Positions of reg. valves are defined in output path

This commit is contained in:
Milan Hanajik
2020-12-02 15:45:59 +01:00
parent d4ac2453b8
commit 6da5bd92ec
7 changed files with 220 additions and 83 deletions
+113 -62
View File
@@ -37,11 +37,12 @@ namespace TBF.BenchControl.Sequences
///------------------------------------------------------------
/// Global static variables set only once.
///------------------------------------------------------------
public static IList<IFlowMeter> FlowMeters; /// list of reference flowmeters
public static IList<IRegulValve> RegulValves; /// list of regulation valves
public static IList<IPumpFM> PumpsWithFM; /// list of FM controlled pumps
public static IList<IWaterMeter> WaterMeters; /// list of water meters
public static IList<ICamera> Cameras; /// list of cameras
public static IList<IFlowMeter> FlowMeters; /// list of reference flowmeters
public static IList<IRegulValve> RegulValves; /// list of regulation valves
public static IList<IRegulValve> OutputRegulValves; /// list of regulation valves
public static IList<IPumpFM> PumpsWithFM; /// list of FM controlled pumps
public static IList<IWaterMeter> WaterMeters; /// list of water meters
public static IList<ICamera> Cameras; /// list of cameras
///------------------------------------------------------------
/// Procedure related (static) variables.
@@ -491,6 +492,35 @@ namespace TBF.BenchControl.Sequences
}
/// return SetRegValvePositionOp operations for RV-s with changed positions
IList<IOperation> GetRegValvePositioningOps(IList<IRegulValve> regValves, float[] regValvePositions)
{
IList<IOperation> rvPosOps = new List<IOperation>();
if (regValves != null && regValvePositions != null)
{
for (int i = 0; i < Math.Min(regValves.Count, regValvePositions.Length); i++)
{
if (regValvePositions[i] >= 0) /// Negative value means no position change
{
if (RegulValves[i].IsCoax)
{
rvPosOps.Add(regValves[i].SetRegulValvePositionOp(regValvePositions[i], regValvePositions[i], 60));
}
else
{
float lo = Math.Max(0, regValvePositions[i] - 3.0f);
float hi = Math.Min(100.0f, regValvePositions[i] + 3.0f);
rvPosOps.Add(regValves[i].SetRegulValvePositionOp(lo, hi, 60));
}
}
}
}
return rvPosOps;
}
/// <summary>
/// Executes steps of a transition sequence
/// </summary>
@@ -612,30 +642,8 @@ namespace TBF.BenchControl.Sequences
}
}
/// Get new regulation valve positions,
float[] allRegvPositions = Utils.GetRegulValvesPositions(step.RegulValvesPct);
/// Prepare necessary SetRegValvePositionOp operations for RV-s with changed positions
IList<IOperation> rvPosOps = new List<IOperation>();
IList<string> rvPosStr = new List<string>();
for (int i = 0; i < allRegvPositions.Length; i++)
{
if (allRegvPositions[i] >= 0) /// Negative value means no position change
{
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] - 3.0f);
float hi = Math.Min(100.0f, allRegvPositions[i] + 3.0f);
rvPosOps.Add(RegulValves[i].SetRegulValvePositionOp(lo, hi, 60));
rvPosStr.Add(string.Format("RV{0}.SetRegulValvePositionOp({1}, {2}, 60s)", i, lo, hi));
}
}
}
/// Get regulation valve positioning operations
IList<IOperation> rvPosOps = GetRegValvePositioningOps(RegulValves, Utils.GetRegulValvesPositions(step.RegulValvesPct));
/// 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.
@@ -654,7 +662,6 @@ namespace TBF.BenchControl.Sequences
for (int j = 0; j <= i; j++)
{
stepStrt.AddOperation(rvPosOps[j]);
log.Debug(rvPosStr[j]);
}
lastStartedRV = i;
stepStrt.EnterState();
@@ -676,7 +683,6 @@ namespace TBF.BenchControl.Sequences
for (int j = 0; j <= lastStartedRV; j++)
{
stepDelay.AddOperation(rvPosOps[j]);
log.Debug(rvPosStr[j]);
}
stepDelay.EnterState();
bool endContitionFulfilled = false;
@@ -721,7 +727,6 @@ namespace TBF.BenchControl.Sequences
for (int j = first; j <= lastStartedRV; j++)
{
stepStop.AddOperation(rvPosOps[j]);
log.Debug(rvPosStr[j]);
}
stepStop.EnterState();
e = StateMachine.WaitRunDevsRunOps();
@@ -764,47 +769,31 @@ namespace TBF.BenchControl.Sequences
while (!e.Contains(Event.ValvesSet));
}
}
else if (context == TransitionContext.BeforeTest)
else if (context == TransitionContext.BeforeTest && inPath != null && benchPath != null && outPath != null)
{
log.WarnFormat("Transition(any, context={0}), setting the required route before a test", context);
///
/// Always set route at the beginning of this test
///
if (inPath != null && benchPath != null && outPath != null)
{
State.Create("SequenceBase : Transition : TestStart - Default action")
.AddOperation(checkUiOp)
.AddOperation(StateMachine.ControlBoard
.SetValvesOp(GenericDevices.ValveBase.Merge(inPath.ValvesOpen, benchPath.ValvesOpen, outPath.ValvesOpen),
GenericDevices.ValveBase.Merge(inPath.ValvesClose, benchPath.ValvesClose, outPath.ValvesClose)))
.EnterState();
do {
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) return Event.Error;
if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop;
}
while (e.Contains(Event.ValvesBusy));
}
Event evnt = PerformSteps(GenericDevices.ValveBase.Merge(inPath.ValvesOpen, benchPath.ValvesOpen, outPath.ValvesOpen),
GenericDevices.ValveBase.Merge(inPath.ValvesClose, benchPath.ValvesClose, outPath.ValvesClose),
GetRegValvePositioningOps(OutputRegulValves, outPath.RegulValvesPct),
"SequenceBase : Transition : TestStart - Default action");
if (evnt == Event.Error || evnt == Event.UiCmdStop) return evnt;
}
else if ((context == TransitionContext.AfterTestWithOverlap) && (nextInPath != null) && (nextBenchPath != null) && (nextOutPath != null))
else if (context == TransitionContext.AfterTestWithOverlap && nextInPath != null && nextBenchPath != null && nextOutPath != null)
{
log.WarnFormat("Transition(., context={0}), overlapped action (next flow regulation)", context);
///
/// Set route for the next test
State.Create("SequenceBase : AfterTestWithOverlap : Default action")
.AddOperation(checkUiOp)
.AddOperation(StateMachine.ControlBoard
.SetValvesOp(GenericDevices.ValveBase.Merge(nextInPath.ValvesOpen, nextBenchPath.ValvesOpen, nextOutPath.ValvesOpen),
GenericDevices.ValveBase.Merge(nextInPath.ValvesClose, nextBenchPath.ValvesClose, nextOutPath.ValvesClose)))
.EnterState();
do {
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error)) return Event.Error;
if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop;
}
while (e.Contains(Event.ValvesBusy));
///
Event evnt = PerformSteps(GenericDevices.ValveBase.Merge(nextInPath.ValvesOpen, nextBenchPath.ValvesOpen, nextOutPath.ValvesOpen),
GenericDevices.ValveBase.Merge(nextInPath.ValvesClose, nextBenchPath.ValvesClose, nextOutPath.ValvesClose),
GetRegValvePositioningOps(OutputRegulValves, outPath.RegulValvesPct),
"SequenceBase : AfterTestWithOverlap : Default action");
/// Set PID coefficient, etc.
int[] filters = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
@@ -844,6 +833,68 @@ namespace TBF.BenchControl.Sequences
}
Event PerformSteps(IList<IValve> valvesToOpen, IList<IValve> valvesToClose, IList<IOperation> rvPosOps, string stateTitle)
{
bool stopFlag = false;
bool errorFlag = false;
IList<Event> e;
int lastStartedRV = -1;
for (int i = 0; i < rvPosOps.Count; i++)
{
State stepStrt = State.Create(stateTitle)
.AddOperation(checkUiOp)
.AddOperation(StateMachine.ControlBoard.SetValvesOp(valvesToOpen, valvesToClose));
for (int j = 0; j <= i; j++) stepStrt.AddOperation(rvPosOps[j]);
lastStartedRV = i;
stepStrt.EnterState();
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error) || e.Contains(Event.RegulValveTimeOut)) { errorFlag = true; break; }
if (TestAndLogUiCmdStop(e)) { stopFlag = true; break; }
}
/// Max. valaue of lastStartedRV after exitting the loop is (rvPosOps.Count - 1)
if (!stopFlag && !errorFlag)
{
State stepRegul = State.Create(stateTitle)
.AddOperation(checkUiOp)
.AddOperation(StateMachine.ControlBoard.SetValvesOp(valvesToOpen, valvesToClose));
for (int j = 0; j <= lastStartedRV; j++) stepRegul.AddOperation(rvPosOps[j]);
stepRegul.EnterState();
do {
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error) || e.Contains(Event.RegulValveTimeOut)) { errorFlag = true; break; }
if (TestAndLogUiCmdStop(e)) { stopFlag = true; break; }
}
while (e.Contains(Event.ValvesBusy) && !e.Contains(Event.Next));
}
for (int first = 1; first <= lastStartedRV; first++)
{
State stepStop = State.Create(stateTitle)
.AddOperation(checkUiOp)
.AddOperation(StateMachine.ControlBoard.SetValvesOp(valvesToOpen, valvesToClose));
for (int j = first; j <= lastStartedRV; j++) stepStop.AddOperation(rvPosOps[j]);
stepStop.EnterState();
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error) || e.Contains(Event.RegulValveTimeOut)) { errorFlag = true; }
if (TestAndLogUiCmdStop(e)) { stopFlag = true; }
}
if (stopFlag) return Event.UiCmdStop;
if (errorFlag) return Event.Error;
return Event.Done;
}
/// <summary>
/// Opens a modeless dialog for entering data at the beginning of a procedure (serial numbers)
/// </summary>