public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource cycleDataResource = CycleDataResource.GetResource(meterDataSet, m_dbAdapterContainer);
            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));
            }
        }
Пример #2
0
        public override void Initialize(MeterDataSet meterDataSet)
        {
            CycleDataResource cycleDataResource = CycleDataResource.GetResource(meterDataSet, m_dbAdapterContainer);

            m_systemEvents = GetSystemEvents(cycleDataResource.DataGroups);
        }
Пример #3
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));
            }
        }