Do not consider connection lost on some error codes

This commit is contained in:
Peter Butzhammer
2024-02-06 18:19:15 +01:00
parent d422249955
commit e7176c26e7
2 changed files with 38 additions and 10 deletions

27
Sharp7.Rx/S7ErrorCodes.cs Normal file
View File

@@ -0,0 +1,27 @@
using System.Collections.Generic;
namespace Sharp7.Rx
{
public static class S7ErrorCodes
{
/// <summary>
/// This list is not exhaustive and should be considered work in progress.
/// </summary>
private static readonly HashSet<int> notDisconnectedErrorCodes = new HashSet<int>
{
0x000000, // OK
0xC00000, // CPU: Item not available
0x900000, // CPU: Address out of range
};
/// <summary>
/// Some error codes indicate connection lost, in which case, the driver tries to reestablish connection.
/// Other error codes indicate a user error, like reading from an unavailable DB or exceeding
/// the DBs range. In this case the driver should not consider the connection to be lost.
/// </summary>
public static bool AssumeConnectionLost(int errorCode)
{
return !notDisconnectedErrorCodes.Contains(errorCode);
}
}
}

View File

@@ -52,7 +52,7 @@ namespace Sharp7.Rx
var result = await Task.Factory.StartNew(() => s7MultiVar.Read(), CancellationToken.None, TaskCreationOptions.None, scheduler); var result = await Task.Factory.StartNew(() => s7MultiVar.Read(), CancellationToken.None, TaskCreationOptions.None, scheduler);
if (result != 0) if (result != 0)
{ {
await EvaluateErrorCode(result); EvaluateErrorCode(result);
throw new InvalidOperationException($"Error in MultiVar request for variables: {string.Join(",", variableNames)}"); throw new InvalidOperationException($"Error in MultiVar request for variables: {string.Join(",", variableNames)}");
} }
@@ -88,7 +88,7 @@ namespace Sharp7.Rx
try try
{ {
var errorCode = await Task.Factory.StartNew(() => sharp7.ConnectTo(ipAddress, rackNr, cpuSlotNr), CancellationToken.None, TaskCreationOptions.None, scheduler); var errorCode = await Task.Factory.StartNew(() => sharp7.ConnectTo(ipAddress, rackNr, cpuSlotNr), CancellationToken.None, TaskCreationOptions.None, scheduler);
var success = await EvaluateErrorCode(errorCode); var success = EvaluateErrorCode(errorCode);
if (success) if (success)
{ {
connectionStateSubject.OnNext(Enums.ConnectionState.Connected); connectionStateSubject.OnNext(Enums.ConnectionState.Connected);
@@ -168,7 +168,7 @@ namespace Sharp7.Rx
await Task.Factory.StartNew(() => sharp7.Disconnect(), CancellationToken.None, TaskCreationOptions.None, scheduler); await Task.Factory.StartNew(() => sharp7.Disconnect(), CancellationToken.None, TaskCreationOptions.None, scheduler);
} }
private async Task<bool> EvaluateErrorCode(int errorCode) private bool EvaluateErrorCode(int errorCode)
{ {
if (errorCode == 0) if (errorCode == 0)
return true; return true;
@@ -178,7 +178,9 @@ namespace Sharp7.Rx
var errorText = sharp7.ErrorText(errorCode); var errorText = sharp7.ErrorText(errorCode);
Logger?.LogError($"Error Code {errorCode} {errorText}"); Logger?.LogError($"Error Code {errorCode} {errorText}");
await SetConnectionLostState();
if (S7ErrorCodes.AssumeConnectionLost(errorCode))
SetConnectionLostState();
return false; return false;
} }
@@ -190,10 +192,9 @@ namespace Sharp7.Rx
return await Connect(); return await Connect();
} }
private async Task SetConnectionLostState() private void SetConnectionLostState()
{ {
var state = await connectionStateSubject.FirstAsync(); if (connectionStateSubject.Value == Enums.ConnectionState.ConnectionLost) return;
if (state == Enums.ConnectionState.ConnectionLost) return;
connectionStateSubject.OnNext(Enums.ConnectionState.ConnectionLost); connectionStateSubject.OnNext(Enums.ConnectionState.ConnectionLost);
} }
@@ -219,7 +220,7 @@ namespace Sharp7.Rx
if (result != 0) if (result != 0)
{ {
await EvaluateErrorCode(result); EvaluateErrorCode(result);
var errorText = sharp7.ErrorText(result); var errorText = sharp7.ErrorText(result);
throw new InvalidOperationException($"Error reading {operand}{dBNr}:{startByteAddress}->{bytesToRead} ({errorText})"); throw new InvalidOperationException($"Error reading {operand}{dBNr}:{startByteAddress}->{bytesToRead} ({errorText})");
} }
@@ -265,7 +266,7 @@ namespace Sharp7.Rx
if (result != 0) if (result != 0)
{ {
await EvaluateErrorCode(result); EvaluateErrorCode(result);
return 0; return 0;
} }
return (ushort)(data.Length); return (ushort)(data.Length);
@@ -283,7 +284,7 @@ namespace Sharp7.Rx
if (result != 0) if (result != 0)
{ {
await EvaluateErrorCode(result); EvaluateErrorCode(result);
return (false); return (false);
} }
return (true); return (true);