Example #1
0
        public Task <Channel> GetChannel(CancellationToken cancellationToken)
        {
            Dictionary <string, string> query = Request.QueryParameters();
            int    meterID       = int.Parse(query["meterID"]);
            string measurementID = query["measurementID"];

            return(Task.Factory.StartNew(() =>
            {
                using (DataContext dataContext = new DataContext("systemSettings"))
                {
                    PQMeasurement pQMeasurement = dataContext.Table <PQMeasurement>().QueryRecordWhere("Name = {0}", measurementID);
                    return dataContext.Table <Channel>().QueryRecordWhere(@"
                        MeterID = {0} AND
                        Channel.MeasurementTypeID = {1} AND
                        Channel.MeasurementCharacteristicID = {2} AND
                        Channel.PhaseID = {3} AND
                        Channel.HarmonicGroup = {4}
                    ", meterID, pQMeasurement.MeasurementTypeID, pQMeasurement.MeasurementCharacteristicID, pQMeasurement.PhaseID, pQMeasurement.HarmonicGroup);
                }
            }, cancellationToken));
        }
        private void ProcessMeasurement(Meter meter, PQMeasurement measurement, string historianServer, string historianInstance, DateTime startTime, DateTime endTime)
        {
            Channel     channel;
            PQTrendStat record;

            using (DataContext dataContext = new DataContext("systemSettings"))
            {
                channel = dataContext.Table <Channel>().QueryRecordWhere("MeasurementTypeID = {0} AND MeasurementCharacteristicID = {1} AND PhaseID = {2} AND HarmonicGroup = {3} AND MeterID = {4}", measurement.MeasurementTypeID, measurement.MeasurementCharacteristicID, measurement.PhaseID, measurement.HarmonicGroup, meter.ID);
                record  = dataContext.Table <PQTrendStat>().QueryRecordWhere("MeterID = {0} AND Date = {1} AND PQMeasurementTypeID = {2}", meter.ID, startTime, measurement.ID);
            }


            if (record == null)
            {
                record                     = new PQTrendStat();
                record.MeterID             = meter.ID;
                record.PQMeasurementTypeID = measurement.ID;
                record.Date                = startTime;
            }

            record.Max  = null;
            record.Min  = null;
            record.Avg  = null;
            record.CP99 = null;
            record.CP95 = null;
            record.CP05 = null;
            record.CP01 = null;

            if (channel != null)
            {
                using (Historian historian = new Historian(historianServer, historianInstance))
                {
                    IEnumerable <openHistorian.XDALink.TrendingDataPoint> data = historian.Read(new[] { channel.ID }, startTime, endTime).ToList();
                    if (!data.Any())
                    {
                        return;
                    }

                    IEnumerable <openHistorian.XDALink.TrendingDataPoint> avgList = data.Where(x => x.SeriesID == SeriesID.Average).OrderBy(x => x.Value);

                    try
                    {
                        record.Max = data.Where(x => x.SeriesID == SeriesID.Maximum).Select(x => x.Value).Max();
                        record.Min = data.Where(x => x.SeriesID == SeriesID.Minimum).Select(x => x.Value).Min();
                        record.Avg = avgList.Select(x => x.Value).Average();
                    }
                    catch (Exception ex)
                    {
                        if (PQTrendingWebReportSettings.Verbose)
                        {
                            Log.Error(ex.Message, ex);
                        }
                    }

                    try
                    {
                        int index99 = (int)(avgList.Count() * (0.995));
                        int index01 = (int)(avgList.Count() * (0.005));
                        record.CP99 = avgList.Where((x, i) => i >= index01 && i <= index99).Select(x => x.Value).Max();
                        record.CP01 = avgList.Where((x, i) => i >= index01 && i <= index99).Select(x => x.Value).Min();
                    }
                    catch (Exception ex)
                    {
                        record.CP99 = null;
                        record.CP01 = null;

                        if (PQTrendingWebReportSettings.Verbose)
                        {
                            Log.Error(ex.Message, ex);
                        }
                    }

                    try
                    {
                        int index95 = (int)(avgList.Count() * (0.975));
                        int index05 = (int)(avgList.Count() * (0.025));
                        record.CP95 = avgList.Where((x, i) => i >= index05 && i <= index95).Select(x => x.Value).Max();
                        record.CP05 = avgList.Where((x, i) => i >= index05 && i <= index95).Select(x => x.Value).Min();
                    }
                    catch (Exception ex)
                    {
                        record.CP95 = null;
                        record.CP05 = null;

                        if (PQTrendingWebReportSettings.Verbose)
                        {
                            Log.Error(ex.Message, ex);
                        }
                    }
                }

                using (DataContext dataContext = new DataContext("systemSettings"))
                {
                    if (record.Avg != null && record.Max != null && record.Min != null)
                    {
                        dataContext.Table <PQTrendStat>().AddNewOrUpdateRecord(record);
                    }
                }
            }
        }
Example #3
0
        private void ProcessMeasurement(Meter meter, StepChangeMeasurement measurement, string historianServer, string historianInstance, DateTime startTime, DateTime endTime)
        {
            using (DataContext dataContext = new DataContext("systemSettings"))
                using (Historian historian = new Historian(historianServer, historianInstance))
                {
                    PQMeasurement  pqMeasurement = dataContext.Table <PQMeasurement>().QueryRecordWhere("ID = {0}", measurement.PQMeasurementID);
                    Channel        channel       = dataContext.Table <Channel>().QueryRecordWhere("MeasurementTypeID = {0} AND MeasurementCharacteristicID = {1} AND PhaseID = {2} AND HarmonicGroup = {3} AND MeterID = {4}", pqMeasurement.MeasurementTypeID, pqMeasurement.MeasurementCharacteristicID, pqMeasurement.PhaseID, pqMeasurement.HarmonicGroup, meter.ID);
                    StepChangeStat record        = dataContext.Table <StepChangeStat>().QueryRecordWhere("MeterID = {0} AND Date = {1} AND StepChangeMeasurementID = {2}", meter.ID, startTime, measurement.ID);
                    Unit           unit          = dataContext.Table <Unit>().QueryRecordWhere("ID = {0}", pqMeasurement.UnitID);

                    if (record == null)
                    {
                        record         = new StepChangeStat();
                        record.MeterID = meter.ID;
                        record.StepchangeMeasurementID = measurement.ID;
                        record.Date = startTime;
                    }

                    record.Value = 0;

                    if (channel != null)
                    {
                        IEnumerable <openHistorian.XDALink.TrendingDataPoint> data = historian.Read(new[] { channel.ID }, startTime.AddHours(-1), endTime).Where(x => x.SeriesID == SeriesID.Average).ToList();

                        // no associated data for this measurement;  just return without creating the record.
                        if (!data.Any())
                        {
                            return;
                        }

                        try
                        {
                            foreach (openHistorian.XDALink.TrendingDataPoint point in data)
                            {
                                if (point.Timestamp >= startTime)
                                {
                                    double lastHourAvg = data.Where(x => x.Timestamp >= point.Timestamp.AddHours(-1) && x.Timestamp < point.Timestamp).Select(x => x.Value).Average();

                                    double std     = data.StandardDeviation(x => x.Value);
                                    double average = data.Average(x => x.Value);

                                    // if value is outside 5 sigma, do not check for step change
                                    if (point.Value > average + std * 5 || point.Value < average - std * 5)
                                    {
                                        continue;
                                    }

                                    if (unit.Name == "Percent")
                                    {
                                        if (Math.Abs(point.Value - lastHourAvg) > measurement.Setting)
                                        {
                                            record.Value++;
                                        }
                                    }
                                    else
                                    {
                                        if ((Math.Abs(point.Value - lastHourAvg) * 100 / lastHourAvg) > measurement.Setting)
                                        {
                                            record.Value++;
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                            // no associated data for this measurement;  just return without creating the record.
                            return;
                        }
                    }

                    if (record.Value > 0)
                    {
                        dataContext.Table <StepChangeStat>().AddNewOrUpdateRecord(record);
                    }
                }
        }