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); } } } }
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); } } }