From ac2eafc8c6fad3d223a2e3f447880257e52613ad Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Fri, 10 Jul 2026 12:01:21 +0200 Subject: [PATCH] Cleanup and Enhancement --- PamhagenSysCtrl/Helpers/PamhagenPlant.cs | 9 ++++----- PamhagenSysCtrl/Helpers/PamhagenPlc.cs | 11 +++++++++++ PamhagenSysCtrl/Helpers/T1.cs | 8 +++----- PamhagenSysCtrl/Windows/MainWindow.xaml.cs | 4 +++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs index f07964e..49fb6c4 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs @@ -68,7 +68,6 @@ namespace PamhagenSysCtrl.Helpers { public void Dispose() { IsRunning = false; - BackgroundThread?.Interrupt(); BackgroundThread?.Join(); Plc?.Dispose(); GC.SuppressFinalize(this); @@ -83,8 +82,6 @@ namespace PamhagenSysCtrl.Helpers { } Sensors = await Plc.ReadInputs(); RaiseUpdateEvent(EventArgs.Empty); - } catch (ThreadInterruptedException) { - // ignore } catch (Exception exc) { var str = "Bei der SPS ist ein Fehler aufgetreten:\n\n" + exc.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; @@ -93,12 +90,14 @@ namespace PamhagenSysCtrl.Helpers { Plc?.Dispose(); Plc = null; IsRunning = false; + } else { + await Task.Delay(1000); } } } try { if (Plc != null) - await Plc.WriteOutputs(new()); + await Plc.WriteOutputs(new() { Valves = Actuators.Valves }); } 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; @@ -150,7 +149,7 @@ namespace PamhagenSysCtrl.Helpers { public void CloseV(int n) => SetV(n, false); protected void SetV(int n, bool val) { - if (n < 1 || n > 60) throw new ArgumentException("Invalid value for n: 1 <= #V <= 60"); + if (n < 1 || n > 57) throw new ArgumentException("Invalid value for n: 1 <= #V <= 57"); Actuators.SetV(n, val); } diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlc.cs b/PamhagenSysCtrl/Helpers/PamhagenPlc.cs index e039ab0..86340f2 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenPlc.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenPlc.cs @@ -83,6 +83,14 @@ namespace PamhagenSysCtrl.Helpers { }; } + public async Task EnsureRunning() { + var s = await Plc.StatusRead(); + if (s.Mode == T1.Mode.RUN || s.Mode == T1.Mode.RUN_F) + return; + var error = await Plc.ErrorStatusRead(); + throw new T1Exception($"Interner Fehler: {error} ({(int)error:0000})"); + } + protected async Task<(ushort RW010, ushort RW011, ushort RW012, ushort RW013, ushort RW014, ushort RW015, ushort RW016)> ReadInputRegisters() { var d = await Plc.DataRead("RW010", 7); // RW010, RW011, RW012, RW013 Drucksensoren @@ -93,6 +101,7 @@ namespace PamhagenSysCtrl.Helpers { } public async Task ReadInputs() { + await EnsureRunning(); var (r1, r2, r3, r4, f1, v, f2) = await ReadInputRegisters(); long pressure = (long)r1 | ((long)r2 << 16) | ((long)r3 << 32) | ((long)r4 << 48); @@ -149,6 +158,7 @@ namespace PamhagenSysCtrl.Helpers { } public async Task ReadOutputs() { + await EnsureRunning(); var (v1, v2, v3, v4, p1, s1, s2) = await ReadOutputRegisters(); long valves = (long)v1 | ((long)v2 << 16) | ((long)v3 << 32) | ((long)v4 << 48); @@ -179,6 +189,7 @@ namespace PamhagenSysCtrl.Helpers { } public async Task WriteOutputs(ActuatorStates state) { + await EnsureRunning(); var v1 = (ushort)((state.Valves ) & 0xFFFF); var v2 = (ushort)((state.Valves >> 16) & 0xFFFF); var v3 = (ushort)((state.Valves >> 32) & 0xFFFF); diff --git a/PamhagenSysCtrl/Helpers/T1.cs b/PamhagenSysCtrl/Helpers/T1.cs index 473d06c..1d9a823 100644 --- a/PamhagenSysCtrl/Helpers/T1.cs +++ b/PamhagenSysCtrl/Helpers/T1.cs @@ -49,9 +49,7 @@ namespace PamhagenSysCtrl.Helpers { protected async Task<(string, string)> ReceiveResponse(string? expectedCmd = null) { var line = Serial.ReadLine(); - if (line == null) { - throw new IOException("Verbindung zu SPS (T1) verloren"); - } else if (line.Length < 8 || !line.StartsWith("(A") || !line.EndsWith(')') || line[^4] != '&') { + if (line.Length < 8 || !line.StartsWith("(A") || !line.EndsWith(')') || line[^4] != '&') { throw new FormatException("Invalid response from PLC (T1)"); } @@ -90,7 +88,7 @@ namespace PamhagenSysCtrl.Helpers { return (cmd, data); } - public async Task Test(string data = "PINGPONG") { + public async Task Test(string data = "_Ping_Pong_0123456789_abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ_") { await SendCommand("TS", data); var (_, res) = await ReceiveResponse("TS"); if (data.Replace(" ", "") != res) throw new T1Exception("Wrong test response from PLC (T1)"); @@ -125,7 +123,7 @@ namespace PamhagenSysCtrl.Helpers { } public async Task DataWrite(params (string Register, ushort[] Values)[] registers) { - await SendCommand("DW", string.Join(',', registers.Select(r => $"{r.Register},{r.Values.Length}," + string.Join(',', r.Values.Select(v => $"{v:X4}"))))); + await SendCommand("DW", string.Join(',', registers.Select(r => $"{r.Register},{r.Values.Length}," + string.Join(',', r.Values.Select(v => $"{v:X}"))))); var (_, res) = await ReceiveResponse("ST"); return new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0')); } diff --git a/PamhagenSysCtrl/Windows/MainWindow.xaml.cs b/PamhagenSysCtrl/Windows/MainWindow.xaml.cs index 769950c..4118bac 100644 --- a/PamhagenSysCtrl/Windows/MainWindow.xaml.cs +++ b/PamhagenSysCtrl/Windows/MainWindow.xaml.cs @@ -27,7 +27,9 @@ namespace PamhagenSysCtrl { b.Click += (sender, evt) => { if (App.Plant == null || sender is not Button b) return; var i = int.Parse($"{b.Content}"[1..]); - if (App.Plant.WantValveOpen(i)) { + if (i > 57) { + return; + } else if (App.Plant.WantValveOpen(i)) { App.Plant.CloseV(i); } else { App.Plant.OpenV(i);