通讯故障,比如远端PLC等断电重启等后,网关就会出现问题.
分析是因为服务器端<PLC>异常时,网关的连接套接字就被回收了? 如果服务器端恢复时,就会出现<不允许非连接套接字执行此操作>的报警.
{"不允许对非连接的套接字执行此操作。"}
Data: {System.Collections.ListDictionaryInternal}
HResult: -2146233079
HelpLink: null
IPForWatsonBuckets: 0x660fa489
InnerException: null
IsTransient: false
Message: "不允许对非连接的套接字执行此操作。"
RemoteStackTrace: null
Source: "System"
我处理是思路就是,通过try..catch..,发生
:<由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>时,就把该连接从连接池删除.
如果重连过程中还没有服务器还没有恢复正常,就会有如下故障
处理代码如下:目前看,只是解决了问题,代码不够优雅.如果有好的方式欢迎大家教教我.
代码语言:javascript复制 public override ushort[] ReadN(request req)
{
IModbusMaster mod = null;
try
{
mod = GetOrAddConnectionN(req.connectiontype, req.destination);
if (mod != null)
{
Console.WriteLine($"{mod}[{req.destination}]");
return mod?.ReadHoldingRegisters(req.slaveid, req.address, req.count);
}
Console.WriteLine("NModbus 没有实例化对象");
return null;
}
catch (Exception e) when
(e.HResult == -2147467259 || e.HResult == -2146233079) // Message: "不允许对非连接的套接字执行此操作。"
{
if (Common.connectionsN.TryRemove(req.destination, out _))
{
Console.WriteLine("NModbus 通讯异常,移除通讯连接 OK,并重连...");
}
else
{
Debug.WriteLine("NModbus 通讯异常,移除通讯连接 NG ...");
}
Console.WriteLine($"NModbus 通讯异常,原因:<{e.Message}> {e.HelpLink}");
//throw;
}
catch (Exception e) when (e.HResult == -2146232800) // Message: "无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。"
{
Console.WriteLine($"NModbus 通讯异常,原因:<{e.Message}> {e.HelpLink}");
}
catch (Exception e)
{
Console.WriteLine($"{DateTime.Now} NModbus 通讯异常,原因:<{e.Message}> {e.HelpLink}");
}
return null;
}
通讯异常后<比如PLC断电了>
PLC重新上电了.网关马上恢复.