多线程通信连接方法 PLCCommunication

//一般通信连接读取数据时都是需要另开线程操作

            CommMethods.plcDevice.Cts = new CancellationTokenSource();
            Task.Run(new Action(() =>
            {
                PLCCommunication(CommMethods.plcDevice);
            }), CommMethods.plcDevice.Cts.Token);

//通信连接步骤,根据连接状态(连接标志位)进行解析或重连,重连根据是否首次连接标志位判定连接情况(先断开,再连接)
// 设备对象和通信对象,设备对象即设备参数化的实体对象,通信对象即实际的通信载体

     /// <summary>
    /// 多线程通信连接方法
    /// </summary>
    /// <param name="Device"></param>
    private void PLCCommunication(ModbusRTUDevice device)
    {
        while (!device.Cts.IsCancellationRequested)
        {
            if (device.IsConnected)
            {
                //读取解析
                foreach (var group in device.GroupList)
                {
                    if (group.IsActive)
                    {
                        var result=   GetGroupValue(group);
                        if (result.IsSuccess) 
                        {
                            // 设置通信状态
                            device.ErrorTimes = 0;
                        }
                        else
                        {
                            device.ErrorTimes ++;
                            if (device.ErrorTimes>= device.AllowErrorTimes)
                            {
                                //设置通信状态
                                //线断不能重连,串口不存在重连
                                if (IsComExits(device.PortName))
                                {
                                    //延时
                                    Thread.Sleep(10);
                                    continue;
                                }
                                else
                                {
                                    device.IsConnected = false;
                                    //设置通信状态
                                    //写入日志
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            else //断线重连
            {
                //根据是否首次连接进行判断
                if (!device.IsFirstConnect)
                {
                    Thread.Sleep(device.ReConnectTime);
                    CommMethods.plc?.DisConnect();
                }
                //连接PLC
              var result=  CommMethods.plc.Connect(device.PortName, device.BaudRate, device.DataBits, device.Parity, device.StopBits);
                if (result)
                {
                    device.IsConnected = true;
                    //设置通信状态
                    //写入日志
                }
                else
                {
                    device.IsConnected = false;
                    //设置通信状态
                    //写入日志
                }
                //清除首次连接标志位
                if (device.IsFirstConnect) 
                {
                    device.IsFirstConnect= false;
                }
            }
        }
    }
posted @   $虫虫$  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示