Modbus是工业领域应用最广泛的通信协议
主从架构
Modbus 采用主从(Master/Slave)架构。一个主设备可以与多个从设备通信,从设备之间不直接通信。主设备发出命令,从设备响应。
传输方式
Modbus 协议支持以下三种主要传输方式
1. Modbus RTU:基于串行通信的 Modbus 变体,通常使用 RS-232 或 RS-485 作为物理层。数据以二进制形式传输,具有较高的效率和较低的通信开销。
传输介质:RS-485(最常用)、RS-232(短距离)。
数据格式:二进制编码,紧凑高效。
特点:
采用主从轮询机制,支持多设备(最多 247 个从站)。
需配置波特率(如 9600、19200 bps)、数据位(8位)、校验位(无/奇/偶)、停止位(1/2位)。
抗干扰能力强,适合工业环境。
2、Modbus ASCII:另一种基于串行通信的变体,数据以 ASCII 字符形式传输,便于调试,但效率较低。
3、Modbus TCP/IP:基于以太网的 Modbus 变体,通过 TCP/IP 协议进行传输,适用于现代网络环境。
传输介质:以太网(TCP/IP 协议)。
数据格式:基于 TCP 封装的 Modbus 协议(端口号默认 502)。
特点:
支持高速、远距离通信(跨网络)。
无需校验位(由 TCP 保证可靠性),主从地址由 IP 区分。
常见功能码
读取数据的功能码:
01(读线圈):读取开关量状态。
02(读离散输入):读取外部开关信号。
03(读保持寄存器):读取设备的配置参数。
04(读输入寄存器):读取设备实时测量数据。
写入数据的功能码:
05(写单个线圈):控制一个开关量的状态。
06(写单个保持寄存器):调整单个参数值。
15(写多个线圈):一次性控制多个开关量。
16(写多个保持寄存器):同时修改多个参数值。
ModbusRTU的通用报文格式如下:

【1】从站地址:这个报文发送给谁或来自于谁。
【2】功能码:要干什么,读/写/线圈/寄存器。
【3】数据部分:配合功能码提供对应的参数。
【4】校验部分:保证报文的正确性和完整性。
通信流程
主站负责向从站发送请求(如读取数据、写入数据)
从站在收到主站的命令时回复数据。
典型通信步骤(以 Modbus RTU 为例)
1、主站发送请求
包含:从站地址(1-247)、功能码(如 0x03 读保持寄存器)、起始地址、数据长度、CRC 校验。
示例(读取从站 0x01 的保持寄存器 40001,即地址 0x0000):
01 03 00 00 00 01 84 0A
2、从站解析并响应
如果成功,返回:从站地址、功能码、数据字节数、数据、CRC。
示例(返回寄存器 40001 的值 0x00A5):
01 03 02 00 A5 F8 4B
3、主站处理数据
调试工具
主站模拟:Modbus Poll、QModMaster
从站模拟:Modbus Slave
以Modbus TCP/IP为例用调试工具调试:



解析通信报文示例
示例报文(Tx:070)
01 64 00 00 00 06 01 03 00 00 00 0A
逐字段解析
字节位置
|
字段
|
值(Hex)
|
说明
|
1-2
|
事务标识
|
01 64
|
Transaction ID = 356
|
3-4
|
协议标识
|
00 00
|
Modbus TCP 固定值
|
5-6
|
长度
|
00 06
|
后续字节数(6字节)
|
7
|
单元标识
|
01
|
从站地址 = 1
|
8
|
功能码
|
03
|
读保持寄存器(功能码03)
|
9-10
|
起始地址
|
00 00
|
起始寄存器地址 = 0(对应40001)
|
11-12
|
寄存器数量
|
00 0A
|
读取10个寄存器(40001-40010)
|
请求总结
- 主站请求读取
从站1 的保持寄存器 40001-40010(共10个寄存器)。
响应报文(Rx)解析
示例报文(Rx:071)
01 64 00 00 00 17 01 03 14 00 02 00 5A 00 6A 1F 42 00 00 00 00 00 00 00 00 00 00 00 17
逐字段解析
字节位置
|
字段
|
值(Hex)
|
说明
|
1-2
|
事务标识
|
01 64
|
Transaction ID = 356(与Tx匹配)
|
3-4
|
协议标识
|
00 00
|
Modbus TCP 固定值
|
5-6
|
长度
|
00 17
|
后续字节数(23字节)
|
7
|
单元标识
|
01
|
从站地址 = 1
|
8
|
功能码
|
03
|
读保持寄存器(功能码03)
|
9
|
字节计数
|
14
|
返回数据字节数 = 20(10寄存器×2字节)
|
10-29
|
寄存器数据
|
00 02...
|
10个寄存器的值(见下表)
|
寄存器数据解析(大端格式)
寄存器地址
|
值(Hex)
|
十进制值
|
40001
|
00 02
|
2
|
40002
|
00 5A
|
90
|
40003
|
00 6A
|
106
|
40004
|
1F 42
|
8002
|
40005-40010
|
00 00
|
0
|