Modbus简介
Modbus 是一种工业自动化领域广泛使用的串行通信协议,由 Modicon 公司于 1979 年开发。它具有以下特点:
-
🔴 开放标准,无版权限制
-
🔴 简单易实现,广泛支持
-
🔴 支持多种物理层(串口、以太网)
-
🔴 主从架构(Master-Slave)
| 特性 | Modbus RTU | Modbus TCP |
|---|---|---|
| 物理层 | 串口(RS-232/RS-485) | 以太网(TCP/IP) |
| 传输方式 | 二进制编码 | TCP 数据包 |
| 帧格式 | 需要校验(CRC) | 内置 TCP 校验 |
| 传输距离 | 较短(RS-485 约 1200m) | 取决于网络 |
| 速度 | 较低(典型 9600-115200 bps) | 较高(10/100/1000 Mbps) |
| 应用场景 | 传统设备、本地控制 | 现代工业、远程控制 |
Modbus 关键概念
基本定位
- 主从架构:1 主多从
- 主站(Master):主动发指令
- 从站(Slave):只响应,不主动发
- 通用工业协议,简单、稳定、开源
四类数据区(最核心)
Modbus协议规定了4个存储区 分别是0 1 3 4区 其中0区和4区是可读可写,1区和3区是只读。
| 区号 | 名称 | 读写 | 地址范围 |
|---|---|---|---|
| 0区 | 输出线圈 | 可读可写布尔量 | 00001-09999 |
| 1区 | 输入线圈 | 只读布尔量 | 10001-19999 |
| 3区 | 输入寄存器 | 只读寄存器 | 30001-39999 |
| 4区 | 保持寄存器 | 可读可写寄存器 | 40001-49999 |
-
线圈(Coils)
- 功能码:01(读)、05(写单)、15(写多)
- 类型:位,读写
- 用途:继电器、开关输出
-
离散输入(Discrete Inputs)
- 功能码:02
- 类型:位,只读
- 用途:传感器、限位、DI 输入
-
输入寄存器(Input Registers)
- 功能码:04
- 类型:16 位字,只读
- 用途:温度、压力、模拟量输入
-
保持寄存器(Holding Registers)
- 功能码:03(读)、06(写单)、16(写多)
- 类型:16 位字,读写
- 用途:参数、设定值、控制字
日常 90% 用:03 读保持寄存器
地址与偏移
- 协议地址从 0 开始
- 设备文档常从 1 开始→ 编程时要 -1
功能码(Function Code)
常用:
- 01:读线圈
- 02:读离散输入
- 03:读保持寄存器
- 04:读输入寄存器
- 05:写单个线圈
- 06:写单个保持寄存器
- 15:写多个线圈
- 16:写多个保持寄存器
两种传输方式
- Modbus RTU
- 二进制,串口(RS485/232)
- 短帧、高效
- Modbus TCP
- 以太网,封装在 TCP/IP
- 端口默认:502
报文结构(RTU)
从站地址 + 功能码 + 数据 + CRC校验
字节序问题(大坑)
- 32 位浮点数 / 整数跨两个寄存器
- 常见顺序:
- ABCD(正常)
- BADC、CDAB 等不对应就换字节序。
异常码
告诉你为什么失败:
- 01:功能码不支持
- 02:地址错误
- 03:数据错误
- 04:设备故障
时序规则
- 主站发 → 等从站回
- 同一时间只能一主一从通信
- 必须有超时重发机制
从站地址(Slave Address)/ 单元 ID(Unit ID)
定义:从站地址(也叫单元 ID/Slave ID)是 Modbus 网络中唯一标识每台从站设备的数字编号,本质是给每台设备分配一个 “身份证号”,让主站能精准找到要通信的设备。
- 取值范围:1-247(0 是广播地址,不分配给具体设备);
- 名称差异:RTU 场景常叫 “从站地址”,TCP 场景常叫 “单元 ID”(MBAP 头中第 7 字节),本质是同一个东西。
核心模式:一主多从(Single Master-Multiple Slaves)
定义:Modbus 协议规定:一个通信网络中只能有 1 个主站,可同时连接多个从站(最多 247 个),所有通信由主站主动发起,从站仅响应指向自己地址的指令。
RTU vs TCP 的 “一主多从” 差异
| 场景 | 实现方式 | 示例(C# 开发) |
|---|---|---|
| Modbus RTU | 所有从站挂在同一 RS485 总线上,主站发指令时携带从站地址,只有匹配的从站响应 | 串口总线上挂地址 1 的传感器、地址 2 的变频器、地址 3 的 PLC |
| Modbus TCP | 主站通过 IP + 端口连接不同从站(或同一 IP 不同端口),指令中仍需指定单元 ID | 主站连接 192.168.1.10:502(单元 ID1)、192.168.1.11:502(单元 ID2) |
NModbus4 核心总结
本质:.NET(C#)平台下的开源 Modbus 协议实现库,专门帮你封装 Modbus RTU/TCP 的底层通信细节(拼报文、算 CRC、解析 MBAP 头),不用手写二进制数据就能开发 Modbus 主 / 从站。
核心用法:
- 主站:创建
ModbusIpMaster(TCP)/ModbusSerialMaster(RTU),调用ReadHoldingRegisters/WriteSingleCoil等方法读写数据; - 从站:创建
ModbusSlave,绑定 Coils/Registers 数组,模拟工业设备响应主站请求。
使用串口的Modbus 报文帧
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。Modbus 报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。Modbus 使用串口中一共有两种模式:Modbus ASCII 模式和Modbus RTU 模式,常用的就是Modbus RTU 模式。

Modbus ASCII 模式
当控制器设为在 Modbus 网络上以 ASCII 模式通信时,在消息中每个 8 位(b)字节都将作 为两个 ASCII 字符发送。这种方式的主要优点是字符发送的时间可隔可达到 1 秒且不产生错误。
在 ASCII 模式下,消息 以冒号(:)字符(ASCII 码为 0x3A) 开始, 以回车换行奇结束 (ASCII 码为 0x0D、0x0A) 。消息的其他字段(域)可以使用的传输字符是十六进制的 0···9、 A··· F。处于网络上的 Modbus 设备不断侦测 “ :”字符,当接收到一个冒号时,每个设备进 入解码阶段,并解码下一个字段(地址域)以判断是否是发给自己的。消息帧中的字符间发送 的时间间隔最长不能超过 1 秒,否则接收设备将认为发生传输错误。
需要注意的是,在消息中的每个字节都作为两个ASCII字符发送
十六进制的0-F 分别对应ASCII字符的0…9,A…F,也就是0x30~0x3A 0x41~0x46
Modbus RTU 模式
Modbus 协议 RTU 报文格式如下所示:

帧结构 = 从机地址 + 功能码 + 数据 + 校验
从机地址: 每个从机都有唯一地址,占用一个字节,范围 0-255,其中有效范围是 1-247, 其中 255 是广播地址(广播就是对所有从机发送应答)
功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从 机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.
数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询 数据的地址和查询字节数等。
校验: 在数据传输过程中可能数据会发生错误,CRC 检验检测接收的数据是否正确
功能码概要
Modbus 标准在协议中规定了以下 3 类 Modbus 功能码。
公共功能码:
-
被明确定义的功能码;
-
保证唯一性;
-
由 Modbus 协会确认,并提供公开的文档;
-
可进行一致性测试;
-
包括协议定义的功能码和保留将来使用的功能码。
用户自定义功能码:
-
有两个用户自定义功能码区域,分别是 65~72 和 100~110;
-
用户自定义,无法保证唯一性。
保留功能码:
保留功能码因为历史遗留原因,某些公司的传统产品现行使用的功能码不作为公共使用。

什么是RS-485 RS-232?
RS232,RS485是一种电平标准
数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。
那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232
RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。
- 全双工
- 逻辑1:-15V–5V
- 逻辑0:+3V–+15V

RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~-6V表示0,两线压差为+2~+6V表示1
- 半双工
- 逻辑1:+2V~+6V
- 逻辑0: -2V~ -6V
注意485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压
Modbus-TCP协议
我们首先看下Modbus-TCP和Modbus-ACSII的区别
Modbus-TCP并不需要从从机地址,而是需要MBAP报文头
并且不需要差错校验,因为TCP本身就具有校验差错的能力

MBAP报文头格式如下:
其中事务处理表示符合协议标识符我们正常使用设置为0即可 长度为6个字节 0x0006

1万+

被折叠的 条评论
为什么被折叠?



