diff --git a/TODO.txt b/TODO.txt index da5a819f9..ed3cd44d7 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,6 +1,4 @@ iPerl: -- naimplementovat Spooler pre OracleDB -- updatovat progress bary pre iPerl comm. - neukladat process data pre UnknownPcbNr... vodomery - log pre pevny start, podobne (zarazky) ako pre letmy @@ -10,12 +8,10 @@ iPerl: - v iPerlCommunication ponukat stringy v drop-down menu - na Process obrazovke posunut stupacku a rezervoar uplne doprava -- ked su Q3 part 1 a Q3 part 2 neda sa vybrat cez UI Q3 part 2 - - export the DB (=make a backup of configuration) from TBF program - - +- IRegisterReader: int Position readonly property +- IRegisterReader: TestCompleted() implementation and use. - 'publish' a 'evaluate' pre vsetky metody - prechadzat na double (results) diff --git a/TestBenchFramework/BenchControl/Cameras/CameraRoi/CameraRoi.cs b/TestBenchFramework/BenchControl/Cameras/CameraRoi/CameraRoi.cs index 866e269b0..142ea42da 100644 --- a/TestBenchFramework/BenchControl/Cameras/CameraRoi/CameraRoi.cs +++ b/TestBenchFramework/BenchControl/Cameras/CameraRoi/CameraRoi.cs @@ -27,7 +27,17 @@ namespace TBF.BenchControl.Cameras.CameraRoi readonly GenericDevices.ICamera camera; public GenericDevices.ICamera Camera { get { return camera; } } - public float PulsesPerLtr { get { return cameraRoiCfg.ProcParams.GradPerLtr; } } + public double PulsesPerLtr { get { return (double)cameraRoiCfg.ProcParams.GradPerLtr; } } + public double LtrsPerPulse { get { return ltrsPerPulse; } } + readonly double ltrsPerPulse; + + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return ltrsPerPulse * (double)wmPulses; } } + + int wmPulses; + int wmRefPulses; + public CameraRoi() { @@ -37,6 +47,7 @@ namespace TBF.BenchControl.Cameras.CameraRoi : base(cfg) { cameraRoiCfg = cfg; + ltrsPerPulse = (PulsesPerLtr <= float.Epsilon) ? 0 : (1 / PulsesPerLtr); if (cfg.DebugLevel != DebugMode.Off) { @@ -50,6 +61,17 @@ namespace TBF.BenchControl.Cameras.CameraRoi log.Debug(this.ToString()); } + public void Clear() + { + wmPulses = 0; + wmRefPulses = 0; + } + + public void TestCompleted() + { + /// TODO: Implement + } + /// /// Events: Event.ReadRegisterDone, Event.Error /// diff --git a/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/ReadReferenceForRegisterOp.cs b/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/ReadReferenceForRegisterOp.cs deleted file mode 100644 index 55bf32395..000000000 --- a/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/ReadReferenceForRegisterOp.cs +++ /dev/null @@ -1,60 +0,0 @@ -/// -/// Copyright (c) 2013-2015 Sensus Metering Systems -/// -using System; -using log4net; -using TBF.Boxes; - -namespace TBF.BenchControl.Elde.FixedStartRegisterReader -{ - public class ReadReferenceForRegisterOp : IOperation - { - private static readonly ILog log = LogManager.GetLogger(typeof(ReadReferenceForRegisterOp)); - public override string ToString() { return string.Format("ReadWaterMeterOp(.,{0},.)", eventDone); } - - /// Set by the constructor - readonly ControlBoardDev controlBoard; - readonly Event eventDone; - IntBox pulses; - - /// - /// Events: or Error - /// - /// Flow meter reference - /// Reference to the measured flow variable, value is in bar - /// Event to be returned by Run() when completed OK - public ReadReferenceForRegisterOp(RegisterReader register, ref IntBox pulses, Event eventDone) - { - if (register == null) throw new ArgumentNullException("register"); - this.controlBoard = register.ControlBoard; - this.eventDone = eventDone; - this.pulses = pulses; - - log.Debug(this.ToString()); - } - public ReadReferenceForRegisterOp(RegisterReader register, ref IntBox pulses) - : this(register, ref pulses, Event.ReadReferenceDone) - { - } - - /// Start this operation - public void Start() - { - } - - /// Run this operation - /// - /// Event.FlowInDone or Event.FlowOutDone - /// - public Event Run() - { - pulses.Val = controlBoard.EtPulses(0); - return eventDone; - } - - /// Stop this operation - public void Stop() - { - } - } -} diff --git a/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/ReadRegisterOp.cs b/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/ReadRegisterOp.cs deleted file mode 100644 index 0d808a60c..000000000 --- a/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/ReadRegisterOp.cs +++ /dev/null @@ -1,75 +0,0 @@ -/// -/// Copyright (c) 2013-2015 Sensus Metering Systems -/// -using System; -using log4net; -using TBF.Boxes; - -namespace TBF.BenchControl.Elde.FixedStartRegisterReader -{ - public class ReadRegisterOp : IOperation - { - private static readonly ILog log = LogManager.GetLogger(typeof(ReadRegisterOp)); - public override string ToString() { return string.Format("ReadRegisterOp({0})", reader.Name); } - - /// Set by the constructor - readonly RegisterReader reader; - IntBox pulses; - IntBox refPulses; - - /// - /// Events: Event.ReadRegisterDone or Event.Error - /// - /// Register reader reference - /// Reference to a field with the water meter pulses - public ReadRegisterOp(GenericDevices.IRegisterReader reader, ref IntBox pulses) - { - this.reader = reader as RegisterReader; - if (reader == null) throw new ArgumentNullException("reader is null or it is not Elde"); - - this.pulses = pulses; - log.Debug(this.ToString()); - } - - /// - /// Events: Event.ReadRegisterDone or Event.Error - /// - /// Register reader reference - /// Reference to a Box with the water meter pulses - /// Reference to a Box with the reference flow meter pulses synchronized with the water meter - public ReadRegisterOp(GenericDevices.IRegisterReader reader, ref IntBox pulses, ref IntBox refPulses) - : this(reader, ref pulses) - { - this.refPulses = refPulses; - log.Debug(this.ToString()); - } - - private void ReadPulses() - { - pulses.Val = (int)(reader.EndWMState - reader.BeginWMState); /// TODO: replace 0 - if (refPulses != null) - { - refPulses.Val = (int)reader.ControlBoard.EtPulses(0); - } - } - - /// Start this operation - public void Start() - { - ReadPulses(); - } - - /// Run this operation - /// eventDone - public Event Run() - { - ReadPulses(); - return Event.ReadRegisterDone; - } - - /// Stop this operation - public void Stop() - { - } - } -} diff --git a/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs b/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs index 201c8e2ac..1ee585add 100644 --- a/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs +++ b/TestBenchFramework/BenchControl/Elde/FixedStartRegisterReader/RegisterReader.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Copyright (c) 2013-2016 Sensus Metering Systems /// using System; using System.Collections.Generic; @@ -8,7 +8,7 @@ using TBF.Boxes; namespace TBF.BenchControl.Elde.FixedStartRegisterReader { - public class RegisterReader : ComponentBase, GenericDevices.IRegisterReader + public class RegisterReader : ComponentBase, GenericDevices.IRegisterReader, IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(RegisterReader)); public override string ToString() { return string.Format("FixedStartRegisterReader({0})", Cfg.ToString(1)); } @@ -18,56 +18,103 @@ namespace TBF.BenchControl.Elde.FixedStartRegisterReader public float BeginWMState; public float EndWMState; - public float PulsesPerLtr { get { return registerReaderCfg.ProcParams.PulsesPerLtr; } } + public double PulsesPerLtr { get { return (double)registerReaderCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return ltrsPerPulse; } } + readonly double ltrsPerPulse; + + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return ltrsPerPulse * (double)wmPulses; } } + + int wmPulses; + int wmRefPulses; + IntBox pulsesBox; + IntBox refPulsesBox; + + readonly ControlBoardDev controlBoard; - public readonly ControlBoardDev ControlBoard; public RegisterReader() { + Clear(); } public RegisterReader(RegisterReaderCfg cfg, IList components) : base(cfg) { registerReaderCfg = cfg; + ltrsPerPulse = (cfg.ProcParams.PulsesPerLtr <= float.Epsilon) ? 0 : (1 / cfg.ProcParams.PulsesPerLtr); - ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); - if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); /// Prepare data for SendCalibData() control board component method log.Debug(this.ToString()); } + public void Clear() + { + wmPulses = 0; + wmRefPulses = 0; + } + + public void TestCompleted() + { + ReadPulses(); + } + /// /// Events: Event.ReadRegisterDone, Event.Error /// - /// Reference to a variable for the water meter pulses + /// Reference to a variable for the water meter pulses /// ReadWaterMeter instance reference casted to IOperaton - public IOperation ReadRegisterOp(ref IntBox pulses) + public IOperation ReadRegisterOp(ref IntBox pulsesBox) { - return new ReadRegisterOp(this, ref pulses); + this.pulsesBox = pulsesBox; + return this; } /// /// Events: Event.ReadRegisterDone, Event.Error /// - /// Reference to a variable for the water meter pulses - /// Reference to a variable for the related reference flowmeter pulses + /// Reference to a variable for the water meter pulses + /// Reference to a variable for the related reference flowmeter pulses /// Reference to operation object instance - public IOperation ReadRegisterOp(ref IntBox pulses, ref IntBox refPulses) + public IOperation ReadRegisterOp(ref IntBox pulsesBox, ref IntBox refPulsesBox) { - return new ReadRegisterOp(this, ref pulses, ref refPulses); + this.pulsesBox = pulsesBox; + this.refPulsesBox = refPulsesBox; + return this; } - /// - /// Events: ReadReferenceDone, Error - /// - /// Reference to a variable for the water meter pulses - /// Reference to operation object instance - public IOperation ReadReferenceForRegisterOp(ref IntBox pulses, ref IntBox refPulses) - { - return new ReadReferenceForRegisterOp(this, ref pulses); - } + + private void ReadPulses() + { + wmPulses = (int)(EndWMState - BeginWMState); /// TODO: replace 0 + wmRefPulses = (int)controlBoard.EtPulses(0); + + pulsesBox.Val = wmPulses; + if (refPulsesBox != null) refPulsesBox.Val = wmRefPulses; + } + + /// Start this operation + public void Start() + { + ReadPulses(); + } + + /// Run this operation + /// eventDone + public Event Run() + { + ReadPulses(); + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + } } } diff --git a/TestBenchFramework/BenchControl/Elde/RegisterReader/ReadReferenceForRegisterOp.cs b/TestBenchFramework/BenchControl/Elde/RegisterReader/ReadReferenceForRegisterOp.cs deleted file mode 100644 index a683be9fe..000000000 --- a/TestBenchFramework/BenchControl/Elde/RegisterReader/ReadReferenceForRegisterOp.cs +++ /dev/null @@ -1,62 +0,0 @@ -/// -/// Copyright (c) 2013-2015 Sensus Metering Systems -/// -using System; -using log4net; -using TBF.Boxes; - -namespace TBF.BenchControl.Elde.RegisterReader -{ - public class ReadReferenceForRegisterOp : IOperation - { - private static readonly ILog log = LogManager.GetLogger(typeof(ReadReferenceForRegisterOp)); - public override string ToString() { return string.Format("ReadWaterMeterOp(.,{0},{1},.)", eventDone, registerNr); } - - /// Set by the constructor - readonly ControlBoardDev controlBoard; - readonly int registerNr; /// 1 .. nr.watermeters - readonly Event eventDone; - IntBox pulses; - - /// - /// Events: or Error - /// - /// Flow meter reference - /// Reference to the measured flow variable, value is in bar - /// Event to be returned by Run() when completed OK - public ReadReferenceForRegisterOp(RegisterReader register, ref IntBox pulses, Event eventDone) - { - if (register == null) throw new ArgumentNullException("register"); - this.controlBoard = register.ControlBoard; - this.registerNr = register.Position; - this.eventDone = eventDone; - this.pulses = pulses; - - log.Debug(this.ToString()); - } - public ReadReferenceForRegisterOp(RegisterReader register, ref IntBox pulses) - : this(register, ref pulses, Event.ReadReferenceDone) - { - } - - /// Start this operation - public void Start() - { - } - - /// Run this operation - /// - /// Event.FlowInDone or Event.FlowOutDone - /// - public Event Run() - { - pulses.Val = (int)controlBoard.EtPulses(registerNr); - return eventDone; - } - - /// Stop this operation - public void Stop() - { - } - } -} diff --git a/TestBenchFramework/BenchControl/Elde/RegisterReader/ReadRegisterOp.cs b/TestBenchFramework/BenchControl/Elde/RegisterReader/ReadRegisterOp.cs deleted file mode 100644 index 291ee940f..000000000 --- a/TestBenchFramework/BenchControl/Elde/RegisterReader/ReadRegisterOp.cs +++ /dev/null @@ -1,103 +0,0 @@ -/// -/// Copyright (c) 2013-2015 Sensus Metering Systems -/// -using System; -using log4net; -using TBF.Boxes; - -namespace TBF.BenchControl.Elde.RegisterReader -{ - public class ReadRegisterOp : IOperation - { - private static readonly ILog log = LogManager.GetLogger(typeof(ReadRegisterOp)); - public override string ToString() { return string.Format("ReadRegisterOp({0})", reader.Name); } - - /// Set by the constructor - readonly RegisterReader reader; - - IntBox pulses; - int lastPulses; - bool lastPulsesValid; - - IntBox refPulses; - - /// - /// Events: Event.ReadRegisterDone or Event.Error - /// - /// Register reader reference - /// Reference to a field with the water meter pulses - public ReadRegisterOp(GenericDevices.IRegisterReader reader, ref IntBox pulses) - { - this.reader = reader as RegisterReader; - if (reader == null) throw new ArgumentNullException("reader is null or it is not Elde"); - - this.pulses = pulses; - lastPulsesValid = false; - log.Debug(this.ToString()); - } - - /// - /// Events: Event.ReadRegisterDone or Event.Error - /// - /// Register reader reference - /// Reference to a Box with the water meter pulses - /// Reference to a Box with the reference flow meter pulses synchronized with the water meter - public ReadRegisterOp(GenericDevices.IRegisterReader reader, ref IntBox pulses, ref IntBox refPulses) - : this(reader, ref pulses) - { - this.refPulses = refPulses; - log.Debug(this.ToString()); - } - - private void ReadPulses() - { - if (!lastPulsesValid) - { - lastPulses = (int)reader.ControlBoard.WMeterPulses(reader.Position); - lastPulsesValid = true; - } - else - { - UInt16 lowerWord = reader.ControlBoard.WMeterPulses(reader.Position); - int uncorrected = (int)(((uint)lastPulses & 0xFFFF0000) | lowerWord); - if (Math.Abs(uncorrected - lastPulses) <= Int16.MaxValue) - { - lastPulses = uncorrected; - } - else if (Math.Abs(uncorrected + 65536 - lastPulses) <= Int16.MaxValue) - { - lastPulses = uncorrected + 65536; - } - else if (Math.Abs(uncorrected - 65536 - lastPulses) <= Int16.MaxValue) - { - lastPulses = uncorrected - 65536; - } - } - pulses.Val = lastPulses; - - if (refPulses != null) - { - refPulses.Val = (int)reader.ControlBoard.EtPulses(reader.Position); - } - } - - /// Start this operation - public void Start() - { - ReadPulses(); - } - - /// Run this operation - /// eventDone - public Event Run() - { - ReadPulses(); - return Event.ReadRegisterDone; - } - - /// Stop this operation - public void Stop() - { - } - } -} diff --git a/TestBenchFramework/BenchControl/Elde/RegisterReader/RegisterReader.cs b/TestBenchFramework/BenchControl/Elde/RegisterReader/RegisterReader.cs index 81d1d34ce..3a6fdfb39 100644 --- a/TestBenchFramework/BenchControl/Elde/RegisterReader/RegisterReader.cs +++ b/TestBenchFramework/BenchControl/Elde/RegisterReader/RegisterReader.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Copyright (c) 2013-2016 Sensus Metering Systems /// using System; using System.Collections.Generic; @@ -8,7 +8,7 @@ using TBF.Boxes; namespace TBF.BenchControl.Elde.RegisterReader { - public class RegisterReader : ComponentBase, GenericDevices.IRegisterReader + public class RegisterReader : ComponentBase, GenericDevices.IRegisterReader, IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(RegisterReader)); public override string ToString() { return string.Format("RegisterReader({0})", Cfg.ToString(1)); } @@ -16,57 +16,133 @@ namespace TBF.BenchControl.Elde.RegisterReader readonly RegisterReaderCfg registerReaderCfg; public int Position { get { return registerReaderCfg.Position; } } /// 1 .. inf - public float PulsesPerLtr { get { return registerReaderCfg.ProcParams.PulsesPerLtr; } } + /// + public double PulsesPerLtr { get { return (double)registerReaderCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return ltrsPerPulse; } } + readonly double ltrsPerPulse; - public readonly ControlBoardDev ControlBoard; + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return ltrsPerPulse * (double)wmPulses; } } + + int wmPulses; + int wmRefPulses; + IntBox pulsesBox; + IntBox refPulsesBox; + + /// This is to cope with counter overflow + int lastPulses; + bool lastPulsesValid; + + readonly ControlBoardDev controlBoard; public RegisterReader() { + Clear(); } public RegisterReader(RegisterReaderCfg cfg, IList components) : base(cfg) { registerReaderCfg = cfg; + ltrsPerPulse = (cfg.ProcParams.PulsesPerLtr <= float.Epsilon) ? 0 : (1 / cfg.ProcParams.PulsesPerLtr); - ControlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); - if (ControlBoard == null) throw new Exception("Cannot find " + Name + " parent"); + controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); + if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); /// Prepare data for SendCalibData() control board component method log.Debug(this.ToString()); } + public void Clear() + { + wmPulses = 0; + wmRefPulses = 0; + lastPulsesValid = false; + } + + public void TestCompleted() + { + ReadPulses(); + } + /// /// Events: Event.ReadRegisterDone, Event.Error /// - /// Reference to a variable for the water meter pulses + /// Reference to a variable for the water meter pulses /// ReadWaterMeter instance reference casted to IOperaton - public IOperation ReadRegisterOp(ref IntBox pulses) + public IOperation ReadRegisterOp(ref IntBox pulsesBox) { - return new ReadRegisterOp(this, ref pulses); + this.pulsesBox = pulsesBox; + return this; } /// /// Events: Event.ReadRegisterDone, Event.Error /// - /// Reference to a variable for the water meter pulses - /// Reference to a variable for the related reference flowmeter pulses + /// Reference to a variable for the water meter pulses + /// Reference to a variable for the related reference flowmeter pulses /// Reference to operation object instance - public IOperation ReadRegisterOp(ref IntBox pulses, ref IntBox refPulses) + public IOperation ReadRegisterOp(ref IntBox pulsesBox, ref IntBox refPulsesBox) { - return new ReadRegisterOp(this, ref pulses, ref refPulses); + this.pulsesBox = pulsesBox; + this.refPulsesBox = refPulsesBox; + return this; } - /// - /// Events: ReadReferenceDone, Error - /// - /// Reference to a variable for the water meter pulses - /// Reference to operation object instance - public IOperation ReadReferenceForRegisterOp(ref IntBox pulses, ref IntBox refPulses) - { - return new ReadReferenceForRegisterOp(this, ref pulses); - } - } + + private void ReadPulses() + { + if (!lastPulsesValid) + { + lastPulses = (int)controlBoard.WMeterPulses(Position); + lastPulsesValid = true; + } + else + { + UInt16 lowerWord = controlBoard.WMeterPulses(Position); + int uncorrected = (int)(((uint)lastPulses & 0xFFFF0000) | lowerWord); + if (Math.Abs(uncorrected - lastPulses) <= Int16.MaxValue) + { + lastPulses = uncorrected; + } + else if (Math.Abs(uncorrected + 65536 - lastPulses) <= Int16.MaxValue) + { + lastPulses = uncorrected + 65536; + } + else if (Math.Abs(uncorrected - 65536 - lastPulses) <= Int16.MaxValue) + { + lastPulses = uncorrected - 65536; + } + } + + wmPulses = lastPulses; + wmRefPulses = (int)controlBoard.EtPulses(Position); + + pulsesBox.Val = wmPulses; + if (refPulsesBox != null) refPulsesBox.Val = wmRefPulses; + } + + /// Start this operation + public void Start() + { + lastPulsesValid = false; + ReadPulses(); + } + + /// Run this operation + /// eventDone + public Event Run() + { + ReadPulses(); + return Event.ReadRegisterDone; + } + + /// Stop this operation + public void Stop() + { + } + } } diff --git a/TestBenchFramework/BenchControl/GenericDevices/IRegisterReader.cs b/TestBenchFramework/BenchControl/GenericDevices/IRegisterReader.cs index 18e58a461..07620969e 100644 --- a/TestBenchFramework/BenchControl/GenericDevices/IRegisterReader.cs +++ b/TestBenchFramework/BenchControl/GenericDevices/IRegisterReader.cs @@ -8,9 +8,19 @@ namespace TBF.BenchControl.GenericDevices { public interface IRegisterReader : IComponent { - float PulsesPerLtr { get; } + double PulsesPerLtr { get; } /// Entered by users in configuration + double LtrsPerPulse { get; } /// To calculate the volume from WMPulses + + int WMPulses { get; } /// Counted pulses of the water meter + double WMVolume { get; } /// Counted volume of the water metter + int WMRefPulses { get; } /// 'Gated' reference pulses of the water meters + + void Clear(); /// To be used at the beginning of a test + + void TestCompleted(); /// To be used when the test is completed ... + /// ... for more accurate WMPulses, WMRefPulses calculation + IOperation ReadRegisterOp(ref IntBox pulses); IOperation ReadRegisterOp(ref IntBox pulses, ref IntBox refPulses); - IOperation ReadReferenceForRegisterOp(ref IntBox pulses, ref IntBox refPulses); } } diff --git a/TestBenchFramework/BenchControl/Sequences/MainSeq.cs b/TestBenchFramework/BenchControl/Sequences/MainSeq.cs index 20b9bb94e..510a6a8db 100644 --- a/TestBenchFramework/BenchControl/Sequences/MainSeq.cs +++ b/TestBenchFramework/BenchControl/Sequences/MainSeq.cs @@ -513,12 +513,14 @@ namespace TBF.BenchControl.Sequences if (testMethodSequence != null && testMethodSequence.CanTest(StateMachine.Procedure.MetersKind)) { StateMachine.LoadTestParams(test); + ProcessData.RegisterReaders = sensPath.RegisterReaders; - if (BenchInfo != null && sensPath.RegisterReaders != null) + foreach (var rr in sensPath.RegisterReaders) { - foreach (var rr in sensPath.RegisterReaders) - if (rr is WaterMeters.iPerl.WaterMeter) - (rr as WaterMeters.iPerl.WaterMeter).BenchName = BenchInfo.TestBenchName; + if ((rr is WaterMeters.iPerl.WaterMeter) && (BenchInfo != null)) + { + (rr as WaterMeters.iPerl.WaterMeter).BenchName = BenchInfo.TestBenchName; + } } e = testMethodSequence.Execute(test); @@ -570,13 +572,15 @@ namespace TBF.BenchControl.Sequences if (testMethodSequence != null && testMethodSequence.CanTest(StateMachine.Procedure.MetersKind)) { StateMachine.LoadTestParams(test); + ProcessData.RegisterReaders = sensPath.RegisterReaders; - if (BenchInfo != null && sensPath.RegisterReaders != null) - { - foreach (var rr in sensPath.RegisterReaders) - if (rr is WaterMeters.iPerl.WaterMeter) - (rr as WaterMeters.iPerl.WaterMeter).BenchName = BenchInfo.TestBenchName; - } + foreach (var rr in sensPath.RegisterReaders) + { + if ((rr is WaterMeters.iPerl.WaterMeter) && (BenchInfo != null)) + { + (rr as WaterMeters.iPerl.WaterMeter).BenchName = BenchInfo.TestBenchName; + } + } e = testMethodSequence.Execute(test); diff --git a/TestBenchFramework/BenchControl/Sequences/ProcessData.cs b/TestBenchFramework/BenchControl/Sequences/ProcessData.cs index e82011cc5..b7fe624fa 100644 --- a/TestBenchFramework/BenchControl/Sequences/ProcessData.cs +++ b/TestBenchFramework/BenchControl/Sequences/ProcessData.cs @@ -8,31 +8,61 @@ namespace TBF.BenchControl.Sequences { public static IBenchInfo BenchInfo; - public static FloatBox AmbientTemp = new FloatBox() { Name = "Ambient Temperature", Format = "F1" }; /// [Celsius] + public static FloatBox AmbientTemp = new FloatBox() { Name = "Ambient Temperature", Format = "F1" }; /// [Celsius] public static FloatBox AmbientPressure = new FloatBox() { Name = "Ambient Pressure", Format = "F1" }; - public static FloatBox AmbientHumidity = new FloatBox() { Name = "Ambient Humidity", Format = "F1" }; /// [%] - public static FloatBox TempIn = new FloatBox() { Name = "Temperature In", Format = "F2" }; /// [Celsius] - public static FloatBox TempOut = new FloatBox() { Name = "Temperature Out", Format = "F2" }; /// [Celsius] - public static FloatBox TempDiv = new FloatBox() { Name = "Temperature Div", Format = "F2" }; /// [Celsius] + public static FloatBox AmbientHumidity = new FloatBox() { Name = "Ambient Humidity", Format = "F1" }; /// [%] + public static FloatBox TempIn = new FloatBox() { Name = "Temperature In", Format = "F2" }; /// [Celsius] + public static FloatBox TempOut = new FloatBox() { Name = "Temperature Out", Format = "F2" }; /// [Celsius] + public static FloatBox TempDiv = new FloatBox() { Name = "Temperature Div", Format = "F2" }; /// [Celsius] public static FloatBox PressureUp = new FloatBox() { Name = "Pressure In", Format = "F3", Factor = 0.01f }; public static FloatBox PressureDown = new FloatBox() { Name = "Pressure Out", Format = "F3", Factor = 0.01f }; - - public static IntBox RefCount = new IntBox() { Name = "RefCount" }; - public static FloatBox RefFreq = new FloatBox() { Name = "RefFreq", Format = "F2" }; - public static FloatBox RefFlow = new FloatBox() { Name = "RefFlow", Format = "F2" }; /// [m3/h] - public static float LtrPerRefPulse; /// to calculate ref. volume - public static FloatBox Mass = new FloatBox() { Name = "Mass", Format = "F3" }; /// [kg] - public static FloatBox StartMass = new FloatBox() { Name = "Start Mass", Format = "F3" }; /// [kg] - public static FloatBox EndMass = new FloatBox() { Name = "End Mass", Format = "F3" }; /// [kg] + public static float LtrPerRefPulse; /// to calculate the ref.volume + public static IntBox RefCount = new IntBox() { Name = "RefCount" }; + public static FloatBox RefFreq = new FloatBox() { Name = "RefFreq", Format = "F2" }; + public static FloatBox RefFlow = new FloatBox() { Name = "RefFlow", Format = "F2" }; /// [m3/h] + + public static FloatBox Mass = new FloatBox() { Name = "Mass", Format = "F3" }; /// [kg] + public static FloatBox StartMass = new FloatBox() { Name = "Start Mass", Format = "F3" }; /// [kg] + public static FloatBox EndMass = new FloatBox() { Name = "End Mass", Format = "F3" }; /// [kg] public static DateTime TestStartTime; public static DateTime TestEndTime; - public static Results.BatchResults BatchRslts; + public static IRegisterReader[] RegisterReaders; + /// + static ProcessData() + { + /// + /// RegisterReaders should never be null, RegisterReader.Length should be Config.Data.WMsCount + /// RegisterReader[i] where i = 0..Config.Data.WMsCount-1 may be null and should always be tested + /// + RegisterReaders = new IRegisterReader[Config.Data.WMsCount]; + } + + + /// + /// To clear process values at the beginning of each test + /// + protected void ClearProcessValues() + { + for (int i = 0; i < RegisterReaders.Length; i++) + { + if (RegisterReaders[i] != null) RegisterReaders[i].Clear(); + } + + RefCount.Clear(); + RefFreq.Clear(); + RefFlow.Clear(); + Mass.Clear(); + StartMass.Clear(); + EndMass.Clear(); + } + + /// /// Statistics of 'continuous' variables (temperature, pressure, flow, etc.) /// diff --git a/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs b/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs index 396a87e81..14ef10832 100644 --- a/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs +++ b/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs @@ -86,30 +86,6 @@ namespace TBF.BenchControl.Sequences protected static FloatBox[] WMVolumes; protected static FloatBox[] WMErrors; - /// - /// To clear process values at the beginning of each test - /// - protected void ClearProcessValues() - { - //if (WMPulses != null) { for (int i = 0; i < WMPulses.Length; i++) WMPulses[i] = 0; } - //if (WMRefPulses != null) { for (int i = 0; i < WMRefPulses.Length; i++) WMPulses[i] = 0; } - - for (int i = 0; i < Config.Data.WMsCount; i++) - { - WMPulses[i] = 0; - WMPulses[i] = 0; - WMVolumes[i].Clear(); - WMErrors[i].Clear(); - } - - RefCount.Clear(); - RefFreq.Clear(); - RefFlow.Clear(); - Mass.Clear(); - StartMass.Clear(); - EndMass.Clear(); - } - /// /// Process data logging diff --git a/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs b/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs index 635a2f372..2634d3fa4 100644 --- a/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs @@ -306,17 +306,17 @@ namespace TBF.BenchControl.TestMethods.Adjustment if (meterRslt != null && regReader != null) { meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; - meterRslt.PulsesMeter = Convert.ToDouble(WMPulses[i]); - meterRslt.PulsesMaster = Convert.ToDouble(WMRefPulses[i]); - meterRslt.VolumeStart = 0; /// liter - meterRslt.VolumeEnd = 0; /// liter - meterRslt.VolumeMeter = (meterRslt.PulsesPerLiter <= float.Epsilon) ? 0 : meterRslt.PulsesMeter / meterRslt.PulsesPerLiter; - meterRslt.VolumeRef = tstRslt.ConstMaster * meterRslt.PulsesMaster; /// liter - meterRslt.TestTime = tstRslt.TestTime; - meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); - meterRslt.Passed = (meterRslt.Error >= test.ErrLimLo + test.Uncertainty) - && (meterRslt.Error <= test.ErrLimHi - test.Uncertainty); - meterRslt.TestDone = meterRslt.Passed; + meterRslt.PulsesMeter = Convert.ToDouble(WMPulses[i]); + meterRslt.PulsesMaster = Convert.ToDouble(WMRefPulses[i]); + meterRslt.VolumeStart = 0; /// liter + meterRslt.VolumeEnd = 0; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + meterRslt.Passed = (meterRslt.Error >= test.ErrLimLo + test.Uncertainty) + && (meterRslt.Error <= test.ErrLimHi - test.Uncertainty); + meterRslt.TestDone = meterRslt.Passed; } } diff --git a/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs b/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs index d7a6e348f..7c6d6f62a 100644 --- a/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs @@ -412,13 +412,11 @@ namespace TBF.BenchControl.TestMethods.CombinedMeters meterRslt.PulsesMeter = (isAux == 0 && testParams.SupressTrills) ? 0 : Convert.ToDouble(WMPulses[2 * i + isAux]); meterRslt.PulsesMaster = Convert.ToDouble(WMRefPulses[2 * i + isAux]); - meterRslt.TestTime = tstRslt.TestTime; - meterRslt.VolumeStart = 0; - meterRslt.VolumeEnd = 0; - meterRslt.VolumeRef = tstRslt.VolumeCTV; - - meterRslt.VolumeMeter = (regReader.PulsesPerLtr <= float.Epsilon) - ? 0 : meterRslt.PulsesMeter / meterRslt.PulsesPerLiter; + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter if (meterRslt.PulsesMaster != 0) { diff --git a/TestBenchFramework/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs b/TestBenchFramework/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs index fb9254f4a..14f7eeeb1 100644 --- a/TestBenchFramework/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/CombinedWithDetection/CombinedWithDetectionSeq.cs @@ -587,15 +587,14 @@ namespace TBF.BenchControl.TestMethods.CombinedWithDetection /// Optionally supress pulses from the large water meter meterRslt.PulsesMeter = (isAux == 0 && testParams.SupressTrills) ? 0 : Convert.ToDouble(WMPulses[2 * i + isAux]); - meterRslt.PulsesMaster = Convert.ToDouble(WMRefPulses[2 * i + isAux]); - meterRslt.TestTime = cBrd.TTime; - meterRslt.VolumeStart = 0; - meterRslt.VolumeEnd = 0; - meterRslt.VolumeRef = tstRslt.VolumeCTV; - - meterRslt.VolumeMeter = (regReader.PulsesPerLtr <= float.Epsilon) - ? 0 : meterRslt.PulsesMeter / meterRslt.PulsesPerLiter; + meterRslt.PulsesMaster = Convert.ToDouble(WMRefPulses[2 * i + isAux]); + meterRslt.TestTime = cBrd.TTime; + meterRslt.VolumeStart = 0; + meterRslt.VolumeEnd = 0; + meterRslt.VolumeRef = tstRslt.VolumeCTV; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + /// if (meterRslt.PulsesMaster != 0) { meterRslt.VolumeMeter *= (tstRslt.PulsesMaster / meterRslt.PulsesMaster); diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs index ba7bc36e4..177977e92 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs @@ -285,8 +285,8 @@ namespace TBF.BenchControl.TestMethods.FlyingStart meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky meterRslt.VolumeStart = 0; meterRslt.VolumeEnd = 0; - meterRslt.VolumeMeter = (meterRslt.PulsesPerLiter <= float.Epsilon) ? 0 : meterRslt.PulsesMeter / meterRslt.PulsesPerLiter; - meterRslt.VolumeRef = tstRslt.ConstMaster * meterRslt.PulsesMaster; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter } meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index 7039045a6..bf8e784ce 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -470,10 +470,10 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection else { meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky - meterRslt.VolumeStart = 0; /// liter - meterRslt.VolumeEnd = 0; /// liter - meterRslt.VolumeMeter = (meterRslt.PulsesPerLiter <= float.Epsilon) ? 0 : meterRslt.PulsesMeter / meterRslt.PulsesPerLiter; - meterRslt.VolumeRef = tstRslt.ConstMaster * meterRslt.PulsesMaster; /// liter + meterRslt.VolumeStart = 0; /// liter + meterRslt.VolumeEnd = 0; /// liter + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter } meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs index e8e3720db..42a261ebf 100644 --- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs +++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs @@ -29,7 +29,9 @@ namespace TBF.BenchControl.WaterMeters.iPerl public int MuxBoardNr { get { return iPerlCfg.MuxBoardNr; } } public int Group { get { return iPerlCfg.Group; } } - public float PulsesPerLtr { get { return iPerlCfg.ProcParams.PulsesPerLtr; } } + public double PulsesPerLtr { get { return (double)iPerlCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return ltrsPerPulse; } } + readonly double ltrsPerPulse; /// WaterMeter producer public string Producer { get { return iPerlCfg.ProcParams.Producer; } } @@ -119,6 +121,20 @@ namespace TBF.BenchControl.WaterMeters.iPerl public double NominalTestFlow; /// liter per hour + /// + /// Required for IRegisterReader interface + /// + public int WMPulses { get { return wmPulses; } } + public int WMRefPulses { get { return wmRefPulses; } } + public double WMVolume { get { return wmVolume; } } + public double WMTestTime { get { return wmTestTime; } } + + double wmVolume; + int wmPulses; + int wmRefPulses; + double wmTestTime; + + /// /// New calibration factor calculated from the original factor (argument) /// and results of the last test. @@ -282,6 +298,8 @@ namespace TBF.BenchControl.WaterMeters.iPerl ClearData(); iPerlCfg = cfg; + ltrsPerPulse = (cfg.ProcParams.PulsesPerLtr <= float.Epsilon) ? 0 : (1 / cfg.ProcParams.PulsesPerLtr); + log.Debug(this.ToString()); } @@ -429,16 +447,23 @@ namespace TBF.BenchControl.WaterMeters.iPerl } /// - /// Events: ReadReferenceDone, Error + /// Clear data/counters related to a specific tests /// - /// Reference to a variable for the water meter pulses - /// Reference to a variable for the water meter pulses - /// Reference to operation object instance - public IOperation ReadReferenceForRegisterOp(ref Boxes.IntBox pulses, ref Boxes.IntBox refPulses) + public void Clear() { - this.pulses = pulses; - this.refPulses = refPulses; - return this; + sampleNr = 0; + + volumeLtr = 0; + volumeLtr0 = 0; + timestampSec = 0; + timestampSec0 = 0; + + ReadPulses(); + } + + public void TestCompleted() + { + /// TODO: Implement } @@ -447,6 +472,8 @@ namespace TBF.BenchControl.WaterMeters.iPerl /// Start this operation public void Start() { + Clear(); + /// Reset opto data optoDataCount = 0; TestStartTelegramIx = 0; @@ -469,14 +496,6 @@ namespace TBF.BenchControl.WaterMeters.iPerl flowNr, StateMachine.CycleStartHH_MI_SS); - sampleNr = 0; - - volumeLtr = 0; - volumeLtr0 = 0; - timestampSec = 0; - timestampSec0 = 0; - - ReadPulses(); StartParsingOptoSerialPort(); } @@ -561,9 +580,14 @@ namespace TBF.BenchControl.WaterMeters.iPerl void ReadPulses() { - pulses.Val = (int)((volumeLtr - volumeLtr0) * (double)PulsesPerLtr + 0.5); - if (timeSec != null) timeSec.Val = timestampSec - timestampSec0; - if (refPulses != null) refPulses.Val = StateMachine.ControlBoard.EtPulses(0); + wmVolume = volumeLtr - volumeLtr0; + wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5); + wmRefPulses = StateMachine.ControlBoard.EtPulses(0); + wmTestTime = timestampSec - timestampSec0; + + pulses.Val = wmPulses; + if (refPulses != null) refPulses.Val = wmRefPulses; + if (timeSec != null) timeSec.Val = wmTestTime; } diff --git a/TestBenchFramework/Screens/ProcessTabPageCtrl24.cs b/TestBenchFramework/Screens/ProcessTabPageCtrl24.cs index 461a58d34..2ac625e05 100644 --- a/TestBenchFramework/Screens/ProcessTabPageCtrl24.cs +++ b/TestBenchFramework/Screens/ProcessTabPageCtrl24.cs @@ -400,63 +400,82 @@ namespace TBF.Screens massLabel.Text = ProcessData.Mass.ToString(); - /// - /// Available when setting the flow - /// - refFreqLabel.Text = ProcessData.RefFreq.ToString(); - refFlowLabel.Text = Utils.FloatToStr(ProcessData.RefFlow.Val, 4); - - - /// - /// Available during a test - /// - refPulsesLabel.Text = ProcessData.RefCount.ToString(); - double refVolume = ProcessData.LtrPerRefPulse * (double)ProcessData.RefCount.Val; - - float massDiff = ProcessData.Mass.Val - ProcessData.StartMass.Val; - massDiffLabel.Text = massDiff.ToString("F3"); - float volumeCtv = 1001.03f * massDiff / (float)TBF.BenchControl.Formulas.WaterDensityFromTemp(ProcessData.TempOut.Val); - volumeCtvLabel.Text = volumeCtv.ToString("F2"); - double refError = TBF.BenchControl.Formulas.ErrorFromVolumes(refVolume, volumeCtv); - refErrorLabel.Text = refError.ToString("F3"); - - if (currentMetersKind == MetersKind.Single) + if (args.TestPhase == Config.Entities.Progress.FlowSetting) { - for (int i = 0; i < textBoxesCount; i++) + /// + /// Available when setting the flow + /// + refFreqLabel.Text = ProcessData.RefFreq.ToString(); + refFlowLabel.Text = Utils.FloatToStr(ProcessData.RefFlow.Val, 4); + } + + if (args.TestPhase == Config.Entities.Progress.FlowSetting || + args.TestPhase == Config.Entities.Progress.Test) + { + /// + /// Available during a test + /// + refPulsesLabel.Text = ProcessData.RefCount.ToString(); + double refVolume = ProcessData.LtrPerRefPulse * (double)ProcessData.RefCount.Val; + + float massDiff = ProcessData.Mass.Val - ProcessData.StartMass.Val; + massDiffLabel.Text = massDiff.ToString("F3"); + float volumeCtv = 1001.03f * massDiff / (float)TBF.BenchControl.Formulas.WaterDensityFromTemp(ProcessData.TempOut.Val); + volumeCtvLabel.Text = volumeCtv.ToString("F2"); + double refError = TBF.BenchControl.Formulas.ErrorFromVolumes(refVolume, volumeCtv); + refErrorLabel.Text = refError.ToString("F3"); + + if (currentMetersKind == MetersKind.Single) { - /// TODO: Reimplement - //pulses[i].Text = args.TestResult.Meters[i].PulsesMeter.ToString(); - //refPulses[i].Text = args.TestResult.Meters[i].PulsesMaster.ToString(); - //volume[i].Text = args.TestResult.Meters[i].VolumeMeter.ToString(); - //error[i].Text = args.TestResult.Meters[i].VolumeErrorPct.ToString("F2"); + for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length); i++) + { + BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + if (rr != null) + { + pulses[i].Text = rr.WMPulses.ToString(); + refPulses[i].Text = rr.WMRefPulses.ToString(); + volume[i].Text = rr.WMVolume.ToString("F1"); + error[i].Text = BenchControl.Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); + } + } + } + else if (currentMetersKind == MetersKind.Combined) + { + for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + { + int end = Math.Min(2 * compMtr + 2, Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length)); + + double compoundVolume = 0; + for (int i = 2 * compMtr; i < end; i++) + { + BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + if (rr != null) + { + pulses[i].Text = rr.WMPulses.ToString(); + refPulses[i].Text = rr.WMRefPulses.ToString(); + volume[i].Text = rr.WMVolume.ToString("F1"); + error[i].Text = BenchControl.Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); + compoundVolume += rr.WMVolume; + } + } + + volume1zLabel.Text = compoundVolume.ToString("F1"); + error1zLabel.Text = BenchControl.Formulas.ErrorFromVolumes(compoundVolume, refVolume).ToString("F1"); + } } } - else if (currentMetersKind == MetersKind.Combined) - { - for (int i = 0; i < 2; i++) - { - /// TODO: Reimplement - //pulses[i].Text = args.TestResult.Meters[i].PulsesMeter.ToString(); - //refPulses[i].Text = args.TestResult.Meters[i].PulsesMaster.ToString(); - //volume[i].Text = args.TestResult.Meters[i].VolumeMeter.ToString(); - //error[i].Text = args.TestResult.Meters[i].VolumeErrorPct.ToString("F2"); - } - /// TODO: Reimplement - //volume1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeMeter.ToString(); - //error1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeErrorPct.ToString("F2"); - } - //if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) - //{ - // //if (pumpOn != args.PumpOn) - // //{ - // // if (pumpOn) pumpPictureBox.Image = System.Resources. - // // else pumpPictureBox.Image = System.Resources. - // //} - // pumpOn = args.PumpOn; - // diverterToTank = args.DivToTank; - // Invalidate(); - //} + //if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) + //{ + // //if (pumpOn != args.PumpOn) + // //{ + // // if (pumpOn) pumpPictureBox.Image = System.Resources. + // // else pumpPictureBox.Image = System.Resources. + // //} + // pumpOn = args.PumpOn; + // diverterToTank = args.DivToTank; + // Invalidate(); + //} } void OnTestCompleted(object sender, TestCompletedEventArgs args) diff --git a/TestBenchFramework/Screens/ProcessTabPageCtrl48.cs b/TestBenchFramework/Screens/ProcessTabPageCtrl48.cs index 0537a5ba6..b64fb0e66 100644 --- a/TestBenchFramework/Screens/ProcessTabPageCtrl48.cs +++ b/TestBenchFramework/Screens/ProcessTabPageCtrl48.cs @@ -456,26 +456,41 @@ namespace TBF.Screens if (currentMetersKind == MetersKind.Single) { - for (int i = 0; i < textBoxesCount; i++) + for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length); i++) { - //pulses[i].Text = args.TestResult.Meters[i].PulsesMeter.ToString(); - //refPulses[i].Text = args.TestResult.Meters[i].PulsesMaster.ToString(); - //volume[i].Text = args.TestResult.Meters[i].VolumeMeter.ToString(); - //error[i].Text = args.TestResult.Meters[i].VolumeErrorPct.ToString("F2"); + BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + if (rr != null) + { + pulses[i].Text = rr.WMPulses.ToString(); + refPulses[i].Text = rr.WMRefPulses.ToString(); + volume[i].Text = rr.WMVolume.ToString("F1"); + error[i].Text = BenchControl.Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); + } } } else if (currentMetersKind == MetersKind.Combined) { - for (int i = 0; i < 2; i++) + for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) { - //pulses[i].Text = args.TestResult.Meters[i].PulsesMeter.ToString(); - //refPulses[i].Text = args.TestResult.Meters[i].PulsesMaster.ToString(); - //volume[i].Text = args.TestResult.Meters[i].VolumeMeter.ToString(); - //error[i].Text = args.TestResult.Meters[i].VolumeErrorPct.ToString("F2"); - } + int end = Math.Min(2 * compMtr+2, Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length)); - //volume1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeMeter.ToString(); - //error1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeErrorPct.ToString("F2"); + double compoundVolume = 0; + for (int i = 2 * compMtr; i < end; i++) + { + BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + if (rr != null) + { + pulses[i].Text = rr.WMPulses.ToString(); + refPulses[i].Text = rr.WMRefPulses.ToString(); + volume[i].Text = rr.WMVolume.ToString("F1"); + error[i].Text = BenchControl.Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); + compoundVolume += rr.WMVolume; + } + } + + volume1zLabel.Text = compoundVolume.ToString("F1"); + error1zLabel.Text = BenchControl.Formulas.ErrorFromVolumes(compoundVolume, refVolume).ToString("F1"); + } } } diff --git a/TestBenchFramework/Screens/ProcessTabPageCtrl6.cs b/TestBenchFramework/Screens/ProcessTabPageCtrl6.cs index 6814cbea1..2bf249754 100644 --- a/TestBenchFramework/Screens/ProcessTabPageCtrl6.cs +++ b/TestBenchFramework/Screens/ProcessTabPageCtrl6.cs @@ -20,6 +20,15 @@ namespace TBF.Screens MetersKind currentMetersKind; + int textBoxesCount; + + Label[] sensor; + Label[] pulses; + Label[] refPulses; + Label[] volume; + Label[] error; + Label[] passed; + bool pumpOn = true; bool diverterToTank = true; @@ -32,6 +41,13 @@ namespace TBF.Screens InitializeComponent(); + textBoxesCount = 6; + sensor = new Label[] { sensor1Label, sensor2Label, sensor3Label, sensor4Label, sensor5Label, sensor6Label }; + pulses = new Label[] { pulses1Label, pulses2Label, pulses3Label, pulses4Label, pulses5Label, pulses6Label }; + refPulses = new Label[] { refPulses1Label, refPulses2Label, refPulses3Label, refPulses4Label, refPulses5Label, refPulses6Label }; + volume = new Label[] { volume1Label, volume2Label, volume3Label, volume4Label, volume5Label, volume6Label }; + error = new Label[] { error1Label, error2Label, error3Label, error4Label, error5Label, error6Label }; + Bridge.ProcedureSelectedHandler += delegate(object sndr, ProcedureSelectedEventArgs args) { if (InvokeRequired) @@ -355,112 +371,98 @@ namespace TBF.Screens void OnProcessDataChanged(object sender, ProcessDataEventArgs args) { - /// Top part - //airTempLabel.Text = args.AmbientTemp.ToString(); - //airPressLabel.Text = args.AmbientPressure.ToString(); - //airHumiLabel.Text = args.AmbientHumidity.ToString(); + /// + /// Always available + /// + airTempLabel.Text = ProcessData.AmbientTemp.ToString(); + airPressLabel.Text = ProcessData.AmbientPressure.ToString(); + airHumiLabel.Text = ProcessData.AmbientHumidity.ToString(); - //refPulsesLabel.Text = args.RefPulses.ToString(); - //refFreqLabel.Text = args.FlowMtrFreq.ToString(); - //refFlowLabel.Text = Utils.FloatToStr(args.Flow.Val, 4); - //refVolumeLabel.Text = args.Volume.ToString(); + tInLabel.Text = ProcessData.TempIn.ToString(); + tOutLabel.Text = ProcessData.TempOut.ToString(); + tDivLabel.Text = ProcessData.TempDiv.ToString(); - //regValvePosLabel.Text = args.RegValvePos.ToString(); - //tDivLabel.Text = args.Tdiv.ToString(); + prInLabel.Text = ProcessData.PressureUp.ToString(); + prOutLabel.Text = ProcessData.PressureDown.ToString(); - /// Bottom part - /// TODO: Reimplement - //pulses1Label.Text = args.TestResult.Meters[0].PulsesMeter.ToString(); - //refPulses1Label.Text = args.TestResult.Meters[0].PulsesMaster.ToString(); - //volume1Label.Text = args.TestResult.Meters[0].VolumeMeter.ToString(); - //error1Label.Text = args.TestResult.Meters[0].VolumeErrorPct.ToString("F2"); + massLabel.Text = ProcessData.Mass.ToString(); - if (Config.Data.WMsCount >= 2) - { - /// TODO: Reimplement - //pulses2Label.Text = args.TestResult.Meters[1].PulsesMeter.ToString(); - //refPulses2Label.Text = args.TestResult.Meters[1].PulsesMaster.ToString(); - //volume2Label.Text = args.TestResult.Meters[1].VolumeMeter.ToString(); - //error2Label.Text = args.TestResult.Meters[1].VolumeErrorPct.ToString("F2"); - } - if (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 2) - { - /// TODO: Reimplement - //volume1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeMeter.ToString(); - //error1zLabel.Text = args.TestResult.CombinedMeters[0].VolumeErrorPct.ToString("F2"); - } - - if ((currentMetersKind == MetersKind.Single && Config.Data.WMsCount >= 3) || - (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 4)) - { - /// TODO: Reimplement - //pulses3Label.Text = args.TestResult.Meters[2].PulsesMeter.ToString(); - //refPulses3Label.Text = args.TestResult.Meters[2].PulsesMaster.ToString(); - //volume3Label.Text = args.TestResult.Meters[2].VolumeMeter.ToString(); - //error3Label.Text = args.TestResult.Meters[2].VolumeErrorPct.ToString("F2"); - } - if (Config.Data.WMsCount >= 4) - { - /// TODO: Reimplement - //pulses4Label.Text = args.TestResult.Meters[3].PulsesMeter.ToString(); - //refPulses4Label.Text = args.TestResult.Meters[3].PulsesMaster.ToString(); - //volume4Label.Text = args.TestResult.Meters[3].VolumeMeter.ToString(); - //error4Label.Text = args.TestResult.Meters[3].VolumeErrorPct.ToString("F2"); - } - if (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 4) - { - /// TODO: Reimplement - //volume2zLabel.Text = args.TestResult.CombinedMeters[1].VolumeMeter.ToString(); - //error2zLabel.Text = args.TestResult.CombinedMeters[1].VolumeErrorPct.ToString("F2"); + if (args.TestPhase == Config.Entities.Progress.FlowSetting) + { + /// + /// Available when setting the flow + /// + refFreqLabel.Text = ProcessData.RefFreq.ToString(); + refFlowLabel.Text = Utils.FloatToStr(ProcessData.RefFlow.Val, 4); } - if ((currentMetersKind == MetersKind.Single && Config.Data.WMsCount >= 5) || - (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 6)) - { - /// TODO: Reimplement - //pulses5Label.Text = args.TestResult.Meters[4].PulsesMeter.ToString(); - //refPulses5Label.Text = args.TestResult.Meters[4].PulsesMaster.ToString(); - //volume5Label.Text = args.TestResult.Meters[4].VolumeMeter.ToString(); - //error5Label.Text = args.TestResult.Meters[4].VolumeErrorPct.ToString("F2"); - } - if (Config.Data.WMsCount >= 6) - { - /// TODO: Reimplement - //pulses6Label.Text = args.TestResult.Meters[5].PulsesMeter.ToString(); - //refPulses6Label.Text = args.TestResult.Meters[5].PulsesMaster.ToString(); - //volume6Label.Text = args.TestResult.Meters[5].VolumeMeter.ToString(); - //error6Label.Text = args.TestResult.Meters[5].VolumeErrorPct.ToString("F2"); - } - if (currentMetersKind == MetersKind.Combined && Config.Data.WMsCount >= 6) - { - /// TODO: Reimplement - //volume3zLabel.Text = args.TestResult.CombinedMeters[2].VolumeMeter.ToString(); - //error3zLabel.Text = args.TestResult.CombinedMeters[2].VolumeErrorPct.ToString("F2"); + if (args.TestPhase == Config.Entities.Progress.FlowSetting || + args.TestPhase == Config.Entities.Progress.Test) + { + /// + /// Available during a test + /// + refPulsesLabel.Text = ProcessData.RefCount.ToString(); + double refVolume = ProcessData.LtrPerRefPulse * (double)ProcessData.RefCount.Val; + + float massDiff = ProcessData.Mass.Val - ProcessData.StartMass.Val; + massDiffLabel.Text = massDiff.ToString("F3"); + float volumeCtv = 1001.03f * massDiff / (float)TBF.BenchControl.Formulas.WaterDensityFromTemp(ProcessData.TempOut.Val); + volumeCtvLabel.Text = volumeCtv.ToString("F2"); + double refError = TBF.BenchControl.Formulas.ErrorFromVolumes(refVolume, volumeCtv); + refErrorLabel.Text = refError.ToString("F3"); + + if (currentMetersKind == MetersKind.Single) + { + for (int i = 0; i < Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length); i++) + { + BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + if (rr != null) + { + pulses[i].Text = rr.WMPulses.ToString(); + refPulses[i].Text = rr.WMRefPulses.ToString(); + volume[i].Text = rr.WMVolume.ToString("F1"); + error[i].Text = BenchControl.Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); + } + } + } + else if (currentMetersKind == MetersKind.Combined) + { + for (int compMtr = 0; compMtr < Config.Data.CompoundWMsCount; compMtr++) + { + int end = Math.Min(2 * compMtr + 2, Math.Min(textBoxesCount, ProcessData.RegisterReaders.Length)); + + double compoundVolume = 0; + for (int i = 2 * compMtr; i < end; i++) + { + BenchControl.GenericDevices.IRegisterReader rr = ProcessData.RegisterReaders[i]; + if (rr != null) + { + pulses[i].Text = rr.WMPulses.ToString(); + refPulses[i].Text = rr.WMRefPulses.ToString(); + volume[i].Text = rr.WMVolume.ToString("F1"); + error[i].Text = BenchControl.Formulas.ErrorFromVolumes(rr.WMVolume, refVolume).ToString("F1"); + compoundVolume += rr.WMVolume; + } + } + + volume1zLabel.Text = compoundVolume.ToString("F1"); + error1zLabel.Text = BenchControl.Formulas.ErrorFromVolumes(compoundVolume, refVolume).ToString("F1"); + } + } } - //tInLabel.Text = args.Tin.ToString(); - //tOutLabel.Text = args.Tout.ToString(); - //prInLabel.Text = args.Pin.ToString(); - //prOutLabel.Text = args.Pout.ToString(); - - //massLabel.Text = args.Mass.ToString(); - - //if (args.Mass.Valid && args.StartMass.Valid) - //{ - // massDiffLabel.Text = (args.Mass.Val - args.StartMass.Val).ToString(args.Mass.Format); - //} - - //if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) - //{ - // //if (pumpOn != args.PumpOn) - // //{ - // // if (pumpOn) pumpPictureBox.Image = System.Resources. - // // else pumpPictureBox.Image = System.Resources. - // //} - // pumpOn = args.PumpOn; - // diverterToTank = args.DivToTank; - // Invalidate(); - //} + //if (pumpOn != args.PumpOn || diverterToTank != args.DivToTank) + //{ + // //if (pumpOn != args.PumpOn) + // //{ + // // if (pumpOn) pumpPictureBox.Image = System.Resources. + // // else pumpPictureBox.Image = System.Resources. + // //} + // pumpOn = args.PumpOn; + // diverterToTank = args.DivToTank; + // Invalidate(); + //} } void OnTestCompleted(object sender, TestCompletedEventArgs args) diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj index 51475d3c7..a5671cac8 100644 --- a/TestBenchFramework/TBF.csproj +++ b/TestBenchFramework/TBF.csproj @@ -670,8 +670,6 @@ EntryFormCfgCtrl.cs - - @@ -753,8 +751,6 @@ PressureMeterCfgCtrl.cs - -