This commit is contained in:
@@ -27,12 +27,16 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
|
||||
internal LegacyPamhagenPlc.ActuatorStates Actuators;
|
||||
internal LegacyPamhagenPlc.ActuatorStates LastActuators;
|
||||
internal LegacyPamhagenPlc.SensorStates Sensors = new(default, default, default, default, default, default, default, [
|
||||
FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown
|
||||
], default);
|
||||
internal LegacyPamhagenPlc.SensorStates[] LastSensors = [];
|
||||
|
||||
public PamhagenPlc(string comPort, Parity parity = Parity.Odd) {
|
||||
internal readonly int ConsiderLastSensorsOpen;
|
||||
internal readonly int ConsiderLastSensorsClose;
|
||||
|
||||
public PamhagenPlc(string comPort, int sensorDelayOpenMs, int sensorDelayCloseMs, Parity parity = Parity.Odd) {
|
||||
Plc = new(comPort, parity);
|
||||
ConsiderLastSensorsOpen = sensorDelayOpenMs / 125 + 1;
|
||||
ConsiderLastSensorsClose = sensorDelayCloseMs / 125 + 1;
|
||||
LastSensors = new LegacyPamhagenPlc.SensorStates[Math.Max(ConsiderLastSensorsOpen, ConsiderLastSensorsClose)];
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
@@ -44,8 +48,9 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
await Plc.TestConnection();
|
||||
Actuators = await Plc.ReadOutputs();
|
||||
LastActuators = Actuators;
|
||||
Sensors = await Plc.ReadInputs();
|
||||
State = new(Sensors, this);
|
||||
var sensors = await Plc.ReadInputs();
|
||||
LastSensors[0] = sensors;
|
||||
State = new(LastSensors, this);
|
||||
}
|
||||
|
||||
public async Task Shutdown() {
|
||||
@@ -59,8 +64,10 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
LastActuators = Actuators;
|
||||
await Plc.WriteOutputs(LastActuators);
|
||||
}
|
||||
Sensors = await Plc.ReadInputs();
|
||||
State = new(Sensors, this);
|
||||
var sensors = await Plc.ReadInputs();
|
||||
Array.Copy(LastSensors, 0, LastSensors, 1, LastSensors.Length - 1);
|
||||
LastSensors[0] = sensors;
|
||||
State = new(LastSensors, this);
|
||||
|
||||
UpdateInterlocks();
|
||||
}
|
||||
|
||||
@@ -10,7 +10,8 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
public bool OverrideDryRunClearances => Plc != null && Plc.OverrideDryRunClearances;
|
||||
|
||||
public long Valves => Actuators.Valves;
|
||||
public long PressureSensors => Sensors.PressureSensors;
|
||||
public readonly long OpenValves { get; }
|
||||
public readonly long ClosedValves { get; }
|
||||
|
||||
public bool MW1_IsSelected => Sensors.TroughSelector == 1;
|
||||
public bool MW2_IsSelected => Sensors.TroughSelector == 2;
|
||||
@@ -114,10 +115,13 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
public bool P5_HasClearance => P4_HasDryRunClearance && P5_HasPathClearance;
|
||||
public bool P6_HasClearance => P6_HasDryRunClearance && P6_HasPathClearance;
|
||||
|
||||
public PamhagenState(LegacyPamhagenPlc.SensorStates sensors, PamhagenPlc plc) {
|
||||
Sensors = sensors;
|
||||
public PamhagenState(IEnumerable<LegacyPamhagenPlc.SensorStates> sensors, PamhagenPlc plc) {
|
||||
Sensors = sensors.First();
|
||||
Plc = plc;
|
||||
|
||||
OpenValves = sensors.Take(Plc.ConsiderLastSensorsOpen).Aggregate(-1L, (m, s) => m & ~s.PressureSensors);
|
||||
ClosedValves = sensors.Take(Plc.ConsiderLastSensorsClose).Aggregate(-1L, (m, s) => m & s.PressureSensors);
|
||||
|
||||
MP1_WantsPathClearance = WantsPathClearnace(this, Paths.MP1);
|
||||
MP2_WantsPathClearance = WantsPathClearnace(this, Paths.MP2);
|
||||
P12_WantsPathClearance = WantsPathClearnace(this, Paths.P12);
|
||||
@@ -143,8 +147,10 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
P6_DryRunClearance = true;
|
||||
}
|
||||
|
||||
public bool Valve_IsClosed(int n) => Sensors.GetDS(n);
|
||||
public bool Valve_IsOpen(int n) => !Valve_IsClosed(n);
|
||||
public bool Valve_IsClosed(int n) => (ClosedValves & (1L << (n - 1))) != 0;
|
||||
public bool Valve_IsTransitioning(int n) => !Valve_IsClosed(n) && !Valve_IsOpen(n);
|
||||
public bool Valve_IsOpen(int n) => (OpenValves & (1L << (n - 1))) != 0;
|
||||
public bool? Valve_OpenState(int n) => Valve_IsOpen(n) ? true : Valve_IsClosed(n) ? false : null;
|
||||
public bool Valve_WantOpen(int n) => Actuators.GetV(n);
|
||||
public bool Valve_WantClosed(int n) => !Valve_WantOpen(n);
|
||||
|
||||
@@ -164,11 +170,11 @@ namespace PamhagenSysCtrl.Helpers.Plc {
|
||||
}
|
||||
|
||||
private static bool HasSinglePathClearance(PamhagenState state, IEnumerable<ValveStateMask> masks) {
|
||||
return masks.Any(m => state.Valves == m && ~state.PressureSensors == m);
|
||||
return masks.Any(m => state.Valves == m && state.OpenValves == m && ~state.ClosedValves == m);
|
||||
}
|
||||
|
||||
private static bool HasAnyPathClearance(PamhagenState state, IEnumerable<ValveStateMask> masks) {
|
||||
return masks.Any(m => state.Valves >= m && ~state.PressureSensors >= m);
|
||||
return masks.Any(m => state.Valves >= m && state.OpenValves >= m && ~state.ClosedValves >= m);
|
||||
}
|
||||
|
||||
private static bool WantsSinglePathClearance(PamhagenState state, IEnumerable<ValveStateMask> masks) {
|
||||
|
||||
Reference in New Issue
Block a user