public override void Execute(MeterDataSet meterDataSet) { // The following logic should only apply to NEXUS meters, not DFRs if (!meterDataSet.Meter.Model.StartsWith("NEXUS")) { return; } CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>(); EventClassificationResource eventClassificationResource = meterDataSet.GetResource <EventClassificationResource>(); for (int i = 0; i < cycleDataResource.DataGroups.Count; i++) { DataGroup dataGroup = cycleDataResource.DataGroups[i]; VIDataGroup viDataGroup = cycleDataResource.VIDataGroups[i]; double llPeakNominalVoltage = dataGroup.Asset.VoltageKV * 1000.0D * Math.Sqrt(2.0D); double lnPeakNominalVoltage = llPeakNominalVoltage / Math.Sqrt(3.0D); // Nominal multipliers used for first derivative, based on: // d/dt(A*sin(w*t)) = A*w*cos(w*t) double omega = 2.0D * Math.PI * SystemFrequency; double llFactor = 1.0D / (llPeakNominalVoltage * omega); double lnFactor = 1.0D / (lnPeakNominalVoltage * omega); DataSeries[] puVoltages = { viDataGroup.VA?.Multiply(lnFactor), viDataGroup.VB?.Multiply(lnFactor), viDataGroup.VC?.Multiply(lnFactor), viDataGroup.VAB?.Multiply(llFactor), viDataGroup.VBC?.Multiply(llFactor), viDataGroup.VCA?.Multiply(llFactor) }; bool invalidVoltage = false; foreach (DataSeries voltage in puVoltages) { if (voltage == null) { continue; } List <DataPoint> dataPoints = voltage.DataPoints; invalidVoltage |= dataPoints .Zip(dataPoints.Skip(1), (p1, p2) => (p2.Value - p1.Value) / (p2.Time - p1.Time).TotalSeconds) .Any(slope => Math.Abs(slope) > Settings.MaxVoltageSlope); } if (invalidVoltage) { eventClassificationResource.Classifications[dataGroup] = EventClassification.MeterDataQuality; } } }
public override void Execute(MeterDataSet meterDataSet) { DataGroupsResource dataGroupsResource = meterDataSet.GetResource <DataGroupsResource>(); CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>(); EventClassificationResource eventClassificationResource = meterDataSet.GetResource <EventClassificationResource>(); using (AdoDataConnection connection = meterDataSet.CreateDbConnection()) { List <DataGroup> dataGroups = new List <DataGroup>(cycleDataResource.DataGroups); dataGroups.AddRange(dataGroupsResource.DataGroups.Where(dataGroup => dataGroup.DataSeries.Count == 0)); List <Event> events = GetEvents(connection, meterDataSet, dataGroups, cycleDataResource.VICycleDataGroups, eventClassificationResource.Classifications); LoadEvents(connection, events); } }
public override void Execute(MeterDataSet meterDataSet) { EventClassificationResource eventClassificationResource = meterDataSet.GetResource <EventClassificationResource>(); foreach (DataGroup dataGroup in eventClassificationResource.Classifications.Keys) { if (meterDataSet.Triggers.Contains("Voltage Sag")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Sag; } if (meterDataSet.Triggers.Contains("Sag became Major Sag")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Sag; } if (meterDataSet.Triggers.Contains("Voltage Swell")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Swell; } if (meterDataSet.Triggers.Contains("Interruption")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Interruption; } if (meterDataSet.Triggers.Contains("Waveshape Change")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Transient; } if (meterDataSet.Triggers.Contains("Impulse")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Transient; } if (meterDataSet.Triggers.Contains("High Frequency Impulse")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Transient; } if (meterDataSet.Triggers.Contains("Snapshot")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Snapshot; } if (meterDataSet.Triggers.Contains("Over-frequency")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Other; } if (meterDataSet.Triggers.Contains("Under-frequency")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Other; } if (meterDataSet.Triggers.Contains("RVC")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Other; } if (meterDataSet.Triggers.Contains("QD")) { eventClassificationResource.Classifications[dataGroup] = EventClassification.Other; } } }