Modbus协议
本文最后更新于 2025-12-11 20:32:33
原文发表在公众号
4种数据模式
| 基本表格 | 对象类型 | 访问类型 | 内容 |
|---|---|---|---|
| 离散量输入(Discretes Input) | 单个比特 | 只读 | I/O系统提供这种类型数据 |
| 线圈(Coils) | 单个比特 | 读写 | 通过应用程序改变这种类型数据 |
| 输入寄存器(Input Registers) | 16-比特字 | 只读 | I/O系统提供这种类型数据 |
| 保持寄存器(Holding Registers) | 16-比特字 | 读写 | 通过应用程序改变这种类型数据 |
3种传输模式
| 基于串口的Modbus-RTU | 数据按照标准串口协议进行编码,采用CRC-16_Modbus检验算法。 |
| 基于串口的Modbus-ASCII | 所有数据都是ASCII格式,一个字节的原始数据需要两个字符来表示,效率底,采用LRC校验算法。 |
| 基于网口的Modbus-TCP | 基于TCP/IP协议,占用502端口,数据帧主要包括两部分:MBAP(报文头)+ PDU(帧结构)。 |
3类功能码
公共功能码、用户定义功能码、保留功能码
公共功能码定义

Modbus-RTU报文帧
| 子节点地址 | 功能代码 | 数据 | CRC校验 |
|---|---|---|---|
| 1个字节 | 1个字节 | 0~252字节 | 2字节(CRC低位,CRC高位) |
Modbus RTU帧最大位256字节
串口信息(9600Baud、偶校验、1个停止位)
1 | |
Modbus-ASCII报文帧
| 起始 | 子节点地址 | 功能代码 | 数据 | LRC校验 | 结束 |
|---|---|---|---|---|---|
| 1字符(冒号字符) | 2字符 | 2字符 | 0~2*252字符 | 2字符 | 2字符(CR,LF) |
Modbus ASCII帧最大位2 * 252 + 1 + 2 + 2 + 2 + 2 = 513字符
串口信息(9600Baud、偶校验、1个停止位)
1 | |
Modbus-TCP报文格式
| MBAP报文头 | 功能码 | 数据 | |||
|---|---|---|---|---|---|
| 事务元标识符 | 协议标识符 | 长度 | 单元标识符 | ||
| 2字节 | 2字节(0) | 2字节(表示单元标识符 + 功能码 + 数据的字节总数) | 1字节 | 1字节 |
1 | |
Modbus协议
https://njit-77.github.io/2024/04/16/Modbus协议/