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 写多个保持寄存器

相关推荐
典典分享指南1 小时前
一品牌多产品线的 GEO 内容矩阵:从策略到落地
java·c#·bash·symfony
今夜有雨.2 小时前
C# 学习文档(零基础入门)
开发语言·学习·c#
软件黑马王子2 小时前
14.事件中心:主要作用和原理
开发语言·前端框架·c#
lifallen3 小时前
短暂 Agent 与持久化工程:让理解脱离对话
人工智能·学习·ai·重构·ai编程
知识分享小能手3 小时前
深度学习学习教程,从入门到精通,深度模型中的优化 — 完整知识点与代码案例(8)
人工智能·深度学习·学习
互联网叫兽3 小时前
redis深入学习二
数据库·redis·学习
疯狂打码的少年3 小时前
【数据库技术】复习日:关系代数 + SQL + 规范化(整理对比表)
jvm·数据库·笔记·sql
维克兜率天4 小时前
【维克】特征归一化与标准化:为什么模型对数据的“尺度“很敏感?
人工智能·笔记·python·机器学习·量化
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 31
android·spring boot·笔记
是隼人4 小时前
buuctf-pwn mrctf2020_easy_equation(64位fmt)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门