Exemple #1
0
 private FaultSegment CreateFaultSegment(int eventID, Fault fault, SegmentType faultSegmentType)
 {
     return(new FaultSegment()
     {
         EventID = eventID,
         SegmentTypeID = faultSegmentType.ID,
         StartTime = fault.InceptionTime,
         EndTime = fault.ClearingTime,
         StartSample = fault.StartSample,
         EndSample = fault.EndSample
     });
 }
Exemple #2
0
            public void SummarizeFault()
            {
                using (AdoDataConnection connection = MeterDataSet.CreateDbConnection())
                {
                    TableOperations <Event>       eventTable       = new TableOperations <Event>(connection);
                    TableOperations <SegmentType> segmentTypeTable = new TableOperations <SegmentType>(connection);

                    TableOperations <openXDA.Model.FaultGroup> faultGroupTable   = new TableOperations <openXDA.Model.FaultGroup>(connection);
                    TableOperations <FaultSegment>             faultSegmentTable = new TableOperations <FaultSegment>(connection);
                    TableOperations <FaultSummary>             faultSummaryTable = new TableOperations <FaultSummary>(connection);

                    Event       evt = eventTable.GetEvent(MeterDataSet.FileGroup, DataGroup);
                    SegmentType faultSegmentType = segmentTypeTable.GetOrAdd("Fault");

                    // Create a fault group row for the whole group of faults
                    if (FaultGroup.FaultDetectionLogicResult != false || FaultGroup.FaultValidationLogicResult != false)
                    {
                        faultGroupTable.AddNewRecord(CreateFaultGroup(evt.ID, FaultGroup));
                    }

                    for (int faultIndex = 0; faultIndex < FaultGroup.Faults.Count; faultIndex++)
                    {
                        Fault fault = FaultGroup.Faults[faultIndex];

                        // Create a fault segment for the fault itself
                        faultSegmentTable.AddNewRecord(CreateFaultSegment(evt.ID, fault, faultSegmentType));

                        // Create fault segments for each fault type found within the fault
                        foreach (Fault.Segment segment in fault.Segments)
                        {
                            string      segmentTypeName = string.Format("{0} Fault", segment.FaultType).Replace("ABC", "3-Phase");
                            SegmentType segmentType     = segmentTypeTable.GetOrAdd(segmentTypeName);
                            faultSegmentTable.AddNewRecord(CreateFaultSegment(evt.ID, segment, segmentType));
                        }

                        // Create the fault summary rows for this fault
                        foreach (FaultSummary faultSummary in CreateFaultSummaries(evt.ID, faultIndex + 1, fault))
                        {
                            faultSummaryTable.AddNewRecord(faultSummary);
                        }
                    }

                    // Generate fault curves for each algorithm used to analyze the fault
                    TableOperations <FaultCurve>          faultCurveTable          = new TableOperations <FaultCurve>(connection);
                    TableOperations <FaultCurveStatistic> faultCurveStatisticTable = new TableOperations <FaultCurveStatistic>(connection);

                    if (FaultGroup.Faults.Any())
                    {
                        for (int i = 0; i < FaultGroup.Faults[0].Curves.Count; i++)
                        {
                            FaultCurve faultCurve = CreateFaultCurve(evt.ID, i);
                            faultCurveTable.AddNewRecord(faultCurve);
                            faultCurve.ID = connection.ExecuteScalar <int>("SELECT @@IDENTITY");

                            for (int faultIndex = 0; faultIndex < FaultGroup.Faults.Count; faultIndex++)
                            {
                                Fault fault = FaultGroup.Faults[faultIndex];

                                if (fault.Curves[i].Series.DataPoints.Count == 0)
                                {
                                    continue;
                                }

                                FaultCurveStatistic faultCurveStatistic = new FaultCurveStatistic()
                                {
                                    FaultCurveID      = faultCurve.ID,
                                    FaultNumber       = faultIndex + 1,
                                    Maximum           = ToDbFloat(fault.Curves[i].Maximum),
                                    Minimum           = ToDbFloat(fault.Curves[i].Minimum),
                                    Average           = ToDbFloat(fault.Curves[i].Average),
                                    StandardDeviation = ToDbFloat(fault.Curves[i].StandardDeviation)
                                };

                                faultCurveStatisticTable.AddNewRecord(faultCurveStatistic);
                            }
                        }
                    }
                }
            }
