private DataSeries ToPerUnit(DataSeries rms) { double nominalValue = rms?.SeriesInfo.Channel.PerUnitValue ?? GetLineVoltage(rms); if (nominalValue == 0.0D) { return(null); } return(rms?.Multiply(1.0D / nominalValue)); }
private void DetectDisturbances(DataGroup dataGroup, VICycleDataGroup viCycleDataGroup) { double nominalVoltage = dataGroup.Line.VoltageKV * 1000.0D / Sqrt3; double nominalVoltageReciprocal = 1.0D / nominalVoltage; DataSeries vAll = GetVAllSeries(viCycleDataGroup); List <Range <int> > aPhaseDisturbanceRanges = DetectDisturbanceRanges(viCycleDataGroup.VA.RMS.Multiply(nominalVoltageReciprocal)); List <Range <int> > bPhaseDisturbanceRanges = DetectDisturbanceRanges(viCycleDataGroup.VB.RMS.Multiply(nominalVoltageReciprocal)); List <Range <int> > cPhaseDisturbanceRanges = DetectDisturbanceRanges(viCycleDataGroup.VC.RMS.Multiply(nominalVoltageReciprocal)); List <Range <int> > allDisturbanceRanges = DetectDisturbanceRanges(vAll.Multiply(nominalVoltageReciprocal)); List <Disturbance> disturbanceList = aPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VA.RMS, range, Phase.AN)) .Concat(bPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VB.RMS, range, Phase.BN))) .Concat(cPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VC.RMS, range, Phase.CN))) .Concat(allDisturbanceRanges.Select(range => ToDisturbance(vAll, range, Phase.None))) .ToList(); m_disturbances.Add(dataGroup, disturbanceList); }
/// <summary> /// Parses the file into a meter data set per meter contained in the file. /// </summary> /// <param name="filePath">The path to the file to be parsed.</param> /// <returns>List of meter data sets, one per meter.</returns> public void Parse(string filePath) { Header header; Channel channel; DataSeries series; List<DateTime> timeSamples; List<double> valueSamples; if ((object)m_eventFile == null) m_eventFile = EventFile.Parse(filePath); if (!m_eventFile.EventReports.Any() && !m_eventFile.CommaSeparatedEventReports.Any()) return; header = m_eventFile.EventReports.FirstOrDefault()?.Header ?? m_eventFile.CommaSeparatedEventReports[0].Header; m_meterDataSet.Meter = new Meter(); m_meterDataSet.Meter.AssetKey = header.RelayID; m_meterDataSet.Meter.Name = header.RelayID; m_meterDataSet.Meter.ShortName = new string(header.RelayID.ToNonNullString().Take(50).ToArray()); m_meterDataSet.Meter.MeterLocation = new MeterLocation(); m_meterDataSet.Meter.MeterLocation.AssetKey = header.StationID; m_meterDataSet.Meter.MeterLocation.Name = header.StationID; m_meterDataSet.Meter.MeterLocation.ShortName = new string(header.StationID.ToNonNullString().Take(50).ToArray()); m_meterDataSet.Meter.MeterLocation.Description = header.StationID; foreach (EventReport report in m_eventFile.EventReports) { for (int i = 0; i < report.AnalogSection.AnalogChannels.Count; i++) { channel = MakeParsedAnalog(report, i); series = new DataSeries(); timeSamples = report.AnalogSection.TimeChannel.Samples; valueSamples = report.AnalogSection.AnalogChannels[i].Samples; series.DataPoints = timeSamples .Zip(valueSamples, (time, value) => new DataPoint() { Time = time, Value = value }) .ToList(); if (new string[] { "VA", "VB", "VC", "VS" }.Contains(report.AnalogSection.AnalogChannels[i].Name)) series = series.Multiply(1000.0D); series.SeriesInfo = channel.Series[0]; m_meterDataSet.DataSeries.Add(series); } for (int i = 0; i < report.AnalogSection.DigitalChannels.Count; i++) { channel = MakeParsedDigital(report, i); series = new DataSeries(); if (channel.Name == "*") continue; timeSamples = report.AnalogSection.TimeChannel.Samples; valueSamples = report.AnalogSection.DigitalChannels[i].Samples.Select(Convert.ToDouble).ToList(); series.SeriesInfo = channel.Series[0]; series.DataPoints = timeSamples .Zip(valueSamples, (time, value) => new DataPoint() { Time = time, Value = value }) .ToList(); m_meterDataSet.Digitals.Add(series); } ComplexNumber z1 = new ComplexNumber(0.0D, 0.0D); ComplexNumber z0 = new ComplexNumber(0.0D, 0.0D); double groupSetting; if (double.TryParse(report.GetGroupSettings("Z1MAG"), out groupSetting)) z1.Magnitude = groupSetting; if (double.TryParse(report.GetGroupSettings("Z1ANG"), out groupSetting)) z1.Angle = groupSetting; if (double.TryParse(report.GetGroupSettings("Z0MAG"), out groupSetting)) z0.Magnitude = groupSetting; if (double.TryParse(report.GetGroupSettings("Z0ANG"), out groupSetting)) z0.Angle = groupSetting; if (z1 != z0) { m_meterDataSet.Configuration.R1 = z1.Real; m_meterDataSet.Configuration.X1 = z1.Imaginary; m_meterDataSet.Configuration.R0 = z0.Real; m_meterDataSet.Configuration.X0 = z0.Imaginary; if (double.TryParse(report.GetGroupSettings("LL"), out groupSetting)) m_meterDataSet.Configuration.LineLength = groupSetting; } } foreach (CommaSeparatedEventReport report in m_eventFile.CommaSeparatedEventReports) { for (int i = 0; i < report.AnalogSection.AnalogChannels.Count; i++) { channel = MakeParsedAnalog(report, i); series = new DataSeries(); timeSamples = report.AnalogSection.TimeChannel.Samples; valueSamples = report.AnalogSection.AnalogChannels[i].Samples; series.DataPoints = timeSamples .Zip(valueSamples, (time, value) => new DataPoint() { Time = time, Value = value }) .ToList(); series.SeriesInfo = channel.Series[0]; m_meterDataSet.DataSeries.Add(series); } for (int i = 0; i < report.AnalogSection.DigitalChannels.Count; i++) { channel = MakeParsedDigital(report, i); series = new DataSeries(); if (channel.Name == "*") continue; timeSamples = report.AnalogSection.TimeChannel.Samples; valueSamples = report.AnalogSection.DigitalChannels[i].Samples.Select(Convert.ToDouble).ToList(); series.SeriesInfo = channel.Series[0]; series.DataPoints = timeSamples .Zip(valueSamples, (time, value) => new DataPoint() { Time = time, Value = value }) .ToList(); m_meterDataSet.Digitals.Add(series); } } }