Modbus笔记
网站推荐:https://www.modbus.cn/modbus-knowledge-base
https://www.modbus.cn/modbus-knowledge-base
Modbus介绍
Modbus是一种广泛应用于工业自动化领域的串行通信协议,由施耐德电气(原Modicon公司)于1979年开发,旨在实现PLC与其他工业设备的高效通信其核心优势在于开放性、灵活性和简单性,现已成为工业设备互联的通用标准
主从通讯、半双工、位于OSI模型第七层(应用层)

Modbus协议分类
串行通信
Modbus RTU(设备必须具备、默认状态下使用的就是Modbus RTU)
基于串口(RS-485/RS-232),采用二进制编码,数据紧凑且效率高,支持CRC校验
应用:短距离、高实时性场景,如PLC与传感器/执行器的本地通信
Modbus ASCII(可读性强)
基于串口,使用ASCII字符编码,可读性强但效率较低,需LRC校验
应用:早期工业设备或调试场景,数据量较小时使用
Modbus TCP(传输介质为以太网)
基于以太网(TCP/IP),封装RTU数据并添加MBAP报文头,端口默认502,无需CRC校验
应用:远程监控、跨区域组网(如工业物联网、SCADA系统)
Modbus Plus(MB+)
Modicon专有协议,采用高速令牌环网络(1Mbps),需专用硬件支持
应用:大型工业网络,现已较少使用
Modbus协议格式

ADU :应用数据单元 PDU: 协议数据单元
地址域和差错校验:非必要,有的协议不需要如Modbus TCP
功能码分类:公共功能码、用户自定义功能码、保留功能码。
功能码的范围为1~127
| 1~64 | 65~72 | 73~99 | 100~110 | 111~127 |
| 公共功能码 | 用户自定义功能码 | 公共功能码 | 用户自定义功能码 | 公共功能码 |
常用公共功能码
| 访问类型 | 子类型 | 操作描述 | 功能码(十进制) | 功能码(十六进制) |
|---|---|---|---|---|
| 比特访问 | 物理离散量输入 | 读输入离散量 | 02 | 0x02 |
| 内部比特 / 物理线圈 | 读线圈 | 01 | 0x01 | |
| 写单个线圈 | 05 | 0x05 | ||
| 写多个线圈 | 15 | 0x0F | ||
| 16 比特访问 | 输入存储器 | 读输入寄存器 | 04 | 0x04 |
| 内部存储器 / 物理输出存储器 | 读多个寄存器 | 03 | 0x03 | |
| 写单个寄存器 | 06 | 0x06 | ||
| 写多个寄存器 | 16 | 0x10 | ||
| 读/写多个寄存器 | 23 | 0x17 | ||
| 屏蔽写寄存器 | 22 | 0x16 | ||
| 文件记录访问 | 读文件记录 | 20 | 0x14 | |
| 写文件记录 | 21 | 0x15 | ||
| 封装接口 | 读设备识别码 | 43 | 0x2B |
Modbus 功能码
Modbus RTU协议解析

由发送设备将Modbus 报文构造为带有已知起始和结束标记的帧(串口的起始位和停止位)。这使设备可以在报文的开始接收 新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。 在 RTU 模式,报文帧由时长至少为3.5 个字符时间的空闲间隔区分。
地址范围为0~247,0为广播地址,从机实际地址有效范围为1~247.
举例

CRC16位校验 :循环冗余校验码CRC原理及编码实现

因为串口是一个字节一个字节的发送、因此对帧与帧之间的时间也有要求:
整个报文帧必须以连续的字符流发送。 如果两个字符之间的空闲间隔大于1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。
根据Modbus RTU协议可得需要使用到的资源有:定时器、串口
Modbus TCP和Modbus RTU区别
传输介质和网络结构 Modbus TCP基于以太网通信,使用TCP/IP协议,适合局域网或广域网环境,支持通过路由器和交换机连接多个设备。 Modbus RTU基于串行通信,通常使用RS-232或RS-485接口,适用于点对点或多点的串行网络,适合短距离通信。
数据结构 Modbus TCP在Modbus RTU的基础上增加了MBAP报文头,用于标识和封装数据包,同时省略了CRC校验码,因为TCP本身提供了可靠性保障。 Modbus RTU的数据帧由地址、功能码、数据和CRC校验码组成,结构简单,直接在串行线上传输。
通信速度和距离 Modbus TCP的速度取决于网络带宽和设备性能,适合高速和远距离通信。 Modbus RTU的速度受波特率限制,通常较低,但在短距离内通信稳定。
MBAP报文
| 事务处理标识 | 协议标识符 | 长度 | 单元标识符 |
| 2字节 | 2字节 | 2字节 | 1字节 |
| 事务处理标识 | 可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文 |
| 协议标识符 | 00 00表示ModbusTCP协议 |
| 长度 | 表示接下来的数据长度,单位为字节 |
| 单元标识符 | 可以理解为设备地址 |
读指令对比(0x04)
| MBAP报文头 | 地址码 | 功能码 | 寄存器地址 | 寄存器数量 | CRC校验 | |
| Modbus RTU | 无 | 01 | 04 | 00 00 | 00 16 | 71 C4 |
| Modbus TCP | 00 00 00 00 00 06 01 | 04 | 00 00 | 00 16 | 无 |

