Modbus通讯协议的报文格式根据传输模式(RTU/ASCII/TCP)存在显著差异,以下依据资料进行系统化阐述,涵盖核心结构、字段定义及功能码关联性:
一、Modbus协议基础架构
Modbus采用主从式通信模型(Master/Slave),主设备(如SCADA系统)发起请求,从设备(如PLC、传感器)响应。协议通过功能码指定操作类型,支持四种寄存器访问:
- 线圈(Coils) :1位读写,控制输出设备(如继电器)
- 离散输入(Discrete Inputs) :1位只读,采集开关状态
- 保持寄存器(Holding Registers) :16位读写,存储设备参数
- 输入寄存器(Input Registers) :16位只读,采集模拟量数据
二、报文格式详解(按传输模式分类)
1. Modbus RTU模式(二进制传输)
适用场景:RS-485/RS-232串行通信,高传输效率,工业现场常用。
报文结构(顺序排列):
字段 | 长度 | 说明 |
---|---|---|
设备地址 | 1字节 | 从站地址(0-247),0为广播地址 |
功能码 | 1字节 | 指定操作类型(如01读线圈、03读保持寄存器) |
数据域 | 可变长 | 含起始地址、数据数量或写入值(结构依功能码而定) |
CRC校验 | 2字节 | 循环冗余校验(CRC-16),校验范围:地址+功能码+数据域 |
示例报文(十六进制):
读取线圈请求:01 01 00 00 00 0A
01:从站地址1
01:功能码(读线圈)
00 00:起始地址0
00 0A:读取10个线圈
CRC需独立计算附加
2. Modbus ASCII模式(文本可读格式)
适用场景:调试场景,数据量小且需人工解析。
报文结构:
字段 | 长度 | 说明 |
---|---|---|
起始符 | 1字符 | 固定为冒号 : (ASCII值0x3A) |
地址 | 2字符 | 从站地址的十六进制ASCII表示(如”01″) |
功能码 | 2字符 | 功能码的十六进制ASCII表示(如”03″) |
数据域 | N×2字符 | 每字节数据用两个ASCII字符表示(如寄存器值”00FF”) |
LRC校验 | 2字符 | 纵向冗余校验(LRC),校验范围:地址+功能码+数据域 |
结束符 | 2字符 | 固定为回车换行 CR/LF (ASCII值0x0D 0x0A) |
示例报文:
:01030000000A45
01:地址1 → 二进制0x01
03:功能码03(读保持寄存器)
0000:起始地址0
000A:读取10个寄存器
45:LRC校验值
3. Modbus TCP模式(以太网传输)
适用场景:TCP/IP网络(如工业以太网),无物理层校验(依赖TCP校验)。
报文结构:
字段 | 长度 | 说明 |
---|---|---|
事务标识符 | 2字节 | 请求/响应对的唯一标识(主设备生成,从设备原样返回) |
协议标识符 | 2字节 | 固定为 0x0000 (表示Modbus协议) |
长度字段 | 2字节 | 后续字段总字节数(含单元标识符+功能码+数据) |
单元标识符 | 1字节 | 从站地址(兼容串行设备,TCP中通常保留) |
功能码 | 1字节 | 同RTU/ASCII模式功能码 |
数据域 | 可变长 | 同RTU模式结构 |
示例报文(十六进制):
00 01 00 00 00 06 01 03 00 00 00 0A
00 01:事务ID
00 00:协议ID
00 06:后续6字节(01+03+00 00+00 0A)
01:单元地址1
03:功能码(读保持寄存器)
00 00:起始地址0
00 0A:读取10个寄存器
三、功能码与报文字段映射关系
功能码决定数据域结构,常见功能码及对应数据域:
功能码 | 名称 | 请求数据域结构 | 响应数据域结构 |
---|---|---|---|
0x01 | 读线圈 | 起始地址(2B) + 线圈数量(2B) | 字节数(1B) + 线圈状态(N字节) |
0x02 | 读离散输入 | 起始地址(2B) + 输入数量(2B) | 字节数(1B) + 输入状态(N字节) |
0x03 | 读保持寄存器 | 起始地址(2B) + 寄存器数量(2B) | 字节数(1B) + 寄存器值(N×2字节) |
0x05 | 写单个线圈 | 线圈地址(2B) + 值(2B,FF00/0000) | 同请求(地址+值回显) |
0x06 | 写单个寄存器 | 寄存器地址(2B) + 值(2B) | 同请求(地址+值回显) |
0x10 | 写多个寄存器 | 起始地址(2B) + 数量(2B) + 字节数(1B) + 值(N×2B) | 起始地址(2B) + 写入数量(2B) |
注:异常响应时功能码 = 请求功能码 + 0x80.数据域替换为异常码(如01=非法功能)。
四、协议特性对比
特性 | Modbus RTU | Modbus ASCII | Modbus TCP |
---|---|---|---|
传输效率 | 高(二进制) | 低(文本冗长) | 高(无额外校验) |
校验机制 | CRC-16 | LRC | 依赖TCP校验 |
调试便利性 | 需专用工具 | 可直接阅读 | 需网络抓包工具 |
适用场景 | 工业现场串行链路 | 低速调试环境 | 以太网/物联网 |
五、设计要点与局限性
地址范围限制:
串行模式最大支持247个从站(TCP无此限制)
寄存器地址范围通常为0-65535(16位寻址)
数据对齐:
多寄存器写入时数据长度需对齐(如0x10功能码需指定字节数)
安全性缺陷:
无原生加密/认证机制(需依赖VPN或物理隔离)
实时性约束:
RTU模式依赖3.5字符静默时间分隔报文
结论:Modbus报文格式的核心差异体现在封装方式(RTU/ASCII/TCP头)、校验算法(CRC/LRC/TCP)及数据编码(二进制/ASCII)。实际应用中需根据物理层、调试需求及网络环境选择协议变体,并严格遵循功能码定义的数据域结构。