Upgrade - improved StandingStartMassCollection method by SLM requirements, added fixed delays, added residual flow delays

This commit is contained in:
2026-07-16 09:30:59 +02:00
parent 38973e0030
commit 6ac3ea87ef
@@ -1,20 +1,22 @@
/// using Common;
using Config.Entities;
using log4net;
using NHibernate.Action;
///
/// Copyright (c) 2013-2021 Sensus Slovensko a.s. /// Copyright (c) 2013-2021 Sensus Slovensko a.s.
/// ///
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using log4net; using System.Windows.Forms;
using Common; using System.Xml.Serialization;
using Config.Entities;
using TBF.Boxes; using TBF.Boxes;
using TBF.Resources; using TBF.Resources;
using TBF.Rig.GenericDevices; using TBF.Rig.GenericDevices;
using TBF.Rig.RegisterReaders.PulsesFromUniCB;
using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common;
using TBF.UiBridge; using TBF.UiBridge;
using System.Xml.Serialization;
using TBF.Rig.RegisterReaders.PulsesFromUniCB;
namespace TBF.Rig.TestMethods.StandingStartMassCollection namespace TBF.Rig.TestMethods.StandingStartMassCollection
{ {
@@ -113,6 +115,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state checkUiOp = new Operations.CheckUIOp(true); /// Runs in more then one state
processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null); processDataLoggingOp = new TBF.Rig.Operations.ProcessDataLoggingOp(processDataLogger, this, heatMetersTestParams != null);
int delay;
if (cBrd is ControlBoard.Uni.UniCB) if (cBrd is ControlBoard.Uni.UniCB)
{ {
int[] filters = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 }; int[] filters = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
@@ -150,7 +154,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
int totalPulses = Convert.ToInt32(test.Volume / outPath.FlowMeter.LtrPerPulse); int totalPulses = Convert.ToInt32(test.Volume / outPath.FlowMeter.LtrPerPulse);
log.InfoFormat( log.InfoFormat(
"{0}({1}) : Test starting (Repetition {2}, LastRepetition={3}, PumpPower={4})", "{0}({1}) : Test starting... (Repetition {2}, LastRepetition={3}, PumpPower={4})",
test.Method, test.Method,
test.Name, test.Name,
repetitionNr, repetitionNr,
@@ -338,8 +342,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(cBrd.SetFlowOp(test.QfromM3ph(), test.QtoM3ph(), RefFlow, FlowSettingTimeoutSec)) .AddOperation(cBrd.SetFlowOp(test.QfromM3ph(), test.QtoM3ph(), RefFlow, FlowSettingTimeoutSec))//...develop: step 1
.AddOperation(heatMetersPromptOp) .AddOperation(heatMetersPromptOp)
.EnterState(); .EnterState();
do { do {
e = StateMachine.WaitRunDevsRunOps(); e = StateMachine.WaitRunDevsRunOps();
@@ -473,8 +477,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
State.Create(string.Format("{0}({1}) : Close the start/stop valve before measuring the start mass", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Close the start/stop valve before measuring the start mass", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(cBrd.CloseStartValveOp()) .AddOperation(cBrd.CloseStartValveOp())//...develop: step 2
.EnterState(); .EnterState();
do { do {
e = StateMachine.WaitRunDevsRunOps(); e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
@@ -482,10 +486,38 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
} }
while (!e.Contains(Event.ValvesSet)); while (!e.Contains(Event.ValvesSet));
///...MF
///-----------------
delay = 5;
//if (test.TimePump2StartV > 0)
//{
State.Create(string.Format("{0}({1}) : Delay 5s", test.Method, test.Name))
.AddOperation(checkUiOp)
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 3
.EnterState();
do
{
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
/// Show remaining time
if ((delay = Math.Max(delay, 0)) > 60)
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
else
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
if (delay > 0)
delay--;
}
while (!e.Contains(Event.TimerExpired));
//}
///-----------------
State.Create(string.Format("{0}({1}) : Start the standing start/stop test", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Start the standing start/stop test", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(testInProgress) .AddOperation(testInProgress) //...develop: step 4 --> diverter switch to the mass
.EnterState(); .EnterState();
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
{ {
@@ -494,6 +526,36 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
} }
///...MF
///-----------------
delay = test.TimeFlow2Mass;
if (delay > 0)
{
State.Create(string.Format("{0}({1}) : Delay for meters stabilization <T flow stab. - start = {2}s> ", test.Method, test.Name, delay))
.AddOperation(checkUiOp)
.AddOperations(readTempPressOps)
.AddOperation(testInProgress)
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 5
.EnterState();
do
{
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
/// Show remaining time
if ((delay = Math.Max(delay, 0)) > 60)
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
else
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
if(delay>0)
delay--;
}
while (!e.Contains(Event.TimerExpired));
}
int time = StateMachine.Time; int time = StateMachine.Time;
double currentFlow = RefFlow.Val; double currentFlow = RefFlow.Val;
@@ -511,6 +573,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
/// ///
GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm;
IOperation readStartMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread); IOperation readStartMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
IOperation readStopMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread);
if (dataEntryCmpnt != null) if (dataEntryCmpnt != null)
{ {
@@ -525,8 +588,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
State state2 = State.Create(string.Format("{0}({1}) : Grab images", test.Method, test.Name)) State state2 = State.Create(string.Format("{0}({1}) : Grab images", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(readStartMassOp) //.AddOperation(readStartMassOp)//...MF presuvam do nasledujucej serie
.AddOperation(testInProgress) .AddOperation(testInProgress)//...nevhodne prepina diverter
.AddOperation(processDataLoggingOp); .AddOperation(processDataLoggingOp);
for (int i = 0; i < sensPath.RegisterReaders.Length; i++) for (int i = 0; i < sensPath.RegisterReaders.Length; i++)
@@ -576,22 +639,33 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
string.Format("{0}({1}) : Grabbing images - valve close", test.Method, test.Name)); string.Format("{0}({1}) : Grabbing images - valve close", test.Method, test.Name));
} }
/////// ///////
delay = test.TimeStop2Mass;
Bridge.OnActivity(this, Strings.Enter_water_meter_data); Bridge.OnActivity(this, Strings.Enter_water_meter_data);
long readStartTime = StateMachine.Time; long readStartTime = StateMachine.Time;
State.Create(string.Format("{0}({1}) : Enter start states of water meters", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Enter start states of water meters and Measuring the start mass after residual flow <T stop-mass msrmt time = {2}s>", test.Method, test.Name, test.TimeStop2Mass))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(testInProgress) .AddOperation(testInProgress)//...nevhodne prepina diverter
.AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders)) .AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders))//...develop: half of step 6
.AddOperation(readStopMassOp) //...develop: half of step 6
.AddOperation(processDataLoggingOp) .AddOperation(processDataLoggingOp)
.EnterState(); .EnterState();
do { do {
e = StateMachine.WaitRunDevsRunOps(); e = StateMachine.WaitRunDevsRunOps();
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
/// Show remaining time
if ((delay = Math.Max(delay, 0)) > 60)
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
else
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
if (delay > 0)
delay--;
} }
while (!e.Contains(Event.ModelessFormClosed)); while (!e.Contains(Event.ModelessFormClosed) || !e.Contains(Event.ScaleDone));
long readEndTime = StateMachine.Time; long readEndTime = StateMachine.Time;
log.Debug("Read poseidon - took:" + (readEndTime - readStartTime)); log.Debug("Read poseidon - took:" + (readEndTime - readStartTime));
@@ -672,12 +746,11 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
} }
} }
//dripping on the scale - using of time constant for delay for measuring
State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(testInProgress) .AddOperation(testInProgress)//...nevhodne prepina diverter
.AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) .AddOperation(scale.ReadStableMassOp(ref StartMass, 0, test.MassMethod, test.MassRepeats, test.MassSpread))//...develop: step 8
.AddOperation(processDataLoggingOp) .AddOperation(processDataLoggingOp)
.EnterState(); .EnterState();
do do
@@ -699,7 +772,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Measure the start mass", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(testInProgress) .AddOperation(testInProgress)//...nevhodne prepina diverter
//.AddOperation(readStartMassOp) //.AddOperation(readStartMassOp)
.AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) .AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread))
.AddOperation(processDataLoggingOp) .AddOperation(processDataLoggingOp)
@@ -733,7 +806,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
/// Measurement loop preparation /// Measurement loop preparation
TestStartTime = DateTime.Now; TestStartTime = DateTime.Now;
StartTime = (double)StateMachine.Time; StartTime = (double)StateMachine.Time;
int estimtdEndTime = StateMachine.Time + (int)test.TestTime; int estimtdEndTime = StateMachine.Time + Convert.ToInt32(test.TestTime);
int remainingTime; int remainingTime;
StartNewStatistics(outPath.FlowMeter, BatchRslts.Batch.BatchNr, test, repetitionNr, Math.Max((int)(test.TestTime / 10), 5)); StartNewStatistics(outPath.FlowMeter, BatchRslts.Batch.BatchNr, test, repetitionNr, Math.Max((int)(test.TestTime / 10), 5));
@@ -742,10 +815,10 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
State.Create(string.Format("{0}({1}) : Start the test, open the start/stop valve", test.Method, test.Name)) State.Create(string.Format("{0}({1}) : Start the test, open the start/stop valve", test.Method, test.Name))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(cBrd.OpenStartValveOp(timeStampStart, startSwitchTime)) .AddOperation(cBrd.OpenStartValveOp(timeStampStart, startSwitchTime)) //...develop: step 9
.AddOperation(testInProgress) .AddOperation(testInProgress)
.AddOperation(controlFlowOp) .AddOperation(controlFlowOp)
.AddOperation(processDataLoggingOp) .AddOperation(processDataLoggingOp)//...develop: step 10, step 11
.EnterState(); .EnterState();
do { do {
e = StateMachine.WaitRunDevsRunOps(); e = StateMachine.WaitRunDevsRunOps();
@@ -759,6 +832,9 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
else else
Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime));
if (delay > 0)
delay--;
/// Update statistics /// Update statistics
RefFrequency.Val = cBrd.RefFrequency; RefFrequency.Val = cBrd.RefFrequency;
RefFlow.Val = outPath.FlowMeter.ReadFlow(); RefFlow.Val = outPath.FlowMeter.ReadFlow();
@@ -803,7 +879,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(testInProgress) .AddOperation(testInProgress)
.AddOperation(cBrd.CloseStartValveOp(timeStampEnd, stopSwitchTime)) .AddOperation(cBrd.CloseStartValveOp(timeStampEnd, stopSwitchTime))//...develop: step 12
.AddOperation(processDataLoggingOp) .AddOperation(processDataLoggingOp)
.EnterState(); .EnterState();
do { do {
@@ -814,6 +890,38 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
log.WarnFormat("Start valve switch time on test end = {0} ms", cBrd.ValveOpenCloseTime); log.WarnFormat("Start valve switch time on test end = {0} ms", cBrd.ValveOpenCloseTime);
///...MF
///-----------------
delay = test.TimeStop2Mass;
if (delay > 0)
{
State.Create(string.Format("{0}({1}) : Delay before end mass measuring <T stop-mass msrmt time = {2}s>", test.Method, test.Name, delay))
.AddOperation(checkUiOp)
.AddOperations(readTempPressOps)
.AddOperation(testInProgress)
.AddOperation(new Operations.TimerOp(delay)) //...develop: step 13
.EnterState();
do
{
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; }
/// Show remaining time
if ((delay = Math.Max(delay, 0)) > 60)
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
else
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
if (delay > 0)
delay--;
}
while (!e.Contains(Event.TimerExpired));
}
if (heatMetersPath == null) if (heatMetersPath == null)
LogProcessDataHeader(processDataLogger, "End mass"); LogProcessDataHeader(processDataLogger, "End mass");
else else
@@ -822,11 +930,14 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
//------------------------------------------------ //------------------------------------------------
Bridge.OnActivity(this, Strings.Measuring_the_weight); Bridge.OnActivity(this, Strings.Measuring_the_weight);
//------------------------------------------------ //------------------------------------------------
State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) /*
delay = test.TimeStop2Mass;
State.Create(string.Format("{0}({1}) : Measuring the end mass after residual flow <T stop-mass msrmt time = {2}s>", test.Method, test.Name, delay))
.AddOperation(checkUiOp) .AddOperation(checkUiOp)
.AddOperations(readTempPressOps) .AddOperations(readTempPressOps)
.AddOperation(testInProgress) //.AddOperation(testInProgress)...nevhodne prepina diverter
.AddOperation(scale.ReadStableMassOp(ref EndMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) .AddOperation(scale.ReadStableMassOp(ref EndMass, delay, test.MassMethod, test.MassRepeats, test.MassSpread))//...develop: step 13
.AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec)) .AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec))
.AddOperation(processDataLoggingOp) .AddOperation(processDataLoggingOp)
.EnterState(); .EnterState();
@@ -840,26 +951,20 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
retVal = Event.RecoverableError; retVal = Event.RecoverableError;
goto stopTest; goto stopTest;
} }
/// Show remaining time
if ((delay = Math.Max(delay, 0)) > 60)
Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", "Delay", delay / 60, "min", delay % 60, Strings.sec));
else
Bridge.OnActivity(this, string.Format("{0} ... {1} s", "Delay", delay));
if (delay > 0)
delay--;
} }
while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next)); while (!e.Contains(Event.ScaleDone) && !e.Contains(Event.Next));*/
/// ///
tMass2 = StateMachine.Time; tMass2 = StateMachine.Time;
if (test.DoDrainingAfter)
{
State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name))
.AddOperation(checkUiOp)
.AddOperation(cBrd.SetValvesOp(scale.DrainValve, null))
.EnterState();
do
{
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; }
}
while (e.Contains(Event.ValvesBusy));
}
double massStart = MeasurementCorrection.CorrectedValue(StartMass.Val, scale.Corrections); double massStart = MeasurementCorrection.CorrectedValue(StartMass.Val, scale.Corrections);
double massEnd = MeasurementCorrection.CorrectedValue(EndMass.Val, scale.Corrections); double massEnd = MeasurementCorrection.CorrectedValue(EndMass.Val, scale.Corrections);
double densityOut = Formulas.WaterDensityFromTempPress((TempUpStat.Average + TempDownStat.Average) / 2, double densityOut = Formulas.WaterDensityFromTempPress((TempUpStat.Average + TempDownStat.Average) / 2,
@@ -1037,6 +1142,20 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection
} }
} }
if (test.DoDrainingAfter)
{
State.Create(string.Format("{0}({1}) : Open the drain valve", test.Method, test.Name))
.AddOperation(checkUiOp)
.AddOperation(cBrd.SetValvesOp(scale.DrainValve, null))
.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); Bridge.OnActivity(this, Strings.Test_completed);
//------------------------------------------------ //------------------------------------------------