Cleanup and Enhancement

This commit is contained in:
2026-07-10 12:01:21 +02:00
parent fb35ddb389
commit ac2eafc8c6
4 changed files with 21 additions and 11 deletions
+4 -5
View File
@@ -68,7 +68,6 @@ namespace PamhagenSysCtrl.Helpers {
public void Dispose() { public void Dispose() {
IsRunning = false; IsRunning = false;
BackgroundThread?.Interrupt();
BackgroundThread?.Join(); BackgroundThread?.Join();
Plc?.Dispose(); Plc?.Dispose();
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
@@ -83,8 +82,6 @@ namespace PamhagenSysCtrl.Helpers {
} }
Sensors = await Plc.ReadInputs(); Sensors = await Plc.ReadInputs();
RaiseUpdateEvent(EventArgs.Empty); RaiseUpdateEvent(EventArgs.Empty);
} catch (ThreadInterruptedException) {
// ignore
} catch (Exception exc) { } catch (Exception exc) {
var str = "Bei der SPS ist ein Fehler aufgetreten:\n\n" + exc.Message; var str = "Bei der SPS ist ein Fehler aufgetreten:\n\n" + exc.Message;
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
@@ -93,12 +90,14 @@ namespace PamhagenSysCtrl.Helpers {
Plc?.Dispose(); Plc?.Dispose();
Plc = null; Plc = null;
IsRunning = false; IsRunning = false;
} else {
await Task.Delay(1000);
} }
} }
} }
try { try {
if (Plc != null) if (Plc != null)
await Plc.WriteOutputs(new()); await Plc.WriteOutputs(new() { Valves = Actuators.Valves });
} catch (Exception exc) { } catch (Exception exc) {
var str = "Beim Schließen der Verbindung zur SPS ist ein Fehler aufgetreten:\n\n" + exc.Message; 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; 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); public void CloseV(int n) => SetV(n, false);
protected void SetV(int n, bool val) { 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); Actuators.SetV(n, val);
} }
+11
View File
@@ -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() { 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); var d = await Plc.DataRead("RW010", 7);
// RW010, RW011, RW012, RW013 Drucksensoren // RW010, RW011, RW012, RW013 Drucksensoren
@@ -93,6 +101,7 @@ namespace PamhagenSysCtrl.Helpers {
} }
public async Task<SensorStates> ReadInputs() { public async Task<SensorStates> ReadInputs() {
await EnsureRunning();
var (r1, r2, r3, r4, f1, v, f2) = await ReadInputRegisters(); var (r1, r2, r3, r4, f1, v, f2) = await ReadInputRegisters();
long pressure = (long)r1 | ((long)r2 << 16) | ((long)r3 << 32) | ((long)r4 << 48); long pressure = (long)r1 | ((long)r2 << 16) | ((long)r3 << 32) | ((long)r4 << 48);
@@ -149,6 +158,7 @@ namespace PamhagenSysCtrl.Helpers {
} }
public async Task<ActuatorStates> ReadOutputs() { public async Task<ActuatorStates> ReadOutputs() {
await EnsureRunning();
var (v1, v2, v3, v4, p1, s1, s2) = await ReadOutputRegisters(); var (v1, v2, v3, v4, p1, s1, s2) = await ReadOutputRegisters();
long valves = (long)v1 | ((long)v2 << 16) | ((long)v3 << 32) | ((long)v4 << 48); 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) { public async Task WriteOutputs(ActuatorStates state) {
await EnsureRunning();
var v1 = (ushort)((state.Valves ) & 0xFFFF); var v1 = (ushort)((state.Valves ) & 0xFFFF);
var v2 = (ushort)((state.Valves >> 16) & 0xFFFF); var v2 = (ushort)((state.Valves >> 16) & 0xFFFF);
var v3 = (ushort)((state.Valves >> 32) & 0xFFFF); var v3 = (ushort)((state.Valves >> 32) & 0xFFFF);
+3 -5
View File
@@ -49,9 +49,7 @@ namespace PamhagenSysCtrl.Helpers {
protected async Task<(string, string)> ReceiveResponse(string? expectedCmd = null) { protected async Task<(string, string)> ReceiveResponse(string? expectedCmd = null) {
var line = Serial.ReadLine(); var line = Serial.ReadLine();
if (line == null) { if (line.Length < 8 || !line.StartsWith("(A") || !line.EndsWith(')') || line[^4] != '&') {
throw new IOException("Verbindung zu SPS (T1) verloren");
} else if (line.Length < 8 || !line.StartsWith("(A") || !line.EndsWith(')') || line[^4] != '&') {
throw new FormatException("Invalid response from PLC (T1)"); throw new FormatException("Invalid response from PLC (T1)");
} }
@@ -90,7 +88,7 @@ namespace PamhagenSysCtrl.Helpers {
return (cmd, data); 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); await SendCommand("TS", data);
var (_, res) = await ReceiveResponse("TS"); var (_, res) = await ReceiveResponse("TS");
if (data.Replace(" ", "") != res) throw new T1Exception("Wrong test response from PLC (T1)"); if (data.Replace(" ", "") != res) throw new T1Exception("Wrong test response from PLC (T1)");
@@ -125,7 +123,7 @@ namespace PamhagenSysCtrl.Helpers {
} }
public async Task<Status> DataWrite(params (string Register, ushort[] Values)[] registers) { public async Task<Status> 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"); var (_, res) = await ReceiveResponse("ST");
return new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0')); return new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0'));
} }
+3 -1
View File
@@ -27,7 +27,9 @@ namespace PamhagenSysCtrl {
b.Click += (sender, evt) => { b.Click += (sender, evt) => {
if (App.Plant == null || sender is not Button b) return; if (App.Plant == null || sender is not Button b) return;
var i = int.Parse($"{b.Content}"[1..]); 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); App.Plant.CloseV(i);
} else { } else {
App.Plant.OpenV(i); App.Plant.OpenV(i);