From dffaa1d3a87c2b79360c8b7f60f3cb10be9d38df Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 14 Feb 2020 09:51:55 +0100 Subject: [PATCH] Earlier mass measurement and tank draining in FlyingStartMassCollProlonged, ver. 2.25.1437 --- TBF/BenchControl/Elde/Diverter/Diverter.cs | 2 +- .../Elde/QueryMeasurementEndOp.cs | 41 +- TBF/BenchControl/Elde/ReadDiverterStateOp.cs | 63 ++++ TBF/BenchControl/Events.cs | 4 + TBF/BenchControl/Sequences/SequenceBase.cs | 15 + .../FlyingStartMassCollProlongedSeq.cs | 351 ++++++++++++------ TBF/Properties/AssemblyInfo.cs | 4 +- TBF/TBF.csproj | 1 + 8 files changed, 334 insertions(+), 147 deletions(-) create mode 100644 TBF/BenchControl/Elde/ReadDiverterStateOp.cs diff --git a/TBF/BenchControl/Elde/Diverter/Diverter.cs b/TBF/BenchControl/Elde/Diverter/Diverter.cs index 309bd06df..cf8feb0b5 100644 --- a/TBF/BenchControl/Elde/Diverter/Diverter.cs +++ b/TBF/BenchControl/Elde/Diverter/Diverter.cs @@ -41,7 +41,7 @@ namespace TBF.BenchControl.Elde.Diverter readonly IOperation diverterToSinkOp; - public bool State { get { return (controlBoard.Route & mask) != 0; } } + public bool State { get { return (controlBoard.RRoute & mask) != 0; } } public int ThresholdGate { get { return diverterCfg.StartingLevel; } } public int ThresholdLo { get { return diverterCfg.ThresholdLo; } } public int ThresholdHi { get { return diverterCfg.ThresholdHi; } } diff --git a/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs b/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs index f98d7a99f..2b5837bbb 100644 --- a/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs +++ b/TBF/BenchControl/Elde/QueryMeasurementEndOp.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Copyright (c) 2013-2020 Sensus Slovensko a.s. /// using System; using log4net; @@ -9,54 +9,51 @@ namespace TBF.BenchControl.Elde public class QueryMeasurementEndOp : IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(QueryMeasurementEndOp)); - public override string ToString() { return string.Format("QueryMeasurementEndOp(.,{0})", eventDone); } + public override string ToString() { return string.Format("QueryMeasurementEndOp()"); } /// Set by the constructor readonly ControlBoardDev controlBoard; - readonly Event eventDone; - bool done = false; + bool done; /// /// Events: MeasurementCompleted /// /// Event to be returned by Run() when completed OK - public QueryMeasurementEndOp(ControlBoardDev controlBoardDev, Event eventDone) - { - if (controlBoardDev == null) throw new ArgumentNullException("controlBoardDev"); - this.controlBoard = controlBoardDev; - this.eventDone = eventDone; - - log.Debug(this.ToString()); - } public QueryMeasurementEndOp(ControlBoardDev controlBoardDev) - : this(controlBoardDev, Event.MeasurementCompleted) { - } + if (controlBoardDev == null) throw new ArgumentNullException("controlBoardDev"); + this.controlBoard = controlBoardDev; + done = false; + log.Debug(this.ToString()); + } - /// Start this operation + /// Start this operation public void Start() { - } + done = false; + } - /// Run this operation + /// Run this operation /// /// Event.FlowInDone or Event.FlowOutDone /// public Event Run() { - if (done) return eventDone; + if (done) return Event.MeasurementCompleted; + if (0 != (controlBoard.StatusP & StatusP.TestCompleted)) { done = true; - return eventDone; + return Event.MeasurementCompleted; } + return Event.None; } - /// Stop this operation + /// Stop this operation public void Stop() - { - } + { + } } } diff --git a/TBF/BenchControl/Elde/ReadDiverterStateOp.cs b/TBF/BenchControl/Elde/ReadDiverterStateOp.cs new file mode 100644 index 000000000..f23e583c7 --- /dev/null +++ b/TBF/BenchControl/Elde/ReadDiverterStateOp.cs @@ -0,0 +1,63 @@ +/// +/// Copyright (c) 2020 Sensus Slovensko a.s. +/// +using System; +using log4net; +using TBF.Boxes; + +namespace TBF.BenchControl.Elde +{ + public class ReadDiverterStateOp : IOperation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ReadFlowOp)); + public override string ToString() { return string.Format("ReadDiverterStateOp(div={0}, delay={1})", div.Name, delay); } + + /// Set by the constructor + readonly GenericDevices.IDiverter div; + readonly ControlBoardDev ctrlBrd; + readonly int delay; + + int startTime; + + /// + /// Events: FlowInDone, FlowOutDone 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 ReadDiverterStateOp(ControlBoardDev ctrlBrd, GenericDevices.IDiverter div, int delay) + { + if (ctrlBrd == null || div == null) throw new ArgumentNullException(); + + this.ctrlBrd = ctrlBrd; + this.div = div; + this.delay = delay; + + log.Debug(this.ToString()); + } + public ReadDiverterStateOp(ControlBoardDev ctrlBrd, GenericDevices.IDiverter div) + : this(ctrlBrd, div, 0) + { + } + + /// Start this operation + public void Start() + { + startTime = StateMachine.Time; + } + + /// Run this operation + /// Event.ToTank or Event.ToSink + public Event Run() + { + if (StateMachine.Time - startTime <= delay) + { + return Event.None; + } + return div.State ? Event.ToTank : Event.ToSink; + } + + /// Stop this operation + public void Stop() { } + } +} diff --git a/TBF/BenchControl/Events.cs b/TBF/BenchControl/Events.cs index 4304622b2..868840563 100644 --- a/TBF/BenchControl/Events.cs +++ b/TBF/BenchControl/Events.cs @@ -156,6 +156,10 @@ namespace TBF.BenchControl /// Timer events TimerExpired, + /// ReadDiverterState events + ToSink, /// State = false + ToTank, /// State = true + /// Process camera events CameraBusy, GrabPassed, diff --git a/TBF/BenchControl/Sequences/SequenceBase.cs b/TBF/BenchControl/Sequences/SequenceBase.cs index 322040c1d..7089a8be6 100644 --- a/TBF/BenchControl/Sequences/SequenceBase.cs +++ b/TBF/BenchControl/Sequences/SequenceBase.cs @@ -206,6 +206,21 @@ namespace TBF.BenchControl.Sequences RefFlow)); } + /// + /// Used in tests in measurement loop to display remaining test time + /// + /// Remaining time in seconds + protected void ShowRemainingTime(int remainingTime) + { + if (remainingTime > 60) + { + Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); + } + else + { + Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); + } + } protected Event DrainTheTank(IScaleOrTank tank) { diff --git a/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs b/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs index df054cb93..4124d3bdd 100644 --- a/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs @@ -1,13 +1,10 @@ /// -/// Copyright (c) 2018 Sensus Slovensko a.s. +/// Copyright (c) 2018-2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; -using System.Text; using log4net; using Config; -using TBF.BenchControl; -using TBF.Boxes; using TBF.Resources; using TBF.UiBridge; using TBF.BenchControl.GenericDevices; @@ -427,8 +424,8 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged foreach (var roi in rois) roi.RegisterRoiToCamera(); /// Prepare measurementOperations - IList measureOperations = new List(); - foreach (var camera in cameras) measureOperations.Add(camera.MeasurementOp()); + IList cameraMeasurementOperations = new List(); + foreach (var camera in cameras) cameraMeasurementOperations.Add(camera.MeasurementOp()); if (drainTheTank) @@ -491,7 +488,7 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) .AddOperation(checkUiOp) - .AddOperations(measureOperations) + .AddOperations(cameraMeasurementOperations) .AddOperations(readTempPressOps) .AddOperation(scale.ReadStableMassOp(ref StartMass, test.MassRepeats, test.MassSpread, test.MassMethod)) .AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec)) @@ -524,7 +521,7 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) .AddOperation(checkUiOp) .AddOperations(readTempPressOps) - .AddOperations(measureOperations) + .AddOperations(cameraMeasurementOperations) .AddOperation(processDataLoggingOp) .AddOperation(cBrd.StartProlongedMeasurementOp(outPath, Elde.TestMethods.Diverter | Elde.TestMethods.Synchro | Elde.TestMethods.MassAndContinue, @@ -549,72 +546,200 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged } } - - /// Measurement loop - preparation - readRegistersOp = new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders); - - int estimtdEndTime = StateMachine.Time + (int)test.TstTime; + /// + /// Measurement loop - preparation + /// + int estimtdEndTime = StateMachine.Time + (int)test.TstTime; StartNewStatistics(StateMachine.Time, BatchRslts.Batch.BatchNr, test.Name, repetitionNr, 0); + bool isMeasurementCompleted = false; - /// Measurement loop - begin - State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) - .AddOperation(checkUiOp) - .AddOperations(readTempPressOps) - .AddOperations(measureOperations) - .AddOperation(readRegistersOp) - .AddOperation(scale.ReadMassOp(ref Mass)) - .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, CountWhenSendingRdDivCmd, CountWhenReadingDiv, true, DiverterStart, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) - .AddOperation(cBrd.QueryMeasurementEndOp()) - .AddOperation(processDataLoggingOp) + IList measurementCompletedOperations = new List(); + measurementCompletedOperations.Add(checkUiOp); + foreach (var op in readTempPressOps) measurementCompletedOperations.Add(op); + measurementCompletedOperations.Add(processDataLoggingOp); + + IList measurementLoopOperations = new List(); + foreach (var op in measurementCompletedOperations) measurementLoopOperations.Add(op); + foreach (var op in cameraMeasurementOperations) measurementLoopOperations.Add(op); + measurementLoopOperations.Add(new Operations.ReadMoreRegistersOp(sensPath.RegisterReaders)); + measurementLoopOperations.Add(cBrd.QueryMeasurementEndOp()); /// Event.MeasurementCompleted + + IOperation readMassOp = scale.ReadMassOp(ref Mass); + + /// Measurement loop - 1st part + State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) + .AddOperations(measurementLoopOperations) + .AddOperation(readMassOp) + .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, CountWhenSendingRdDivCmd, CountWhenReadingDiv, + true, DiverterStart, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) + .AddOperation(new TBF.BenchControl.Elde.ReadDiverterStateOp(cBrd, outPath.Diverter)) .EnterState(); do { - e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } - if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } - if (e.Contains(Event.MeasurementCompleted)) goto test_completed; + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) { retVal = Event.Error; goto stopTest; } + DoInsideMeasurementLoop(heatMetersTestParams, test, repetitionNr, estimtdEndTime); + } + while (!e.Contains(Event.ToSink) && !e.Contains(Event.Next)); /// Proceed to 2nd part of the measurement loop when diverter turns back to sink + /// 'Next' button can be used in Debug version + /// + /// Waiting before the 2nd mass measurement + /// + bool waitingBeforeEndMassMeasurementCompleted = false; + IOperation readDiverterTransitionOp = cBrd.ReadDiverterTransitionOp(outPath.Diverter, CountWhenSendingRdDivCmd, CountWhenReadingDiv, + false, DiverterEnd, BatchRslts.Batch.BatchNr, test.Name, repetitionNr); + IOperation stop2MassTimerOp = new Operations.TimerOp(test.TimeStop2Mass); + do { + State.Create(string.Format("{0}({1}) : Waiting before the 2nd mass measurement", test.Method, test.Name)) + .AddOperations(isMeasurementCompleted ? measurementCompletedOperations : measurementLoopOperations) + .AddOperation(readMassOp) + .AddOperation(readDiverterTransitionOp) + .AddOperation(stop2MassTimerOp) + .EnterState(); - //------------------------------------------------ - int remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0); - if (remainingTime > 60) - { - Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime / 60, "min", remainingTime % 60, Strings.sec)); - } - else - { - Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); - } - //------------------------------------------------ - - RefFreq.Val = cBrd.ReferenceFreq; - RefFlow.Val = cBrd.ReferenceFlow; - - UpdateAllStatistics(StateMachine.Time); - - if (heatMetersTestParams != null) + if (!isMeasurementCompleted) { - if (lastEnergyUpdateTime == 0) + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) isMeasurementCompleted = true; + waitingBeforeEndMassMeasurementCompleted = (e.Contains(Event.TimerExpired) && e.Contains(Event.BalanceDone)); + DoInsideMeasurementLoop(heatMetersTestParams, test, repetitionNr, estimtdEndTime); + } + while (!isMeasurementCompleted && !waitingBeforeEndMassMeasurementCompleted); + } + else + { + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + waitingBeforeEndMassMeasurementCompleted = (e.Contains(Event.TimerExpired) && e.Contains(Event.BalanceDone)); + } + while (!waitingBeforeEndMassMeasurementCompleted); + } + } + while (!waitingBeforeEndMassMeasurementCompleted); + + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); + + /// + /// Measuring the end mass + /// + Bridge.OnActivity(this, Strings.Measuring_the_weight); + IOperation readStableMassOp = scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod); + IOperation massMsrmntTimerOp = new Operations.TimerOp(StableMassMsrmntTimeoutSec); + bool measuringEndMassCompleted = false; + do + { + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) + .AddOperations(isMeasurementCompleted ? measurementCompletedOperations : measurementLoopOperations) + .AddOperation(readStableMassOp) + .AddOperation(massMsrmntTimerOp) + .EnterState(); + + if (!isMeasurementCompleted) + { + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.TimerExpired)) + { + Bridge.OnError(this, Strings.Mass_measurement_timeout); + retVal = Event.RecoverableError; + goto stopTest; + } + if (e.Contains(Event.MeasurementCompleted)) isMeasurementCompleted = true; + measuringEndMassCompleted = e.Contains(Event.BalanceDone); + DoInsideMeasurementLoop(heatMetersTestParams, test, repetitionNr, estimtdEndTime, false); + } + while (!isMeasurementCompleted && !measuringEndMassCompleted); + } + else + { + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.TimerExpired)) + { + Bridge.OnError(this, Strings.Mass_measurement_timeout); + retVal = Event.RecoverableError; + goto stopTest; + } + measuringEndMassCompleted = e.Contains(Event.BalanceDone); + } + while (!measuringEndMassCompleted); + } + } + while (!measuringEndMassCompleted); + /// + tMass2 = StateMachine.Time; + log.WarnFormat("End mass = {0}kg", EndMass); + TestEndTime = DateTime.Now; + + if (test.DoDrainingAfter) + { + /// + /// Draining after the 2nd mass measurement enabled, empty the tank + /// + IOperation setValvesOp = StateMachine.ControlBoard.SetValvesOp(scale.DrainValve, null); + bool openingDrainValveCompleted = false; + do { + State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name)) + .AddOperations(isMeasurementCompleted ? measurementCompletedOperations : measurementLoopOperations) + .AddOperation(setValvesOp) + .AddOperation(readMassOp) + .EnterState(); + + if (!isMeasurementCompleted) { - lastEnergyUpdateTime = StateMachine.Time; + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.MeasurementCompleted)) isMeasurementCompleted = true; + openingDrainValveCompleted = !e.Contains(Event.ValvesBusy); + DoInsideMeasurementLoop(heatMetersTestParams, test, repetitionNr, estimtdEndTime); + } + while (!isMeasurementCompleted && !openingDrainValveCompleted); } else { - //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); - double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] - double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] - double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] - double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] - Energy.Update(deltaEnergy); - VolumeForEnergy.Update(deltaVolume); - lastEnergyUpdateTime = StateMachine.Time; + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + openingDrainValveCompleted = !e.Contains(Event.ValvesBusy); + } + while (!openingDrainValveCompleted); } } + while (!openingDrainValveCompleted); + } - Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); - Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); - } - while (!e.Contains(Event.Next)); /// 'Next' button can be used in Debug version - - /// Measurement loop - end + if (!isMeasurementCompleted) + { + /// + /// Measurement loop - 2nd part, diverter is in state 'To sink' + /// + State.Create(string.Format("{0}({1}) : Reading watermeters", test.Method, test.Name)) + .AddOperations(measurementLoopOperations) + .AddOperation(readMassOp) + .EnterState(); + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + DoInsideMeasurementLoop(heatMetersTestParams, test, repetitionNr, estimtdEndTime); + } + while (!e.Contains(Event.MeasurementCompleted) && !e.Contains(Event.Next)); /// Quit the measurement loop when there is Event.MeasurementCompleted + /// 'Next' button can be used in Debug version + } test_completed: @@ -655,67 +780,6 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged while (!e.Contains(Event.ValvesSet)); } - //------------------------------------------------ - Bridge.OnActivity(this, Strings.Measuring_the_weight); - //------------------------------------------------ - State.Create(string.Format("{0}({1}) : Waiting before the 2nd mass measurement", test.Method, test.Name)) - .AddOperation(checkUiOp) - .AddOperations(readTempPressOps) - .AddOperation(scale.ReadMassOp(ref Mass)) - .AddOperation(cBrd.ReadDiverterTransitionOp(outPath.Diverter, CountWhenSendingRdDivCmd, CountWhenReadingDiv, false, DiverterEnd, BatchRslts.Batch.BatchNr, test.Name, repetitionNr)) - .AddOperation(processDataLoggingOp) - .AddOperation(new Operations.TimerOp(test.TimeStop2Mass)) - .EnterState(); - do { - e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } - if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } - } - while (!e.Contains(Event.TimerExpired) || !e.Contains(Event.BalanceDone)); - - - if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); - else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); - - State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) - .AddOperation(checkUiOp) - .AddOperations(readTempPressOps) - .AddOperation(scale.ReadStableMassOp(ref EndMass, test.MassRepeats, test.MassSpread, test.MassMethod)) - .AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec)) - .AddOperation(processDataLoggingOp) - .EnterState(); - do { - e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } - if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } - if (e.Contains(Event.TimerExpired)) - { - Bridge.OnError(this, Strings.Mass_measurement_timeout); - retVal = Event.RecoverableError; - goto stopTest; - } - } - while (!e.Contains(Event.BalanceDone)); - /// - tMass2 = StateMachine.Time; - log.WarnFormat("End mass = {0}kg", EndMass); - TestEndTime = DateTime.Now; - - if (test.DoDrainingAfter) - { - State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name)) - .AddOperation(checkUiOp) - .AddOperation(StateMachine.ControlBoard.SetValvesOp(scale.DrainValve, null)) - .AddOperations(readTempPressOps) - .EnterState(); - do - { - e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } - } - while (e.Contains(Event.ValvesBusy)); - } - //------------------------------------------------ Bridge.OnActivity(this, Strings.Test_completed); //------------------------------------------------ @@ -1062,6 +1126,49 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged } + /// + /// Collection of actions executed inside measurement loop + /// + void DoInsideMeasurementLoop(HeatMeters.TestParams heatMetersTestParams, Config.Entities.Test test, int repetitionNr, int estimtdEndTime, bool showRemainingTimeMsg = true) + { + RefFreq.Val = StateMachine.ControlBoard.ReferenceFreq; + RefFlow.Val = StateMachine.ControlBoard.ReferenceFlow; + + UpdateAllStatistics(StateMachine.Time); + UpdateEnergy(heatMetersTestParams); + if (showRemainingTimeMsg) ShowRemainingTime(Math.Max(estimtdEndTime - StateMachine.Time, 0)); + + Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.Test)); + } + + + /// + /// This function is invoked in the measurement loop + /// + /// Heat meter test parameters or null + void UpdateEnergy(HeatMeters.TestParams heatMetersTestParams) + { + if (heatMetersTestParams == null) return; + + if (lastEnergyUpdateTime == 0) + { + lastEnergyUpdateTime = StateMachine.Time; + } + else + { + //double deltaTime = (double)(StateMachine.Time - lastEnergyUpdateTime); + double T_in = (TempRefHi1.Val + TempRefHi2.Val) / 2; /// [°C] + double T_out = (TempRefLo1.Val + TempRefLo2.Val) / 2; /// [°C] + double deltaVolume = LtrPerRefPulse * RefPulsesDelta; /// [l] + double deltaEnergy = (0.001 * deltaVolume) * (T_in - T_out) * Formulas.HeatCoefficientWater(16, T_in, T_out, heatMetersTestParams.FlowMeasuredAtHiTempPipe); /// [J] = [m3] * [K] * [J/(m3 K)] + Energy.Update(deltaEnergy); + VolumeForEnergy.Update(deltaVolume); + lastEnergyUpdateTime = StateMachine.Time; + } + } + + IList Simulate(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, Single.TestParams singleTestParams, Compound.TestParams compoundTestParams, diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index f23f3e9c5..4e836e7ac 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.25.1434.0")] -[assembly: AssemblyFileVersion("2.25.1434.0")] +[assembly: AssemblyVersion("2.25.1437.0")] +[assembly: AssemblyFileVersion("2.25.1437.0")] diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index dfd8aa99e..59eaed0ba 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -559,6 +559,7 @@ +