Exemple #1
0
        private void InitializeRangeLimitTable(DataQuality.DataQualityRangeLimitDataTable rangeLimitTable, Channel channel)
        {
            DataQualityRangeLimitTableAdapter        rangeLimitAdapter;
            DefaultDataQualityRangeLimitTableAdapter defaultRangeLimitAdapter;

            DataQuality.DefaultDataQualityRangeLimitDataTable defaultRangeLimitTable;
            DataQuality.DataQualityRangeLimitRow rangeLimitRow;

            // Clear existing rows from the range limit table
            rangeLimitTable.Clear();

            // Fill the range limit table with range limits for the given channel
            rangeLimitAdapter = m_dbAdapterContainer.GetAdapter <DataQualityRangeLimitTableAdapter>();
            rangeLimitAdapter.FillBy(rangeLimitTable, channel.ID);

            // If limits exist for the given channel,
            // range limit table has been successfully initialized
            if (rangeLimitTable.Count != 0)
            {
                return;
            }

            // Get the default range limits for the measurement type and characteristic of this channel
            defaultRangeLimitAdapter = m_dbAdapterContainer.GetAdapter <DefaultDataQualityRangeLimitTableAdapter>();
            defaultRangeLimitTable   = defaultRangeLimitAdapter.GetDataBy(channel.MeasurementTypeID, channel.MeasurementCharacteristicID);

            // If there are no default limits for the channel,
            // then the range limit table has been successfully initialized
            if (defaultRangeLimitTable.Count == 0)
            {
                return;
            }

            lock (RangeLimitLock)
            {
                // Fill the range limit table one more time inside the lock to
                // ensure that no other threads have written limits for this channel
                rangeLimitAdapter.FillBy(rangeLimitTable, channel.ID);

                // If there are still no limits defined for this channel,
                // update the table to include this channel's default limits
                if (rangeLimitTable.Count == 0)
                {
                    foreach (DataQuality.DefaultDataQualityRangeLimitRow row in defaultRangeLimitTable)
                    {
                        rangeLimitRow                = rangeLimitTable.NewDataQualityRangeLimitRow();
                        rangeLimitRow.ChannelID      = channel.ID;
                        rangeLimitRow.RangeInclusive = row.RangeInclusive;
                        rangeLimitRow.PerUnit        = row.PerUnit;
                        rangeLimitRow.Enabled        = 1;

                        if (!row.IsHighNull())
                        {
                            rangeLimitRow.High = row.High;
                        }

                        if (!row.IsLowNull())
                        {
                            rangeLimitRow.Low = row.Low;
                        }

                        rangeLimitTable.AddDataQualityRangeLimitRow(rangeLimitRow);
                    }

                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(m_dbAdapterContainer.Connection))
                    {
                        bulkCopy.BulkCopyTimeout      = 0;
                        bulkCopy.DestinationTableName = rangeLimitTable.TableName;
                        bulkCopy.WriteToServer(rangeLimitTable);
                    }
                }
            }
        }
Exemple #2
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;
                }
            }
        }