diff --git a/PamhagenSysCtrl/App.xaml b/PamhagenSysCtrl/App.xaml
index 2a0d55b..ad48252 100644
--- a/PamhagenSysCtrl/App.xaml
+++ b/PamhagenSysCtrl/App.xaml
@@ -2,7 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:PamhagenSysCtrl"
- StartupUri="Windows/MainWindow.xaml"
+ StartupUri="Windows/PlantSchemeWindow.xaml"
Exit="Application_Exit">
diff --git a/PamhagenSysCtrl/App.xaml.cs b/PamhagenSysCtrl/App.xaml.cs
index fe10df3..0016ffb 100644
--- a/PamhagenSysCtrl/App.xaml.cs
+++ b/PamhagenSysCtrl/App.xaml.cs
@@ -1,4 +1,6 @@
using PamhagenSysCtrl.Helpers;
+using System.IO;
+using System.Reflection;
using System.Windows;
using System.Windows.Threading;
@@ -6,14 +8,42 @@ namespace PamhagenSysCtrl {
public partial class App : Application {
public static PamhagenPlant? Plant;
- public static Dispatcher MainDispatcher;
+ public static Dispatcher? MainDispatcher;
+
+ public static readonly string DataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Anlagensteuerung Pamhagen");
+ public static readonly string ConfigPath = Path.Combine(DataPath, "config.ini");
+ public static readonly string InstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Anlagensteuerung Pamhagen");
+ public static readonly string TempPath = Path.Combine(Path.GetTempPath(), "Anlagensteuerung Pamhagen");
+
+ public static Config Config { get; private set; } = new(ConfigPath);
+ public static Version Version { get; private set; } = new();
public App() :
base() {
+ Directory.CreateDirectory(TempPath);
+ Directory.CreateDirectory(DataPath);
MainDispatcher = Dispatcher;
+
+ var args = Environment.GetCommandLineArgs();
+ if (args.Length >= 2) {
+ Config = new(Path.GetFullPath(args[1]));
+ }
}
protected override async void OnStartup(StartupEventArgs evt) {
+ Version = new Version(typeof(App).GetTypeInfo().Assembly.GetCustomAttribute()?.InformationalVersion.Split('+')[0] ?? "0.0.0");
+
+ try {
+ Plant = new(Config.PlcPort);
+ await Plant.StartThread();
+ } catch (Exception exc) {
+ Plant?.Dispose();
+ Plant = null;
+ var str = $"Beim Aufbauen einer Verbindung zur SPS ist ein Fehler aufgetreten:\n\n{exc.GetType().Name}: {exc.Message}";
+ if (exc.InnerException != null) str += $"\n\n{exc.InnerException.GetType().Name}: {exc.InnerException.Message}";
+ MessageBox.Show(str, "SPS-Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+
base.OnStartup(evt);
}
diff --git a/PamhagenSysCtrl/Helpers/Config.cs b/PamhagenSysCtrl/Helpers/Config.cs
new file mode 100644
index 0000000..4b87616
--- /dev/null
+++ b/PamhagenSysCtrl/Helpers/Config.cs
@@ -0,0 +1,28 @@
+using Microsoft.Extensions.Configuration;
+using System.Windows;
+
+namespace PamhagenSysCtrl.Helpers {
+ public class Config {
+
+ private static readonly string[] TrueValues = ["1", "true", "yes", "on"];
+
+ private readonly string FileName;
+
+ public string PlcPort = "COM1";
+
+ public Config(string filename) {
+ FileName = filename;
+ Read();
+ }
+
+ public void Read() {
+ try {
+ var config = new ConfigurationBuilder().AddIniFile(FileName).Build();
+ PlcPort = config["plc:port"] ?? "COM1";
+ } catch (Exception exc) {
+ MessageBox.Show($"Die Konfigurationsdatei konnte nicht gelesen werden:\n\n{exc.Message}", "Konfigurationsdatei lesen", MessageBoxButton.OK, MessageBoxImage.Error);
+ App.Current.Shutdown();
+ }
+ }
+ }
+}
diff --git a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs
index 5e3c03c..f241a03 100644
--- a/PamhagenSysCtrl/Helpers/PamhagenGraph.cs
+++ b/PamhagenSysCtrl/Helpers/PamhagenGraph.cs
@@ -60,11 +60,11 @@ namespace PamhagenSysCtrl.Helpers {
Nodes.Add(Auger2);
var rebler = new Rebler("Rebler", (mw1X + mw2X) / 2, 200, () => App.Plant?.IsReblerActive ?? false);
Nodes.Add(rebler);
- var switcher = new Switcher("", (mw1X + mw2X) / 2, 260, () => App.Plant?.TroughSelector ?? 0, () => App.Plant == null ? 0 : App.Plant.WantA1Selected ? 1 : 2);
+ var switcher = new Switcher("", (mw1X + mw2X) / 2, 260, () => App.Plant?.TroughSelector ?? 0, () => App.Plant == null ? 0 : App.Plant.WantMW1Selected ? 1 : 2);
Nodes.Add(switcher);
- MW1 = new Trough("MW1", mw1X, mpY - 70, () => App.Plant?.FillLevelA1 ?? FillState.Unknown);
- MW2 = new Trough("MW2", mw2X, mpY - 70, () => App.Plant?.FillLevelA2 ?? FillState.Unknown);
+ MW1 = new Trough("MW1", mw1X, mpY - 70, () => App.Plant?.FillLevelMW1 ?? FillState.Unknown);
+ MW2 = new Trough("MW2", mw2X, mpY - 70, () => App.Plant?.FillLevelMW2 ?? FillState.Unknown);
MP1 = new Pump("MP1", mw1X, mpY, () => App.Plant?.IsMP1Active ?? false, () => App.Plant?.MP1HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x)));
MP2 = new Pump("MP2", mw2X, mpY, () => App.Plant?.IsMP2Active ?? false, () => App.Plant?.MP2HasClearance ?? false, (x) => SelectedPaths.Any(p => p.Hops.Any(h => h.Node == x)));
var x1 = new PipeJoin(mw1X, mpY + 40);
diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs
index 9195900..fae1054 100644
--- a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs
+++ b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs
@@ -22,14 +22,14 @@ namespace PamhagenSysCtrl.Helpers {
public bool WantValveClosed(int n) => !WantValveOpen(n);
public bool WantValveOpen(int n) => Actuators.GetV(n);
- public bool AreValvesOpen(params int[] ns) => ns.All(IsValveOpen);
- public bool AreValvesClosed(params int[] ns) => ns.All(IsValveClosed);
+ 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 IsA1Selected => Sensors.TroughSelector == 1;
- public bool IsA2Selected => Sensors.TroughSelector == 2;
- public FillState FillLevelA1 => Sensors.FillingLevels.A1;
- public FillState FillLevelA2 => Sensors.FillingLevels.A2;
+ public bool IsMWSelected => Sensors.TroughSelector == 1;
+ public bool IsMW2Selected => Sensors.TroughSelector == 2;
+ public FillState FillLevelMW1 => Sensors.FillingLevels.MW1;
+ public FillState FillLevelMW2 => Sensors.FillingLevels.MW2;
public FillState FillLevelPress1 => Sensors.FillingLevels.Press1;
public FillState FillLevelPress2 => Sensors.FillingLevels.Press2;
public FillState FillLevelT1 => Sensors.FillingLevelTanks[0];
@@ -46,13 +46,13 @@ namespace PamhagenSysCtrl.Helpers {
public MotorState PresseQuerSchnecke => Sensors.PresseQuerSchnecke;
public bool IsPresseQuerSchneckeActive => PresseQuerSchnecke == MotorState.Forward;
- public bool WantA1Selected => Actuators.GetV(58);
- public bool WantA2Selected => !Actuators.GetV(58);
+ public bool WantMW1Selected => Actuators.GetV(58);
+ public bool WantMW2Selected => !Actuators.GetV(58);
public bool IsTroughAugerActive => Actuators.TroughAuger;
public bool IsReblerActive => Actuators.Rebler;
- public bool IsStirrerA1Active => Actuators.StirrerA1;
- public bool IsStirrerA2Active => Actuators.StirrerA2;
+ public bool IsStirrerMW1Active => Actuators.StirrerMW1;
+ public bool IsStirrerMW2Active => Actuators.StirrerMW2;
public bool IsBeltActive => Actuators.Belt;
public bool IsAuger1Active => Actuators.Auger1;
public bool IsAuger2Active => Actuators.Auger2;
@@ -73,7 +73,7 @@ namespace PamhagenSysCtrl.Helpers {
}
protected virtual void RaiseUpdateEvent(PlantEventArgs evt) {
- App.MainDispatcher.BeginInvoke(() => Update?.Invoke(this, evt));
+ App.MainDispatcher?.BeginInvoke(() => Update?.Invoke(this, evt));
}
protected static void OnUpdate(object? sender, PlantEventArgs evt) {
@@ -82,7 +82,7 @@ namespace PamhagenSysCtrl.Helpers {
if (p.IsReblerActive && !p.IsAuger1Active) p.StartAuger1();
if (p.IsAuger1Active && !p.IsBeltActive) p.StartBelt();
if (p.IsBeltActive && !p.IsAuger2Active) p.StartAuger2();
- if (p.IsTroughAugerActive && (!p.IsReblerActive || (p.IsA1Selected && p.FillLevelA1 == FillState.Full) || (p.IsA2Selected && p.FillLevelA2 == FillState.Full)))
+ if (p.IsTroughAugerActive && (!p.IsReblerActive || (p.IsMWSelected && p.FillLevelMW1 == FillState.Full) || (p.IsMW2Selected && p.FillLevelMW2 == FillState.Full)))
p.StopTroughAuger();
if (p.IsMP1Active && !p.MP1HasClearance) p.StopMP1();
if (p.IsMP2Active && !p.MP2HasClearance) p.StopMP2();
@@ -210,7 +210,7 @@ namespace PamhagenSysCtrl.Helpers {
(a && ((HasWTClearanceAA && HasT9ClearanceA) || (HasWTClearanceAB && HasT9ClearanceB))) ||
(b && ((HasWTClearanceBA && HasT9ClearanceA) || (HasWTClearanceBB && HasT9ClearanceB)));
- public bool MP1HasClearance => FillLevelA1 != FillState.Empty && (
+ public bool MP1HasClearance => FillLevelMW1 != FillState.Empty && (
(MP1HasClearancePress1 && FillLevelPress1 != FillState.Full) ||
(MP1HasClearancePress2 && FillLevelPress2 != FillState.Full) ||
(HasClearanceTank1(MP1HasClearanceTanksA, MP1HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
@@ -237,7 +237,7 @@ namespace PamhagenSysCtrl.Helpers {
set => Actuators.MP1 = (value != MotorState.Halt && value != MotorState.Forward && value != MotorState.Backward) ? throw new ArgumentException("Invalid state for MP1") : value;
}
- public bool MP2HasClearance => FillLevelA2 != FillState.Empty && (
+ public bool MP2HasClearance => FillLevelMW2 != FillState.Empty && (
(MP2HasClearancePress1 && FillLevelPress1 != FillState.Full) ||
(MP2HasClearancePress2 && FillLevelPress2 != FillState.Full) ||
(HasClearanceTank1(MP2HasClearanceTanksA, MP2HasClearanceTanksB) && FillLevelT1 != FillState.Full) ||
@@ -371,20 +371,20 @@ namespace PamhagenSysCtrl.Helpers {
ActuatorsChanged = true;
}
- public void SelectA1() {
+ public void SelectMW1() {
Actuators.SetV(58, true);
- //if (IsReblerActive) Actuators.StirrerA1 = true;
+ //if (IsReblerActive) Actuators.StirrerMW1 = true;
ActuatorsChanged = true;
}
- public void SelectA2() {
+ public void SelectMW2() {
Actuators.SetV(58, false);
- //if (IsReblerActive) Actuators.StirrerA2 = true;
+ //if (IsReblerActive) Actuators.StirrerMW2 = true;
ActuatorsChanged = true;
}
public void StartTroughAuger() {
- if (!IsReblerActive || (IsA1Selected && FillLevelA1 == FillState.Full) || (IsA2Selected && FillLevelA2 == FillState.Full))
+ if (!IsReblerActive || (IsMWSelected && FillLevelMW1 == FillState.Full) || (IsMW2Selected && FillLevelMW2 == FillState.Full))
throw new NoClearanceException("Schnecke Auffangwanne hat keine Freigabe");
Actuators.TroughAuger = true;
ActuatorsChanged = true;
@@ -407,23 +407,23 @@ namespace PamhagenSysCtrl.Helpers {
ActuatorsChanged = true;
}
- public void StartStirrerA1() {
- Actuators.StirrerA1 = true;
+ public void StartStirrerMW1() {
+ Actuators.StirrerMW1 = true;
ActuatorsChanged = true;
}
- public void StopStirrerA1() {
- Actuators.StirrerA1 = false;
+ public void StopStirrerMW1() {
+ Actuators.StirrerMW1 = false;
ActuatorsChanged = true;
}
- public void StartStirrerA2() {
- Actuators.StirrerA2 = true;
+ public void StartStirrerMW2() {
+ Actuators.StirrerMW2 = true;
ActuatorsChanged = true;
}
- public void StopStirrerA2() {
- Actuators.StirrerA2 = false;
+ public void StopStirrerMW2() {
+ Actuators.StirrerMW2 = false;
ActuatorsChanged = true;
}
diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlc.cs b/PamhagenSysCtrl/Helpers/PamhagenPlc.cs
index 86340f2..0b21daf 100644
--- a/PamhagenSysCtrl/Helpers/PamhagenPlc.cs
+++ b/PamhagenSysCtrl/Helpers/PamhagenPlc.cs
@@ -5,7 +5,7 @@ namespace PamhagenSysCtrl.Helpers {
public record struct SensorStates(
long PressureSensors,
- (FillState A1, FillState A2, FillState Press1, FillState Press2) FillingLevels,
+ (FillState MW1, FillState MW2, FillState Press1, FillState Press2) FillingLevels,
int TroughSelector,
double GradationOe,
FillState[] FillingLevelTanks,
@@ -17,7 +17,7 @@ namespace PamhagenSysCtrl.Helpers {
public record struct ActuatorStates(
long Valves,
MotorState MP1, MotorState MP2, MotorState P12, MotorState P3, MotorState P4, MotorState P5, MotorState P6,
- bool TroughAuger, bool Rebler, bool StirrerA1, bool StirrerA2, bool Belt, bool Auger1, bool Auger2, bool GradationPump
+ bool TroughAuger, bool Rebler, bool StirrerMW1, bool StirrerMW2, bool Belt, bool Auger1, bool Auger2, bool GradationPump
) {
public readonly bool GetV(int n) => (Valves & (1L << (n - 1))) != 0;
public void SetV(int n, bool val) {
@@ -107,11 +107,11 @@ namespace PamhagenSysCtrl.Helpers {
long pressure = (long)r1 | ((long)r2 << 16) | ((long)r3 << 32) | ((long)r4 << 48);
pressure = (pressure & 0x01FFFFFFFFFFFFFF) | ((pressure & 0x0600000000000000) << 1);
- var a1 = Int3ToFillState((f1 ) & 0x7); // 111 011 001 000
- var a2 = Int3ToFillState((f1 >> 3) & 0x7); // 111 011 001 000
- var p1 = Int1ToFillState((f1 >> 6) & 0x1); // 1 0
- var p2 = Int1ToFillState((f1 >> 7) & 0x1); // 1 0
- var wp = ((f1 >> 8) & 0x3); // 10 01
+ var mw1 = Int3ToFillState((f1 ) & 0x7); // 111 011 001 000
+ var mw2 = Int3ToFillState((f1 >> 3) & 0x7); // 111 011 001 000
+ var p1 = Int1ToFillState((f1 >> 6) & 0x1); // 1 0
+ var p2 = Int1ToFillState((f1 >> 7) & 0x1); // 1 0
+ var wp = ((f1 >> 8) & 0x3); // 10 01
// Masseligerät : 4mA => 50 Oe
// 20mA => 150 Oe
@@ -137,7 +137,7 @@ namespace PamhagenSysCtrl.Helpers {
var t9 = Int1ToFillState((f2 >> 13) & 0x1); // 1 0
var q1 = Int1ToPumpState((f2 >> 15) & 0x1); // 1 0
- return new SensorStates(pressure, (a1, a2, p1, p2), wp == 3 ? -1 : wp == 1 ? 2 : wp == 2 ? 1 : 0, oe, [t1, t2, t3, t4, t5, t6, t7, t8, t9], q1);
+ return new SensorStates(pressure, (mw1, mw2, p1, p2), wp == 3 ? -1 : wp == 1 ? 2 : wp == 2 ? 1 : 0, oe, [t1, t2, t3, t4, t5, t6, t7, t8, t9], q1);
}
protected async Task<(ushort RW000, ushort RW001, ushort RW002, ushort RW003, ushort RW004, ushort RW005, ushort RW006)> ReadOutputRegisters() {
@@ -210,8 +210,8 @@ namespace PamhagenSysCtrl.Helpers {
(state.TroughAuger ? 0x01 : 0x00) |
(state.Rebler ? 0x02 : 0x00) |
(state.GetV(58) ? 0x04 : 0x00) |
- (state.StirrerA1 ? 0x08 : 0x00) |
- (state.StirrerA2 ? 0x10 : 0x00) |
+ (state.StirrerMW1 ? 0x08 : 0x00) |
+ (state.StirrerMW2 ? 0x10 : 0x00) |
(state.Belt ? 0x20 : 0x00) |
(state.Auger1 ? 0x40 : 0x00) |
(state.Auger2 ? 0x80 : 0x00);
diff --git a/PamhagenSysCtrl/PamhagenSysCtrl.csproj b/PamhagenSysCtrl/PamhagenSysCtrl.csproj
index 1f0dd9d..a5430d5 100644
--- a/PamhagenSysCtrl/PamhagenSysCtrl.csproj
+++ b/PamhagenSysCtrl/PamhagenSysCtrl.csproj
@@ -11,7 +11,8 @@
-
+
+
diff --git a/PamhagenSysCtrl/Windows/MainWindow.xaml.cs b/PamhagenSysCtrl/Windows/MainWindow.xaml.cs
deleted file mode 100644
index 782e1ab..0000000
--- a/PamhagenSysCtrl/Windows/MainWindow.xaml.cs
+++ /dev/null
@@ -1,268 +0,0 @@
-using PamhagenSysCtrl.Helpers;
-using PamhagenSysCtrl.Windows;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Media;
-
-namespace PamhagenSysCtrl {
- public partial class MainWindow : Window {
-
- public MainWindow() {
- InitializeComponent();
-
- for (int i = 1; i <= 60; i++) {
- var b = new Button() {
- Content = $"V{i}",
- Margin = new(10 + ((i - 1) / 10) * 50, 10 + ((i - 1) % 10) * 40, 10, 10),
- BorderThickness = new(2),
- FontWeight = FontWeights.Bold,
- VerticalAlignment = VerticalAlignment.Top,
- HorizontalAlignment = HorizontalAlignment.Left,
- Height = 30,
- Width = 40,
- FontSize = 14,
- };
- var borderStyle = new Style(typeof(Border));
- borderStyle.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(5)));
- b.Resources.Add(typeof(Border), borderStyle);
- b.Click += (sender, evt) => {
- if (App.Plant == null || sender is not Button b) return;
- var i = int.Parse($"{b.Content}"[1..]);
- if (i == 58) {
- if (App.Plant.WantA1Selected) {
- App.Plant.SelectA2();
- } else {
- App.Plant.SelectA1();
- }
- } else if (i > 57) {
- return;
- } else if (App.Plant.WantValveOpen(i)) {
- App.Plant.CloseV(i);
- } else {
- App.Plant.OpenV(i);
- }
- };
- ValvePanel.Children.Add(b);
- }
-
- var w = new PlantSchemeWindow();
- w.Show();
- }
-
- public async void ConnectButton_Click(object? sender, RoutedEventArgs evt) {
- try {
- App.Plant = new(PortInput.Text);
- App.Plant.Update += OnUpdate;
- await App.Plant.StartThread();
- } catch (Exception exc) {
- App.Plant?.Dispose();
- App.Plant = null;
- var str = $"Beim Aufbauen einer Verbindung zur SPS ist ein Fehler aufgetreten:\n\n{exc.GetType().Name}: {exc.Message}";
- if (exc.InnerException != null) str += $"\n\n{exc.InnerException.GetType().Name}: {exc.InnerException.Message}";
- MessageBox.Show(str, "SPS-Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- }
-
- public void OnUpdate(object? sender, PlantEventArgs evt) {
- if (sender is not PamhagenPlant plant) return;
-
- for (int i = 1; i <= 60; i++) {
- var target = plant.WantValveClosed(i);
- var actual = plant.IsValveClosed(i);
- if (ValvePanel.Children[i - 1] is not Button b)
- continue;
- b.BorderBrush = target ? Brushes.DarkRed : Brushes.SlateGray;
- b.Foreground = target ? Brushes.DarkRed : Brushes.Black;
- b.Background = actual ? Brushes.MistyRose : Brushes.WhiteSmoke;
- }
-
- ReblerButton.BorderBrush = plant.IsReblerActive ? Brushes.DarkGreen : Brushes.DarkRed;
- ReblerButton.Foreground = plant.IsReblerActive ? Brushes.DarkGreen : Brushes.DarkRed;
- ReblerButton.Background = plant.IsReblerActive ? Brushes.MintCream: Brushes.MistyRose;
-
- TroughAugerButton.BorderBrush = plant.IsTroughAugerActive ? Brushes.DarkGreen : Brushes.DarkRed;
- TroughAugerButton.Foreground = plant.IsTroughAugerActive ? Brushes.DarkGreen : Brushes.DarkRed;
- TroughAugerButton.Background = plant.IsTroughAugerActive ? Brushes.MintCream : Brushes.MistyRose;
-
- StirrerA1Button.BorderBrush = plant.IsStirrerA1Active ? Brushes.DarkGreen : Brushes.DarkRed;
- StirrerA1Button.Foreground = plant.IsStirrerA1Active ? Brushes.DarkGreen : Brushes.DarkRed;
- StirrerA1Button.Background = plant.IsStirrerA1Active ? Brushes.MintCream : Brushes.MistyRose;
-
- StirrerA2Button.BorderBrush = plant.IsStirrerA2Active ? Brushes.DarkGreen : Brushes.DarkRed;
- StirrerA2Button.Foreground = plant.IsStirrerA2Active ? Brushes.DarkGreen : Brushes.DarkRed;
- StirrerA2Button.Background = plant.IsStirrerA2Active ? Brushes.MintCream : Brushes.MistyRose;
-
- BeltButton.BorderBrush = plant.IsBeltActive ? Brushes.DarkGreen : Brushes.DarkRed;
- BeltButton.Foreground = plant.IsBeltActive ? Brushes.DarkGreen : Brushes.DarkRed;
- BeltButton.Background = plant.IsBeltActive ? Brushes.MintCream : Brushes.MistyRose;
-
- Auger1Button.BorderBrush = plant.IsAuger1Active ? Brushes.DarkGreen : Brushes.DarkRed;
- Auger1Button.Foreground = plant.IsAuger1Active ? Brushes.DarkGreen : Brushes.DarkRed;
- Auger1Button.Background = plant.IsAuger1Active ? Brushes.MintCream : Brushes.MistyRose;
-
- Auger2Button.BorderBrush = plant.IsAuger2Active ? Brushes.DarkGreen : Brushes.DarkRed;
- Auger2Button.Foreground = plant.IsAuger2Active ? Brushes.DarkGreen : Brushes.DarkRed;
- Auger2Button.Background = plant.IsAuger2Active ? Brushes.MintCream : Brushes.MistyRose;
-
- GradationPumpButton.BorderBrush = plant.IsGradationPumpActive ? Brushes.DarkGreen : Brushes.DarkRed;
- GradationPumpButton.Foreground = plant.IsGradationPumpActive ? Brushes.DarkGreen : Brushes.DarkRed;
- GradationPumpButton.Background = plant.IsGradationPumpActive ? Brushes.MintCream : Brushes.MistyRose;
-
- MP1BackwardButton.BorderBrush = plant.MP1 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP1BackwardButton.Foreground = plant.MP1 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP1BackwardButton.Background = plant.MP1 == MotorState.Backward ? Brushes.MintCream : Brushes.WhiteSmoke;
- MP1HaltButton.BorderBrush = plant.MP1 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
- MP1HaltButton.Foreground = plant.MP1 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
- MP1HaltButton.Background = plant.MP1 == MotorState.Halt ? Brushes.MistyRose : Brushes.WhiteSmoke;
- MP1ForwardButton.BorderBrush = plant.MP1 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP1ForwardButton.Foreground = plant.MP1 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP1ForwardButton.Background = plant.MP1 == MotorState.Forward ? Brushes.MintCream: Brushes.WhiteSmoke;
-
- MP2BackwardButton.BorderBrush = plant.MP2 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP2BackwardButton.Foreground = plant.MP2 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP2BackwardButton.Background = plant.MP2 == MotorState.Backward ? Brushes.MintCream : Brushes.WhiteSmoke;
- MP2HaltButton.BorderBrush = plant.MP2 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
- MP2HaltButton.Foreground = plant.MP2 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
- MP2HaltButton.Background = plant.MP2 == MotorState.Halt ? Brushes.MistyRose : Brushes.WhiteSmoke;
- MP2ForwardButton.BorderBrush = plant.MP2 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP2ForwardButton.Foreground = plant.MP2 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
- MP2ForwardButton.Background = plant.MP2 == MotorState.Forward ? Brushes.MintCream : Brushes.WhiteSmoke;
-
- P12Button.BorderBrush = plant.P12 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
- P12Button.Foreground = plant.P12 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
- P12Button.Background = plant.P12 == MotorState.Forward ? Brushes.MintCream : Brushes.MistyRose;
-
- Status.Text = $"""
- Gradation °Oe: {plant.GradationOe:N2}
- Presse Querschnecke: {plant.PresseQuerSchnecke}
- Füllstände:
- Wanne A1: {plant.FillLevelA1} (ausgewählt: {plant.WantA1Selected}, Status: {plant.IsA1Selected})
- Wanne A2: {plant.FillLevelA2} (ausgewählt: {plant.WantA2Selected}, Status: {plant.IsA2Selected})
- Presse 1: {plant.FillLevelPress1}
- Presse 2: {plant.FillLevelPress2}
- Tank 1: {plant.FillLevelT1}
- Tank 2: {plant.FillLevelT2}
- Tank 3: {plant.FillLevelT3}
- Tank 4: {plant.FillLevelT4}
- Tank 5: {plant.FillLevelT5}
- Tank 6: {plant.FillLevelT6}
- Tank 7: {plant.FillLevelT7}
- Tank 8: {plant.FillLevelT8}
- Tank 9: {plant.FillLevelT9}
- """;
- }
-
- private void TroughAugerButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsTroughAugerActive) {
- App.Plant.StopTroughAuger();
- } else {
- App.Plant.StartTroughAuger();
- }
- }
-
- private void ReblerButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsReblerActive) {
- App.Plant.StopRebler();
- } else {
- App.Plant.StartRebler();
- }
- }
-
- private void StirrerA1Button_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsStirrerA1Active) {
- App.Plant.StopStirrerA1();
- } else {
- App.Plant.StartStirrerA1();
- }
- }
-
- private void StirrerA2Button_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsStirrerA2Active) {
- App.Plant.StopStirrerA2();
- } else {
- App.Plant.StartStirrerA2();
- }
- }
-
- private void BeltButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsBeltActive) {
- App.Plant.StopBelt();
- } else {
- App.Plant.StartBelt();
- }
- }
-
- private void Auger1Button_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsAuger1Active) {
- App.Plant.StopAuger1();
- } else {
- App.Plant.StartAuger1();
- }
- }
-
- private void Auger2Button_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsAuger2Active) {
- App.Plant.StopAuger2();
- } else {
- App.Plant.StartAuger2();
- }
- }
-
- private void GradationPumpButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.IsGradationPumpActive) {
- App.Plant.StopGradationPump();
- } else {
- App.Plant.StartGradationPump();
- }
- }
-
- private void MP1BackwardButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- App.Plant.StartMP1Backward();
- }
-
- private void MP1HaltButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- App.Plant.StopMP1();
- }
-
- private void MP1ForwardButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- App.Plant.StartMP1Forward();
- }
-
-
- private void MP2BackwardButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- App.Plant.StartMP2Backward();
- }
-
- private void MP2HaltButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- App.Plant.StopMP2();
- }
-
- private void MP2ForwardButton_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- App.Plant.StartMP2Forward();
- }
-
- private void P12Button_Click(object? sender, RoutedEventArgs? evt) {
- if (App.Plant == null) return;
- if (App.Plant.P12 == MotorState.Forward) {
- App.Plant.StopP12();
- } else {
- App.Plant.StartP12();
- }
- }
- }
-}
diff --git a/PamhagenSysCtrl/Windows/MainWindow.xaml b/PamhagenSysCtrl/Windows/ManualControlWindow.xaml
similarity index 75%
rename from PamhagenSysCtrl/Windows/MainWindow.xaml
rename to PamhagenSysCtrl/Windows/ManualControlWindow.xaml
index c192b88..6e35963 100644
--- a/PamhagenSysCtrl/Windows/MainWindow.xaml
+++ b/PamhagenSysCtrl/Windows/ManualControlWindow.xaml
@@ -1,19 +1,13 @@
-
+ Title="Manuelle Steuerung - Anlagensteuerung Pamhagen" Height="550" Width="860">
-
-
-
-
+
-
+ Click="StirrerMW1Button_Click"/>
-
-
-
+ Click="StirrerMW2Button_Click"/>
-
+
-
-
+ Click="P6Button_Click"/>
-
+
+
+
diff --git a/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs b/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs
new file mode 100644
index 0000000..22ff74b
--- /dev/null
+++ b/PamhagenSysCtrl/Windows/ManualControlWindow.xaml.cs
@@ -0,0 +1,362 @@
+using PamhagenSysCtrl.Helpers;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace PamhagenSysCtrl {
+ public partial class ManualControlWindow : Window {
+
+ public ManualControlWindow() {
+ InitializeComponent();
+
+ for (int i = 1; i <= 58; i++) {
+ var b = new Button() {
+ Content = $"V{i}",
+ Margin = new(10 + ((i - 1) / 10) * 50, 10 + ((i - 1) % 10) * 40, 10, 10),
+ BorderThickness = new(2),
+ FontWeight = FontWeights.Bold,
+ VerticalAlignment = VerticalAlignment.Top,
+ HorizontalAlignment = HorizontalAlignment.Left,
+ Height = 30,
+ Width = 40,
+ FontSize = 14,
+ };
+ var borderStyle = new Style(typeof(Border));
+ borderStyle.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(5)));
+ b.Resources.Add(typeof(Border), borderStyle);
+ b.Click += (sender, evt) => {
+ if (App.Plant == null || sender is not Button b) return;
+ var i = int.Parse($"{b.Content}"[1..]);
+ if (i == 58) {
+ if (App.Plant.WantMW1Selected) {
+ App.Plant.SelectMW2();
+ } else {
+ App.Plant.SelectMW1();
+ }
+ } else if (i > 57) {
+ return;
+ } else if (App.Plant.WantValveOpen(i)) {
+ App.Plant.CloseV(i);
+ } else {
+ App.Plant.OpenV(i);
+ }
+ };
+ ValvePanel.Children.Add(b);
+ }
+
+ App.Plant?.Update += OnUpdate;
+ }
+
+ public void OnUpdate(object? sender, PlantEventArgs evt) {
+ if (sender is not PamhagenPlant plant) return;
+
+ for (int i = 1; i <= 58; i++) {
+ var target = plant.WantValveClosed(i);
+ var actual = plant.IsValveClosed(i);
+ if (ValvePanel.Children[i - 1] is not Button b)
+ continue;
+ b.BorderBrush = target ? Brushes.DarkRed : Brushes.DarkGreen;
+ b.Foreground = target ? Brushes.DarkRed : Brushes.DarkGreen;
+ b.Background = actual ? Brushes.MistyRose : Brushes.MintCream;
+ }
+
+ ReblerButton.BorderBrush = plant.IsReblerActive ? Brushes.DarkGreen : Brushes.DarkRed;
+ ReblerButton.Foreground = plant.IsReblerActive ? Brushes.DarkGreen : Brushes.DarkRed;
+ ReblerButton.Background = plant.IsReblerActive ? Brushes.MintCream: Brushes.MistyRose;
+
+ TroughAugerButton.BorderBrush = plant.IsTroughAugerActive ? Brushes.DarkGreen : Brushes.DarkRed;
+ TroughAugerButton.Foreground = plant.IsTroughAugerActive ? Brushes.DarkGreen : Brushes.DarkRed;
+ TroughAugerButton.Background = plant.IsTroughAugerActive ? Brushes.MintCream : Brushes.MistyRose;
+
+ StirrerMW1Button.BorderBrush = plant.IsStirrerMW1Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ StirrerMW1Button.Foreground = plant.IsStirrerMW1Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ StirrerMW1Button.Background = plant.IsStirrerMW1Active ? Brushes.MintCream : Brushes.MistyRose;
+
+ StirrerMW2Button.BorderBrush = plant.IsStirrerMW2Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ StirrerMW2Button.Foreground = plant.IsStirrerMW2Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ StirrerMW2Button.Background = plant.IsStirrerMW2Active ? Brushes.MintCream : Brushes.MistyRose;
+
+ BeltButton.BorderBrush = plant.IsBeltActive ? Brushes.DarkGreen : Brushes.DarkRed;
+ BeltButton.Foreground = plant.IsBeltActive ? Brushes.DarkGreen : Brushes.DarkRed;
+ BeltButton.Background = plant.IsBeltActive ? Brushes.MintCream : Brushes.MistyRose;
+
+ Auger1Button.BorderBrush = plant.IsAuger1Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ Auger1Button.Foreground = plant.IsAuger1Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ Auger1Button.Background = plant.IsAuger1Active ? Brushes.MintCream : Brushes.MistyRose;
+
+ Auger2Button.BorderBrush = plant.IsAuger2Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ Auger2Button.Foreground = plant.IsAuger2Active ? Brushes.DarkGreen : Brushes.DarkRed;
+ Auger2Button.Background = plant.IsAuger2Active ? Brushes.MintCream : Brushes.MistyRose;
+
+ MP1BackwardButton.BorderBrush = plant.MP1 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP1BackwardButton.Foreground = plant.MP1 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP1BackwardButton.Background = plant.MP1 == MotorState.Backward ? Brushes.MintCream : Brushes.WhiteSmoke;
+ MP1HaltButton.BorderBrush = plant.MP1 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
+ MP1HaltButton.Foreground = plant.MP1 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
+ MP1HaltButton.Background = plant.MP1 == MotorState.Halt ? Brushes.MistyRose : Brushes.WhiteSmoke;
+ MP1ForwardButton.BorderBrush = plant.MP1 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP1ForwardButton.Foreground = plant.MP1 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP1ForwardButton.Background = plant.MP1 == MotorState.Forward ? Brushes.MintCream: Brushes.WhiteSmoke;
+
+ MP2BackwardButton.BorderBrush = plant.MP2 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP2BackwardButton.Foreground = plant.MP2 == MotorState.Backward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP2BackwardButton.Background = plant.MP2 == MotorState.Backward ? Brushes.MintCream : Brushes.WhiteSmoke;
+ MP2HaltButton.BorderBrush = plant.MP2 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
+ MP2HaltButton.Foreground = plant.MP2 == MotorState.Halt ? Brushes.DarkRed : Brushes.SlateGray;
+ MP2HaltButton.Background = plant.MP2 == MotorState.Halt ? Brushes.MistyRose : Brushes.WhiteSmoke;
+ MP2ForwardButton.BorderBrush = plant.MP2 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP2ForwardButton.Foreground = plant.MP2 == MotorState.Forward ? Brushes.DarkGreen : Brushes.SlateGray;
+ MP2ForwardButton.Background = plant.MP2 == MotorState.Forward ? Brushes.MintCream : Brushes.WhiteSmoke;
+
+ P12Button.BorderBrush = plant.P12 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P12Button.Foreground = plant.P12 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P12Button.Background = plant.P12 == MotorState.Forward ? Brushes.MintCream : Brushes.MistyRose;
+
+ P3Button.BorderBrush = plant.P3 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P3Button.Foreground = plant.P3 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P3Button.Background = plant.P3 == MotorState.Forward ? Brushes.MintCream : Brushes.MistyRose;
+
+ P4Button.BorderBrush = plant.P4 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P4Button.Foreground = plant.P4 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P4Button.Background = plant.P4 == MotorState.Forward ? Brushes.MintCream : Brushes.MistyRose;
+
+ P5Button.BorderBrush = plant.P5 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P5Button.Foreground = plant.P5 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P5Button.Background = plant.P5 == MotorState.Forward ? Brushes.MintCream : Brushes.MistyRose;
+
+ P6Button.BorderBrush = plant.P6 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P6Button.Foreground = plant.P6 == MotorState.Forward ? Brushes.DarkGreen : Brushes.DarkRed;
+ P6Button.Background = plant.P6 == MotorState.Forward ? Brushes.MintCream : Brushes.MistyRose;
+
+ Status.Text = $"""
+ Gradation °Oe: {plant.GradationOe:N2}
+ Presse Querschnecke: {plant.PresseQuerSchnecke}
+ Füllstände:
+ Maischewanne 1: {plant.FillLevelMW1} (ausgewählt: {plant.WantMW1Selected}, Status: {plant.IsMWSelected})
+ Maischewanne 2: {plant.FillLevelMW2} (ausgewählt: {plant.WantMW2Selected}, Status: {plant.IsMW2Selected})
+ Presse 1: {plant.FillLevelPress1}
+ Presse 2: {plant.FillLevelPress2}
+ Tank 1: {plant.FillLevelT1}
+ Tank 2: {plant.FillLevelT2}
+ Tank 3: {plant.FillLevelT3}
+ Tank 4: {plant.FillLevelT4}
+ Tank 5: {plant.FillLevelT5}
+ Tank 6: {plant.FillLevelT6}
+ Tank 7: {plant.FillLevelT7}
+ Tank 8: {plant.FillLevelT8}
+ Tank 9: {plant.FillLevelT9}
+ """;
+ }
+
+ private void TroughAugerButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsTroughAugerActive) {
+ App.Plant.StopTroughAuger();
+ } else {
+ App.Plant.StartTroughAuger();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void ReblerButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsReblerActive) {
+ App.Plant.StopRebler();
+ } else {
+ App.Plant.StartRebler();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void StirrerMW1Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsStirrerMW1Active) {
+ App.Plant.StopStirrerMW1();
+ } else {
+ App.Plant.StartStirrerMW1();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void StirrerMW2Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsStirrerMW2Active) {
+ App.Plant.StopStirrerMW2();
+ } else {
+ App.Plant.StartStirrerMW2();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void BeltButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsBeltActive) {
+ App.Plant.StopBelt();
+ } else {
+ App.Plant.StartBelt();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void Auger1Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsAuger1Active) {
+ App.Plant.StopAuger1();
+ } else {
+ App.Plant.StartAuger1();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void Auger2Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.IsAuger2Active) {
+ App.Plant.StopAuger2();
+ } else {
+ App.Plant.StartAuger2();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void MP1BackwardButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ App.Plant.StartMP1Backward();
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void MP1HaltButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ App.Plant.StopMP1();
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void MP1ForwardButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ App.Plant.StartMP1Forward();
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+
+ private void MP2BackwardButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ App.Plant.StartMP2Backward();
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void MP2HaltButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ App.Plant.StopMP2();
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void MP2ForwardButton_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ App.Plant.StartMP2Forward();
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void P12Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.P12 == MotorState.Forward) {
+ App.Plant.StopP12();
+ } else {
+ App.Plant.StartP12();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void P3Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.P3 == MotorState.Forward) {
+ App.Plant.StopP3();
+ } else {
+ App.Plant.StartP3();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void P4Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.P4 == MotorState.Forward) {
+ App.Plant.StopP4();
+ } else {
+ App.Plant.StartP4();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void P5Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.P5 == MotorState.Forward) {
+ App.Plant.StopP5();
+ } else {
+ App.Plant.StartP5();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void P6Button_Click(object? sender, RoutedEventArgs? evt) {
+ if (App.Plant == null) return;
+ try {
+ if (App.Plant.P6 == MotorState.Forward) {
+ App.Plant.StopP6();
+ } else {
+ App.Plant.StartP6();
+ }
+ } catch (NoClearanceException exc) {
+ MessageBox.Show($"{exc.Message}", "Keine Freigabe", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+ }
+}
diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml
index 332fd9d..c305948 100644
--- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml
+++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml
@@ -4,10 +4,51 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:PamhagenSysCtrl.Windows"
- Title="Schema - Anlagensteuerung Pamhagen" Height="900" Width="1600" MinWidth="1500" MinHeight="900">
+ Title="Anlagensteuerung Pamhagen" Height="950" Width="1600" MinWidth="1500" MinHeight="950">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs
index dabec06..be208df 100644
--- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs
+++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs
@@ -1,5 +1,6 @@
using PamhagenSysCtrl.Helpers;
using PamhagenSysCtrl.Helpers.Pipeline;
+using System.Diagnostics;
using System.Windows;
using System.Windows.Input;
@@ -12,7 +13,6 @@ namespace PamhagenSysCtrl.Windows {
private List _path = [];
private ISet? _lastSelected;
private ISet? _hover;
- private bool _mouseDown;
public PlantSchemeWindow() {
InitializeComponent();
@@ -21,6 +21,28 @@ namespace PamhagenSysCtrl.Windows {
Graph.Draw(SchemeCanvas);
}
+ private void Menu_Settings_ManualControl_Click(object sender, RoutedEventArgs evt) {
+ var w = new ManualControlWindow();
+ w.Show();
+ }
+
+ private void Menu_Settings_Directory_Click(object sender, RoutedEventArgs evt) {
+ try {
+ Process.Start("explorer.exe", App.DataPath);
+ } catch { }
+ }
+
+ private void Menu_Settings_Config_Click(object sender, RoutedEventArgs evt) {
+ try {
+ Process.Start(new ProcessStartInfo {
+ FileName = "notepad.exe",
+ Arguments = App.ConfigPath,
+ Verb = "runas",
+ UseShellExecute = true,
+ });
+ } catch { }
+ }
+
private void SchemeCanvas_MouseMove(object sender, MouseEventArgs evt) {
var p = evt.GetPosition(SchemeCanvas);
UpdateScheme(evt.GetPosition(SchemeCanvas), evt.LeftButton == MouseButtonState.Pressed);
@@ -75,10 +97,10 @@ namespace PamhagenSysCtrl.Windows {
App.Plant?.StartRebler();
}
} else if (c is Switcher switcher) {
- if (App.Plant?.WantA1Selected ?? false) {
- App.Plant?.SelectA2();
+ if (App.Plant?.WantMW1Selected ?? false) {
+ App.Plant?.SelectMW2();
} else {
- App.Plant?.SelectA1();
+ App.Plant?.SelectMW1();
}
} else if (c is EncasedAuger auger) {
if (auger == Graph.Auger1) {
@@ -166,7 +188,6 @@ namespace PamhagenSysCtrl.Windows {
Graph.ColorPipesAdjacientToPath(p, PamhagenBrushes.Green, p.Hops.Any(h => (h.Node as Pump)?.IsActive ?? false), PamhagenBrushes.DimOrange);
}
_hover = Graph.GetHover(pos.X, pos.Y);
- _mouseDown = down;
if (_lastSource != null && (_hover.Count > 0 || _path.Count > 0)) {
List points = [_lastSource, .. _path];
if (_hover.Count > 0 && !points.Contains(_hover.First())) {