Пример #1
0
        private void FindAllRestrikes(CycleDataResource cycleDataResource)
        {
            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                DataGroup   dataGroup   = cycleDataResource.DataGroups[i];
                VIDataGroup viDataGroup = cycleDataResource.VIDataGroups[i];
                DataSeries  ia          = viDataGroup.IA;
                DataSeries  ib          = viDataGroup.IB;
                DataSeries  ic          = viDataGroup.IC;

                IEnumerable <Restrike> iaRestrikes = FindRestrikes(ia)
                                                     .Select(index => new Restrike(Phase.AN, index));

                IEnumerable <Restrike> ibRestrikes = FindRestrikes(ib)
                                                     .Select(index => new Restrike(Phase.BN, index));

                IEnumerable <Restrike> icRestrikes = FindRestrikes(ic)
                                                     .Select(index => new Restrike(Phase.CN, index));

                List <Restrike> allRestrikes = Enumerable.Empty <Restrike>()
                                               .Concat(iaRestrikes)
                                               .Concat(ibRestrikes)
                                               .Concat(icRestrikes)
                                               .ToList();

                if (allRestrikes.Any())
                {
                    RestrikeLookup.Add(dataGroup, allRestrikes);
                }
            }
        }
Пример #2
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            DataGroupsResource dataGroupsResource = meterDataSet.GetResource <DataGroupsResource>();
            CycleDataResource  cycleDataResource  = meterDataSet.GetResource <CycleDataResource>();
            FaultDataResource  faultDataResource  = meterDataSet.GetResource <FaultDataResource>();

            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                DataGroup   dataGroup   = cycleDataResource.DataGroups[i];
                VIDataGroup viDataGroup = cycleDataResource.VIDataGroups[i];
                FaultGroup  faultGroup;

                if (!faultDataResource.FaultLookup.TryGetValue(dataGroup, out faultGroup))
                {
                    faultGroup = null;
                }

                m_classifications.Add(dataGroup, Classify(meterDataSet, dataGroup, viDataGroup, faultGroup));
            }

            foreach (DataGroup dataGroup in dataGroupsResource.DataGroups)
            {
                if (dataGroup.DataSeries.Count > 0)
                {
                    continue;
                }

                m_classifications.Add(dataGroup, Classify(meterDataSet, dataGroup));
            }
        }
Пример #3
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource      cycleDataResource = meterDataSet.GetResource <CycleDataResource>();
            ILightningDataProvider dataProvider      = GetDataProvider();

            if (dataProvider == null)
            {
                return;
            }

            ConnectionStringParser <SettingAttribute, CategoryAttribute> connectionStringParser = new ConnectionStringParser <SettingAttribute, CategoryAttribute>();

            connectionStringParser.ParseConnectionString(meterDataSet.ConnectionString, dataProvider);

            foreach (DataGroup dataGroup in cycleDataResource.DataGroups)
            {
                string   lineKey = dataGroup.Asset.AssetKey;
                DateTime start   = dataGroup.StartTime.AddSeconds(-LightningDataSettings.DataProviderTimeWindow);
                DateTime end     = dataGroup.EndTime.AddSeconds(LightningDataSettings.DataProviderTimeWindow);

                List <ILightningStrike> lightningStrikes = dataProvider
                                                           .GetLightningStrikes(lineKey, start, end)
                                                           .ToList();

                LightningStrikeLookup.Add(dataGroup, lightningStrikes);
            }
        }
Пример #4
0
        private void FindAllTrips(CycleDataResource cycleDataResource)
        {
            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                DataGroup        dataGroup        = cycleDataResource.DataGroups[i];
                VICycleDataGroup viCycleDataGroup = cycleDataResource.VICycleDataGroups[i];

                IEnumerable <Trip> iaTrips = FindTrips(viCycleDataGroup.IA?.Peak)
                                             .Select(point => new Trip(Phase.AN, point.Time));

                IEnumerable <Trip> ibTrips = FindTrips(viCycleDataGroup.IB?.Peak)
                                             .Select(point => new Trip(Phase.BN, point.Time));

                IEnumerable <Trip> icTrips = FindTrips(viCycleDataGroup.IC?.Peak)
                                             .Select(point => new Trip(Phase.CN, point.Time));

                List <Trip> allTrips = Enumerable.Empty <Trip>()
                                       .Concat(iaTrips)
                                       .Concat(ibTrips)
                                       .Concat(icTrips)
                                       .ToList();

                if (allTrips.Any())
                {
                    TripLookup.Add(dataGroup, allTrips);
                }
            }
        }
