Modbus TCP设备通信代码

发布时间:2026/10/13 6:42:03
Modbus TCP设备通信代码 一、核心前置知识点Modbus TCP协议帧格式必考背诵1.1 请求报文Rx 读取请求帧帧示例00 01 00 00 00 06 01 03 00 00 00 04字节段含义说明00 01事务ID(Transaction ID)请求与响应必须一致用于报文配对00 00协议ID(Protocol ID)Modbus TCP固定为00 0000 06数据长度(Length)后续有效数据总字节数01从站地址(Unit ID)设备从站号代码中固定读1号从站03功能码(Function Code)03 读取保持寄存器00 00起始寄存器地址从0号寄存器开始读取00 04读取寄存器数量一次性读取4个寄存器数据1.2 响应报文Tx 设备返回帧帧示例00 01 00 00 00 0B 01 03 08 00 01 00 02 00 03 00 04字节段含义说明00 01事务ID与请求报文一致完成问答匹配00 00协议IDModbus TCP固定值00 0B后续数据长度16进制0B11字节01从站地址对应请求从站号03功能码一致代表正常响应无异常08数据字节长度4个寄存器 × 2字节 8字节数据00 01 ~ 00 04寄存器数据依次为0、1、2、3号寄存器数值二、命名空间与全局变量知识点Modbus核心对象namespace _01设备通信 { public partial class Form1 : Form { // Modbus主站核心对象统一管理TCP/UDP/RTU通信 ModbusMaster ipMaster; // 取消令牌控制异步循环读取启停线程安全 CancellationTokenSource cts; } }考点ModbusMasterNModbus第三方库核心主站对象负责读写寄存器CancellationTokenSource异步线程终止核心类避免后台死循环线程残留三、窗体初始化模块知识点默认通信参数配置private void Form1_Load(object sender, EventArgs e) { // 默认设备IP和端口 textBox1.Text 192.168.219.200; textBox2.Text 8016; }考点窗体加载初始化通信地址、端口为后续连接设备做参数准备。四、设备连接模块重难点多协议兼容 TCP/UDP/RTU4.1 完整拆分代码private void button1_Click(object sender, EventArgs e) { try { // 切换连接/断开状态 if (button1.Text 连接) { // 1.TCP IP协议 if (radioButton1.Checked true) { TcpClient tcp new TcpClient(); tcp.ConnectAsync(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); ipMaster ModbusIpMaster.CreateIp(tcp); } // 2.UDP IP协议 else if (radioButton2.Checked) { UdpClient udp new UdpClient(); udp.Connect(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); ipMaster ModbusIpMaster.CreateIp(udp); } // 3.TCP RTU协议 else if (radioButton3.Checked) { TcpClient tcp new TcpClient(); tcp.ConnectAsync(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); ipMaster ModbusSerialMaster.CreateRtu(tcp); } // 4.UDP RTU协议 else { UdpClient udp new UdpClient(); udp.Connect(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)); ipMaster ModbusSerialMaster.CreateRtu(udp); } button1.Text 断开; } else { button1.Text 连接; } } catch (Exception) { throw; } }4.2 核心考点协议区分ModbusIpMasterTCP/IP协议、ModbusSerialMasterRTU串口协议通信对象TcpClient长连接、UdpClient无连接通信状态切换按钮文本切换实现连接/断开UI交互多协议兼容代码同时支持TCP、UDP、IP、RTU四种设备通信模式五、实时轮询读取模块高频考点异步多线程UI刷新5.1 完整拆分代码private void button2_Click(object sender, EventArgs e) { // 开启实时读取 if (button2.Text 实时读取) { cts new CancellationTokenSource(); // 开启后台异步线程轮询 Task.Run(async () { // 未收到取消指令则持续循环 while (!cts.IsCancellationRequested) { // Modbus核心读取保持寄存器从站1起始地址0读取4个寄存器 ushort[] data ipMaster.ReadHoldingRegisters(1, 0, 4); // 跨线程更新UI必须Invoke避免线程报错 Invoke(new Action(() { textBox3.Text data[0].ToString(); textBox4.Text data[1].ToString(); textBox5.Text data[2].ToString(); textBox6.Text data[3].ToString(); })); // 轮询间隔1秒 await Task.Delay(1000); } }, cts.Token); button2.Text 停止读取; } // 停止实时读取 else { button2.Text 实时读取; // 终止后台线程 cts.Cancel(); // 清空UI数据 Invoke(new Action(() { textBox3.Text ; textBox4.Text ; textBox5.Text ; textBox6.Text ; })); } }5.2 核心考点异步轮询Task.Run开启后台线程不阻塞UI界面线程安全使用CancellationTokenSource优雅终止循环杜绝死线程Modbus读取方法ReadHoldingRegisters(从站号, 起始地址, 读取个数)跨线程UI更新子线程不能直接操作控件必须通过Invoke委托轮询机制1秒刷新一次设备寄存器数据实现实时监控六、寄存器写入模块考点单寄存器写入6.1 完整拆分代码private void button3_Click(object sender, EventArgs e) { // 写入单个保持寄存器从站18号寄存器写入值999 ipMaster.WriteSingleRegister(1, 8, 999); }6.2 核心考点写入方法WriteSingleRegister(从站ID, 寄存器地址, 写入数值)功能向指定设备、指定寄存器写入自定义数据实现设备控制对应Modbus功能码06写入单个保持寄存器七、期末考试核心简答题汇总1. 简述Modbus TCP报文事务ID的作用事务ID用于请求报文和响应报文的配对匹配保证多报文通信时数据一一对应防止问答错乱。2. 为什么读取设备数据需要开启异步线程如果在UI主线程循环读取设备数据会造成界面卡顿、假死使用后台异步线程可实现数据实时轮询同时不阻塞UI操作。3. CancellationTokenSource的作用是什么用于优雅终止后台异步死循环精准停止设备轮询任务避免后台线程一直运行造成内存泄漏和程序异常。4. 为什么跨线程更新UI必须使用InvokeWinForm控件属于主线程资源子线程无法直接操作通过Invoke委托将UI操作抛回主线程保证线程安全。5. Modbus 03功能码和06功能码作用03功能码读取多个保持寄存器数据06功能码写入单个保持寄存器数据。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询