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)); } }
public override void Initialize(MeterDataSet meterDataSet) { CycleDataResource cycleDataResource = CycleDataResource.GetResource(meterDataSet, m_dbAdapterContainer); m_systemEvents = GetSystemEvents(cycleDataResource.DataGroups); }
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)); } }