Cleanup and Enhancement
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user