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); } }
public ChannelSummary(Channel channel, TrendingDataSummaryResource.TrendingDataSummary summary) { m_channel = channel; m_date = summary.Time.Date; m_trendingSummary = summary; }
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; } } } }
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; } } }