Пример #5
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>();

            FindAllTrips(cycleDataResource);
            FindAllRestrikes(cycleDataResource);
        }
Пример #6
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            if (!meterDataSet.FilePath.ToLower().Contains("snapshot"))
            {
                return;
            }

            IsSnapshot = true;

            CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>();

            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                ProcessSnapshots(cycleDataResource.SystemFrequency, cycleDataResource.VIDataGroups[i]);
            }
        }
Пример #7
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            DataGroup         dataGroup;
            VIDataGroup       viDataGroup;
            CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>();

            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                dataGroup   = cycleDataResource.DataGroups[i];
                viDataGroup = cycleDataResource.VIDataGroups[i];

                IEnumerable <Disturbance> transients = DetectTransients(viDataGroup);

                if (transients.Any())
                {
                    Transients.Add(dataGroup, transients.ToList());
                }
            }
        }
Пример #8
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>();
            FaultDataResource faultDataResource = meterDataSet.GetResource(() => new FaultDataResource(m_dbAdapterContainer));
            FaultGroup        faultGroup;

            DataGroup        dataGroup;
            VICycleDataGroup viCycleDataGroup;

            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                dataGroup        = cycleDataResource.DataGroups[i];
                viCycleDataGroup = cycleDataResource.VICycleDataGroups[i];

                if (!faultDataResource.FaultLookup.TryGetValue(dataGroup, out faultGroup))
                {
                    faultGroup = null;
                }

                m_classifications.Add(dataGroup, Classify(meterDataSet, dataGroup, viCycleDataGroup, faultGroup));
            }
        }
Пример #9
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource cycleDataResource = meterDataSet.GetResource <CycleDataResource>();

            m_systemEvents = GetSystemEvents(cycleDataResource.DataGroups);
        }
Пример #10
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource cycleDataResource = CycleDataResource.GetResource(meterDataSet, m_dbAdapterContainer);

            m_systemEvents = GetSystemEvents(cycleDataResource.DataGroups);
        }