Exemple #3
0
            private IEnumerable <FaultSummary> CreateFaultSummaries(int eventID, int faultNumber, Fault fault)
            {
                foreach (Fault.Summary summary in fault.Summaries)
                {
                    // Calculate the duration of the fault in seconds
                    double durationSeconds = fault.Duration.TotalSeconds;

                    // Create the fault summary record to be written to the database
                    yield return(new FaultSummary()
                    {
                        EventID = eventID,
                        Algorithm = summary.DistanceAlgorithm,
                        FaultNumber = faultNumber,
                        CalculationCycle = fault.CalculationCycle,
                        Distance = ToDbFloat(summary.Distance),
                        CurrentMagnitude = ToDbFloat(fault.CurrentMagnitude),
                        CurrentLag = ToDbFloat(fault.CurrentLag),
                        PrefaultCurrent = ToDbFloat(fault.PrefaultCurrent),
                        PostfaultCurrent = ToDbFloat(fault.PostfaultCurrent),
                        ReactanceRatio = ToDbFloat(fault.ReactanceRatio),
                        Inception = fault.InceptionTime,
                        DurationSeconds = durationSeconds,
                        DurationCycles = durationSeconds * m_systemFrequency,
                        FaultType = fault.Type.ToString(),
                        IsSelectedAlgorithm = summary.IsSelectedAlgorithm,
                        IsValid = summary.IsValid,
                        IsSuppressed = fault.IsSuppressed
                    });
                }
            }
 private List<XElement> GetSegmentElements(Fault fault)
 {
     return fault.Segments
         .Select(GetSegmentElement)
         .ToList();
 }
        private XElement GetSegmentElement(Fault.Segment segment)
        {
            double duration = (segment.EndTime - segment.StartTime).TotalSeconds;

            return new XElement("segment",
                new XElement("type", segment.FaultType),
                new XElement("start",
                    new XElement("time", segment.StartTime.ToString(DateTimeFormat)),
                    new XElement("index", segment.StartSample)),
                new XElement("end",
                    new XElement("time", segment.EndTime.ToString(DateTimeFormat)),
                    new XElement("index", segment.EndSample)),
                new XElement("duration",
                    new XElement("seconds", duration.ToString(DoubleFormat)),
                    new XElement("cycles", (duration * m_systemFrequency).ToString(DoubleFormat))));
        }
        private XElement GetFaultElement(Fault fault)
        {
            DateTime startTime = fault.InceptionTime;
            DateTime endTime = fault.ClearingTime;
            int startSample = fault.StartSample;
            int endSample = fault.EndSample;
            double duration = fault.Duration.TotalSeconds;

            foreach (Fault.Summary summary in fault.Summaries)
            {
                if (!summary.IsSelectedAlgorithm)
                    continue;

                return new XElement("fault",
                    new XElement("type", fault.Type),
                    new XElement("distance", summary.Distance),
                    new XElement("algorithm", summary.DistanceAlgorithm),
                    new XElement("calculationCycle", fault.CalculationCycle),
                    new XElement("faultCurrent", fault.CurrentMagnitude),
                    new XElement("inception",
                        new XElement("time", startTime.ToString(DateTimeFormat)),
                        new XElement("sample", startSample)
                    ),
                    new XElement("clearing",
                        new XElement("time", endTime.ToString(DateTimeFormat)),
                        new XElement("sample", endSample)
                    ),
                    new XElement("duration",
                        new XElement("seconds", duration.ToString(DoubleFormat)),
                        new XElement("cycles", (duration * m_systemFrequency).ToString(DoubleFormat))
                    ),
                    GetSegmentElements(fault)
                );
            }

            return new XElement("fault");
        }
            private FaultCauseMetrics CreateFaultCauseMetrics(int eventID, int faultNumber, Fault fault)
            {
                double?ToDBFloat(double num) =>
                !double.IsNaN(num) ? (double?)num : null;

                return(new FaultCauseMetrics()
                {
                    EventID = eventID,
                    FaultNumber = faultNumber,
                    TreeFaultResistance = ToDBFloat(fault.TreeFaultResistance),
                    LightningMilliseconds = ToDBFloat(fault.LightningMilliseconds),
                    InceptionDistanceFromPeak = ToDBFloat(fault.InceptionDistanceFromPeak),
                    PrefaultThirdHarmonic = ToDBFloat(fault.PrefaultThirdHarmonic),
                    GroundCurrentRatio = ToDBFloat(fault.GroundCurrentRatio),
                    LowPrefaultCurrentRatio = ToDBFloat(fault.LowPrefaultCurrentRatio)
                });
            }