首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[C#] 支持API的边缘网关开发笔记7 -- 通讯重连

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

作者头像
科控物联
发布2022-03-29 20:09:28
发布2022-03-29 20:09:28
86800
代码可运行
举报
文章被收录于专栏:科控自动化科控自动化
运行总次数:0
代码可运行

通讯故障,比如远端PLC等断电重启等后,网关就会出现问题.

分析是因为服务器端<PLC>异常时,网关的连接套接字就被回收了? 如果服务器端恢复时,就会出现<不允许非连接套接字执行此操作>的报警.

{"不允许对非连接的套接字执行此操作。"}

Data: {System.Collections.ListDictionaryInternal}

HResult: -2146233079

HelpLink: null

IPForWatsonBuckets: 0x660fa489

InnerException: null

IsTransient: false

Message: "不允许对非连接的套接字执行此操作。"

RemoteStackTrace: null

Source: "System"

我处理是思路就是,通过try..catch..,发生

:<由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>时,就把该连接从连接池删除.

如果重连过程中还没有服务器还没有恢复正常,就会有如下故障

处理代码如下:目前看,只是解决了问题,代码不够优雅.如果有好的方式欢迎大家教教我.

代码语言:javascript
代码运行次数:0
运行
复制
    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重新上电了.网关马上恢复.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档