Пример #11
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            DataGroup        dataGroup;
            VIDataGroup      viDataGroup;
            VICycleDataGroup viCycleDataGroup;

            List <Fault> faults;

            List <FaultLocationAlgorithm> faultLocationAlgorithms;
            FaultLocationDataSet          faultLocationDataSet;
            ImpedanceExtractor            impedanceExtractor;
            FaultCurveGenerator           faultCurveGenerator;

            CycleDataResource cycleDataResource;

            bool?faultDetectionLogicResult;
            bool defaultFaultDetectionLogicResult;
            bool faultValidationLogicResult;

            Stopwatch stopwatch;

            stopwatch               = new Stopwatch();
            cycleDataResource       = CycleDataResource.GetResource(meterDataSet, m_dbAdapterContainer);
            faultLocationAlgorithms = GetFaultLocationAlgorithms(m_dbAdapterContainer.GetAdapter <FaultLocationInfoDataContext>());

            Log.Info(string.Format("Executing fault location analysis on {0} events.", cycleDataResource.DataGroups.Count));

            for (int i = 0; i < cycleDataResource.DataGroups.Count; i++)
            {
                dataGroup        = cycleDataResource.DataGroups[i];
                viDataGroup      = cycleDataResource.VIDataGroups[i];
                viCycleDataGroup = cycleDataResource.VICycleDataGroups[i];

                // Defined channel checks
                Log.Debug("Checking defined channels...");

                if (viDataGroup.DefinedNeutralVoltages != 3)
                {
                    Log.Debug($"Not enough neutral voltage channels for fault analysis: {viDataGroup.DefinedNeutralVoltages}.");
                    continue;
                }

                if (viDataGroup.DefinedCurrents < 3)
                {
                    Log.Debug($"Not enough current channels for fault analysis: {viDataGroup.DefinedNeutralVoltages}.");
                    continue;
                }

                // Engineering reasonableness checks
                Log.Debug("Checking for engineering reasonableness...");

                try
                {
                    stopwatch.Restart();

                    if (!IsReasonable(dataGroup, viCycleDataGroup))
                    {
                        continue;
                    }
                }
                finally
                {
                    Log.Debug(stopwatch.Elapsed);
                }

                // Break into faults and segments
                Log.Debug("Classifying data into faults and segments...");

                try
                {
                    stopwatch.Restart();

                    faults = DetectFaults(viDataGroup, viCycleDataGroup);

                    if (faults.Count > 0)
                    {
                        ClassifyFaults(faults, dataGroup, viCycleDataGroup);
                    }
                }
                finally
                {
                    Log.Debug(stopwatch.Elapsed);
                }

                // Check the fault detection logic and the default fault detection logic
                faultDetectionLogicResult        = CheckFaultDetectionLogic(meterDataSet, dataGroup);
                defaultFaultDetectionLogicResult = CheckDefaultFaultDetectionLogic(faults);

                // If the fault detection logic detects a fault and the default
                // logic does not agree, treat the whole waveform as a fault
                if (faultDetectionLogicResult == true && !defaultFaultDetectionLogicResult)
                {
                    faults.Add(new Fault()
                    {
                        StartSample = 0,
                        EndSample   = dataGroup[0].DataPoints.Count - 1
                    });

                    ClassifyFaults(faults, dataGroup, viCycleDataGroup);
                }

                // Create the fault location data set and begin populating
                // the properties necessary for calculating fault location
                faultLocationDataSet = new FaultLocationDataSet();
                faultLocationDataSet.LineDistance  = dataGroup.Line.Length;
                faultLocationDataSet.PrefaultCycle = FirstCycle(viCycleDataGroup);

                // Extract impedances from the database
                // and into the fault location data set
                impedanceExtractor = new ImpedanceExtractor();
                impedanceExtractor.FaultLocationDataSet = faultLocationDataSet;
                impedanceExtractor.FaultLocationInfo    = m_dbAdapterContainer.GetAdapter <FaultLocationInfoDataContext>();
                impedanceExtractor.Meter = meterDataSet.Meter;
                impedanceExtractor.Line  = dataGroup.Line;

                if (impedanceExtractor.TryExtractImpedances())
                {
                    // Generate fault curves for fault analysis
                    Log.Debug("Generating fault curves...");
                    stopwatch.Restart();

                    faultCurveGenerator = new FaultCurveGenerator();
                    faultCurveGenerator.SamplesPerCycle         = Transform.CalculateSamplesPerCycle(viDataGroup.VA, m_systemFrequency);
                    faultCurveGenerator.CycleDataGroup          = viCycleDataGroup;
                    faultCurveGenerator.Faults                  = faults;
                    faultCurveGenerator.FaultLocationDataSet    = faultLocationDataSet;
                    faultCurveGenerator.FaultLocationAlgorithms = faultLocationAlgorithms;
                    faultCurveGenerator.GenerateFaultCurves();

                    Log.Debug(stopwatch.Elapsed);

                    // Gather additional info about each fault
                    // based on the results of the above analysis
                    foreach (Fault fault in faults)
                    {
                        PopulateFaultInfo(fault, dataGroup, viCycleDataGroup);
                    }
                }

                // Create a fault group and add it to the lookup table
                faultValidationLogicResult = CheckFaultValidationLogic(faults);
                m_faultLookup.Add(dataGroup, new FaultGroup(faults, faultDetectionLogicResult, defaultFaultDetectionLogicResult, faultValidationLogicResult));
            }
        }