[C#] 支持API的边缘网关开发笔记7 -- 通讯重连

2022-03-29 20:09:28 浏览数 (1)

通讯故障,比如远端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重新上电了.网关马上恢复.

0 人点赞