@@ -1,4 +1,5 @@
|
||||
using PamhagenSysCtrl.Helpers.Pipeline;
|
||||
using PamhagenSysCtrl.Helpers.Plc;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
@@ -34,73 +35,17 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
protected bool IsRunning = true;
|
||||
protected Thread? BackgroundThread;
|
||||
|
||||
public bool ManualControlMode { get; set; }
|
||||
public bool OverridePathClearances { get; set; }
|
||||
public bool OverrideDryRunClearances { get; set; }
|
||||
|
||||
public event EventHandler<PlantEventArgs>? Update;
|
||||
|
||||
protected bool ActuatorsChanged = false;
|
||||
protected PamhagenPlc.ActuatorStates Actuators;
|
||||
protected PamhagenPlc.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);
|
||||
|
||||
public string? PlcPortName => Plc?.PortName;
|
||||
public T1.Status? LastPlcStatus => Plc?.LastPlcStatus;
|
||||
public T1Error? LastPlcError => Plc?.LastPlcError;
|
||||
public T1.Status? LastPlcStatus => Plc?.LastStatus;
|
||||
public T1Error? LastPlcError => Plc?.LastError;
|
||||
public long? LastRttNs { get; private set; }
|
||||
|
||||
public bool IsValveOpen(int n) => !IsValveClosed(n);
|
||||
public bool IsValveClosed(int n) => Sensors.GetDS(n);
|
||||
public bool WantValveClosed(int n) => !WantValveOpen(n);
|
||||
public bool WantValveOpen(int n) => Actuators.GetV(n);
|
||||
|
||||
public bool AreValvesOpen(params int[] ns) => ns.All(IsValveOpen) && ns.All(WantValveOpen);
|
||||
public bool AreValvesClosed(params int[] ns) => ns.All(IsValveClosed) && ns.All(WantValveClosed);
|
||||
|
||||
public int TroughSelector => Sensors.TroughSelector;
|
||||
public bool IsMW1Selected => Sensors.TroughSelector == 1;
|
||||
public bool IsMW2Selected => Sensors.TroughSelector == 2;
|
||||
public FillState FillLevelMW1 => Sensors.FillingLevelMW1;
|
||||
public FillState FillLevelMW2 => Sensors.FillingLevelMW2;
|
||||
public bool Press1HasClearance => Sensors.ClearancePress1;
|
||||
public bool Press2HasClearance => Sensors.ClearancePress2;
|
||||
public FillState FillLevelT1 => Sensors.FillingLevelTanks[0];
|
||||
public FillState FillLevelT2 => Sensors.FillingLevelTanks[1];
|
||||
public FillState FillLevelT3 => Sensors.FillingLevelTanks[2];
|
||||
public FillState FillLevelT4 => Sensors.FillingLevelTanks[3];
|
||||
public FillState FillLevelT5 => Sensors.FillingLevelTanks[4];
|
||||
public FillState FillLevelT6 => Sensors.FillingLevelTanks[5];
|
||||
public FillState FillLevelT7 => Sensors.FillingLevelTanks[6];
|
||||
public FillState FillLevelT8 => Sensors.FillingLevelTanks[7];
|
||||
public FillState FillLevelT9 => Sensors.FillingLevelTanks[8];
|
||||
public FillState[] TankFillLevels => Sensors.FillingLevelTanks;
|
||||
public double GradationOe => Sensors.GradationOe;
|
||||
public MotorState PresseQuerSchnecke => Sensors.PresseQuerSchnecke;
|
||||
public bool IsPresseQuerSchneckeActive => PresseQuerSchnecke == MotorState.Forward;
|
||||
|
||||
public bool WantMW1Selected => Actuators.GetV(58);
|
||||
public bool WantMW2Selected => !Actuators.GetV(58);
|
||||
|
||||
public bool IsTroughAugerActive => Actuators.TroughAuger;
|
||||
public bool TroughAugerHasClearance => IsReblerActive && !(IsMW1Selected && FillLevelMW1 == FillState.Full) && !(IsMW2Selected && FillLevelMW2 == FillState.Full);
|
||||
public bool IsReblerActive => Actuators.Rebler;
|
||||
public bool IsStirrerMW1Active => Actuators.StirrerMW1;
|
||||
public bool IsStirrerMW2Active => Actuators.StirrerMW2;
|
||||
public bool IsAuger1Active => Actuators.Auger1;
|
||||
public bool IsAuger2Active => Actuators.Auger2;
|
||||
public bool IsAuger3Active => Actuators.Auger3;
|
||||
public bool IsWasteDisposalActive => IsAuger1Active || IsAuger2Active || IsAuger3Active;
|
||||
public bool IsGradationPumpActive => Actuators.GradationPump;
|
||||
|
||||
public bool IsMP1Active => Actuators.MP1 == MotorState.Forward || Actuators.MP1 == MotorState.Backward;
|
||||
public bool IsMP2Active => Actuators.MP2 == MotorState.Forward || Actuators.MP2 == MotorState.Backward;
|
||||
public bool IsP12Active => Actuators.P12 == MotorState.Forward;
|
||||
public bool IsP3Active => Actuators.P3 == MotorState.Forward;
|
||||
public bool IsP4Active => Actuators.P4 == MotorState.Forward;
|
||||
public bool IsP5Active => Actuators.P5 == MotorState.Forward;
|
||||
public bool IsP6Active => Actuators.P6 == MotorState.Forward;
|
||||
public PamhagenState State => Plc?.State ?? default; // FIXME
|
||||
public bool ManualControlMode { get => Plc?.ManualControlMode ?? false; set => Plc?.ManualControlMode = value; }
|
||||
public bool OverridePathClearances { get => Plc?.OverridePathClearances ?? false; set => Plc?.OverridePathClearances = value; }
|
||||
public bool OverrideDryRunClearances { get => Plc?.OverrideDryRunClearances ?? false; set => Plc?.OverrideDryRunClearances = value; }
|
||||
|
||||
public PamhagenPlant(string portName) {
|
||||
try {
|
||||
@@ -120,7 +65,6 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
Keyboard.SetBacklight(Color.FromRgb(4, 4, 4));
|
||||
} catch { }
|
||||
|
||||
Update += OnUpdate;
|
||||
Update += UpdateKeyboardBacklights;
|
||||
}
|
||||
|
||||
@@ -128,56 +72,17 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
App.MainDispatcher?.BeginInvoke(() => Update?.Invoke(this, evt));
|
||||
}
|
||||
|
||||
protected static void OnUpdate(object? sender, PlantEventArgs evt) {
|
||||
if (sender is not PamhagenPlant p) return;
|
||||
|
||||
if (!p.ManualControlMode) {
|
||||
if (p.IsPresseQuerSchneckeActive && !p.IsAuger2Active) p.StartAuger2();
|
||||
if (p.IsReblerActive && !p.IsAuger1Active) p.StartAuger1();
|
||||
if (p.IsAuger1Active && !p.IsAuger2Active) p.StartAuger2();
|
||||
if (p.IsAuger2Active && !p.IsAuger3Active) p.StartAuger3();
|
||||
if (p.IsTroughAugerActive && !p.TroughAugerHasClearance)
|
||||
p.StopTroughAuger();
|
||||
if (!p.IsPresseQuerSchneckeActive && !p.IsAuger1Active) {
|
||||
p.StopAuger2();
|
||||
p.StopAuger3();
|
||||
}
|
||||
}
|
||||
|
||||
if (p.IsMP1Active && !p.MP1HasClearance) p.StopMP1();
|
||||
if (p.IsMP2Active && !p.MP2HasClearance) p.StopMP2();
|
||||
|
||||
if (!p.ManualControlMode) {
|
||||
if (p.MP1 == MotorState.Forward && p.FillLevelMW1 >= FillState.Half && !p.IsStirrerMW1Active) {
|
||||
p.StartStirrerMW1();
|
||||
} else if (p.IsStirrerMW1Active && (!p.IsMP1Active || p.FillLevelMW1 < FillState.Half)) {
|
||||
p.StopStirrerMW1();
|
||||
}
|
||||
if (p.MP2 == MotorState.Forward && p.FillLevelMW2 >= FillState.Half && !p.IsStirrerMW2Active) {
|
||||
p.StartStirrerMW2();
|
||||
} else if (p.IsStirrerMW2Active && (!p.IsMP2Active || p.FillLevelMW2 < FillState.Half)) {
|
||||
p.StopStirrerMW2();
|
||||
}
|
||||
}
|
||||
|
||||
if (p.IsP12Active && !p.P12HasClearance) p.StopP12();
|
||||
if (p.IsP3Active && !p.P3HasClearance) p.StopP3();
|
||||
if (p.IsP4Active && !p.P4HasClearance) p.StopP4();
|
||||
if (p.IsP5Active && !p.P5HasClearance) p.StopP5();
|
||||
if (p.IsP6Active && !p.P6HasClearance) p.StopP6();
|
||||
}
|
||||
|
||||
protected void UpdateKeyboardBacklights(object? sender, PlantEventArgs evt) {
|
||||
if (sender is not PamhagenPlant plant || plant.Keyboard is not Xbe24Keyboard k) return;
|
||||
|
||||
k.SetBacklight((int)Xbe24Key.START_REBLER, plant.IsReblerActive ? Color.FromRgb(0, 255, 0) : plant.IsAuger1Active ? Color.FromRgb(255, 255, 0) : plant.IsAuger2Active || plant.IsAuger3Active ? Color.FromRgb(32, 32, 4) : Color.FromRgb(4, 32, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_REBLER, !plant.IsReblerActive ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
k.SetBacklight((int)Xbe24Key.START_REBLER, State.Rebler_IsActive ? Color.FromRgb(0, 255, 0) : State.Auger1_IsActive ? Color.FromRgb(255, 255, 0) : State.WasteDisposal_IsActive ? Color.FromRgb(32, 32, 4) : Color.FromRgb(4, 32, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_REBLER, !State.Rebler_IsActive ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
|
||||
k.SetBacklight((int)Xbe24Key.START_TROUGH_AUGER, !plant.TroughAugerHasClearance ? k.IsKeyPressed((int)Xbe24Key.START_TROUGH_AUGER) ? Color.FromRgb(255, 32, 0) : Color.FromRgb(32, 4, 4) : plant.IsTroughAugerActive ? Color.FromRgb(0, 255, 0) : Color.FromRgb(4, 32, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_TROUGH_AUGER, !plant.IsTroughAugerActive ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
k.SetBacklight((int)Xbe24Key.START_TROUGH_AUGER, !State.TroughAuger_HasClearance ? k.IsKeyPressed((int)Xbe24Key.START_TROUGH_AUGER) ? Color.FromRgb(255, 32, 0) : Color.FromRgb(32, 4, 4) : State.TroughAuger_IsActive ? Color.FromRgb(0, 255, 0) : Color.FromRgb(4, 32, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_TROUGH_AUGER, !State.TroughAuger_IsActive ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
|
||||
k.SetBacklight((int)Xbe24Key.SELECT_MW2, plant.WantMW2Selected || plant.IsMW2Selected ? Color.FromRgb(0, 0, 255) : Color.FromRgb(4, 4, 16), plant.WantMW2Selected && !plant.IsMW2Selected);
|
||||
k.SetBacklight((int)Xbe24Key.SELECT_MW1, plant.WantMW1Selected || plant.IsMW1Selected ? Color.FromRgb(0, 0, 255) : Color.FromRgb(4, 4, 16), plant.WantMW1Selected && !plant.IsMW1Selected);
|
||||
k.SetBacklight((int)Xbe24Key.SELECT_MW2, State.MW2_WantSelected || State.MW2_IsSelected ? Color.FromRgb(0, 0, 255) : Color.FromRgb(4, 4, 16), State.MW2_WantSelected && !State.MW2_IsSelected);
|
||||
k.SetBacklight((int)Xbe24Key.SELECT_MW1, State.MW1_WantSelected || State.MW1_IsSelected ? Color.FromRgb(0, 0, 255) : Color.FromRgb(4, 4, 16), State.MW1_WantSelected && !State.MW1_IsSelected);
|
||||
|
||||
var buttons = new Dictionary<Xbe24Key, (ISource Source, Pump Pump, ISink Sink)> {
|
||||
[Xbe24Key.FAST_SELECT_MW1_1] = (Graph.MW1, Graph.MP1, Graph.Press1),
|
||||
@@ -213,24 +118,23 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
}
|
||||
}
|
||||
|
||||
if (!plant.MP2HasPathClearance && plant.MP2HasDryRunClearance && preparingMP2) {
|
||||
if (!plant.State.MP2_HasPathClearance && plant.State.MP2_HasDryRunClearance && preparingMP2) {
|
||||
k.SetBacklight((int)Xbe24Key.START_MP2, Color.FromRgb(4, 32, 4), true);
|
||||
} else {
|
||||
k.SetBacklight((int)Xbe24Key.START_MP2, !plant.MP2HasClearance ? k.IsKeyPressed((int)Xbe24Key.START_MP2) ? Color.FromRgb(255, 32, 0) : Color.FromRgb(32, 4, 4) : plant.IsMP2Active ? Color.FromRgb(0, 255, 0) : Color.FromRgb(4, 32, 4));
|
||||
k.SetBacklight((int)Xbe24Key.START_MP2, !State.MP2_HasClearance ? k.IsKeyPressed((int)Xbe24Key.START_MP2) ? Color.FromRgb(255, 32, 0) : Color.FromRgb(32, 4, 4) : State.MP2_IsActive ? Color.FromRgb(0, 255, 0) : Color.FromRgb(4, 32, 4));
|
||||
}
|
||||
if (!plant.MP1HasPathClearance && plant.MP1HasDryRunClearance && preparingMP1) {
|
||||
if (!plant.State.MP1_HasPathClearance && plant.State.MP1_HasDryRunClearance && preparingMP1) {
|
||||
k.SetBacklight((int)Xbe24Key.START_MP1, Color.FromRgb(4, 32, 4), true);
|
||||
} else {
|
||||
k.SetBacklight((int)Xbe24Key.START_MP1, !plant.MP1HasClearance ? k.IsKeyPressed((int)Xbe24Key.START_MP1) ? Color.FromRgb(255, 32, 0) : Color.FromRgb(32, 4, 4) : plant.IsMP1Active ? Color.FromRgb(0, 255, 0) : Color.FromRgb(4, 32, 4));
|
||||
k.SetBacklight((int)Xbe24Key.START_MP1, !State.MP1_HasClearance ? k.IsKeyPressed((int)Xbe24Key.START_MP1) ? Color.FromRgb(255, 32, 0) : Color.FromRgb(32, 4, 4) : State.MP1_IsActive ? Color.FromRgb(0, 255, 0) : Color.FromRgb(4, 32, 4));
|
||||
}
|
||||
k.SetBacklight((int)Xbe24Key.STOP_MP2, highlightOffMP2 ? Color.FromRgb(255, 32, 0) : !plant.IsMP2Active ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_MP1, highlightOffMP1 ? Color.FromRgb(255, 32, 0) : !plant.IsMP1Active ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_MP2, highlightOffMP2 ? Color.FromRgb(255, 32, 0) : !State.MP2_IsActive ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
k.SetBacklight((int)Xbe24Key.STOP_MP1, highlightOffMP1 ? Color.FromRgb(255, 32, 0) : !State.MP1_IsActive ? Color.FromRgb(255, 0, 0) : Color.FromRgb(32, 4, 4));
|
||||
}
|
||||
|
||||
public async Task StartThread() {
|
||||
if (Plc == null) throw new Exception();
|
||||
await Plc.TestConnection();
|
||||
Actuators = await Plc.ReadOutputs();
|
||||
await Plc.Initialize();
|
||||
BackgroundThread = new Thread(new ParameterizedThreadStart(BackgroundLoop));
|
||||
BackgroundThread.Start();
|
||||
}
|
||||
@@ -247,11 +151,7 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
while (IsRunning && Plc != null) {
|
||||
var start = DateTime.Now;
|
||||
try {
|
||||
if (ActuatorsChanged) {
|
||||
await Plc.WriteOutputs(Actuators);
|
||||
ActuatorsChanged = false;
|
||||
}
|
||||
Sensors = await Plc.ReadInputs();
|
||||
await Plc.Update();
|
||||
LastRttNs = (long)(DateTime.Now - start).TotalNanoseconds;
|
||||
RaiseUpdateEvent(new());
|
||||
} catch (Exception exc) {
|
||||
@@ -270,7 +170,7 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
}
|
||||
try {
|
||||
if (Plc != null)
|
||||
await Plc.WriteOutputs(new() { Valves = Actuators.Valves });
|
||||
await Plc.Shutdown();
|
||||
} catch (Exception exc) {
|
||||
var str = "Beim Schließen der Verbindung zur SPS ist ein Fehler aufgetreten:\n\n" + exc.Message;
|
||||
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
||||
@@ -283,7 +183,7 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
var remove = Graph.SelectedPaths.ToList();
|
||||
foreach (var p in remove) Graph.RemovePath(p);
|
||||
for (int i = 1; i <= 57; i++) {
|
||||
App.Plant?.CloseV(i);
|
||||
App.Plant?.Plc?.CloseV(i);
|
||||
}
|
||||
foreach (var p in add) {
|
||||
if (p.Hops.Any(h => h.Node is ControlledValve v && v.IsLocked)) continue;
|
||||
@@ -298,7 +198,7 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
foreach (var src in sources) {
|
||||
var paths = new List<Pipeline.Path>();
|
||||
foreach (var sink in sinks) {
|
||||
paths.AddRange(Graph.GetPaths(src, sink, null, (n) => n is not ISink && (n is not ControlledValve v || p.WantValveOpen(v.Nr))));
|
||||
paths.AddRange(Graph.GetPaths(src, sink, null, (n) => n is not ISink && (n is not ControlledValve v || State.Valve_WantOpen(v.Nr))));
|
||||
}
|
||||
if (paths.Count == 1)
|
||||
yield return paths.First();
|
||||
@@ -321,35 +221,36 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
private void Keyboard_KeyDown(object? sender, int keyIndex) {
|
||||
var key = (Xbe24Key)keyIndex;
|
||||
App.MainDispatcher?.BeginInvoke(() => {
|
||||
if (Plc == null) return;
|
||||
try {
|
||||
if (key == Xbe24Key.START_REBLER) {
|
||||
StartRebler();
|
||||
Plc.StartRebler();
|
||||
} else if (key == Xbe24Key.STOP_REBLER) {
|
||||
if (IsReblerActive) {
|
||||
StopRebler();
|
||||
if (State.Rebler_IsActive) {
|
||||
Plc.StopRebler();
|
||||
} else {
|
||||
StopAuger1();
|
||||
if (!IsPresseQuerSchneckeActive) {
|
||||
StopAuger2();
|
||||
StopAuger3();
|
||||
Plc.StopAuger1();
|
||||
if (!State.PressCrossAuger_IsActive) {
|
||||
Plc.StopAuger2();
|
||||
Plc.StopAuger3();
|
||||
}
|
||||
}
|
||||
} else if (key == Xbe24Key.START_TROUGH_AUGER) {
|
||||
StartTroughAuger();
|
||||
Plc.StartTroughAuger();
|
||||
} else if (key == Xbe24Key.STOP_TROUGH_AUGER) {
|
||||
StopTroughAuger();
|
||||
Plc.StopTroughAuger();
|
||||
} else if (key == Xbe24Key.SELECT_MW2) {
|
||||
SelectMW2();
|
||||
Plc.SelectMW2();
|
||||
} else if (key == Xbe24Key.SELECT_MW1) {
|
||||
SelectMW1();
|
||||
Plc.SelectMW1();
|
||||
} else if (key == Xbe24Key.START_MP2) {
|
||||
StartMP2Forward();
|
||||
Plc.StartMP2Forward();
|
||||
} else if (key == Xbe24Key.STOP_MP2) {
|
||||
StopMP2();
|
||||
Plc.StopMP2();
|
||||
} else if (key == Xbe24Key.START_MP1) {
|
||||
StartMP1Forward();
|
||||
Plc.StartMP1Forward();
|
||||
} else if (key == Xbe24Key.STOP_MP1) {
|
||||
StopMP1();
|
||||
Plc.StopMP1();
|
||||
} else if (key == Xbe24Key.FAST_SELECT_MW1_1) {
|
||||
FastSelect(Graph.MW1, Graph.Press1);
|
||||
} else if (key == Xbe24Key.FAST_SELECT_MW1_2) {
|
||||
@@ -387,442 +288,39 @@ namespace PamhagenSysCtrl.Helpers {
|
||||
RaiseUpdateEvent(new());
|
||||
}
|
||||
|
||||
protected bool HasWTClearanceAA =>
|
||||
(AreValvesOpen(12) && AreValvesClosed(15, 16, 20)) || // bypass
|
||||
(AreValvesOpen(15, 18, 16) && AreValvesClosed(11, 12, 14, 17, 19, 20)) || // WT1
|
||||
(AreValvesOpen(15, 17, 20) && AreValvesClosed(11, 12, 18, 19, 21)) || // WT2
|
||||
(AreValvesOpen(15, 18, 19, 20) && AreValvesClosed(11, 12, 14, 16, 17, 21)) || // WT1+WT2
|
||||
false;
|
||||
protected bool HasWTClearanceAB =>
|
||||
(AreValvesOpen(15, 18, 14) && AreValvesClosed(11, 12, 13, 16, 17, 19, 21)) || // WT1
|
||||
(AreValvesOpen(15, 17, 21) && AreValvesClosed(11, 12, 13, 18, 19, 20)) || // WT2
|
||||
(AreValvesOpen(15, 18, 19, 21) && AreValvesClosed(11, 12, 13, 14, 16, 17, 20)) || // WT1+WT2
|
||||
false;
|
||||
protected bool HasWTClearanceBA =>
|
||||
(AreValvesOpen(11, 18, 16) && AreValvesClosed(15, 12, 13, 14, 17, 19, 20)) || // WT1
|
||||
(AreValvesOpen(11, 17, 20) && AreValvesClosed(15, 12, 13, 18, 19, 21)) || // WT2
|
||||
(AreValvesOpen(11, 18, 19, 20) && AreValvesClosed(15, 12, 13, 14, 16, 17, 21)) || // WT1+WT2
|
||||
false;
|
||||
protected bool HasWTClearanceBB =>
|
||||
(AreValvesOpen(13) && AreValvesClosed(11, 14, 21)) || // bypass
|
||||
(AreValvesOpen(11, 18, 14) && AreValvesClosed(15, 13, 16, 17, 19, 21)) || // WT1
|
||||
(AreValvesOpen(11, 17, 21) && AreValvesClosed(15, 13, 18, 19, 20)) || // WT2
|
||||
(AreValvesOpen(11, 18, 19, 21) && AreValvesClosed(15, 13, 14, 16, 17, 20)) || // WT1+WT2
|
||||
false;
|
||||
|
||||
protected bool HasT1ClearanceA => AreValvesOpen(22) && AreValvesClosed(24, 26, 28);
|
||||
protected bool HasT1ClearanceB => AreValvesOpen(23) && AreValvesClosed(25, 27, 29);
|
||||
protected bool HasT2ClearanceA => AreValvesOpen(24) && AreValvesClosed(22, 26, 28);
|
||||
protected bool HasT2ClearanceB => AreValvesOpen(25) && AreValvesClosed(23, 27, 29);
|
||||
protected bool HasT3ClearanceA => AreValvesOpen(26) && AreValvesClosed(22, 24, 28);
|
||||
protected bool HasT3ClearanceB => AreValvesOpen(27) && AreValvesClosed(23, 25, 29);
|
||||
protected bool HasT4ClearanceA => AreValvesOpen(28, 30) && AreValvesClosed(22, 24, 26, 32, 34);
|
||||
protected bool HasT4ClearanceB => AreValvesOpen(29, 31) && AreValvesClosed(23, 25, 27, 33, 35);
|
||||
protected bool HasT5ClearanceA => AreValvesOpen(28, 32) && AreValvesClosed(22, 24, 26, 30, 34);
|
||||
protected bool HasT5ClearanceB => AreValvesOpen(29, 33) && AreValvesClosed(23, 25, 27, 31, 35);
|
||||
protected bool HasT6ClearanceA => AreValvesOpen(28, 34, 37) && AreValvesClosed(22, 24, 26, 30, 32, 39, 41, 43);
|
||||
protected bool HasT6ClearanceB => AreValvesOpen(29, 35, 36) && AreValvesClosed(23, 25, 27, 31, 33, 38, 40, 42);
|
||||
protected bool HasT7ClearanceA => AreValvesOpen(28, 34, 39) && AreValvesClosed(22, 24, 26, 30, 32, 37, 41, 43);
|
||||
protected bool HasT7ClearanceB => AreValvesOpen(29, 35, 38) && AreValvesClosed(23, 25, 27, 31, 33, 36, 40, 42);
|
||||
protected bool HasT8ClearanceA => AreValvesOpen(28, 34, 41) && AreValvesClosed(22, 24, 26, 30, 32, 37, 39, 43);
|
||||
protected bool HasT8ClearanceB => AreValvesOpen(29, 35, 40) && AreValvesClosed(23, 25, 27, 31, 33, 36, 38, 42);
|
||||
protected bool HasT9ClearanceA => AreValvesOpen(28, 34, 43) && AreValvesClosed(22, 24, 26, 30, 32, 37, 39, 41);
|
||||
protected bool HasT9ClearanceB => AreValvesOpen(29, 35, 42) && AreValvesClosed(23, 25, 27, 31, 33, 36, 38, 40);
|
||||
|
||||
protected bool HasClearanceTank1(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT1ClearanceA) || (HasWTClearanceAB && HasT1ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT1ClearanceA) || (HasWTClearanceBB && HasT1ClearanceB)));
|
||||
protected bool HasClearanceTank2(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT2ClearanceA) || (HasWTClearanceAB && HasT2ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT2ClearanceA) || (HasWTClearanceBB && HasT2ClearanceB)));
|
||||
protected bool HasClearanceTank3(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT3ClearanceA) || (HasWTClearanceAB && HasT3ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT3ClearanceA) || (HasWTClearanceBB && HasT3ClearanceB)));
|
||||
protected bool HasClearanceTank4(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT4ClearanceA) || (HasWTClearanceAB && HasT4ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT4ClearanceA) || (HasWTClearanceBB && HasT4ClearanceB)));
|
||||
protected bool HasClearanceTank5(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT5ClearanceA) || (HasWTClearanceAB && HasT5ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT5ClearanceA) || (HasWTClearanceBB && HasT5ClearanceB)));
|
||||
protected bool HasClearanceTank6(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT6ClearanceA) || (HasWTClearanceAB && HasT6ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT6ClearanceA) || (HasWTClearanceBB && HasT6ClearanceB)));
|
||||
protected bool HasClearanceTank7(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT7ClearanceA) || (HasWTClearanceAB && HasT7ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT7ClearanceA) || (HasWTClearanceBB && HasT7ClearanceB)));
|
||||
protected bool HasClearanceTank8(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT8ClearanceA) || (HasWTClearanceAB && HasT8ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT8ClearanceA) || (HasWTClearanceBB && HasT8ClearanceB)));
|
||||
protected bool HasClearanceTank9(bool a, bool b) =>
|
||||
(a && ((HasWTClearanceAA && HasT9ClearanceA) || (HasWTClearanceAB && HasT9ClearanceB))) ||
|
||||
(b && ((HasWTClearanceBA && HasT9ClearanceA) || (HasWTClearanceBB && HasT9ClearanceB)));
|
||||
|
||||
public bool MP1HasClearance => MP1HasDryRunClearance && MP1HasPathClearance;
|
||||
public bool MP1HasDryRunClearance => (OverrideDryRunClearances || FillLevelMW1 != FillState.Empty);
|
||||
public bool MP1HasPathClearance => (
|
||||
OverridePathClearances ||
|
||||
(MP1HasClearancePress1 && Press1HasClearance) ||
|
||||
(MP1HasClearancePress2 && Press2HasClearance) ||
|
||||
(HasClearanceTank1(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
|
||||
(HasClearanceTank2(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT2 != FillState.Full) ||
|
||||
(HasClearanceTank3(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT3 != FillState.Full) ||
|
||||
(HasClearanceTank4(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT4 != FillState.Full) ||
|
||||
(HasClearanceTank5(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT5 != FillState.Full) ||
|
||||
(HasClearanceTank6(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT6 != FillState.Full) ||
|
||||
(HasClearanceTank7(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT7 != FillState.Full) ||
|
||||
(HasClearanceTank8(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT8 != FillState.Full) ||
|
||||
(HasClearanceTank9(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT9 != FillState.Full) ||
|
||||
false);
|
||||
protected bool MP1HasClearancePress1 =>
|
||||
(AreValvesOpen(1, 6, 51) && AreValvesClosed(3, 4, 5, 50, 52, 53, 55)) ||
|
||||
(AreValvesOpen(4, 8, 52) && AreValvesClosed(1, 2, 7, 50, 51, 53, 56));
|
||||
protected bool MP1HasClearancePress2 =>
|
||||
(AreValvesOpen(1, 6, 55) && AreValvesClosed(3, 4, 5, 51, 54, 56, 57)) ||
|
||||
(AreValvesOpen(4, 8, 56) && AreValvesClosed(1, 2, 7, 52, 54, 55, 57));
|
||||
protected bool MP1HasClearanceTanksA => AreValvesOpen(1, 5) && AreValvesClosed(3, 4, 6);
|
||||
protected bool MP1HasClearanceTanksB => AreValvesOpen(4, 7, 9) && AreValvesClosed(1, 2, 8, 10);
|
||||
|
||||
public MotorState MP1 {
|
||||
get => Actuators.MP1;
|
||||
set => Actuators.MP1 = (value != MotorState.Halt && value != MotorState.Forward && value != MotorState.Backward) ? throw new ArgumentException("Invalid state for MP1") : value;
|
||||
}
|
||||
|
||||
public bool MP2HasClearance => MP2HasDryRunClearance && MP2HasPathClearance;
|
||||
public bool MP2HasDryRunClearance => (OverrideDryRunClearances || FillLevelMW2 != FillState.Empty);
|
||||
public bool MP2HasPathClearance => (
|
||||
OverridePathClearances ||
|
||||
(MP2HasClearancePress1 && Press1HasClearance) ||
|
||||
(MP2HasClearancePress2 && Press2HasClearance) ||
|
||||
(HasClearanceTank1(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
|
||||
(HasClearanceTank2(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT2 != FillState.Full) ||
|
||||
(HasClearanceTank3(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT3 != FillState.Full) ||
|
||||
(HasClearanceTank4(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT4 != FillState.Full) ||
|
||||
(HasClearanceTank5(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT5 != FillState.Full) ||
|
||||
(HasClearanceTank6(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT6 != FillState.Full) ||
|
||||
(HasClearanceTank7(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT7 != FillState.Full) ||
|
||||
(HasClearanceTank8(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT8 != FillState.Full) ||
|
||||
(HasClearanceTank9(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT9 != FillState.Full) ||
|
||||
false);
|
||||
protected bool MP2HasClearancePress1 =>
|
||||
(AreValvesOpen(2, 8, 52) && AreValvesClosed(3, 4, 7, 50, 51, 53, 56)) ||
|
||||
(AreValvesOpen(3, 6, 51) && AreValvesClosed(1, 2, 5, 50, 52, 53, 55));
|
||||
protected bool MP2HasClearancePress2 =>
|
||||
(AreValvesOpen(2, 8, 56) && AreValvesClosed(3, 4, 7, 52, 54, 55, 57)) ||
|
||||
(AreValvesOpen(3, 6, 55) && AreValvesClosed(2, 1, 5, 51, 54, 56, 57));
|
||||
protected bool MP2HasClearanceTanksA => AreValvesOpen(3, 5) && AreValvesClosed(1, 2, 6);
|
||||
protected bool MP2HasClearanceTanksB => AreValvesOpen(2, 7, 9) && AreValvesClosed(3, 4, 8, 10);
|
||||
|
||||
public MotorState MP2 {
|
||||
get => Actuators.MP2;
|
||||
set => Actuators.MP2 = (value != MotorState.Halt && value != MotorState.Forward && value != MotorState.Backward) ? throw new ArgumentException("Invalid state for MP2") : value;
|
||||
}
|
||||
|
||||
public bool P12HasClearance => (OverrideDryRunClearances || FillLevelT1 != FillState.Empty || FillLevelT2 != FillState.Empty) && (
|
||||
OverridePathClearances ||
|
||||
(P12HasClearancePress1 && Press1HasClearance) ||
|
||||
(P12HasClearancePress2 && Press2HasClearance) ||
|
||||
(HasClearanceTank1(false, P12HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
|
||||
(HasClearanceTank2(false, P12HasClearanceTanksB) && FillLevelT2 != FillState.Full) ||
|
||||
(HasClearanceTank3(false, P12HasClearanceTanksB) && FillLevelT3 != FillState.Full) ||
|
||||
(HasClearanceTank4(false, P12HasClearanceTanksB) && FillLevelT4 != FillState.Full) ||
|
||||
(HasClearanceTank5(false, P12HasClearanceTanksB) && FillLevelT5 != FillState.Full) ||
|
||||
(HasClearanceTank6(false, P12HasClearanceTanksB) && FillLevelT6 != FillState.Full) ||
|
||||
(HasClearanceTank7(false, P12HasClearanceTanksB) && FillLevelT7 != FillState.Full) ||
|
||||
(HasClearanceTank8(false, P12HasClearanceTanksB) && FillLevelT8 != FillState.Full) ||
|
||||
(HasClearanceTank9(false, P12HasClearanceTanksB) && FillLevelT9 != FillState.Full) ||
|
||||
false);
|
||||
protected bool P12HasClearancePress1 => AreValvesOpen(44, 46, 49, 50) && AreValvesClosed(10, 45, 47, 48, 54, 51, 52, 53);
|
||||
protected bool P12HasClearancePress2 => AreValvesOpen(44, 46, 49, 54) && AreValvesClosed(10, 45, 47, 48, 50, 55, 56, 57);
|
||||
protected bool P12HasClearanceTanksB => AreValvesOpen(44, 10) && AreValvesClosed(9, 45, 46);
|
||||
|
||||
public MotorState P12 {
|
||||
get => Actuators.P12;
|
||||
set => Actuators.P12 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P12") : value;
|
||||
}
|
||||
|
||||
public bool P3HasClearance => (OverrideDryRunClearances || FillLevelT3 != FillState.Empty) && (
|
||||
OverridePathClearances ||
|
||||
(P3HasClearancePress1 && Press1HasClearance) ||
|
||||
(P3HasClearancePress2 && Press2HasClearance) ||
|
||||
(HasClearanceTank1(false, P3HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
|
||||
(HasClearanceTank2(false, P3HasClearanceTanksB) && FillLevelT2 != FillState.Full) ||
|
||||
(HasClearanceTank3(false, P3HasClearanceTanksB) && FillLevelT3 != FillState.Full) ||
|
||||
(HasClearanceTank4(false, P3HasClearanceTanksB) && FillLevelT4 != FillState.Full) ||
|
||||
(HasClearanceTank5(false, P3HasClearanceTanksB) && FillLevelT5 != FillState.Full) ||
|
||||
(HasClearanceTank6(false, P3HasClearanceTanksB) && FillLevelT6 != FillState.Full) ||
|
||||
(HasClearanceTank7(false, P3HasClearanceTanksB) && FillLevelT7 != FillState.Full) ||
|
||||
(HasClearanceTank8(false, P3HasClearanceTanksB) && FillLevelT8 != FillState.Full) ||
|
||||
(HasClearanceTank9(false, P3HasClearanceTanksB) && FillLevelT9 != FillState.Full) ||
|
||||
false);
|
||||
protected bool P3HasClearancePress1 => AreValvesOpen(45, 46, 49, 50) && AreValvesClosed(10, 44, 47, 48, 51, 52, 53, 54);
|
||||
protected bool P3HasClearancePress2 => AreValvesOpen(45, 46, 49, 54) && AreValvesClosed(10, 44, 47, 48, 50, 55, 56, 57);
|
||||
protected bool P3HasClearanceTanksB => AreValvesOpen(45, 10) && AreValvesClosed(9, 44, 46);
|
||||
|
||||
public MotorState P3 {
|
||||
get => Actuators.P3;
|
||||
set => Actuators.P3 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P3") : value;
|
||||
}
|
||||
|
||||
public bool P4HasClearance => (OverrideDryRunClearances || FillLevelT4 != FillState.Empty) && (
|
||||
OverridePathClearances ||
|
||||
(P4HasClearancePress1 && Press1HasClearance) ||
|
||||
(P4HasClearancePress2 && Press2HasClearance) ||
|
||||
(HasClearanceTank1(false, P4HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
|
||||
(HasClearanceTank2(false, P4HasClearanceTanksB) && FillLevelT2 != FillState.Full) ||
|
||||
(HasClearanceTank3(false, P4HasClearanceTanksB) && FillLevelT3 != FillState.Full) ||
|
||||
(HasClearanceTank4(false, P4HasClearanceTanksB) && FillLevelT4 != FillState.Full) ||
|
||||
(HasClearanceTank5(false, P4HasClearanceTanksB) && FillLevelT5 != FillState.Full) ||
|
||||
(HasClearanceTank6(false, P4HasClearanceTanksB) && FillLevelT6 != FillState.Full) ||
|
||||
(HasClearanceTank7(false, P4HasClearanceTanksB) && FillLevelT7 != FillState.Full) ||
|
||||
(HasClearanceTank8(false, P4HasClearanceTanksB) && FillLevelT8 != FillState.Full) ||
|
||||
(HasClearanceTank9(false, P4HasClearanceTanksB) && FillLevelT9 != FillState.Full) ||
|
||||
false);
|
||||
protected bool P4HasClearancePress1 => AreValvesOpen(47, 49, 50) && AreValvesClosed(46, 48, 51, 52, 53, 54);
|
||||
protected bool P4HasClearancePress2 => AreValvesOpen(47, 49, 54) && AreValvesClosed(46, 48, 50, 55, 56, 57);
|
||||
protected bool P4HasClearanceTanksB => AreValvesOpen(47, 46, 10) && AreValvesClosed(9, 44, 45, 48, 49);
|
||||
|
||||
public MotorState P4 {
|
||||
get => Actuators.P4;
|
||||
set => Actuators.P4 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P4") : value;
|
||||
}
|
||||
|
||||
public bool P5HasClearance => (OverrideDryRunClearances || FillLevelT5 != FillState.Empty) && (
|
||||
OverridePathClearances ||
|
||||
(P5HasClearancePress1 && Press1HasClearance) ||
|
||||
(P5HasClearancePress2 && Press2HasClearance) ||
|
||||
(HasClearanceTank1(false, P5HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
|
||||
(HasClearanceTank2(false, P5HasClearanceTanksB) && FillLevelT2 != FillState.Full) ||
|
||||
(HasClearanceTank3(false, P5HasClearanceTanksB) && FillLevelT3 != FillState.Full) ||
|
||||
(HasClearanceTank4(false, P5HasClearanceTanksB) && FillLevelT4 != FillState.Full) ||
|
||||
(HasClearanceTank5(false, P5HasClearanceTanksB) && FillLevelT5 != FillState.Full) ||
|
||||
(HasClearanceTank6(false, P5HasClearanceTanksB) && FillLevelT6 != FillState.Full) ||
|
||||
(HasClearanceTank7(false, P5HasClearanceTanksB) && FillLevelT7 != FillState.Full) ||
|
||||
(HasClearanceTank8(false, P5HasClearanceTanksB) && FillLevelT8 != FillState.Full) ||
|
||||
(HasClearanceTank9(false, P5HasClearanceTanksB) && FillLevelT9 != FillState.Full) ||
|
||||
false);
|
||||
protected bool P5HasClearancePress1 => AreValvesOpen(48, 49, 50) && AreValvesClosed(46, 47, 51, 52, 53, 54);
|
||||
protected bool P5HasClearancePress2 => AreValvesOpen(48, 49, 54) && AreValvesClosed(46, 47, 50, 55, 56, 57);
|
||||
protected bool P5HasClearanceTanksB => AreValvesOpen(48, 46, 10) && AreValvesClosed(9, 44, 45, 47, 49);
|
||||
|
||||
public MotorState P5 {
|
||||
get => Actuators.P5;
|
||||
set => Actuators.P5 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P5") : value;
|
||||
}
|
||||
|
||||
public bool P6HasClearance => OverridePathClearances ||
|
||||
(AreValvesOpen(53) && AreValvesClosed(50, 51, 52, 57) && Press1HasClearance) ||
|
||||
(AreValvesOpen(57) && AreValvesClosed(53, 54, 55, 56) && Press2HasClearance);
|
||||
|
||||
public MotorState P6 {
|
||||
get => Actuators.P6;
|
||||
set => Actuators.P6 = (value != MotorState.Halt && value != MotorState.Forward) ? throw new ArgumentException("Invalid state for P6") : value;
|
||||
}
|
||||
|
||||
|
||||
public void OpenV(int n) => SetV(n, true);
|
||||
public void CloseV(int n) => SetV(n, false);
|
||||
|
||||
protected void SetV(int n, bool val) {
|
||||
if (n < 1 || n > 57) throw new ArgumentException("Invalid value for n: 1 <= #V <= 57");
|
||||
Actuators.SetV(n, val);
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void SelectMW1() {
|
||||
Actuators.SetV(58, true);
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void SelectMW2() {
|
||||
Actuators.SetV(58, false);
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartTroughAuger() {
|
||||
if (!ManualControlMode && !TroughAugerHasClearance)
|
||||
throw new NoClearanceException("Schnecke Auffangwanne hat keine Freigabe");
|
||||
Actuators.TroughAuger = true;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopTroughAuger() {
|
||||
Actuators.TroughAuger = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartRebler() {
|
||||
Actuators.Rebler = true;
|
||||
if (!ManualControlMode) StartAuger1();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopRebler() {
|
||||
if (!ManualControlMode) StopTroughAuger();
|
||||
Actuators.Rebler = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartStirrerMW1() {
|
||||
Actuators.StirrerMW1 = true;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopStirrerMW1() {
|
||||
Actuators.StirrerMW1 = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartStirrerMW2() {
|
||||
Actuators.StirrerMW2 = true;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopStirrerMW2() {
|
||||
Actuators.StirrerMW2 = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartAuger1() {
|
||||
Actuators.Auger1 = true;
|
||||
if (!ManualControlMode) StartAuger2();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopAuger1() {
|
||||
if (!ManualControlMode && IsReblerActive) throw new NoClearanceException("Rebler aktiv");
|
||||
Actuators.Auger1 = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartAuger2() {
|
||||
Actuators.Auger2 = true;
|
||||
if (!ManualControlMode) StartAuger3();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopAuger2() {
|
||||
if (!ManualControlMode && IsPresseQuerSchneckeActive) throw new NoClearanceException("Presse-Querschnecke aktiv");
|
||||
if (!ManualControlMode && IsAuger1Active) throw new NoClearanceException("Förderschnecke 1 aktiv");
|
||||
Actuators.Auger2 = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartAuger3() {
|
||||
Actuators.Auger3 = true;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopAuger3() {
|
||||
if (!ManualControlMode && IsAuger2Active) throw new NoClearanceException("Förderschnecke 2 aktiv");
|
||||
Actuators.Auger3 = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartGradationPump() {
|
||||
Actuators.GradationPump = true;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopGradationPump() {
|
||||
Actuators.GradationPump = false;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartMP1Forward() {
|
||||
if (!MP1HasClearance) throw new NoClearanceException("MP1 hat keine Freigabe");
|
||||
if (Actuators.MP1 == MotorState.Backward) throw new NoClearanceException("MP1 läuft bereits (zurück)");
|
||||
Actuators.MP1 = MotorState.Forward;
|
||||
if (FillLevelMW1 >= FillState.Half) StartStirrerMW1();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartMP1Backward() {
|
||||
if (!MP1HasClearance) throw new NoClearanceException("MP1 hat keine Freigabe");
|
||||
if (Actuators.MP1 == MotorState.Forward) throw new NoClearanceException("MP1 läuft bereits (vor)");
|
||||
Actuators.MP1 = MotorState.Backward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopMP1() {
|
||||
Actuators.MP1 = MotorState.Halt;
|
||||
if (!ManualControlMode) StopStirrerMW1();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartMP2Forward() {
|
||||
if (!MP2HasClearance) throw new NoClearanceException("MP2 hat keine Freigabe");
|
||||
if (Actuators.MP2 == MotorState.Backward) throw new NoClearanceException("MP2 läuft bereits (zurück)");
|
||||
Actuators.MP2 = MotorState.Forward;
|
||||
if (FillLevelMW2 >= FillState.Half) StartStirrerMW2();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartMP2Backward() {
|
||||
if (!MP2HasClearance) throw new NoClearanceException("MP2 hat keine Freigabe");
|
||||
if (Actuators.MP2 == MotorState.Forward) throw new NoClearanceException("MP2 läuft bereits (vor)");
|
||||
Actuators.MP2 = MotorState.Backward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopMP2() {
|
||||
Actuators.MP2 = MotorState.Halt;
|
||||
if (!ManualControlMode) StopStirrerMW1();
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartP12() {
|
||||
if (!P12HasClearance) throw new NoClearanceException("P1/2 hat keine Freigabe");
|
||||
Actuators.P12 = MotorState.Forward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopP12() {
|
||||
Actuators.P12 = MotorState.Halt;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartP3() {
|
||||
if (!P3HasClearance) throw new NoClearanceException("P3 hat keine Freigabe");
|
||||
Actuators.P3 = MotorState.Forward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopP3() {
|
||||
Actuators.P3 = MotorState.Halt;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartP4() {
|
||||
if (!P4HasClearance) throw new NoClearanceException("P4 hat keine Freigabe");
|
||||
Actuators.P4 = MotorState.Forward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopP4() {
|
||||
Actuators.P4 = MotorState.Halt;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartP5() {
|
||||
if (!P5HasClearance) throw new NoClearanceException("P5 hat keine Freigabe");
|
||||
Actuators.P5 = MotorState.Forward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopP5() {
|
||||
Actuators.P5 = MotorState.Halt;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StartP6() {
|
||||
if (!P6HasClearance) throw new NoClearanceException("P6 hat keine Freigabe");
|
||||
Actuators.P6 = MotorState.Forward;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
|
||||
public void StopP6() {
|
||||
Actuators.P6 = MotorState.Halt;
|
||||
ActuatorsChanged = true;
|
||||
}
|
||||
public void OpenV(int n) => Plc?.OpenV(n);
|
||||
public void CloseV(int n) => Plc?.CloseV(n);
|
||||
public void SelectMW1() => Plc?.SelectMW1();
|
||||
public void SelectMW2() => Plc?.SelectMW2();
|
||||
public void StartTroughAuger() => Plc?.StartTroughAuger();
|
||||
public void StopTroughAuger() => Plc?.StopTroughAuger();
|
||||
public void StartRebler() => Plc?.StartRebler();
|
||||
public void StopRebler() => Plc?.StopRebler();
|
||||
public void StartStirrerMW1() => Plc?.StartStirrerMW1();
|
||||
public void StopStirrerMW1() => Plc?.StopStirrerMW1();
|
||||
public void StartStirrerMW2() => Plc?.StartStirrerMW2();
|
||||
public void StopStirrerMW2() => Plc?.StopStirrerMW2();
|
||||
public void StartAuger1() => Plc?.StartAuger1();
|
||||
public void StopAuger1() => Plc?.StopAuger1();
|
||||
public void StartAuger2() => Plc?.StartAuger2();
|
||||
public void StopAuger2() => Plc?.StopAuger2();
|
||||
public void StartAuger3() => Plc?.StartAuger3();
|
||||
public void StopAuger3() => Plc?.StopAuger3();
|
||||
public void StartMP1Forward() => Plc?.StartMP1Forward();
|
||||
public void StartMP1Backward() => Plc?.StartMP1Backward();
|
||||
public void StopMP1() => Plc?.StopMP1();
|
||||
public void StartMP2Forward() => Plc?.StartMP2Forward();
|
||||
public void StartMP2Backward() => Plc?.StartMP2Backward();
|
||||
public void StopMP2() => Plc?.StopMP2();
|
||||
public void EnableP12() => Plc?.EnableP12();
|
||||
public void DisableP12() => Plc?.DisableP12();
|
||||
public void EnableP3() => Plc?.EnableP3();
|
||||
public void DisableP3() => Plc?.DisableP3();
|
||||
public void EnableP4() => Plc?.EnableP4();
|
||||
public void DisableP4() => Plc?.DisableP4();
|
||||
public void EnableP5() => Plc?.EnableP5();
|
||||
public void DisableP5() => Plc?.DisableP5();
|
||||
public void EnableP6() => Plc?.EnableP6();
|
||||
public void DisableP6() => Plc?.DisableP6();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user