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

Modbus-Tcp 通讯学习总结


一、项目概览

NuGet 依赖

xml 复制代码
<PackageReference Include="NModbus" Version="3.0.83" />
<PackageReference Include="NModbus.Serial" Version="3.0.83" />
  • NModbus:实现 Modbus TCP / UDP 协议主从站
  • NModbus.Serial:串口(RTU/ASCII)场景下使用,本项目未直接调用

二、Modbus-Tcp 业务流程图

复制代码
                  +-----------------------------+
                  |        应用程序启动         |
                  |   Form1_Load 设置默认参数   |
                  |   IP=127.0.0.1  Port=502   |
                  +--------------+--------------+
                                 |
                                 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
       +----+----+
       |   结束   |
       +---------+

三、核心关键字段

csharp 复制代码
private IModbusMaster? master;        // Modbus 主站接口,统一抽象 TCP/UDP/RTU
private CancellationTokenSource? cts;  // 异步读取任务的取消令牌

要点:

  • IModbusMaster 是 NModbus 的统一主站接口,屏蔽底层传输差异
  • CancellationTokenSource 用于优雅停止后台轮询任务

四、关键代码片段

4.1 创建 ModbusFactory 与 Master

csharp 复制代码
var factory = new ModbusFactory();
TcpClient tcp = new TcpClient();
tcp.ConnectAsync(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
master = factory.CreateMaster(tcp);

ModbusFactory.CreateMaster 接受 TcpClient / UdpClient / Socket,返回的 IModbusMaster 屏蔽底层传输差异。

4.2 周期读取保持寄存器

csharp 复制代码
cts = new CancellationTokenSource();
Task.Run(async () =>
{
    while (!cts.IsCancellationRequested)
    {
        if (master == null) continue;
        ushort[] data = master.ReadHoldingRegisters(1, 0, 4);

        Invoke(new Action(() =>
        {
            txtData1.Text = data[0].ToString();
            // txtData2 / txtData3 / txtData4 ...
        }));

        await Task.Delay(1000);
    }
}, cts.Token);

调用:master.ReadHoldingRegisters(slaveAddress=1, startAddress=0, numberOfPoints=4)

对应 Modbus 功能码 0x03,读取从站 1 的保持寄存器 HR0 ~ HR3。

4.3 写入单个寄存器

csharp 复制代码
if (master == null) return;
master.WriteSingleRegister(1, 0, 111);

对应 Modbus 功能码 0x06,向从站 1 的 HR0 写入值 111。

4.4 断开连接

csharp 复制代码
cts?.Cancel();
txtData1.Text = "";
// 清空其余显示 ...
btnRead.Text = "实时读取";

五、NModbus 支持的传输模式对比

模式 UI 控件 底层类型 NModbus 创建方式
Modbus TCP rdbTCP TcpClient factory.CreateMaster(tcp)
Modbus UDP rdbUDP UdpClient factory.CreateMaster(udp)
RTU Over TCP /UDP rdbRTUOverTCP/UDP Socket (Stream/Tcp/Udp) factory.CreateMaster(socket)

Modbus TCP 使用 MBAP Header + PDU 帧格式;RTU Over TCP 在 TCP 流上承载含 CRC 的 RTU 帧。切换传输模式时业务代码(ReadHoldingRegisters 等)无需改动。


六、NModbus 关键 API 速查

API 功能码 作用
ReadCoils 0x01 读线圈(bit)
ReadInputs 0x02 读离散输入(bit,只读)
ReadHoldingRegisters 0x03 读保持寄存器(16 bit)
ReadInputRegisters 0x04 读输入寄存器(只读)
WriteSingleCoil 0x05 写单个线圈
WriteSingleRegister 0x06 写单个保持寄存器
WriteMultipleCoils 0x0F 写多个线圈
WriteMultipleRegisters 0x10 写多个保持寄存器

相关推荐
lhh_qrsly2 小时前
HTTP / HTTPS / MQTT / MQTTs(嵌入式学习版)
学习·http·https
cao233310 小时前
关于 y0 y1 yn 变量名冲突说法的指正
笔记
玩泥巴的16 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
~patience~19 小时前
WAV 逆向分析工具使用笔记
笔记
滴啦嘟啦哒19 小时前
【具身笔记】【π0.5 微调与仿真】五、在MuJoCo中实现可视化仿真
笔记·python·vla·具身
xier_ran19 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名19 小时前
ai应用开发的学习笔记
服务器·笔记·学习
乔旭伟20 小时前
中小厂生产管理系统选型笔记:驱动方式、主线链路与成本结构
笔记·需求分析·规格说明书
xier_ran20 小时前
【infra之路】AI 编译器学习笔记(十四):为什么要 tiling,以及矩阵计算单元的“固定“
人工智能·笔记·学习
燕落南枝20 小时前
HTML 学习:辅助标签 label 与字符实体
前端·学习·html