多线程通信连接方法 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;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!