Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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;
                }
            }
        }