2018-01-16 16:23:38 +00:00
///
2021-07-01 07:32:58 +00:00
/// Copyright (c) 2018-2021 Sensus Slovensko a.s.
2018-01-16 16:23:38 +00:00
///
using System ;
using System.Collections.Generic ;
using log4net ;
2018-04-10 14:10:44 +00:00
using Config ;
2018-01-16 16:23:38 +00:00
using TBF.Resources ;
using TBF.UiBridge ;
2018-10-22 16:14:47 +00:00
using TBF.BenchControl.GenericDevices ;
2018-01-16 16:23:38 +00:00
namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged
{
public class FlyingStartMassCollProlongedSeq : Sequences . SequenceBase
{
private static readonly ILog log = LogManager . GetLogger ( typeof ( FlyingStartMassCollProlongedSeq ) ) ;
/// <summary>
/// Flying start mass collection method sequence
/// </summary>
/// <param name="test">Test entity</param>
/// <returns>
/// Event.Done . . . . . . . OK
/// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP
/// Event.OpArgumentError . Target flow is out of range
/// Event.Error . . . . . . Unspecified error
/// </returns>
public IList < Event > Execute ( Config . Entities . Test test , int repetitionNr , bool isLastRepetition ,
Single . TestParams singleTestParams ,
Compound . TestParams compoundTestParams ,
HeatMeters . TestParams heatMetersTestParams ,
Config . Entities . DebugMode debugLevel )
{
if ( debugLevel = = Config . Entities . DebugMode . Simulate )
{
2018-11-12 13:16:03 +00:00
return Simulate ( test , repetitionNr , isLastRepetition , singleTestParams , compoundTestParams , heatMetersTestParams ) ;
2018-10-22 16:14:47 +00:00
}
2018-01-16 16:23:38 +00:00
2018-10-22 16:14:47 +00:00
IScale scale = outPath . Scale as IScale ;
if ( scale = = null )
{
Bridge . OnError ( this , Strings . Missing_a_scale ) ;
2019-05-02 07:36:33 +00:00
new List < Event > { Event . ConfigurationError } ;
}
2018-01-16 16:23:38 +00:00
2018-10-22 16:14:47 +00:00
int rangeIx = 0 ; /// Default range, used for non-Elde flowmeters
if ( outPath . FlowMeter is Elde . FlowMeter . FlowMeter )
{
Elde . FlowMeter . FlowMeter eldeFM = outPath . FlowMeter as Elde . FlowMeter . FlowMeter ;
rangeIx = - 1 ; /// Indicates invalid range
for ( int r = 0 ; r < = 5 ; r + + )
{
if ( eldeFM . RangeEnabled ( r ) & & eldeFM . GetTempLo ( r ) < = test . TempLimLo
& & eldeFM . GetTempHi ( r ) > = test . TempLimHi )
{
rangeIx = r ;
}
}
2018-01-16 16:23:38 +00:00
2018-10-22 16:14:47 +00:00
if ( rangeIx = = - 1 )
{
Bridge . OnError ( this , Strings . Flow_meter_temperature_range_does_not_fit_this_test_conditions ) ;
2019-05-02 07:36:33 +00:00
new List < Event > { Event . ConfigurationError } ;
}
2018-01-16 16:23:38 +00:00
}
2018-10-22 16:14:47 +00:00
float volumeToTank = ( singleTestParams ! = null ) ? singleTestParams . VolumeToTank
: ( ( compoundTestParams ! = null ) ? compoundTestParams . VolumeToTank : heatMetersTestParams . VolumeToTank ) ;
if ( volumeToTank > scale . Capacity * Constants . TankFullFactor )
{
Bridge . OnError ( this , Strings . Volume_to_tank_exceeds_the_scale_capacity ) ;
2019-05-02 07:36:33 +00:00
new List < Event > { Event . ConfigurationError } ;
2018-10-22 16:14:47 +00:00
}
if ( volumeToTank > test . Volume )
{
Bridge . OnError ( this , Strings . Volume_to_tank_is_larger_then_the_test_volume ) ;
2019-05-02 07:36:33 +00:00
new List < Event > { Event . ConfigurationError } ;
2018-10-22 16:14:47 +00:00
}
2018-01-16 16:23:38 +00:00
2019-05-02 07:36:33 +00:00
IList < Event > e = new List < Event > ( ) ; /// Events from currently running operations
Elde . ControlBoardDev cBrd = StateMachine . ControlBoard ;
2019-05-14 14:59:20 +00:00
int tMass1 = 0 ;
int tMass2 = 0 ;
checkUiOp = new Operations . CheckUIOp ( true ) ; /// Runs in more then one state
2018-01-16 16:23:38 +00:00
processDataLoggingOp = new TBF . BenchControl . Operations . ProcessDataLoggingOp ( processDataLogger , this , heatMetersTestParams ! = null ) ;
2019-05-02 07:36:33 +00:00
int [ ] filters = new int [ ] { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
if ( sensPath ! = null & & sensPath . RegisterReaders ! = null )
{
foreach ( var rr in sensPath . RegisterReaders )
{
2020-11-05 08:31:43 +00:00
IRegReaderPulses eldeRR = rr as IRegReaderPulses ;
2019-05-02 07:36:33 +00:00
if ( ( eldeRR ! = null ) & & ( eldeRR . Position > = 1 ) & & ( eldeRR . Position < = 8 ) )
{
filters [ eldeRR . Position - 1 ] = eldeRR . Filter ;
}
}
}
2019-03-18 08:14:13 +00:00
2019-05-10 14:26:58 +00:00
cBrd . SetFiltersPidShortPulses ( filters , outPath . PidCoef , ( test . TolerRed = = 0 ) ? 0 : 1 ) ;
2019-03-18 08:14:13 +00:00
IList < IOperation > readTempPressOps = new List < IOperation > ( ) ;
if ( benchPath . TempMtrUp ! = null ) readTempPressOps . Add ( benchPath . TempMtrUp . ReadTempOp ( ref TempUp ) ) ;
if ( benchPath . TempMtrDown ! = null ) readTempPressOps . Add ( benchPath . TempMtrDown . ReadTempOp ( ref TempDown ) ) ;
if ( outPath . TempDiv ! = null ) readTempPressOps . Add ( outPath . TempDiv . ReadTempOp ( ref TempDiv ) ) ;
if ( benchPath . PressMtrUp ! = null ) readTempPressOps . Add ( benchPath . PressMtrUp . ReadPressureOp ( ref PressUp ) ) ;
if ( benchPath . PressMtrDown ! = null ) readTempPressOps . Add ( benchPath . PressMtrDown . ReadPressureOp ( ref PressDown ) ) ;
if ( benchPath . PressMtrDelta ! = null ) readTempPressOps . Add ( benchPath . PressMtrDelta . ReadPressureOp ( ref PressDelta ) ) ;
if ( heatMetersPath ! = null ) readTempPressOps . Add ( heatMetersPath . TMeterRefWarm1 . ReadTempOp ( ref TempRefHi1 ) ) ;
if ( heatMetersPath ! = null ) readTempPressOps . Add ( heatMetersPath . TMeterRefWarm2 . ReadTempOp ( ref TempRefHi2 ) ) ;
if ( heatMetersPath ! = null ) readTempPressOps . Add ( heatMetersPath . TMeterRefCold1 . ReadTempOp ( ref TempRefLo1 ) ) ;
if ( heatMetersPath ! = null ) readTempPressOps . Add ( heatMetersPath . TMeterRefCold2 . ReadTempOp ( ref TempRefLo2 ) ) ;
2018-10-22 16:14:47 +00:00
Event retVal = Event . Done ;
2018-01-16 16:23:38 +00:00
LtrPerRefPulse = outPath . FlowMeter . LtrPerPulse ;
int targetTotalPulses = ( int ) ( test . Volume / LtrPerRefPulse + 0.5f ) ;
int targetMassPulses = ( int ) ( volumeToTank / LtrPerRefPulse + 0.5f ) ;
//====================================
loop :
2019-03-18 08:14:13 +00:00
/// Read pressure and temperature once before calling Bridge.OnTestSelected(...)
State . Create ( string . Format ( "{0}({1}) : Measuring process data" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
. 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 . Busy ) ) ;
/// Start the test, initialize test results
Bridge . OnTestSelected ( this , new TestSelectedEventArgs ( test , repetitionNr , inPath , benchPath , outPath , sensPath , heatMetersPath , targetTotalPulses ) ) ;
2018-01-16 16:23:38 +00:00
string testName = Results . Utils . GetTestName ( test . Name , test . Repeats , repetitionNr ) ;
TestStartTime = DateTime . Now ;
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Checking_tank_capacity ) ;
//------------------------------------------------
bool drainTheTank = test . DoDraining ;
if ( ! drainTheTank ) /// If condition met => skip measuring and force emptying
{
///
/// Measure the weight and skip emptying if there is enough room in the tank
///
State . Create ( string . Format ( "{0}({1}) : Checking available tank capacity" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
. AddOperation ( scale . ReadMassOp ( ref Mass ) )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
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 . BalanceDone ) ) ;
double estimatedEndMass = Mass . Val + volumeToTank ;
2018-10-22 16:14:47 +00:00
if ( estimatedEndMass > = scale . Capacity * Constants . TankFullFactor )
2018-01-16 16:23:38 +00:00
{
drainTheTank = true ;
}
}
///
if ( drainTheTank )
{
#if BERLIN
2018-12-21 07:38:08 +00:00
switch ( DrainTheTank ( outPath . Scale ) )
2018-01-16 16:23:38 +00:00
{
case Event . Error : { retVal = Event . Error ; goto stopTest ; }
case Event . UiCmdStop : { retVal = Event . UiCmdStop ; goto stopTest ; }
}
drainTheTank = false ;
#else
State . Create ( string . Format ( "{0}({1}) : Open the drain valve" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
. AddOperation ( StateMachine . ControlBoard . SetValvesOp ( scale . DrainValve , null ) )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
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 . ValvesBusy ) ) ;
#endif
}
///
/// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test
///
IOperation heatMetersPromptOp = null ;
if ( heatMetersTestParams ! = null & & ! string . IsNullOrEmpty ( heatMetersTestParams . Prompt ) )
{
/// Make sure the CycleBeginForm is closed
if ( UIFlowControl . Stop = = WaitBeginFormClosed ( ) ) goto stopTest ;
heatMetersPromptOp = new Operations . MessageBoxOp ( heatMetersTestParams . Prompt ) ;
}
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Starting_the_pump ) ;
//------------------------------------------------
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
int flowSetTime0 = StateMachine . Time ;
if ( inPath . Pump is GenericDevices . IPumpFM ) ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOn ( test . PumpPower ) ;
///
State . Create ( string . Format ( "{0}({1}) : Starting the pump" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60))
. AddOperations ( readTempPressOps )
. AddOperation ( heatMetersPromptOp )
. AddOperation ( inPath . Pump ! = null ? cBrd . SetValvesOp ( inPath . Pump , null ) : null )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnProcessData ( this , new ProcessDataEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
if ( e . Contains ( Event . Error ) ) { retVal = Event . Error ; goto stopTest ; }
}
while ( e . Contains ( Event . ValvesBusy ) /* || !e.Contains(Event.AllPositionsReached)*/ ) ;
if ( test . TimePump2StartV > 0 )
{
State . Create ( string . Format ( "{0}({1}) : Waiting after the pump started" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperation ( new Operations . TimerOp ( test . TimePump2StartV ) )
. AddOperations ( readTempPressOps )
. AddOperation ( heatMetersPromptOp )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnProcessData ( this , new ProcessDataEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
}
while ( ! e . Contains ( Event . TimerExpired ) ) ;
}
if ( benchPath . StopBFValve ! = null )
{
State . Create ( string . Format ( "{0}({1}) : Opening the stop backflow valve" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperation ( StateMachine . ControlBoard . SetValvesOp ( benchPath . StopBFValve , null ) )
. AddOperations ( readTempPressOps )
. AddOperation ( heatMetersPromptOp )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
if ( e . Contains ( Event . Error ) ) { retVal = Event . Error ; goto stopTest ; }
}
while ( ! e . Contains ( Event . ValvesSet ) ) ;
}
if ( test . TimeBeforeFlow > 0 )
{
State . Create ( string . Format ( "{0}({1}) : Waiting before flow setting process starts" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperation ( new Operations . TimerOp ( test . TimeBeforeFlow ) )
. AddOperations ( readTempPressOps )
. AddOperation ( heatMetersPromptOp )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnProcessData ( this , new ProcessDataEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
}
while ( ! e . Contains ( Event . TimerExpired ) ) ;
}
setting_flow :
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Setting_the_flow ) ;
//------------------------------------------------
State . Create ( string . Format ( "{0}({1}) : Setting the flow" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
2019-05-10 14:26:58 +00:00
. AddOperation ( outPath . RegulValve . SetFlowOp ( outPath . FlowMeter , test . Qfrom , test . Qto , RefFlow , FlowSettingTimeoutSec ) )
2019-03-18 08:14:13 +00:00
. AddOperations ( readTempPressOps )
. AddOperation ( heatMetersPromptOp )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
Bridge . OnProcessData ( this , new ProcessDataEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
if ( e . Contains ( Event . OpArgumentError ) ) { retVal = Event . OpArgumentError ; goto stopTest ; }
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
if ( e . Contains ( Event . RegulValveTimeOut ) )
{
2018-06-05 09:16:13 +00:00
Bridge . OnError ( this , Strings . Flow_adjustment_failed ) ;
2019-04-08 08:33:58 +00:00
retVal = Event . RecoverableError ;
2018-01-16 16:23:38 +00:00
goto stopTest ;
}
if ( e . Contains ( Event . Next ) ) goto flow_set ;
}
while ( ! e . Contains ( Event . FlowReached ) ) ;
flow_set :
int flowSetTime = StateMachine . Time - flowSetTime0 ;
double currentFlow = RefFlow . Val ;
if ( heatMetersTestParams ! = null & & heatMetersPath ! = null )
{
//---------------------------------------------------
Bridge . OnActivity ( this , Strings . Setting_temperature ) ;
//---------------------------------------------------
int lastTimeSec = StateMachine . Time ;
double Tw_last = 0 ;
double Tc_last = 0 ;
State . Create ( string . Format ( "{0}({1}) : Check temperature stabilized." , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
. AddOperation ( heatMetersPromptOp )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
if ( e . Contains ( Event . Next ) ) goto temperature_set ;
if ( TempRefHi1 . Val ! = 0 & & TempRefHi2 . Val ! = 0 & & TempRefLo1 . Val ! = 0 & & TempRefLo2 . Val ! = 0 )
{
if ( StateMachine . Time - lastTimeSec > 10 | | StateMachine . Time - lastTimeSec < 0 )
{
double Tw = ( TempRefHi1 . Val + TempRefHi2 . Val ) / 2 ;
double Tc = ( TempRefLo1 . Val + TempRefLo2 . Val ) / 2 ;
if ( heatMetersTestParams . TempWarmLo < = Tw & & Tw < = heatMetersTestParams . TempWarmHi & &
heatMetersTestParams . TempColdLo < = Tc & & Tc < = heatMetersTestParams . TempColdHi & &
Math . Abs ( Tw - Tw_last ) < = heatMetersTestParams . ChangeInTimeWarm & &
Math . Abs ( Tc - Tc_last ) < = heatMetersTestParams . ChangeInTimeCold & &
Math . Abs ( TempRefHi1 . Val - TempRefHi2 . Val ) < = heatMetersTestParams . DeltaTempWarm & &
Math . Abs ( TempRefLo1 . Val - TempRefLo2 . Val ) < = heatMetersTestParams . DeltaTempCold )
{
goto temperature_set ;
}
lastTimeSec = StateMachine . Time ;
Tw_last = Tw ;
Tc_last = Tc ;
}
}
}
while ( true ) ;
}
else if ( test . DoControlWaterTemp & & benchPath . TempMtrUp ! = null & & benchPath . TempMtrDown ! = null )
{
//---------------------------------------------------
Bridge . OnActivity ( this , Strings . Setting_temperature ) ;
//---------------------------------------------------
State . Create ( string . Format ( "{0}({1}) : Wait until the water temperature is within limits" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
2019-03-18 08:14:13 +00:00
. AddOperations ( readTempPressOps )
2018-01-16 16:23:38 +00:00
. EnterState ( ) ;
2019-03-18 08:14:13 +00:00
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
if ( e . Contains ( Event . Next ) ) goto temperature_set ;
2019-03-18 08:14:13 +00:00
if ( ( test . TempLimLo < = TempUp . Val ) & & ( TempUp . Val < = test . TempLimHi ) & &
( test . TempLimLo < = TempDown . Val ) & & ( TempDown . Val < = test . TempLimHi ) )
2018-01-16 16:23:38 +00:00
{
goto temperature_set ;
}
}
while ( true ) ;
}
temperature_set :
///
/// Prepare cameras, ROI-s and measurementOperations
///
/// Find successfully detected ROI-s
2020-11-05 08:31:43 +00:00
IList < GenericDevices . IRegReaderLiveCamera > rois = new List < GenericDevices . IRegReaderLiveCamera > ( ) ;
2018-01-16 16:23:38 +00:00
foreach ( var rr in sensPath . RegisterReaders )
{
2020-11-05 08:31:43 +00:00
GenericDevices . IRegReaderLiveCamera cameraRoI = rr as GenericDevices . IRegReaderLiveCamera ;
2019-05-02 07:36:33 +00:00
if ( ( cameraRoI ! = null ) & & cameraRoI . Detected )
2018-08-23 09:39:11 +00:00
{
2019-05-02 07:36:33 +00:00
rois . Add ( cameraRoI ) ;
2018-08-23 09:39:11 +00:00
}
2019-05-02 07:36:33 +00:00
}
2018-01-16 16:23:38 +00:00
/// Find cameras
IList < GenericDevices . ICamera > cameras = new List < GenericDevices . ICamera > ( ) ;
foreach ( var roi in rois )
{
if ( roi . Camera ! = null & & ! cameras . Contains ( roi . Camera ) )
{
cameras . Add ( roi . Camera ) ;
roi . Camera . ClearRoiParams ( ) ;
}
}
/// Register ROI-parameters to cameras
foreach ( var roi in rois ) roi . RegisterRoiToCamera ( ) ;
/// Prepare measurementOperations
2020-02-14 08:51:55 +00:00
IList < IOperation > cameraMeasurementOperations = new List < IOperation > ( ) ;
foreach ( var camera in cameras ) cameraMeasurementOperations . Add ( camera . MeasurementOp ( ) ) ;
2018-01-16 16:23:38 +00:00
if ( drainTheTank )
{
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Closing_the_tank ) ;
//------------------------------------------------
///
/// Make sure tank draining completed
///
2019-03-18 08:14:13 +00:00
switch ( DrainTheTank ( scale , readTempPressOps ) )
2018-01-16 16:23:38 +00:00
{
case Event . Error : { retVal = Event . Error ; goto stopTest ; }
case Event . UiCmdStop : { retVal = Event . UiCmdStop ; goto stopTest ; }
}
drainTheTank = false ;
}
else
{
/// Close the drain valve anyway
State . Create ( string . Format ( "{0}({1}) : Close the drain valve" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
2019-03-18 08:14:13 +00:00
. AddOperations ( readTempPressOps )
. AddOperation ( StateMachine . ControlBoard . SetValvesOp ( null , scale . DrainValve ) )
2018-01-16 16:23:38 +00:00
. EnterState ( ) ;
2019-03-18 08:14:13 +00:00
do {
2018-01-16 16:23:38 +00:00
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 . ValvesBusy ) ) ;
}
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Measuring_the_weight ) ;
//------------------------------------------------
if ( test . TimeFlow2Mass > 0 )
{
State . Create ( string . Format ( "{0}({1}) : Waiting before 1st mass measurement" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
. AddOperation ( new Operations . TimerOp ( test . TimeFlow2Mass ) )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
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 ) ) ;
}
LogProcessDataTestInfo ( processDataLogger , test . Procedure . Name , test . Name ) ;
if ( heatMetersPath = = null ) LogProcessDataHeader ( processDataLogger , "Start mass" ) ;
else LogProcessDataHeaderHeatMeters ( processDataLogger , "Start mass" ) ;
State . Create ( string . Format ( "{0}({1}) : Measuring the start mass" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
2020-02-14 08:51:55 +00:00
. AddOperations ( cameraMeasurementOperations )
2019-03-18 08:14:13 +00:00
. AddOperations ( readTempPressOps )
. AddOperation ( scale . ReadStableMassOp ( ref StartMass , test . MassRepeats , test . MassSpread , test . MassMethod ) )
. AddOperation ( new Operations . TimerOp ( StableMassMsrmntTimeoutSec ) )
. AddOperation ( processDataLoggingOp )
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( e . Contains ( Event . Error ) ) { retVal = Event . Error ; goto stopTest ; }
if ( TestAndLogUiCmdStop ( test , e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
2019-03-08 13:52:02 +00:00
if ( e . Contains ( Event . TimerExpired ) )
{
Bridge . OnError ( this , Strings . Mass_measurement_timeout ) ;
2019-04-08 08:33:58 +00:00
retVal = Event . RecoverableError ;
2019-03-08 13:52:02 +00:00
goto stopTest ;
}
}
2018-01-16 16:23:38 +00:00
while ( ! e . Contains ( Event . BalanceDone ) ) ;
Mass . Val = StartMass . Val ;
2019-05-14 14:59:20 +00:00
tMass1 = StateMachine . Time ;
log . WarnFormat ( "Start mass = {0}kg" , StartMass ) ;
2018-01-16 16:23:38 +00:00
if ( heatMetersPath = = null ) LogProcessDataHeader ( processDataLogger , "Measurement" ) ;
else LogProcessDataHeaderHeatMeters ( processDataLogger , "Measurement" ) ;
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Test_in_progress ) ;
//------------------------------------------------
State . Create ( string . Format ( "{0}({1}) : Starting the test" , test . Method , test . Name ) )
2019-03-18 08:14:13 +00:00
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
2020-02-14 08:51:55 +00:00
. AddOperations ( cameraMeasurementOperations )
2019-03-18 08:14:13 +00:00
. AddOperation ( processDataLoggingOp )
. AddOperation ( cBrd . StartProlongedMeasurementOp ( outPath ,
Elde . TestMethods . Diverter | Elde . TestMethods . Synchro | Elde . TestMethods . MassAndContinue ,
2019-05-10 14:26:58 +00:00
test . Qfrom , test . Qto , targetTotalPulses , targetMassPulses ) )
2019-03-18 08:14:13 +00:00
. EnterState ( ) ;
do {
2018-01-16 16:23:38 +00:00
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 . MeasurementStarted ) ) ;
foreach ( var rr in sensPath . RegisterReaders )
{
2018-06-01 09:55:36 +00:00
GenericDevices . IHasTestName readerWithTstName = rr as GenericDevices . IHasTestName ;
if ( readerWithTstName ! = null )
{
readerWithTstName . TestName = test . Name ;
readerWithTstName . TestRepeats = test . Repeats ;
readerWithTstName . RepetitionNr = repetitionNr ;
}
}
2018-01-16 16:23:38 +00:00
2020-02-14 08:51:55 +00:00
///
/// Measurement loop - preparation
///
int estimtdEndTime = StateMachine . Time + ( int ) test . TstTime ;
2018-10-11 08:20:44 +00:00
StartNewStatistics ( StateMachine . Time , BatchRslts . Batch . BatchNr , test . Name , repetitionNr , 0 ) ;
2020-02-14 08:51:55 +00:00
bool isMeasurementCompleted = false ;
IList < IOperation > measurementCompletedOperations = new List < IOperation > ( ) ;
measurementCompletedOperations . Add ( checkUiOp ) ;
foreach ( var op in readTempPressOps ) measurementCompletedOperations . Add ( op ) ;
measurementCompletedOperations . Add ( processDataLoggingOp ) ;
IList < IOperation > measurementLoopOperations = new List < IOperation > ( ) ;
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 ) )
2019-03-18 08:14:13 +00:00
. EnterState ( ) ;
do {
2020-02-14 08:51:55 +00:00
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 ( ) ;
2018-01-16 16:23:38 +00:00
2020-02-14 08:51:55 +00:00
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 . 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 ) ;
2018-01-16 16:23:38 +00:00
2020-02-14 08:51:55 +00:00
if ( heatMetersPath = = null ) LogProcessDataHeader ( processDataLogger , "End mass" ) ;
else LogProcessDataHeaderHeatMeters ( processDataLogger , "End mass" ) ;
2018-01-16 16:23:38 +00:00
2020-02-14 08:51:55 +00:00
///
/// 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 ( ) ;
2018-01-16 16:23:38 +00:00
2020-02-14 08:51:55 +00:00
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
2018-01-16 16:23:38 +00:00
{
2020-02-14 08:51:55 +00:00
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 )
2018-01-16 16:23:38 +00:00
{
2020-02-14 08:51:55 +00:00
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 ) ;
2018-01-16 16:23:38 +00:00
}
else
{
2020-02-14 08:51:55 +00:00
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 ) ;
2018-01-16 16:23:38 +00:00
}
}
2020-02-14 08:51:55 +00:00
while ( ! openingDrainValveCompleted ) ;
}
2018-01-16 16:23:38 +00:00
2020-02-14 08:51:55 +00:00
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
}
2018-01-16 16:23:38 +00:00
test_completed :
2018-02-11 15:31:25 +00:00
StopRecordingStatistics ( ) ;
2019-04-25 09:00:34 +00:00
State . Create ( string . Format ( "{0}({1}) : Stopping flow regulation" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperations ( readTempPressOps )
2019-05-10 08:53:00 +00:00
. AddOperation ( cBrd . StopFlowRegulationOp ( outPath ) )
2019-04-25 09:00:34 +00:00
. 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 . FlowRegulationStopped ) ) ;
2018-01-16 16:23:38 +00:00
///
/// (Berlin:) Water is stopped immediately after the test and before the 2nd mass measurement in case:
/// - no 'transition sequence after test' is used
/// - this is the last (or the only) test repetition or test is a part of an 'outer loop'
///
if ( isLastRepetition & & transitionAfter = = null )
{
if ( inPath . Pump is GenericDevices . IPumpFM ) ( inPath . Pump as GenericDevices . IPumpFM ) . TurnOff ( ) ;
State . Create ( "SequenceBase : Transition : TestEnd - Default action" )
. AddOperation ( checkUiOp )
2019-03-18 08:14:13 +00:00
. AddOperations ( readTempPressOps )
. AddOperation ( StateMachine . ControlBoard . SetValvesOp ( StateMachine . DefaultValvesOpen , StateMachine . DefaultValvesClose ) )
2018-01-16 16:23:38 +00:00
. EnterState ( ) ;
2019-03-18 08:14:13 +00:00
do {
2018-01-16 16:23:38 +00:00
e = StateMachine . WaitRunDevsRunOps ( ) ;
if ( e . Contains ( Event . Error ) ) { retVal = Event . Error ; goto stopTest ; }
if ( TestAndLogUiCmdStop ( e ) ) { retVal = Event . UiCmdStop ; goto stopTest ; }
}
while ( ! e . Contains ( Event . ValvesSet ) ) ;
}
//------------------------------------------------
Bridge . OnActivity ( this , Strings . Test_completed ) ;
//------------------------------------------------
/// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results
if ( heatMetersPromptOp = = null )
{
if ( UIFlowControl . Stop = = WaitBeginFormClosed ( ) ) goto stopTest ;
}
///
/// Populate TestResult data entity with data
///
Results . Entities . TestRslt tstRslt = BatchRslts . GetTestRslt ( testName , test . Part ) ;
2021-06-24 11:57:31 +00:00
bool stopCycle = false ;
if ( tstRslt ! = null )
2020-01-22 12:51:47 +00:00
{
Results . Utils . GetCounterStates ( tstRslt , Program . LocalSettings . Counters ) ;
2018-01-16 16:23:38 +00:00
UpdateTempPressDensAmb ( tstRslt ) ;
double totalPulses = Convert . ToDouble ( cBrd . EtPulses ( 0 ) ) ;
double massPulses = Convert . ToDouble ( cBrd . EtPulsesK ) ;
/// Main results
2018-11-15 11:39:29 +00:00
tstRslt . MethodClass = TbfComponents . FindComponent ( test . Method ) . ClassName ;
tstRslt . StartTime = TestStartTime ;
tstRslt . EndTime = TestEndTime ;
tstRslt . FlowSetTime = flowSetTime ;
tstRslt . PulsesMaster = massPulses ; /// Pulses of the master flow meter (test total)
tstRslt . TotalPulsesMstr = totalPulses ;
2021-04-04 12:49:35 +00:00
tstRslt . TestTime = cBrd . TTime ; /// [s] measurement time (TODO: or cBrd.ImpulseTime(0) ???)
tstRslt . TimeBtwnMassMsrmnts = tMass2 - tMass1 ;
tstRslt . MassOfEvapWater = tstRslt . TimeBtwnMassMsrmnts * outPath . Scale . EvaporationRate ( tstRslt . TempDivMean ) ;
2018-11-15 11:39:29 +00:00
tstRslt . MassStartRaw = StartMass . Val ;
tstRslt . MassStart = Formulas . CorrectedValue ( tstRslt . MassStartRaw , scale . Corrections ) ;
tstRslt . MassEndRaw = EndMass . Val ;
tstRslt . MassEnd = Formulas . CorrectedValue ( tstRslt . MassEndRaw , scale . Corrections ) ;
2021-04-04 12:49:35 +00:00
tstRslt . FlowMass = 3600 * ( tstRslt . MassEnd - tstRslt . MassStart + tstRslt . MassOfEvapWater ) * totalPulses / ( tstRslt . TestTime * massPulses ) ; /// [kg/h]
double flow = 3.6 * LtrPerRefPulse * totalPulses / tstRslt . TestTime ; /// [m3/h]
tstRslt . VolumeCTV = 1000 * tstRslt . Batch . Buoyancy * ( tstRslt . MassEnd - tstRslt . MassStart + tstRslt . MassOfEvapWater ) / tstRslt . DensityLine ; /// [l] commercially true volume of collected water
2019-05-15 08:31:52 +00:00
if ( ( outPath . Diverter ! = null ) & & ( tstRslt . TestTime > float . Epsilon ) )
{
2020-06-25 07:35:10 +00:00
tstRslt . TestTimeCorrection = outPath . Diverter . TestTimeCorrection ( flow ) ;
2019-05-15 08:31:52 +00:00
tstRslt . VolumeCTV * = tstRslt . TestTime + tstRslt . TestTimeCorrection ;
tstRslt . VolumeCTV / = tstRslt . TestTime ;
}
2021-01-21 07:01:05 +00:00
tstRslt . VolumeMaster = LtrPerRefPulse * massPulses ; /// [l] volume from the master flow meter /// [l] volume from the master flow meter
tstRslt . ConstMasterRaw = outPath . FlowMeter . LtrPerPulse ; /// Uncorrected master flowmeter coefficient /// Uncorrected master flowmeter coefficient
tstRslt . ConstMasterCorr = outPath . FlowMeter . LtrPerPulseCorrected ( flow , rangeIx ) ; /// Master pulses per liter from a correction table and a flow /// Corrected master pulses per liter
tstRslt . ConstMaster = ( massPulses ! = 0 ) ? ( tstRslt . VolumeCTV / massPulses ) : tstRslt . ConstMasterCorr ;
/// Master pulses per liter from the measured mass
tstRslt . ErrorMaster = Formulas . ErrorFromVolumes ( tstRslt . VolumeMaster , tstRslt . VolumeCTV ) ;
2018-01-16 16:23:38 +00:00
2020-06-25 07:35:10 +00:00
tstRslt . FlowVolume = 3.6 * totalPulses * tstRslt . VolumeCTV / ( massPulses * tstRslt . TestTime ) ;
tstRslt . FlowMean = Convert . ToSingle ( RefFlowStat . Average ) ;
tstRslt . FlowStart = Convert . ToSingle ( RefFlowStat . First ) ;
tstRslt . FlowEnd = Convert . ToSingle ( RefFlowStat . Last ) ;
tstRslt . FlowMin = Convert . ToSingle ( RefFlowStat . Min ) ;
tstRslt . FlowMax = Convert . ToSingle ( RefFlowStat . Max ) ;
2018-01-16 16:23:38 +00:00
2019-09-04 10:28:30 +00:00
tstRslt . DiverterStart = outPath . Diverter . SwitchTimeStart . Val ;
2018-06-08 12:52:34 +00:00
tstRslt . DivStart10 = 0 ;
tstRslt . DivStart50 = 0 ;
tstRslt . DivStart90 = 0 ;
2019-09-04 10:28:30 +00:00
tstRslt . DiverterEnd = outPath . Diverter . SwitchTimeEnd . Val ;
2018-06-08 12:52:34 +00:00
tstRslt . DivEnd90 = 0 ;
tstRslt . DivEnd50 = 0 ;
tstRslt . DivEnd10 = 0 ;
log . DebugFormat ( "Diverter switch time [s]: Start: {0}ms ({1} {2} {3}) End: {4}ms ({5} {6} {7})" ,
( tstRslt . DiverterStart * 1000 ) . ToString ( "F0" ) , tstRslt . DivStart10 , tstRslt . DivStart50 , tstRslt . DivStart90 ,
( tstRslt . DiverterEnd * 1000 ) . ToString ( "F0" ) , tstRslt . DivEnd90 , tstRslt . DivEnd50 , tstRslt . DivEnd10 ) ;
2019-12-03 09:32:46 +00:00
long infoFlags = 0 ;
2021-06-24 11:57:31 +00:00
tstRslt . ErrorFlags = ( ErrorFlagsComp ! = null ) ? ErrorFlagsComp . GetErrorFlags ( tstRslt , true , false , tstRslt . DiverterStart , tstRslt . DiverterEnd , out infoFlags , out stopCycle ) : 0 ;
2019-12-03 09:32:46 +00:00
tstRslt . InfoFlags = infoFlags ;
2018-01-16 16:23:38 +00:00
if ( compoundTestParams ! = null )
{
///
/// Compound meters
///
for ( int i = 0 ; i < BatchRslts . WMPositionsCount ; i + + )
{
2019-01-14 13:32:26 +00:00
if ( ! test . IsPartCompatible ( Utils . PartNr ( i + 1 , BatchRslts . Batch . Compound ) ) ) continue ;
2018-01-16 16:23:38 +00:00
Results . Entities . MeterTestRslt mainMeterRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . CompoundMain ) ;
Results . Entities . MeterTestRslt auxMeterRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . CompoundAux ) ;
for ( int isAux = 0 ; isAux < = 1 ; isAux + + ) /// 0=main, 1=aux
{
2020-11-05 08:31:43 +00:00
GenericDevices . IRegReader regReader = sensPath . RegisterReaders [ 2 * i + isAux ] ;
2018-01-16 16:23:38 +00:00
Results . Entities . MeterTestRslt meterRslt = ( isAux = = 0 ) ? mainMeterRslt : auxMeterRslt ;
if ( meterRslt ! = null & & regReader ! = null )
{
2018-04-10 14:10:44 +00:00
meterRslt . RegReaderType = ( int ) regReader . RegisterReaderType ;
2018-02-26 11:18:04 +00:00
meterRslt . PulsesPerLiter = regReader . PulsesPerLtr ;
2018-01-16 16:23:38 +00:00
/// Optionally supress pulses from the large water meter
meterRslt . PulsesMeter = ( isAux = = 0 & & compoundTestParams . SupressTrills ) ? 0 : Convert . ToDouble ( regReader . WMPulses ) ;
meterRslt . PulsesMaster = Convert . ToDouble ( regReader . WMRefPulses ) ;
2019-11-20 08:40:54 +00:00
meterRslt . TestTime = cBrd . ImpulseTime ( regReader . Position ) ;
2018-01-16 16:23:38 +00:00
meterRslt . VolumeStart = 0 ;
meterRslt . VolumeEnd = 0 ;
meterRslt . VolumeRef = tstRslt . VolumeCTV ;
meterRslt . VolumeMeter = meterRslt . PulsesMeter * regReader . LtrsPerPulse ; /// liter
if ( meterRslt . PulsesMaster ! = 0 )
{
2018-11-15 11:39:29 +00:00
meterRslt . VolumeMeter * = ( totalPulses / meterRslt . PulsesMaster ) ;
2018-01-16 16:23:38 +00:00
}
2018-04-10 14:10:44 +00:00
meterRslt . Error = Formulas . ErrorFromVolumes ( meterRslt . VolumeMeter , tstRslt . VolumeCTV ) ; /// Main/Aux meter error is not usedfor evaluation
2018-01-16 16:23:38 +00:00
}
}
Results . Entities . MeterTestRslt compoundMeterRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . Compound ) ;
if ( compoundMeterRslt ! = null & & mainMeterRslt ! = null & & auxMeterRslt ! = null )
{
compoundMeterRslt . VolumeRef = tstRslt . VolumeCTV ;
compoundMeterRslt . VolumeMeter = mainMeterRslt . VolumeMeter + auxMeterRslt . VolumeMeter ;
2018-11-15 11:39:29 +00:00
compoundMeterRslt . PulsesMaster = totalPulses ;
2018-01-16 16:23:38 +00:00
compoundMeterRslt . TestTime = tstRslt . TestTime ;
2018-04-10 14:10:44 +00:00
compoundMeterRslt . Error = Formulas . ErrorFromVolumes ( compoundMeterRslt . VolumeMeter , compoundMeterRslt . VolumeRef ) ;
2019-01-25 15:31:26 +00:00
compoundMeterRslt . Passed = ( compoundMeterRslt . Error > = test . GetErrLimLo ( tstRslt . VolumeCTV , tstRslt . TestTime ) + test . Uncertainty )
& & ( compoundMeterRslt . Error < = test . GetErrLimHi ( tstRslt . VolumeCTV , tstRslt . TestTime ) - test . Uncertainty )
2019-12-03 09:32:46 +00:00
& & ( tstRslt . ErrorFlags = = 0 ) ;
mainMeterRslt . Passed = auxMeterRslt . Passed = compoundMeterRslt . Passed ;
2018-01-16 16:23:38 +00:00
mainMeterRslt . TestDone = auxMeterRslt . TestDone = compoundMeterRslt . TestDone = true ;
tstRslt . TestDone = true ;
}
}
}
else if ( heatMetersTestParams ! = null )
{
///
/// Heat meters
///
tstRslt . RefEnergy = Energy . Sum * tstRslt . VolumeCTV / VolumeForEnergy . Sum ; /// [J] = [J] * [l] / [l]
tstRslt . Custom1 = ( float ) TempRefHiStat . Average ;
tstRslt . Custom2 = ( float ) TempRefHiStat . First ;
tstRslt . Custom3 = ( float ) TempRefHiStat . Last ;
tstRslt . Custom4 = ( float ) TempRefHiStat . Min ;
tstRslt . Custom5 = ( float ) TempRefHiStat . Max ;
tstRslt . Custom6 = ( float ) TempRefLoStat . Average ;
tstRslt . Custom7 = ( float ) TempRefLoStat . First ;
tstRslt . Custom8 = ( float ) TempRefLoStat . Last ;
tstRslt . Custom9 = ( float ) TempRefLoStat . Min ;
tstRslt . Custom10 = ( float ) TempRefLoStat . Max ;
for ( int i = 0 ; i < BatchRslts . WMPositionsCount ; i + + )
{
2019-01-14 13:32:26 +00:00
if ( ! test . IsPartCompatible ( Utils . PartNr ( i + 1 , BatchRslts . Batch . Compound ) ) ) continue ;
2018-01-16 16:23:38 +00:00
Results . Entities . MeterTestRslt volumeRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . HeatMeterVolume ) ;
Results . Entities . MeterTestRslt energyRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . HeatMeterEnergy ) ;
2020-11-05 08:31:43 +00:00
BenchControl . GenericDevices . IRegReader volumeRegReader =
2018-01-16 16:23:38 +00:00
( sensPath . RegisterReaders . Length > 2 * i ) ? sensPath . RegisterReaders [ 2 * i ] : null ;
2020-11-05 08:31:43 +00:00
BenchControl . GenericDevices . IRegReader energyRegReader =
2018-01-16 16:23:38 +00:00
( sensPath . RegisterReaders . Length > 2 * i + 1 ) ? sensPath . RegisterReaders [ 2 * i + 1 ] : null ;
if ( volumeRslt ! = null & & volumeRegReader ! = null )
{
volumeRslt . PulsesPerLiter = volumeRegReader . PulsesPerLtr ; /// [l ^ -1]
volumeRslt . PulsesMeter = Convert . ToDouble ( volumeRegReader . WMPulses ) ;
volumeRslt . PulsesMaster = Convert . ToDouble ( volumeRegReader . WMRefPulses ) ;
volumeRslt . VolumeStart = 0 ;
volumeRslt . VolumeEnd = 0 ;
volumeRslt . VolumeMeter = volumeRslt . PulsesMeter * volumeRegReader . LtrsPerPulse ; /// [l]
volumeRslt . VolumeRef = volumeRslt . PulsesMaster * tstRslt . ConstMaster ; /// [l]
2018-02-26 12:54:26 +00:00
volumeRslt . TestTime = cBrd . ImpulseTime ( i + 1 ) ; /// [s]
2018-01-16 16:23:38 +00:00
volumeRslt . Error = Formulas . ErrorFromVolumes ( volumeRslt . VolumeMeter , volumeRslt . VolumeRef ) ;
volumeRslt . Passed = ! heatMetersTestParams . EvaluateVolume | |
2019-01-25 15:31:26 +00:00
( ( volumeRslt . Error > = test . GetErrLimLo ( tstRslt . VolumeCTV , tstRslt . TestTime ) + test . Uncertainty ) & &
( volumeRslt . Error < = test . GetErrLimHi ( tstRslt . VolumeCTV , tstRslt . TestTime ) - test . Uncertainty ) & &
2019-12-03 09:32:46 +00:00
( tstRslt . ErrorFlags = = 0 ) ) ;
2018-01-16 16:23:38 +00:00
volumeRslt . TestDone = true ;
tstRslt . TestDone = true ;
}
if ( energyRslt ! = null & & energyRegReader ! = null )
{
energyRslt . PulsesPerLiter = energyRegReader . PulsesPerLtr ; /// [kWh ^ -1]
energyRslt . PulsesMeter = Convert . ToDouble ( energyRegReader . WMPulses ) ;
energyRslt . PulsesMaster = Convert . ToDouble ( energyRegReader . WMRefPulses ) ;
energyRslt . VolumeStart = 0 ;
energyRslt . VolumeEnd = 0 ;
2018-11-15 11:39:29 +00:00
energyRslt . VolumeRef = tstRslt . RefEnergy * ( energyRslt . PulsesMaster / totalPulses ) ; /// [J]
2018-01-16 16:23:38 +00:00
energyRslt . VolumeMeter = energyRslt . PulsesMeter * Config . Units . ConvertFrom ( Config . Unit . kWh , energyRegReader . LtrsPerPulse ) ; /// [J]
2018-02-26 12:54:26 +00:00
energyRslt . TestTime = cBrd . ImpulseTime ( i + 1 ) ; /// [s]
2018-01-16 16:23:38 +00:00
energyRslt . Error = Formulas . ErrorFromVolumes ( energyRslt . VolumeMeter , energyRslt . VolumeRef ) ;
energyRslt . Passed = ( energyRslt . Error > = heatMetersTestParams . ErrorLimitLo )
& & ( energyRslt . Error < = heatMetersTestParams . ErrorLimitHi )
2019-12-03 09:32:46 +00:00
& & ( tstRslt . ErrorFlags = = 0 ) ;
2018-01-16 16:23:38 +00:00
energyRslt . TestDone = true ;
tstRslt . TestDone = true ;
}
}
}
else
{
///
/// Single meters
///
for ( int i = 0 ; i < BatchRslts . WMPositionsCount ; i + + )
{
2019-01-14 13:32:26 +00:00
if ( ! test . IsPartCompatible ( Utils . PartNr ( i + 1 , BatchRslts . Batch . Compound ) ) ) continue ;
2018-01-16 16:23:38 +00:00
/// MetersKind.Single meters
Results . Entities . MeterTestRslt meterRslt = BatchRslts . GetMeterTestRslt ( testName , i , Config . Entities . CompoundMeterId . Single ) ;
2020-11-05 08:31:43 +00:00
GenericDevices . IRegReader regReader = sensPath . RegisterReaders [ i ] ;
GenericDevices . IRegReaderDatastream dstrReader = regReader as GenericDevices . IRegReaderDatastream ;
2018-06-01 13:44:31 +00:00
TestMethods . iPerlCommunication . iPerlHead . IperlHead iPerl = regReader as TestMethods . iPerlCommunication . iPerlHead . IperlHead ;
2020-11-05 08:31:43 +00:00
GenericDevices . IRegReaderLiveCamera cameraRoi = regReader as GenericDevices . IRegReaderLiveCamera ;
2018-01-16 16:23:38 +00:00
if ( meterRslt ! = null & & regReader ! = null )
{
2018-04-10 14:10:44 +00:00
meterRslt . RegReaderType = ( int ) regReader . RegisterReaderType ;
2018-02-26 11:18:04 +00:00
meterRslt . PulsesPerLiter = regReader . PulsesPerLtr ;
2018-01-16 16:23:38 +00:00
meterRslt . PulsesMeter = Convert . ToDouble ( regReader . WMPulses ) ;
2021-01-21 07:01:05 +00:00
log . DebugFormat ( "Water meter {0}: pulses/liter={1}, meter pulses={2}" , i + 1 , meterRslt . PulsesPerLiter , meterRslt . PulsesMeter ) ;
2018-06-01 13:44:31 +00:00
if ( dstrReader ! = null )
2018-01-16 16:23:38 +00:00
{
2018-06-01 13:44:31 +00:00
meterRslt . TimestampStart = dstrReader . TimestampSecStart ;
2021-01-21 07:01:05 +00:00
meterRslt . TimestampEnd = ! dstrReader . NoSamples ? dstrReader . TimestampSecEnd : ( dstrReader . TimestampSecStart + tstRslt . TestTime ) ;
2018-06-01 13:44:31 +00:00
meterRslt . TestTime = meterRslt . TimestampEnd - meterRslt . TimestampStart ;
meterRslt . VolumeStart = dstrReader . VolumeLtrStart ; /// liter
meterRslt . VolumeEnd = dstrReader . VolumeLtrEnd ; /// liter
meterRslt . VolumeMeter = Math . Abs ( dstrReader . VolumeLtrEnd - dstrReader . VolumeLtrStart ) ;
2018-11-15 11:39:29 +00:00
meterRslt . VolumeRef = tstRslt . VolumeCTV * meterRslt . TestTime * totalPulses / ( tstRslt . TestTime * massPulses ) ;
meterRslt . PulsesMaster = totalPulses * meterRslt . TestTime / tstRslt . TestTime ;
2018-06-01 13:44:31 +00:00
if ( iPerl ! = null )
{
if ( iPerl . ResultCode ! = 0 & & ( meterRslt . WaterMeter . ResultCode & ( int ) Results . Entities . ResultCode . OptoErrorCodeMask ) = = 0 )
{
meterRslt . WaterMeter . ResultCode | = iPerl . ResultCode ;
}
2018-01-16 16:23:38 +00:00
#if IPERL
2018-10-17 07:52:08 +00:00
meterRslt . WaterMeter . CalibFactor = iPerl . CalibFactor ;
2021-06-24 10:19:15 +00:00
meterRslt . ExtraDataPath = iPerl . ExtraDataPath ;
2021-07-01 07:32:58 +00:00
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 1 ) meterRslt . X1 = iPerl . X [ 0 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 2 ) meterRslt . X2 = iPerl . X [ 1 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 3 ) meterRslt . X3 = iPerl . X [ 2 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 4 ) meterRslt . X4 = iPerl . X [ 3 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 5 ) meterRslt . X5 = iPerl . X [ 4 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 6 ) meterRslt . X6 = iPerl . X [ 5 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 7 ) meterRslt . X7 = iPerl . X [ 6 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 8 ) meterRslt . X8 = iPerl . X [ 7 ] ;
if ( TestMethods . iPerlCommunication . iPerlHead . IperlHead . FeatureVectorSize > = 9 ) meterRslt . X9 = iPerl . X [ 8 ] ;
2021-06-24 11:57:31 +00:00
#endif
2018-06-01 13:44:31 +00:00
iPerl . LastTestResult2 = iPerl . LastTestResult ; /// Save shift previous test result
iPerl . LastTestResult = meterRslt ; /// Save this test result
}
2021-01-21 07:01:05 +00:00
log . DebugFormat ( "Datastream: Tst={0} Tend={1} Tmtr={2} Ttime={3} Vst={4} Vend={5} Vmtr={6} Vref={7}" ,
meterRslt . TimestampStart ,
meterRslt . TimestampEnd ,
meterRslt . TestTime ,
tstRslt . TestTime ,
meterRslt . VolumeStart ,
meterRslt . VolumeEnd ,
meterRslt . VolumeMeter ,
meterRslt . VolumeRef ) ;
}
2018-01-16 16:23:38 +00:00
else if ( cameraRoi ! = null )
{
2021-01-21 07:01:05 +00:00
meterRslt . TimestampStart = cameraRoi . TimestampStart ; /// [s]
meterRslt . TimestampEnd = cameraRoi . TimestampEnd ; /// [s]
meterRslt . TestTime = cameraRoi . TimestampEnd - cameraRoi . TimestampStart ; /// [s]
2018-01-16 16:23:38 +00:00
2021-01-21 07:01:05 +00:00
meterRslt . VolumeStart = cameraRoi . VolumeStart ; /// [l]
meterRslt . VolumeEnd = cameraRoi . VolumeEnd ; /// [l]
meterRslt . VolumeMeter = cameraRoi . VolumeEnd - cameraRoi . VolumeStart ; /// [l]
2018-01-16 16:23:38 +00:00
2021-01-21 07:01:05 +00:00
meterRslt . VolumeRef = tstRslt . VolumeCTV * meterRslt . TestTime * totalPulses / ( tstRslt . TestTime * massPulses ) ;
meterRslt . PulsesMaster = totalPulses * meterRslt . TestTime / tstRslt . TestTime ;
log . DebugFormat ( "Camera: Tst={0} Tend={1} Tmtr={2} Ttime={3} Vst={4} Vend={5} Vmtr={6} Vref={7}" ,
meterRslt . TimestampStart ,
meterRslt . TimestampEnd ,
meterRslt . TestTime ,
tstRslt . TestTime ,
meterRslt . VolumeStart ,
meterRslt . VolumeEnd ,
meterRslt . VolumeMeter ,
meterRslt . VolumeRef ) ;
2018-11-07 07:10:12 +00:00
}
2018-01-16 16:23:38 +00:00
else
{
2018-11-07 07:10:12 +00:00
meterRslt . PulsesMaster = Convert . ToDouble ( regReader . WMRefPulses ) ;
2021-01-21 07:01:05 +00:00
meterRslt . TestTime = cBrd . ImpulseTime ( i + 1 ) ; /// [s]
meterRslt . VolumeStart = 0 ; /// [l]
meterRslt . VolumeEnd = 0 ; /// [l]
meterRslt . VolumeMeter = meterRslt . PulsesMeter * regReader . LtrsPerPulse ; /// [l]
meterRslt . VolumeRef = meterRslt . PulsesMaster * tstRslt . ConstMaster ; /// [l], tstRslt.ConstMaster is calculated from massPulses and VolumeCTV (from scale)
log . DebugFormat ( "Datastream: RefPls4mtrRR={0} RefPls4mtrBrd={1} Tmtr={2} Ttime={3} Vmtr={4} Vref={5}" ,
meterRslt . PulsesMaster ,
cBrd . EtPulses ( i + 1 ) ,
meterRslt . TestTime ,
tstRslt . TestTime ,
meterRslt . VolumeMeter ,
meterRslt . VolumeRef ) ;
}
2018-01-16 16:23:38 +00:00
2018-04-10 14:10:44 +00:00
meterRslt . Error = Formulas . ErrorFromVolumes ( meterRslt . VolumeMeter , meterRslt . VolumeRef ) ;
2019-01-25 15:31:26 +00:00
meterRslt . Passed = ( meterRslt . Error > = test . GetErrLimLo ( tstRslt . VolumeCTV , tstRslt . TestTime ) + test . Uncertainty )
& & ( meterRslt . Error < = test . GetErrLimHi ( tstRslt . VolumeCTV , tstRslt . TestTime ) - test . Uncertainty )
2019-12-03 09:32:46 +00:00
& & ( tstRslt . ErrorFlags = = 0 ) ;
meterRslt . TestDone = true ;
2018-01-16 16:23:38 +00:00
tstRslt . TestDone = true ;
}
}
}
tstRslt . Components = Results . Entities . Components . UpdateList ( BatchRslts . ComponentsList ,
new Results . Entities . Components ( ( BenchInfo ! = null ) ? BenchInfo . TestBenchId : 1 ,
( BenchInfo ! = null ) ? BenchInfo . TestBenchName : "testbench" ,
inPath . Pump ! = null ? inPath . Pump . Name : string . Empty ,
outPath . FlowMeter ! = null ? outPath . FlowMeter . Name : string . Empty ,
2018-10-22 16:14:47 +00:00
scale ! = null ? scale . Name : string . Empty ,
2018-01-16 16:23:38 +00:00
outPath . RegulValve ! = null ? outPath . RegulValve . Name : string . Empty ,
outPath . Diverter ! = null ? outPath . Diverter . Name : string . Empty ) ) ;
/// Update water meter error flags
if ( ErrorFlagsComp ! = null )
{
2020-01-31 14:45:30 +00:00
if ( BatchRslts . Batch ! = null & & BatchRslts . Batch . WaterMeters ! = null )
2018-01-16 16:23:38 +00:00
{
2020-01-31 14:45:30 +00:00
for ( int i = 0 ; i < BatchRslts . WMPositionsCount ; i + + )
2018-01-16 16:23:38 +00:00
{
2020-01-31 14:45:30 +00:00
if ( BatchRslts . Batch . WaterMeters [ i ] ! = null & & ! BatchRslts . Batch . WaterMeters [ i ] . Disabled )
{
long wmInfoFlags ;
BatchRslts . Batch . WaterMeters [ i ] . ErrorFlags = ErrorFlagsComp . GetWMtrErrorFlags ( BatchRslts . Batch . WaterMeters [ i ] . MeterTestRslts , out wmInfoFlags ) ;
BatchRslts . Batch . WaterMeters [ i ] . InfoFlags = wmInfoFlags ;
}
2018-01-16 16:23:38 +00:00
}
}
}
/// Update results
Bridge . OnTestCompleted ( this , new TestCompletedEventArgs ( testName , tstRslt ) ) ;
}
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . TransitionAfter ) ) ;
/// Append the results to the CSV-file
allResults . Info ( TestResult2CsvLine ( testName , test . Part ) ) ;
2021-06-24 11:57:31 +00:00
if ( stopCycle ) retVal = Event . ErrorFlagsStop ;
2018-01-16 16:23:38 +00:00
stopTest :
2018-02-11 15:31:25 +00:00
StopRecordingStatistics ( ) ;
2018-01-16 16:23:38 +00:00
///
/// Quit this sequence
///
2021-07-01 07:32:58 +00:00
if ( isLastRepetition | | retVal = = Event . UiCmdStop
| | retVal = = Event . OpArgumentError
| | retVal = = Event . RecoverableError
| | retVal = = Event . ErrorFlagsStop
| | retVal = = Event . Error
| | retVal = = Event . ConfigurationError )
2018-01-16 16:23:38 +00:00
{
State . Create ( string . Format ( "{0}({1}) : Stopping diverter, gate, etc." , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. AddOperation ( cBrd . StopPreviousOp ( ) )
. EnterState ( ) ;
do
{
e = StateMachine . WaitRunDevsRunOps ( ) ;
2019-04-08 08:33:58 +00:00
if ( TestAndLogUiCmdStop ( test , e ) ) break ;
2018-01-16 16:23:38 +00:00
}
while ( ! e . Contains ( Event . PreviousStopped ) ) ;
}
stopTestWOStoppingDivGateEtc :
2019-03-18 08:14:13 +00:00
return new List < Event > { retVal } ;
}
2018-10-22 16:14:47 +00:00
2020-02-14 08:51:55 +00:00
/// <summary>
/// Collection of actions executed inside measurement loop
/// </summary>
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 ) ) ;
}
/// <summary>
/// This function is invoked in the measurement loop
/// </summary>
/// <param name="heatMetersTestParams">Heat meter test parameters or null</param>
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 ;
}
}
2018-10-22 16:14:47 +00:00
IList < Event > Simulate ( Config . Entities . Test test , int repetitionNr , bool isLastRepetition ,
Single . TestParams singleTestParams ,
Compound . TestParams compoundTestParams ,
HeatMeters . TestParams heatMetersTestParams )
{
///
/// Test method simulation
///
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . FlowSetting ) ) ;
if ( compoundTestParams ! = null )
{
if ( test . Name . ToLower ( ) . Contains ( "nok" ) ) MakeSimulatedCompound ( test , 1 , 0 , 4.7f , 0.9f ) ;
else MakeSimulatedCompound ( test , 1 , 0 , 0.7f , 1.0f ) ;
}
else if ( heatMetersTestParams ! = null )
{
MakeSimulatedHeatMeters ( test , 1 , 0 , 1.5f , 1000000 , heatMetersTestParams . ErrorLimitLo , heatMetersTestParams . ErrorLimitHi , heatMetersTestParams . EvaluateVolume ) ;
}
else
{
float errorPctBase = - 1.0f ;
if ( test . Name . ToLower ( ) . Contains ( "q3" ) ) errorPctBase = - 0.5f ;
else if ( test . Name . ToLower ( ) . Contains ( "q2" ) ) errorPctBase = 0.5f ;
else if ( test . Name . ToLower ( ) . Contains ( "q1" ) ) errorPctBase = - 5.1f ;
MakeSimulated ( test , repetitionNr , 0 , errorPctBase + repetitionNr * 0.1f ) ;
}
Bridge . OnTestProgress ( this , new TestProgressEventArgs ( test , repetitionNr , Config . Entities . Progress . Completed ) ) ;
Bridge . OnTestCompleted ( this , new TestCompletedEventArgs ( test . Name , BatchRslts . GetTestRslt ( Results . Utils . GetTestName ( test . Name , 1 , 1 ) , 0 ) ) ) ;
allResults . Info ( TestResult2CsvLine ( test . Name , 0 ) ) ; /// Append the results to the CSV-file
//-------------------------------------------------------------------
Bridge . OnActivity ( this , string . Format ( "{0} Simulation" , test . Name ) ) ;
//-------------------------------------------------------------------
State . Create ( string . Format ( "{0}({1}) : Simulation" , test . Method , test . Name ) )
. AddOperation ( checkUiOp )
. EnterState ( ) ;
IList < Event > e = StateMachine . WaitRunDevsRunOps ( ) ;
2019-03-18 08:14:13 +00:00
return new List < Event > { TestAndLogUiCmdStop ( test , e ) ? Event . UiCmdStop : Event . Done } ;
}
2018-01-16 16:23:38 +00:00
}
}