c#软件开发学习笔记--Modbus-TCP/UDP网口通讯

📅 2026/8/19 9:59:44
c#软件开发学习笔记--Modbus-TCP/UDP网口通讯
Modbus-Tcp 通讯学习总结一、项目概览NuGet 依赖PackageReferenceIncludeNModbusVersion3.0.83/PackageReferenceIncludeNModbus.SerialVersion3.0.83/NModbus实现 Modbus TCP / UDP 协议主从站NModbus.Serial串口RTU/ASCII场景下使用本项目未直接调用二、Modbus-Tcp 业务流程图----------------------------- | 应用程序启动 | | Form1_Load 设置默认参数 | | IP127.0.0.1 Port502 | ---------------------------- | v ----------------------------------------- | 用户操作界面 | | [选择模式] [输入IP] [输入端口] | ------------------------------------- | | | v v v ---------- ----------- ----------- | ModbusTCP| | ModbusUDP | |RTU Over TCP| ---------- ----------- ----------- | | | | | | | | | v v v -------------------------------------- | 创建 ModbusFactory | | var factory new ModbusFactory(); | ------------------------------------- | v -------------------------------------- | 建立底层网络连接并创建 Master | | TcpClient.ConnectAsync(...) | | master factory.CreateMaster(tcp) | ------------------------------------- | v ------------------------ | 连接成功 / 按钮切换 | | btnStart.Text断开 | ------------------------ | ------------------------------------ | | v v ---------------- -------------------- | 读取流程 | | 写入流程 | ---------------- -------------------- | | v v ---------------- -------------------- | 创建CTS 启动 | | 调用 master. | | Task.Run 循环 | | WriteSingleRegister| ---------------- -------------------- | | v v ---------------- -------------------- | master.Read- | | 功能码 0x06 | | HoldingRegisters| | 写入单个寄存器 | | (1, 0, 4) | -------------------- ---------------- | v ---------------- | 功能码 0x03 | | 读取 HR0 ~ HR3 | ---------------- | v ---------------- | Control.Invoke | | 更新 4 个文本框 | ---------------- | v ---------------- | Task.Delay(1000)| | 1 秒轮询周期 | ---------------- | -------- (循环直到 cts.Cancel) | v ---------------- | 退出读取循环 | ----------------- | v ---------------- | 用户点击断开 | | cts.Cancel() | | 清空数据显示 | ----------------- | v -------- | 结束 | ---------三、核心关键字段privateIModbusMaster?master;// Modbus 主站接口统一抽象 TCP/UDP/RTUprivateCancellationTokenSource?cts;// 异步读取任务的取消令牌要点IModbusMaster是 NModbus 的统一主站接口屏蔽底层传输差异CancellationTokenSource用于优雅停止后台轮询任务四、关键代码片段4.1 创建 ModbusFactory 与 MastervarfactorynewModbusFactory();TcpClienttcpnewTcpClient();tcp.ConnectAsync(IPAddress.Parse(txtIP.Text),int.Parse(txtPort.Text));masterfactory.CreateMaster(tcp);ModbusFactory.CreateMaster接受TcpClient/UdpClient/Socket返回的IModbusMaster屏蔽底层传输差异。4.2 周期读取保持寄存器ctsnewCancellationTokenSource();Task.Run(async(){while(!cts.IsCancellationRequested){if(masternull)continue;ushort[]datamaster.ReadHoldingRegisters(1,0,4);Invoke(newAction((){txtData1.Textdata[0].ToString();// txtData2 / txtData3 / txtData4 ...}));awaitTask.Delay(1000);}},cts.Token);调用master.ReadHoldingRegisters(slaveAddress1, startAddress0, numberOfPoints4)对应 Modbus功能码 0x03读取从站 1 的保持寄存器 HR0 ~ HR3。4.3 写入单个寄存器if(masternull)return;master.WriteSingleRegister(1,0,111);对应 Modbus功能码 0x06向从站 1 的 HR0 写入值 111。4.4 断开连接cts?.Cancel();txtData1.Text;// 清空其余显示 ...btnRead.Text实时读取;五、NModbus 支持的传输模式对比模式UI 控件底层类型NModbus 创建方式Modbus TCPrdbTCPTcpClientfactory.CreateMaster(tcp)Modbus UDPrdbUDPUdpClientfactory.CreateMaster(udp)RTU Over TCP /UDPrdbRTUOverTCP/UDPSocket(Stream/Tcp/Udp)factory.CreateMaster(socket)Modbus TCP 使用 MBAP Header PDU 帧格式RTU Over TCP 在 TCP 流上承载含 CRC 的 RTU 帧。切换传输模式时业务代码ReadHoldingRegisters等无需改动。六、NModbus 关键 API 速查API功能码作用ReadCoils0x01读线圈bitReadInputs0x02读离散输入bit只读ReadHoldingRegisters0x03读保持寄存器16 bitReadInputRegisters0x04读输入寄存器只读WriteSingleCoil0x05写单个线圈WriteSingleRegister0x06写单个保持寄存器WriteMultipleCoils0x0F写多个线圈WriteMultipleRegisters0x10写多个保持寄存器