From 3c307da0cadc9e55af6fab89194e72b1eb7ea002 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Wed, 19 Aug 2026 10:04:36 +0200 Subject: [PATCH] [WIP] Status bar --- PamhagenSysCtrl/Helpers/PamhagenPlant.cs | 8 ++++ PamhagenSysCtrl/Helpers/PamhagenPlc.cs | 4 ++ PamhagenSysCtrl/Helpers/T1.cs | 14 +++++-- .../Windows/PlantSchemeWindow.xaml | 39 ++++++++++++++++++- .../Windows/PlantSchemeWindow.xaml.cs | 9 ++++- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs index f1bd8cd..a2d633e 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenPlant.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenPlant.cs @@ -21,6 +21,11 @@ namespace PamhagenSysCtrl.Helpers { 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 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); @@ -133,14 +138,17 @@ namespace PamhagenSysCtrl.Helpers { protected async void BackgroundLoop(object? parameters) { while (IsRunning && Plc != null) { + var start = DateTime.Now; try { if (ActuatorsChanged) { await Plc.WriteOutputs(Actuators); ActuatorsChanged = false; } Sensors = await Plc.ReadInputs(); + LastRttNs = (long)(DateTime.Now - start).TotalNanoseconds; RaiseUpdateEvent(new()); } catch (Exception exc) { + LastRttNs = null; var str = "Bei der SPS ist ein Fehler aufgetreten:\n\n" + exc.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; MessageBox.Show(str, "SPS-Fehler", MessageBoxButton.OK, MessageBoxImage.Error); diff --git a/PamhagenSysCtrl/Helpers/PamhagenPlc.cs b/PamhagenSysCtrl/Helpers/PamhagenPlc.cs index ae5b370..70f8107 100644 --- a/PamhagenSysCtrl/Helpers/PamhagenPlc.cs +++ b/PamhagenSysCtrl/Helpers/PamhagenPlc.cs @@ -34,6 +34,10 @@ namespace PamhagenSysCtrl.Helpers { protected readonly T1 Plc; + public string PortName => Plc.PortName; + public T1.Status LastPlcStatus => Plc.LastStatus; + public T1Error LastPlcError => Plc.LastError; + public PamhagenPlc(string portName, Parity parity = Parity.Odd) { Plc = new T1(portName, parity); } diff --git a/PamhagenSysCtrl/Helpers/T1.cs b/PamhagenSysCtrl/Helpers/T1.cs index e7c5b5d..9a3a6c1 100644 --- a/PamhagenSysCtrl/Helpers/T1.cs +++ b/PamhagenSysCtrl/Helpers/T1.cs @@ -10,12 +10,16 @@ namespace PamhagenSysCtrl.Helpers { protected SerialPort Serial; + public string PortName => Serial.PortName; + public Status LastStatus { get; private set; } + public T1Error LastError { get; private set; } + public T1(string portName, Parity parity = Parity.Odd) { Serial = new SerialPort(portName, 9600, parity, 8, StopBits.One) { Handshake = Handshake.None, NewLine = "\r", - ReadTimeout = 1000, - WriteTimeout = 1000, + ReadTimeout = 500, + WriteTimeout = 500, DtrEnable = true, RtsEnable = true, Encoding = Encoding.ASCII, @@ -97,14 +101,16 @@ namespace PamhagenSysCtrl.Helpers { public async Task StatusRead() { await SendCommand("ST", checksum: false); var (_, res) = await ReceiveResponse("ST"); - return new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0')); + LastStatus = new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0')); + return LastStatus; } public async Task ErrorStatusRead() { await SendCommand("ER", checksum: false); var (_, res) = await ReceiveResponse("ER"); var code = Convert.ToInt32(res, 10); - return Enum.IsDefined(typeof(T1Error), code) ? (T1Error)code : T1Error.UNKNOWN_ERROR; + LastError = Enum.IsDefined(typeof(T1Error), code) ? (T1Error)code : T1Error.UNKNOWN_ERROR; + return LastError; } public Task DataRead(string register, int length) { diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml index 59f9884..acd46bf 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml @@ -227,7 +227,44 @@ - + + + + + + + + + + + + + + + + + + SPS-Verbindung: + + + + + + SPS-Status: + + + + + + Druckluft: + + + + + + Ventile offen: + + diff --git a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs index e0301f7..2eec3fb 100644 --- a/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs +++ b/PamhagenSysCtrl/Windows/PlantSchemeWindow.xaml.cs @@ -502,6 +502,8 @@ namespace PamhagenSysCtrl.Windows { foreach (var n in Graph.Nodes) { if (n is Pump p) { p.Highlight = null; + } else if (n is PipeJoin j) { + j.Highlight = null; } } @@ -593,7 +595,12 @@ namespace PamhagenSysCtrl.Windows { } public void OnUpdate(object? sender, PlantEventArgs? evt) { - if (sender is not PamhagenPlant plant) return; + if (App.Plant is PamhagenPlant p) { + Status_Connection.Text = $"Ja ({p.PlcPortName}" + (p.LastRttNs != null ? $", {p.LastRttNs / 1000000.0:N0} ms" : "") + ")"; + Status_Plc.Text = $"{p.LastPlcStatus?.Mode} ({p.LastPlcStatus?.Flags:X3}) / {p.LastPlcError?.GetName()} ({(int?)p.LastPlcError:0000})"; + Status_CompressedAir.Text = Enumerable.Range(1, 57).Any(p.IsValveClosed) ? "Ein" : Enumerable.Range(1, 57).Any(p.WantValveClosed) ? "Aus" : "?"; + Status_ValvesOpen.Text = Enumerable.Range(1, 57).Count(p.IsValveOpen) + " / " + Enumerable.Range(1, 57).Count(p.WantValveOpen) + " / 57"; + } UpdateScheme(Mouse.GetPosition(SchemeCanvas), Mouse.LeftButton == MouseButtonState.Pressed); }