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() {
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);
}
+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() {
var d = await Plc.DataRead("RW010", 7);
// RW010, RW011, RW012, RW013 Drucksensoren
@@ -93,6 +101,7 @@ namespace PamhagenSysCtrl.Helpers {
}
public async Task<SensorStates> 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<ActuatorStates> 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);
+3 -5
View File
@@ -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<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");
return new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0'));
}