Positions of reg. valves are defined in output path
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user