[#74] Weighing: Try to reconnect tcp scales on first error
All checks were successful
Test / Run tests (push) Successful in 3m0s

This commit is contained in:
2026-02-25 10:57:44 +01:00
parent b58dee6d3f
commit 1108427023
3 changed files with 33 additions and 7 deletions

View File

@@ -53,9 +53,16 @@ namespace Elwig.Helpers.Weighing {
return line[1..^1]; return line[1..^1];
} }
protected async Task<WeighingResult> Weigh(bool incIdentNr) { protected async Task<WeighingResult> Weigh(bool incIdentNr, bool retry = true) {
string record;
try {
await SendCommand(incIdentNr ? '\x05' : '?'); await SendCommand(incIdentNr ? '\x05' : '?');
string record = await ReceiveResponse(); record = await ReceiveResponse();
} catch (IOException) {
if (!retry || Tcp == null) throw;
ReconnectTcp();
return await Weigh(incIdentNr, false);
}
if (record.Length != 45) if (record.Length != 45)
throw new FormatException("Invalid response from scale: Received record has invalid size"); throw new FormatException("Invalid response from scale: Received record has invalid size");
var line = record[2..]; var line = record[2..];

View File

@@ -10,6 +10,7 @@ namespace Elwig.Helpers.Weighing {
protected enum Output { RTS, DTR, OUT1, OUT2 }; protected enum Output { RTS, DTR, OUT1, OUT2 };
protected readonly string Connection;
protected SerialPort? Serial = null; protected SerialPort? Serial = null;
protected SerialPort? ControlSerialEmpty = null, ControlSerialFilling = null; protected SerialPort? ControlSerialEmpty = null, ControlSerialFilling = null;
protected TcpClient? Tcp = null; protected TcpClient? Tcp = null;
@@ -37,6 +38,7 @@ namespace Elwig.Helpers.Weighing {
} }
protected Scale(string cnx, string? empty, string? filling, int? limit, string? log, bool softFail = false, bool failSilent = false) { protected Scale(string cnx, string? empty, string? filling, int? limit, string? log, bool softFail = false, bool failSilent = false) {
Connection = cnx;
if (cnx.StartsWith("serial:")) { if (cnx.StartsWith("serial:")) {
try { try {
Serial = Utils.OpenSerialConnection(cnx); Serial = Utils.OpenSerialConnection(cnx);
@@ -95,6 +97,14 @@ namespace Elwig.Helpers.Weighing {
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
protected void ReconnectTcp() {
if (Connection.StartsWith("tcp:")) {
Tcp = Utils.OpenTcpConnection(Connection);
Stream = Tcp.GetStream();
Reader = new(Stream, Encoding.ASCII, false, 512);
}
}
protected static Output? ConvertOutput(string? value) { protected static Output? ConvertOutput(string? value) {
return value switch { return value switch {
null => null, null => null,

View File

@@ -33,7 +33,9 @@ namespace Elwig.Helpers.Weighing {
protected async Task<string> ReceiveResponse() { protected async Task<string> ReceiveResponse() {
var line = await Reader.ReadUntilAsync("\r\n"); var line = await Reader.ReadUntilAsync("\r\n");
if (LogPath != null) await File.AppendAllTextAsync(LogPath, line); if (LogPath != null) await File.AppendAllTextAsync(LogPath, line);
if (line == null || line.Length < 4 || !line.StartsWith('<') || !line.EndsWith(">\r\n")) { if (line == null) {
throw new IOException("Verbindung zu Waage verloren");
} else if (line.Length < 4 || !line.StartsWith('<') || !line.EndsWith(">\r\n")) {
throw new FormatException("Invalid response from scale"); throw new FormatException("Invalid response from scale");
} }
@@ -72,9 +74,16 @@ namespace Elwig.Helpers.Weighing {
return line[1..^3]; return line[1..^3];
} }
protected async Task<WeighingResult> Weigh(bool incIdentNr) { protected async Task<WeighingResult> Weigh(bool incIdentNr, bool retry = true) {
string record;
try {
await SendCommand(incIdentNr ? $"RN{InternalScaleNr}" : $"RM{InternalScaleNr}"); await SendCommand(incIdentNr ? $"RN{InternalScaleNr}" : $"RM{InternalScaleNr}");
string record = await ReceiveResponse(); record = await ReceiveResponse();
} catch (IOException) {
if (!retry || Tcp == null) throw;
ReconnectTcp();
return await Weigh(incIdentNr, false);
}
if (record.Length != 62) if (record.Length != 62)
throw new FormatException("Invalid response from scale: Received record has invalid size"); throw new FormatException("Invalid response from scale: Received record has invalid size");
var line = record[2..]; var line = record[2..];