From 9caae8dffd26dbe72dd8f82927258fcdee07e6eb Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Sat, 21 Sep 2019 11:04:40 +0200 Subject: [PATCH] (1) FlowMeteDewa uses EtPulses2, EtPulses3, (2) WMChart fixed, Q4 displayed, (3) Minor MainSeq bug fix. --- Results/Output/WMChart.cs | 16 ++++- TBF/BenchControl/Elde/ControlBoardDev.cs | 6 +- TBF/BenchControl/Elde/ControlComSim.cs | 4 +- TBF/BenchControl/Elde/ControlComWrap.cs | 7 +++ .../Elde/FlowMeterDewa/FlowMeter.cs | 63 ++++++++++++++++--- TBF/BenchControl/Elde/IControlCom.cs | 6 +- TBF/BenchControl/Sequences/MainSeq.cs | 5 +- 7 files changed, 90 insertions(+), 17 deletions(-) diff --git a/Results/Output/WMChart.cs b/Results/Output/WMChart.cs index 6d5499768..577db1b61 100644 --- a/Results/Output/WMChart.cs +++ b/Results/Output/WMChart.cs @@ -13,17 +13,25 @@ namespace Results.Output { public static Chart GetChart(WaterMeter wm, bool isPrinter) { - return GetChart(wm, isPrinter, Config.Unit.lph, false); + return GetChart(wm, isPrinter, Config.Unit.lph); } - public static Chart GetChart(WaterMeter wm, bool isPrinter, Config.Unit flowUnit, bool isQ4) + public static Chart GetChart(WaterMeter wm, bool isPrinter, Config.Unit flowUnit) { + double maxFlow_m3h = 0; IList unsortedPoints = new List(); foreach (var mtr in wm.MeterTestRslts) { if (mtr.IsPilotRslt() && mtr.TestRslt.TestData.Evaluate && (mtr.TestRslt.TestTime > 0) && (mtr.TestRslt.PulsesMaster > 0)) { - double flow = Config.Units.ConvertTo(flowUnit, 3.6 * mtr.TestRslt.VolumeCTV / mtr.TestRslt.TestTime); + double flow_m3h = (mtr.TestTime != 0) + ? (3.6 * mtr.TestRslt.VolumeCTV / mtr.TestTime * mtr.PulsesMaster / mtr.TestRslt.PulsesMaster) + : (3.6 * mtr.TestRslt.VolumeCTV / mtr.TestRslt.TestTime); + + if (flow_m3h > maxFlow_m3h) maxFlow_m3h = flow_m3h; + + double flow = Config.Units.ConvertTo(flowUnit, flow_m3h); /// Convert to specified units + if (flow > 0) { unsortedPoints.Add(new PointF((float)flow, (float)mtr.Error)); @@ -32,6 +40,8 @@ namespace Results.Output } IEnumerable sortedPoints = unsortedPoints.OrderBy(x => x.X); + bool isQ4 = (maxFlow_m3h > 1.1 * wm.WaterMeterData.Q3_Qn); + Chart chart = new Chart { Name = "chart", diff --git a/TBF/BenchControl/Elde/ControlBoardDev.cs b/TBF/BenchControl/Elde/ControlBoardDev.cs index ded3cd394..0ce2c1295 100644 --- a/TBF/BenchControl/Elde/ControlBoardDev.cs +++ b/TBF/BenchControl/Elde/ControlBoardDev.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2017 Sensus Metering Systems +/// Copyright (c) 2013-2019 Sensus Slovensko a.s. /// using System; using System.Text; @@ -43,7 +43,9 @@ namespace TBF.BenchControl.Elde public StatusP StatusP { get { return controlCom.StatusP; } } public int EtPulses(int wmNr1) { return controlCom.EtPulses(wmNr1); } public int EtPulsesK { get { return controlCom.EtPulsesK; } } - public UInt16 WMeterPulses(int wmNr1) { return controlCom.WMeterPulses(wmNr1); } + public int EtPulses2 { get { return controlCom.EtPulses2; } } /// DEWA_300: pulses from I12 + public int EtPulses3 { get { return controlCom.EtPulses3; } } /// DEWA_300: pulses from I13 + public UInt16 WMeterPulses(int wmNr1) { return controlCom.WMeterPulses(wmNr1); } public int WMeterReference(int wmNr0) { return controlCom.WMeterReference(wmNr0); } public uint RegulValveDAC(int rvNr0) { return controlCom.RegulValveDAC(rvNr0); } public float Pressure(int prsNr0) { return controlCom.Pressure(prsNr0); } diff --git a/TBF/BenchControl/Elde/ControlComSim.cs b/TBF/BenchControl/Elde/ControlComSim.cs index 108052a87..323454498 100644 --- a/TBF/BenchControl/Elde/ControlComSim.cs +++ b/TBF/BenchControl/Elde/ControlComSim.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Copyright (c) 2013-2019 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -28,6 +28,8 @@ namespace TBF.BenchControl.Elde } public int EtPulsesK { get { return 1; } } + public int EtPulses2 { get { return 0; } } + public int EtPulses3 { get { return 0; } } double[] errFactor = new double[Config.Data.WMsCount + 1]; /// Internal double[] wMeterPulsesF = new double[Config.Data.WMsCount + 1]; /// Internal diff --git a/TBF/BenchControl/Elde/ControlComWrap.cs b/TBF/BenchControl/Elde/ControlComWrap.cs index 86f8fe686..31af7187b 100644 --- a/TBF/BenchControl/Elde/ControlComWrap.cs +++ b/TBF/BenchControl/Elde/ControlComWrap.cs @@ -50,6 +50,13 @@ namespace TBF.BenchControl.Elde public int EtPulsesK { get { return (int)ctrlBrdComponent.etPulsesK; } } #endif +#if DEWA_300 + public int EtPulses2 { get { return (int)ctrlBrdComponent.EtPulses2; } } + public int EtPulses3 { get { return (int)ctrlBrdComponent.EtPulses3; } } +#else + public int EtPulses2 { get { return 0; } } + public int EtPulses3 { get { return 0; } } +#endif public UInt16 WMeterPulses(int wmNr1) { return (UInt16)ctrlBrdComponent.wMeterPuls[wmNr1]; } public int WMeterReference(int wmNr0) { return (int)ctrlBrdComponent.wMeterReference[wmNr0]; } diff --git a/TBF/BenchControl/Elde/FlowMeterDewa/FlowMeter.cs b/TBF/BenchControl/Elde/FlowMeterDewa/FlowMeter.cs index c336ca1b8..fca3291cb 100644 --- a/TBF/BenchControl/Elde/FlowMeterDewa/FlowMeter.cs +++ b/TBF/BenchControl/Elde/FlowMeterDewa/FlowMeter.cs @@ -28,22 +28,66 @@ namespace TBF.BenchControl.Elde.FlowMeterDewa public double NominalFlow { get { return nominalFlow; } } public double LtrPerPulse { get { return ltrPerPulse; } } - double[] refFreq; + double[] refFreq; /// 0..sum, 1..I11, 2..I12, 3..I13 + int[] refPulses; public double LtrPerPulseCorrected(double flow, int rangeIx) { - if (flow < 0.1 * NominalFlow) return LtrPerPulse; /// No correction for small flow + log.DebugFormat("LtrPerPulseCorrected({0}, {1}) started", flow, rangeIx); refFreq[0] = controlBoard.ReferenceFreqs(0); + refFreq[1] = controlBoard.ReferenceFreqs(1); refFreq[2] = controlBoard.ReferenceFreqs(2); refFreq[3] = controlBoard.ReferenceFreqs(3); + log.DebugFormat("refFreq[] = ({0}, {1}, {2}, {3})", refFreq[0], refFreq[1], refFreq[2], refFreq[3]); + refFreq[1] = refFreq[0] - refFreq[2] - refFreq[3]; - double ltrPerPulseCorrected = 0; - if (flowMeter1 != null) ltrPerPulseCorrected += refFreq[flowMeter1.Idx1] * flowMeter1.LtrPerPulseCorrected(flow * refFreq[flowMeter1.Idx1] / refFreq[0], rangeIx); - if (flowMeter2 != null) ltrPerPulseCorrected += refFreq[flowMeter2.Idx1] * flowMeter2.LtrPerPulseCorrected(flow * refFreq[flowMeter2.Idx1] / refFreq[0], rangeIx); - if (flowMeter3 != null) ltrPerPulseCorrected += refFreq[flowMeter3.Idx1] * flowMeter3.LtrPerPulseCorrected(flow * refFreq[flowMeter3.Idx1] / refFreq[0], rangeIx); - return ltrPerPulseCorrected / refFreq[0]; + refPulses[0] = controlBoard.EtPulses(0); + refPulses[2] = controlBoard.EtPulses2; + refPulses[3] = controlBoard.EtPulses3; + refPulses[1] = refPulses[0] - refPulses[2] - refPulses[3]; + + log.DebugFormat("refPulses[] = ({0}, {1}, {2}, {3})", refPulses[0], refPulses[1], refPulses[2], refPulses[3]); + + double flow1, flow2, flow3; + double contribution1, contribution2, contribution3; + if (refFreq[0] != 0) + { + double ltrPerPulseCorrected = 0; + if (flowMeter1 != null) + { + double ratio = (double)refPulses[flowMeter1.Idx1] / (double)refPulses[0]; + flow1 = flow * ratio; + contribution1 = flowMeter1.LtrPerPulseCorrected(flow1, rangeIx) * ratio; + ltrPerPulseCorrected += contribution1; + log.DebugFormat("flowmeter1 = {0}, flow1 = {1}, contribution1 = {2}", flowMeter1.Name, flow1, contribution1); + } + if (flowMeter2 != null) + { + double ratio = (double)refPulses[flowMeter2.Idx1] / (double)refPulses[0]; + flow2 = flow * ratio; + contribution2 = flowMeter2.LtrPerPulseCorrected(flow2, rangeIx) * ratio; + ltrPerPulseCorrected += contribution2; + log.DebugFormat("flowmeter2 = {0}, flow2 = {1}, contribution2 = {2}", flowMeter2.Name, flow2, contribution2); + } + if (flowMeter3 != null) + { + double ratio = (double)refPulses[flowMeter3.Idx1] / (double)refPulses[0]; + flow3 = flow * ratio; + contribution3 = flowMeter3.LtrPerPulseCorrected(flow3, rangeIx) * ratio; + ltrPerPulseCorrected += contribution3; + log.DebugFormat("flowmeter3 = {0}, flow3 = {1}, contribution3 = {2}", flowMeter3.Name, flow3, contribution3); + } + + log.DebugFormat("LtrPerPulseCorrected() returns {0}", ltrPerPulseCorrected); + return ltrPerPulseCorrected; + } + else + { + log.DebugFormat("LtrPerPulseCorrected() returns 1"); + return 1; + } } @@ -56,7 +100,9 @@ namespace TBF.BenchControl.Elde.FlowMeterDewa public FlowMeter() { - } + refFreq = new double[4]; + refPulses = new int[4]; + } public FlowMeter(Generic.IComponentCfg cfg, IList components) : base(cfg) @@ -80,6 +126,7 @@ namespace TBF.BenchControl.Elde.FlowMeterDewa ltrPerPulse = nominalFlow / (flowMetersCount * 7200.0); /// Nominal freq. is flowMetersCount * 2000 Hz (2000, 4000 or 6000 Hz) refFreq = new double[4]; + refPulses = new int[4]; log.Debug(this.ToString()); } diff --git a/TBF/BenchControl/Elde/IControlCom.cs b/TBF/BenchControl/Elde/IControlCom.cs index 18ab7d4e3..3709ad6eb 100644 --- a/TBF/BenchControl/Elde/IControlCom.cs +++ b/TBF/BenchControl/Elde/IControlCom.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Copyright (c) 2013-2019 Sensus Slovensko a.s. /// using System; using Dirichlet.Numerics; @@ -11,7 +11,9 @@ namespace TBF.BenchControl.Elde StatusP StatusP { get; } int EtPulses(int wmNr1); int EtPulsesK { get; } - UInt16 WMeterPulses(int wmNr1); + int EtPulses2 { get; } + int EtPulses3 { get; } + UInt16 WMeterPulses(int wmNr1); int WMeterReference(int wmNr0); uint RegulValveDAC(int rvNr0); float Pressure(int prsNr0); diff --git a/TBF/BenchControl/Sequences/MainSeq.cs b/TBF/BenchControl/Sequences/MainSeq.cs index 1626acef2..5e5d32c18 100644 --- a/TBF/BenchControl/Sequences/MainSeq.cs +++ b/TBF/BenchControl/Sequences/MainSeq.cs @@ -488,7 +488,10 @@ namespace TBF.BenchControl.Sequences Debug.WriteLine(string.Format("Procedure {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure) ? "initialized" : "NOT initialized")); Debug.WriteLine(string.Format("Procedure.MoreParams {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.MoreParams) ? "initialized" : "NOT initialized")); Debug.WriteLine(string.Format("Procedure.Tests {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.Tests) ? "initialized" : "NOT initialized")); - Debug.WriteLine(string.Format("Procedure.Tests[0].MoreParams {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.Tests[0].MoreParams) ? "initialized" : "NOT initialized")); + if (StateMachine.Procedure.Tests.Count > 0) + { + Debug.WriteLine(string.Format("Procedure.Tests[0].MoreParams {0}", NHibernateUtil.IsInitialized(StateMachine.Procedure.Tests[0].MoreParams) ? "initialized" : "NOT initialized")); + } UiBridge.Bridge.OnError(this, string.Empty); /// Clear an error message (if any)