From 3407b51c27e89edc7adc01ff966c6de08e7b078b Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Sun, 7 Feb 2016 22:27:32 +0100 Subject: [PATCH] All changes done for Badger-velka-trat merged into this branch, version 2.1.210. --- Config/Entities/TransitionStep.cs | 8 +- .../BenchControl/Elde/Common.cs | 10 ++- .../BenchControl/Elde/ControlComSim.cs | 34 +++++++- .../Elde/RegulValve/RegulValve.cs | 9 +-- .../BenchControl/Elde/RegulValve/SetFlowOp.cs | 35 +++++++- .../RegulValve/SetRegulValvePositionOp.cs | 12 +-- .../Elde/RegulValveTandem/RegulValveTandem.cs | 4 +- .../BenchControl/Elde/StartMeasurementOp.cs | 4 +- .../GenericDevices/IRegulValve.cs | 5 ++ .../MettlerToledo/Multi/ReadMassOp.cs | 19 ++--- .../BenchControl/Sequences/SequenceBase.cs | 75 ++++++++++++------ .../TestMethods/Adjustment/AdjustmentSeq.cs | 2 +- .../CameraRoiDetection/RoiDetectionSeq.cs | 2 +- .../CombinedMeters/CombinedMetersSeq.cs | 2 +- .../FixedStartAdvancedSeq.cs | 2 +- .../FixedStartCombinedMetersSeq.cs | 2 +- .../FixedStartMassCollectionSeq.cs | 2 +- .../TestMethods/FlyingStart/FlyingStartSeq.cs | 2 +- .../FlyingStartMassCollectionSeq.cs | 2 +- .../TestMethods/LeakTest/LeakTestSeq.cs | 4 +- .../TestMethods/PMaxTest/PMaxTestSeq.cs | 2 +- .../ReferenceFlowmeterCalibrationSeq.cs | 4 +- TestBenchFramework/Properties/AssemblyInfo.cs | 4 +- .../Badger-velka-trat/ControlComponent3U.dll | Bin 236544 -> 236544 bytes 24 files changed, 169 insertions(+), 76 deletions(-) diff --git a/Config/Entities/TransitionStep.cs b/Config/Entities/TransitionStep.cs index 68c90d615..7e263579b 100644 --- a/Config/Entities/TransitionStep.cs +++ b/Config/Entities/TransitionStep.cs @@ -55,10 +55,10 @@ namespace Config.Entities result += indent + "Duration = " + Duration.ToString() + ", "; result += indent + "Message = " + Message + ", "; result += indent + "EndCondition = " + EndCondition.ToString() + ", "; - result += indent + "ValvesOpen = " + ValvesOpen.ToString() + ", "; - result += indent + "ValvesClose = " + ValvesClose.ToString() + ", "; - result += indent + "RegulValvesPct = " + RegulValvesPct.ToString() + ", "; - result += indent + "PumpsWithFMPct = " + RegulValvesPct.ToString() + Environment.NewLine; + result += indent + "ValvesOpen = " + ValvesOpen + ", "; + result += indent + "ValvesClose = " + ValvesClose + ", "; + result += indent + "RegulValvesPct = " + RegulValvesPct + ", "; + result += indent + "PumpsWithFMPct = " + PumpWithFMPcts + Environment.NewLine; return result; } } diff --git a/TestBenchFramework/BenchControl/Elde/Common.cs b/TestBenchFramework/BenchControl/Elde/Common.cs index 60e8a186d..ec5dc0fbe 100644 --- a/TestBenchFramework/BenchControl/Elde/Common.cs +++ b/TestBenchFramework/BenchControl/Elde/Common.cs @@ -24,13 +24,14 @@ namespace TBF.BenchControl.Elde TestInProgress = 0x20, //DiverterError = 0x20, MsrmntWithDivrtr = 0x80, - RefPulsesMsrmnt = 0x100, - SynchroMethod = 0x800, - WaterMeterCalib = 0x1000, + RefPulsesMsrmnt = 0x100, /// bit 8 + SynchroMethod = 0x800, /// bit 11 + WaterMeterCalib = 0x1000, /// bit 12 EmgcyStopActive = 0x2000, MsrmntGateActive = 0x4000, TimeMeasurement = 0x8000, - FrequencyMeasured = 0x80000, + FrequencyMeasured = 0x80000, /// bit 19 + CoaxRegValveBusy = 0x200000, /// bit 21 ADCError = 0x80000000, TimeoutOccured = 0x100000000, MeretAddresses = 0x200000000, @@ -56,6 +57,7 @@ namespace TBF.BenchControl.Elde MsrmntGateActive = 0x4000, TimeMeasurement = 0x8000, FrequencyMeasured = 0x80000, + CoaxRegValveBusy = 0x200000, /// bit 21 ADCError = 0x80000000, TimeoutOccured = 0x100000000, MeretAddresses = 0x200000000, diff --git a/TestBenchFramework/BenchControl/Elde/ControlComSim.cs b/TestBenchFramework/BenchControl/Elde/ControlComSim.cs index 887c1197b..bdd993bd2 100644 --- a/TestBenchFramework/BenchControl/Elde/ControlComSim.cs +++ b/TestBenchFramework/BenchControl/Elde/ControlComSim.cs @@ -124,6 +124,8 @@ namespace TBF.BenchControl.Elde /// Percentages for switching of diverters, ix = diverter nr.(0,1), typ.value 50 (%) public void SendCalibData(uint[,] rvCalib, byte[] meretA, int usedCom, float[,] tempCalib, float[] etCalib, uint[] divEdge, uint[] balanceRange) { + log.Info("SendCalibData(...)"); + this.regValveCalib = rvCalib; this.meretRS485Address = meretA; this.tempCalibData = tempCalib; @@ -141,13 +143,35 @@ namespace TBF.BenchControl.Elde /// kolko impulzov ma trvat skuska /// See ControlBoard.TestMethods enum /// 0 = No filtering (0..255) - /// Freq.inverter control (not applicable in DT100, Munich) + /// Freq.inverter control (not applicable in DT100, Munich) /// Coefficient used to control reg. valves (1..100) /// 0 = default value, 1 = spec. processing of very short pulses /// What to stop public void SendCommand(Command cmd, int refFlowmtrNr, ulong route, int totalRefPulses, TestMethods testMethods, - float filterConstant, float[] FMFreq, int regConst, int shortImp, StopDevs stopDevs) + float filterConstant, float[] fmFreq, int regConst, int shortImp, StopDevs stopDevs) { + log.InfoFormat("SendCommand(cmd={0}, ref={1}, route={2} {3} {4} {5}, pulses={6}, TM={7}, filt={8}, pumpFM=[{9}{10}{11}{12}{13}{14}], reg={15}, shrtImp={16}, stop={17})", + cmd, + refFlowmtrNr, + ((route >> 48) & 0xFFFF).ToString("X4"), + ((route >> 32) & 0xFFFF).ToString("X4"), + ((route >> 16) & 0xFFFF).ToString("X4"), + (route & 0xFFFF).ToString("X4"), + totalRefPulses, + testMethods, + filterConstant, + fmFreq[0].ToString(), + (fmFreq.Length > 1) ? ("," + fmFreq[1].ToString()) : "", + (fmFreq.Length > 2) ? ("," + fmFreq[2].ToString()) : "", + (fmFreq.Length > 3) ? ("," + fmFreq[3].ToString()) : "", + (fmFreq.Length > 4) ? ("," + fmFreq[4].ToString()) : "", + (fmFreq.Length > 5) ? ("," + fmFreq[5].ToString()) : "", + regConst, + shortImp, + stopDevs); + /// + /// Simulation + /// Command lastCmd = this.cmd; this.cmd = cmd; this.refFlowmtrNr = refFlowmtrNr; @@ -169,7 +193,7 @@ namespace TBF.BenchControl.Elde this.totalRefPulses = totalRefPulses; this.testMethods = testMethods; this.filterConstant = filterConstant; - this.FMFreq = FMFreq; + this.FMFreq = fmFreq; this.regConst = regConst; this.shortImp = shortImp; this.stopDevs = stopDevs; @@ -210,6 +234,8 @@ namespace TBF.BenchControl.Elde /// Stabilization time when setting the flow: 0=200ms, step 50ms, max. 1.5 sec. public void ValveMove(int regulValveNo, RegulValveMode regulValveMode, float[] regulValveValue, int stableTime) { + log.InfoFormat("ValveMove({0}, {1}, [{2},{3}], {4})", regulValveNo, regulValveMode, regulValveValue[0], regulValveValue[1], stableTime); + this.regulValveNo = regulValveNo; this.regulValveMode = regulValveMode; this.regulValveValue = regulValveValue; @@ -219,7 +245,7 @@ namespace TBF.BenchControl.Elde { TestBenchSim.RunDevice(regulValveNo, refFlowmtrNr, statusP); - log.DebugFormat("refFreq=", referenceFreq); + log.DebugFormat("refFreq={0}", referenceFreq); tTime += 1.0f; diff --git a/TestBenchFramework/BenchControl/Elde/RegulValve/RegulValve.cs b/TestBenchFramework/BenchControl/Elde/RegulValve/RegulValve.cs index 8ed2b55e1..93fddb16a 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValve/RegulValve.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValve/RegulValve.cs @@ -30,11 +30,10 @@ namespace TBF.BenchControl.Elde.RegulValve public int DacValueOpen { get { return RegulValveCfg.AdcValueOpen; } } /// 0..1023 public int StableTime { get { return RegulValveCfg.StableTime; } } /// 0=200ms, step=50ms, max. 1500ms (max.26) public int FlowStableSec { get { return RegulValveCfg.FlowStableSec; } } /// 0..60 sec - /// - public float Position - { - get { return ControlBoard.RValvePosition(Idx1); } - } + /// + public bool IsCoax { get { return (Idx1 == COAX_IDX); } } + /// + public float Position { get { return ControlBoard.RValvePosition(Idx1); } } #region Configuration Change Handling diff --git a/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs index f1972aabd..ca9ccc43a 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValve/SetFlowOp.cs @@ -17,6 +17,9 @@ namespace TBF.BenchControl.Elde.RegulValve return string.Format("SetFlowOp({0}, Qfrom={1}, Qto={2}, PID={3})", regulValve.Name, reqFlowLo, reqFlowHi, pidCoef); } + const int CoaxValveNr = 7; /// Coax. valve has number 7 + + /// Set by the constructor readonly ControlBoardDev controlBoard; readonly Elde.RegulValve.RegulValve regulValve; @@ -267,7 +270,17 @@ namespace TBF.BenchControl.Elde.RegulValve opState = OpState.SendCommandAgain; return Event.None; } - else if (regulValveNr == 7 || controlBoard.RegulValveState(regulValveNr) != RegulValveState.DacValueRegul) + else if (regulValveNr == CoaxValveNr && ((ulong)controlBoard.StatusP & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + /// Repeat appropriate ValveMove(...) command + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, + new float[2] { (targetPositionLo + targetPositionHi) / 2, (targetPositionLo + targetPositionHi) / 2 }, + regulValve.StableTime); + + opState = OpState.ValveMoveToPosition3; + return Event.None; + } + else if (regulValveNr < 6 && controlBoard.RegulValveState(regulValveNr) != RegulValveState.DacValueRegul) { /// Repeat appropriate ValveMove(...) command controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetPosition, @@ -331,7 +344,19 @@ namespace TBF.BenchControl.Elde.RegulValve opState = OpState.SendCommandAgain; return Event.None; } - else if (regulValveNr == 7 || controlBoard.RegulValveState(regulValveNr) != RegulValveState.PwOrFreqRegul) + else if (regulValveNr == CoaxValveNr && ((ulong)controlBoard.StatusP & (ulong)StatusP.CoaxRegValveBusy) == 0) + { + /// Done once, issues an appropriate ValveMove(...) command + float freqLo = 2000.0f * reqFlowLo / nominalFlow; + float freqHi = 2000.0f * reqFlowHi / nominalFlow; + controlBoard.ValveMove(regulValveNr, RegulValveMode.TargetFrequency, + new float[2] { (freqLo + freqHi) / 2.0f, (freqLo + freqHi) / 2.0f }, + regulValve.StableTime); + + opState = OpState.ValveMoveToFlow3; + return Event.None; + } + else if (regulValveNr < 6 && controlBoard.RegulValveState(regulValveNr) != RegulValveState.PwOrFreqRegul) { /// Done once, issues an appropriate ValveMove(...) command float freqLo = 2000.0f * reqFlowLo / nominalFlow; @@ -376,11 +401,15 @@ namespace TBF.BenchControl.Elde.RegulValve regulValveNr, reqFlowAve, rvPosition.ToString("F1")); } } + + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow, reqFlowLo, reqFlowHi); + opState = OpState.FlowReached; return Event.FlowReached; } else { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, FLOW_OK_TIMER={3}s)", flow, reqFlowLo, reqFlowHi, flowWithinBoundsTime); return Event.None; } } @@ -390,12 +419,14 @@ namespace TBF.BenchControl.Elde.RegulValve } else { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2})", flow, reqFlowLo, reqFlowHi); flowWithinBoundsTime = 0; return Event.None; } } else /// opState == OpState.FlowReached { + log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, REACHED)", flow, reqFlowLo, reqFlowHi); return Event.FlowReached; } } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs b/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs index a2f5e7ac0..274d2409f 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValve/SetRegulValvePositionOp.cs @@ -84,7 +84,8 @@ namespace TBF.BenchControl.Elde.RegulValve { if (firstRun) { - if (posLoPct >= posHiPct || posLoPct >= 100.0f || posHiPct <= 0) + if (posLoPct > posHiPct || (!regulValve.IsCoax && posLoPct == posHiPct) || + posLoPct > 100.0f || posHiPct < 0) { return Event.OpArgumentError; } @@ -125,10 +126,11 @@ namespace TBF.BenchControl.Elde.RegulValve /// Stop this operation public void Stop() { - controlBoard.ValveMove(regulValveNr, - RegulValveMode.Stop, - new float[2] { posLoPct, posHiPct }, - regulValve.StableTime); + if (!regulValve.IsCoax) + { + controlBoard.ValveMove(regulValveNr, RegulValveMode.Stop, + new float[2] { posLoPct, posHiPct }, regulValve.StableTime); + } } } } diff --git a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs index 7ddba7c6a..c71284d6f 100644 --- a/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs +++ b/TestBenchFramework/BenchControl/Elde/RegulValveTandem/RegulValveTandem.cs @@ -29,7 +29,9 @@ namespace TBF.BenchControl.Elde.RegulValveTandem public int FlowStableSec { get { return RegulValveTandemCfg.FlowStableSec; } } /// 0..60 sec /// - public float Position + public bool IsCoax { get { return false; } } + + public float Position { get { return regulValve.Position; } } diff --git a/TestBenchFramework/BenchControl/Elde/StartMeasurementOp.cs b/TestBenchFramework/BenchControl/Elde/StartMeasurementOp.cs index f56eb6f22..0303d8494 100644 --- a/TestBenchFramework/BenchControl/Elde/StartMeasurementOp.cs +++ b/TestBenchFramework/BenchControl/Elde/StartMeasurementOp.cs @@ -97,8 +97,8 @@ namespace TBF.BenchControl.Elde public void Start() { controlBoard.SyncRoute(); -#if IPERLST - int flowMeterIdxAndDiv = flowMeterNr + 16 * diverterNr; +#if IPERLST || BADGER_VELKA_TRAT + int flowMeterIdxAndDiv = flowMeterNr + 16 * diverterNr; #else int flowMeterIdxAndDiv = flowMeterNr; #endif diff --git a/TestBenchFramework/BenchControl/GenericDevices/IRegulValve.cs b/TestBenchFramework/BenchControl/GenericDevices/IRegulValve.cs index 0c3324d96..29c8c9e61 100644 --- a/TestBenchFramework/BenchControl/GenericDevices/IRegulValve.cs +++ b/TestBenchFramework/BenchControl/GenericDevices/IRegulValve.cs @@ -10,6 +10,11 @@ namespace TBF.BenchControl.GenericDevices { public interface IRegulValve : IComponent { + /// + /// true = The regulation valve is 4-20 mA current controlled coaxial valve + /// + bool IsCoax { get; } + /// /// Regulation valve position 0.0 .. 100.0 % /// diff --git a/TestBenchFramework/BenchControl/MettlerToledo/Multi/ReadMassOp.cs b/TestBenchFramework/BenchControl/MettlerToledo/Multi/ReadMassOp.cs index e915a5911..f8560163f 100644 --- a/TestBenchFramework/BenchControl/MettlerToledo/Multi/ReadMassOp.cs +++ b/TestBenchFramework/BenchControl/MettlerToledo/Multi/ReadMassOp.cs @@ -39,7 +39,6 @@ namespace TBF.BenchControl.MettlerToledo.Multi /// Start this operation public void Start() { - started = false; done = false; started = BalanceDev.GetImmediateMassMeasurement(balanceDev.IdNr, balanceDev.Name); } @@ -55,19 +54,21 @@ namespace TBF.BenchControl.MettlerToledo.Multi if (!started) { started = BalanceDev.GetImmediateMassMeasurement(balanceDev.IdNr, balanceDev.Name); - return Event.Busy; + if (!done) return Event.Busy; + else return Event.BalanceDone; + } + else if (started && balanceDev.MsrmntState == MsrmntState.Valid) + { + result.Val = balanceDev.Mass; + log.InfoFormat("ReadMassOp.Run() ... mass={0} ... returning Event.BalanceDone", balanceDev.Mass); + done = true; + started = false; + return Event.BalanceDone; /// Mass read OK } else if (done) { return Event.BalanceDone; /// Mass has already been read (at least once) } - else if (balanceDev.MsrmntState == MsrmntState.Valid) - { - result.Val = balanceDev.Mass; - log.InfoFormat("ReadMassOp.Run() ... mass={0} ... returning Event.BalanceDone", balanceDev.Mass); - done = true; - return Event.BalanceDone; /// Mass read OK - } else { return Event.Busy; diff --git a/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs b/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs index d892a3f45..d7d0a8998 100644 --- a/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs +++ b/TestBenchFramework/BenchControl/Sequences/SequenceBase.cs @@ -233,9 +233,10 @@ namespace TBF.BenchControl.Sequences public enum TransitionContext { PurgeBegin, - PurgeEnd, BeforeTest, AfterTest, + PurgeEnd, + Stop, } /// @@ -250,20 +251,25 @@ namespace TBF.BenchControl.Sequences /// protected Event Transition(TransitionSequence transitionSequence, TransitionContext context) { + bool stopFlag = false; + bool errorFlag = false; IList e; - string message; + /// switch (context) { case TransitionContext.PurgeBegin: message = Strings.Purging_i_n; break; - case TransitionContext.PurgeEnd: message = Strings.Emptying_i_n; break; case TransitionContext.BeforeTest: message = Strings.Test_start_sequence_i_n; break; case TransitionContext.AfterTest: message = Strings.Test_stop_sequence_i_n; break; - default: message = "Transition"; break; + case TransitionContext.PurgeEnd: message = Strings.Emptying_i_n; break; + case TransitionContext.Stop: message = Strings.Test_stop_sequence_i_n; break; + default: message = "Transition"; break; } if (transitionSequence == null) { + log.WarnFormat("Transition(null, context={0})", context); + /// /// No transition sequence defined --> Default action /// @@ -311,6 +317,9 @@ namespace TBF.BenchControl.Sequences .List(); int stepsCount = transitionSteps.Count; + + log.WarnFormat("Transition(sequence={0} ({1} steps), context={2})", transitionSequence.Name, stepsCount, context); + foreach (var step in transitionSteps) { //------------------------------------------------ @@ -346,18 +355,24 @@ namespace TBF.BenchControl.Sequences { if (allRegvPositions[i] >= 0) /// Negative value means no position change { - float lo = Math.Max(0, allRegvPositions[i] - 0.05f); - float hi = Math.Min(100.0f, allRegvPositions[i] + 0.05f); - rvPosOps.Add(RegulValves[i].SetRegulValvePositionOp(lo, hi, 60)); - rvPosStr.Add(string.Format("RV{0}.SetRegulValvePositionOp({1}, {2}, 60s)", i, lo, hi)); + if (RegulValves[i].IsCoax) + { + rvPosOps.Add(RegulValves[i].SetRegulValvePositionOp(allRegvPositions[i], allRegvPositions[i], 60)); + rvPosStr.Add(string.Format("RV{0}.SetRegulValvePositionOp({1}, {1}, 60s)", i, allRegvPositions[i])); + } + else + { + float lo = Math.Max(0, allRegvPositions[i] - 0.05f); + float hi = Math.Min(100.0f, allRegvPositions[i] + 0.05f); + rvPosOps.Add(RegulValves[i].SetRegulValvePositionOp(lo, hi, 60)); + rvPosStr.Add(string.Format("RV{0}.SetRegulValvePositionOp({1}, {2}, 60s)", i, lo, hi)); + } } } /// Max. one SetRegulValvePositionOp can be started or stopped in one sub-step. /// Therefore SetRegulValvePositionOp operations are added and removed to subsequent states one by one. int delay = Math.Max(2, step.Duration - rvPosOps.Count + 2); - bool stopFlag = false; - bool errorFlag = false; /// int lastStartedRV = -1; @@ -383,7 +398,7 @@ namespace TBF.BenchControl.Sequences } /// Max. valaue of lastStartedRV after exitting the loop is (rvPosOps.Count - 1) - if (!(stopFlag || errorFlag)) + if (!stopFlag && !errorFlag) { log.DebugFormat("SequenceBase.Transition() : Step {0} delay {1}s, opening={2}, closing={3}", step.ItemNr + 1, delay, step.ValvesOpen, step.ValvesClose); State stepDelay = State @@ -446,32 +461,42 @@ namespace TBF.BenchControl.Sequences if (e.Contains(Event.UiCmdStop)) { stopFlag = true; } } - if (errorFlag) return Event.Error; - if (stopFlag) return Event.UiCmdStop; + if (errorFlag || stopFlag) break; } + + Bridge.OnMessage(this, string.Empty); /// Clear the last step message } - if (context == TransitionContext.AfterTest) + if (context == TransitionContext.Stop || errorFlag || stopFlag) { /// /// Stop the pump at the end of test /// foreach (var fmPump in PumpsWithFM) fmPump.TurnOff(); - State.Create("SequenceBase : Test(s) completed -> Stopping the pump") - .AddOperation(checkUiOp) - .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) - .AddOperation((inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) - .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, inPath.Pump)) - .EnterState(); - do + + if (inPath != null) { - e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) return Event.Error; + State.Create("SequenceBase.Transition() : Test stopped -> Stopping the pump") + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.UpdateTankWeightOp()) + .AddOperation((inPath.Pump is GenericDevices.IPumpFM) ? (inPath.Pump as GenericDevices.IPumpFM).TurnOffOp() : null) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, inPath.Pump)) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + } + while (!e.Contains(Event.ValvesSet) || ((inPath.Pump is GenericDevices.IPumpFM) && !e.Contains(Event.TurnPumpOnOffDone))); } - while (!e.Contains(Event.ValvesSet) || ((inPath.Pump is GenericDevices.IPumpFM) && !e.Contains(Event.TurnPumpOnOffDone))); } - return Event.Done; + if (errorFlag) + return Event.Error; + else if (stopFlag) + return Event.UiCmdStop; + else + return Event.Done; } diff --git a/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs b/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs index 2f7b81645..1dc59e305 100644 --- a/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/Adjustment/AdjustmentSeq.cs @@ -377,7 +377,7 @@ namespace TBF.BenchControl.TestMethods.Adjustment /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/CameraRoiDetection/RoiDetectionSeq.cs b/TestBenchFramework/BenchControl/TestMethods/CameraRoiDetection/RoiDetectionSeq.cs index 3bca8f2f8..1d6086fc3 100644 --- a/TestBenchFramework/BenchControl/TestMethods/CameraRoiDetection/RoiDetectionSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/CameraRoiDetection/RoiDetectionSeq.cs @@ -147,7 +147,7 @@ namespace TBF.BenchControl.TestMethods.CameraRoiDetection /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs b/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs index bc192b483..a6e94bf55 100644 --- a/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/CombinedMeters/CombinedMetersSeq.cs @@ -496,7 +496,7 @@ namespace TBF.BenchControl.TestMethods.CombinedMeters /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs index 90e9dd356..c6624d695 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FixedStartAdvanced/FixedStartAdvancedSeq.cs @@ -592,7 +592,7 @@ namespace TBF.BenchControl.TestMethods.FixedStartAdvanced /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/FixedStartCombinedMeters/FixedStartCombinedMetersSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FixedStartCombinedMeters/FixedStartCombinedMetersSeq.cs index 8f2d4abeb..b2d1fbc3a 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FixedStartCombinedMeters/FixedStartCombinedMetersSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FixedStartCombinedMeters/FixedStartCombinedMetersSeq.cs @@ -620,7 +620,7 @@ namespace TBF.BenchControl.TestMethods.FixedStartCombinedMeters /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs index d615ae232..6ccf9f1d2 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FixedStartMassCollection/FixedStartMassCollectionSeq.cs @@ -591,7 +591,7 @@ namespace TBF.BenchControl.TestMethods.FixedStartMassCollection /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs index 15aa56d36..94943a034 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs @@ -347,7 +347,7 @@ namespace TBF.BenchControl.TestMethods.FlyingStart /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index f90eb4d2f..6be1001e3 100644 --- a/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -533,7 +533,7 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs b/TestBenchFramework/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs index 76ac7db84..715626d4d 100644 --- a/TestBenchFramework/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/LeakTest/LeakTestSeq.cs @@ -399,9 +399,9 @@ namespace TBF.BenchControl.TestMethods.LeakTest /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { - case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } + case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } } diff --git a/TestBenchFramework/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs b/TestBenchFramework/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs index 119c7626d..9daec886e 100644 --- a/TestBenchFramework/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/PMaxTest/PMaxTestSeq.cs @@ -315,7 +315,7 @@ namespace TBF.BenchControl.TestMethods.PMaxTest /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } diff --git a/TestBenchFramework/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs b/TestBenchFramework/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs index e4f28b2ad..c95cac436 100644 --- a/TestBenchFramework/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs +++ b/TestBenchFramework/BenchControl/TestMethods/ReferenceFlowmeterCalibration/ReferenceFlowmeterCalibrationSeq.cs @@ -410,9 +410,9 @@ namespace TBF.BenchControl.TestMethods.ReferenceFlowmeterCalibration /// Transition sequence at the end of test /// Prevent overwriting 'retVal' in case it was set to non-default value earlier - switch (Transition(transitionAfter, TransitionContext.AfterTest)) + switch (Transition(transitionAfter, (retVal == Event.Done) ? TransitionContext.AfterTest : TransitionContext.Stop)) { - case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } + case Event.Error: { if (retVal == Event.Done) retVal = Event.Error; break; } case Event.UiCmdStop: { if (retVal == Event.Done) retVal = Event.UiCmdStop; break; } } diff --git a/TestBenchFramework/Properties/AssemblyInfo.cs b/TestBenchFramework/Properties/AssemblyInfo.cs index 9a31382e3..5cd0df90c 100644 --- a/TestBenchFramework/Properties/AssemblyInfo.cs +++ b/TestBenchFramework/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.1.190.1")] -[assembly: AssemblyFileVersion("2.1.190.1")] +[assembly: AssemblyVersion("2.1.210.1")] +[assembly: AssemblyFileVersion("2.1.210.1")] diff --git a/packages/ControlBoard/Badger-velka-trat/ControlComponent3U.dll b/packages/ControlBoard/Badger-velka-trat/ControlComponent3U.dll index acada01ec534ddeab10ba2e855d74d07afd91d68..6cb098805c69a880baf1b76469543fa159f2e042 100644 GIT binary patch delta 6573 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 Zp|(IpX2!ZyZL4_hW&y8w(n9g?{9k*AT