コード例 #1
0
ファイル: AlarmOperation.cs プロジェクト: daozh/openXDA
        private void CheckAlarm(Channel channel, TrendingDataSummaryResource.TrendingDataSummary summary, AlarmData.AlarmRangeLimitRow rangeLimit)
        {
            double perUnitValue;

            double highLimit = 0.0D;
            double lowLimit  = 0.0D;
            bool   highValid = true;
            bool   lowValid  = true;

            AlarmData.AlarmLogRow logRow;

            if (summary.IsDuplicate)
            {
                return;
            }

            perUnitValue = channel.PerUnitValue ?? 1.0D;

            if (!rangeLimit.IsHighNull())
            {
                highLimit = Convert.ToBoolean(rangeLimit.PerUnit) ? (rangeLimit.High * perUnitValue) : rangeLimit.High;
                highValid = Convert.ToBoolean(rangeLimit.RangeInclusive) ^ (summary.Average <= highLimit);
            }

            if (!rangeLimit.IsLowNull())
            {
                lowLimit = Convert.ToBoolean(rangeLimit.PerUnit) ? (rangeLimit.Low * perUnitValue) : rangeLimit.Low;
                lowValid = Convert.ToBoolean(rangeLimit.RangeInclusive) ^ (summary.Average >= lowLimit);
            }

            if (!lowValid || !highValid)
            {
                logRow             = m_alarmLogTable.NewAlarmLogRow();
                logRow.ChannelID   = channel.ID;
                logRow.AlarmTypeID = rangeLimit.AlarmTypeID;
                logRow.Time        = summary.Time;
                logRow.Severity    = rangeLimit.Severity;
                logRow.Value       = Convert.ToBoolean(rangeLimit.PerUnit) ? (summary.Average / perUnitValue) : summary.Average;

                if (!rangeLimit.IsHighNull())
                {
                    logRow.LimitHigh = highLimit;
                }

                if (!rangeLimit.IsLowNull())
                {
                    logRow.LimitLow = lowLimit;
                }

                m_alarmLogTable.AddAlarmLogRow(logRow);
            }
        }
コード例 #2
0
 public ChannelSummary(Channel channel, TrendingDataSummaryResource.TrendingDataSummary summary)
 {
     m_channel         = channel;
     m_date            = summary.Time.Date;
     m_trendingSummary = summary;
 }
コード例 #3
0
        private void ProcessDataQualityRangeLimits(MeterDataSet meterDataSet)
        {
            TrendingDataSummaryResource trendingDataSummaryResource = meterDataSet.GetResource <TrendingDataSummaryResource>();
            Dictionary <Channel, List <TrendingDataSummaryResource.TrendingDataSummary> > trendingDataSummaries = trendingDataSummaryResource.TrendingDataSummaries;

            TrendingDataSummaryResource.TrendingDataSummary previousSummary = null;

            if (trendingDataSummaries.Count == 0)
            {
                return;
            }

            using (AdoDataConnection connection = meterDataSet.CreateDbConnection())
            {
                foreach (KeyValuePair <Channel, List <TrendingDataSummaryResource.TrendingDataSummary> > keyValuePair in trendingDataSummaries)
                {
                    Channel channel      = keyValuePair.Key;
                    double  perUnitValue = channel.PerUnitValue ?? 1.0D;

                    List <DataQualityRangeLimit> dataQualityRangeLimits = InitializeRangeLimitTable(connection, channel);

                    foreach (TrendingDataSummaryResource.TrendingDataSummary trendingDataSummary in keyValuePair.Value)
                    {
                        if ((object)previousSummary != null && trendingDataSummary.Minimum == previousSummary.Minimum && trendingDataSummary.Average == previousSummary.Average && trendingDataSummary.Maximum == previousSummary.Maximum)
                        {
                            trendingDataSummary.Latched = true;
                        }

                        if (trendingDataSummary.Average < trendingDataSummary.Minimum || trendingDataSummary.Average > trendingDataSummary.Maximum)
                        {
                            trendingDataSummary.NonCongruent = true;
                        }

                        foreach (DataQualityRangeLimit dataQualityRangeLimit in dataQualityRangeLimits.Where(row => row.Enabled))
                        {
                            double highLimit = 0.0D;
                            double lowLimit  = 0.0D;
                            bool   maxValid  = true;
                            bool   minValid  = true;

                            double factor = dataQualityRangeLimit.PerUnit ? perUnitValue : 1.0D;

                            if ((object)dataQualityRangeLimit.High != null)
                            {
                                highLimit = factor * dataQualityRangeLimit.High.GetValueOrDefault();
                                maxValid  = Convert.ToBoolean(dataQualityRangeLimit.RangeInclusive) ^ (trendingDataSummary.Maximum < highLimit);
                            }

                            if ((object)dataQualityRangeLimit.Low != null)
                            {
                                lowLimit = factor * dataQualityRangeLimit.Low.GetValueOrDefault();
                                minValid = Convert.ToBoolean(dataQualityRangeLimit.RangeInclusive) ^ (trendingDataSummary.Minimum > lowLimit);
                            }

                            if (!minValid || !maxValid)
                            {
                                trendingDataSummary.Unreasonable = true;
                                trendingDataSummary.HighLimit    = highLimit;
                                trendingDataSummary.LowLimit     = lowLimit;

                                if (!maxValid)
                                {
                                    trendingDataSummary.UnreasonableValue = trendingDataSummary.Maximum;
                                }
                                else
                                {
                                    trendingDataSummary.UnreasonableValue = trendingDataSummary.Minimum;
                                }

                                break;
                            }
                        }

                        previousSummary = trendingDataSummary;
                    }
                }
            }
        }
