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