コード例 #4
0
        private void ProcessDataQualityRangeLimits(MeterDataSet meterDataSet)
        {
            DataQuality.DataQualityRangeLimitDataTable rangeLimitTable;

            Dictionary <Channel, List <TrendingDataSummaryResource.TrendingDataSummary> > trendingDataSummaries;
            Channel channel;

            TrendingDataSummaryResource.TrendingDataSummary previousSummary = null;

            double perUnitValue;
            double lowLimit;
            double highLimit;
            bool   minValid;
            bool   maxValid;

            trendingDataSummaries = meterDataSet.GetResource <TrendingDataSummaryResource>().TrendingDataSummaries;
            rangeLimitTable       = new DataQuality.DataQualityRangeLimitDataTable();

            foreach (KeyValuePair <Channel, List <TrendingDataSummaryResource.TrendingDataSummary> > keyValuePair in trendingDataSummaries)
            {
                channel      = keyValuePair.Key;
                perUnitValue = channel.PerUnitValue ?? 1.0D;
                InitializeRangeLimitTable(rangeLimitTable, channel);

                foreach (TrendingDataSummaryResource.TrendingDataSummary trendingDataSummary in keyValuePair.Value)
                {
                    if ((object)previousSummary != null && trendingDataSummary.Minimum == previousSummary.Minimum && trendingDataSummary.Average == previousSummary.Average && trendingDataSummary.Maximum == previousSummary.Maximum)
                    {
                        trendingDataSummary.Latched = true;
                    }

                    if (trendingDataSummary.Average < trendingDataSummary.Minimum || trendingDataSummary.Average > trendingDataSummary.Maximum)
                    {
                        trendingDataSummary.NonCongruent = true;
                    }

                    foreach (DataQuality.DataQualityRangeLimitRow row in rangeLimitTable.Where(row => row.Enabled != 0))
                    {
                        highLimit = 0.0D;
                        lowLimit  = 0.0D;
                        maxValid  = true;
                        minValid  = true;

                        if (!row.IsHighNull())
                        {
                            highLimit = Convert.ToBoolean(row.PerUnit) ? row.High * perUnitValue : row.High;
                            maxValid  = Convert.ToBoolean(row.RangeInclusive) ^ (trendingDataSummary.Maximum < highLimit);
                        }

                        if (!row.IsLowNull())
                        {
                            lowLimit = Convert.ToBoolean(row.PerUnit) ? row.Low * perUnitValue : row.Low;
                            minValid = Convert.ToBoolean(row.RangeInclusive) ^ (trendingDataSummary.Minimum > lowLimit);
                        }

                        if (!minValid || !maxValid)
                        {
                            trendingDataSummary.Unreasonable = true;
                            trendingDataSummary.HighLimit    = highLimit;
                            trendingDataSummary.LowLimit     = lowLimit;

                            if (!maxValid)
                            {
                                trendingDataSummary.UnreasonableValue = trendingDataSummary.Maximum;
                            }
                            else
                            {
                                trendingDataSummary.UnreasonableValue = trendingDataSummary.Minimum;
                            }

                            break;
                        }
                    }

                    previousSummary = trendingDataSummary;
                }
            }
        }