Modbus-RTU通讯中功能码和5位数字地址对应关系
文章目录[隐藏]
Modbus-RTU通讯中功能码和5位数字地址对应关系
Modbus地址通常有两种表示法:
- PLC地址(或数据表地址):就是我们常说的 40001、30001 这种5位数字。它是一种便于人类理解和设备手册标注的编号。
- 协议地址(或偏移地址):是在实际通讯报文里使用的,从0开始的地址。
它们的对应关系由功能码决定:
| 功能码 (十六进制) | 数据类型 | PLC地址范围 | 协议地址范围 (报文内使用) | 说明 |
|---|---|---|---|---|
| 0x01, 0x05, 0x0F | 线圈 (Coils) | 00001-09999 | 0x0000-0x270F | 可读可写的单个开关量 |
| 0x02 | 离散输入 (Discrete Inputs) | 10001-19999 | 0x0000-0x270F | 只读的单个开关量 |
| 0x04 | 输入寄存器 (Input Registers) | 30001-39999 | 0x0000-0x270F | 只读的16位数据 |
| 0x03, 0x06, 0x10 | 保持寄存器 (Holding Registers) | 40001-49999 | 0x0000-0x270F | 可读可写的16位数据 |
核心规则:
- 功能码决定了操作的数据类型,从而决定了使用哪一类地址(4XXXX, 3XXXX等)。
- 协议地址 = PLC地址 - 偏移量。
- 对于 4XXXX(保持寄存器),偏移量是 40001。所以 PLC地址 40001 在报文中对应的协议地址是 0。
- 对于 3XXXX(输入寄存器),偏移量是 30001。所以 PLC地址 30001 在报文中对应的协议地址也是 0。
举例说明:
- 如果你想用功能码 0x03 读取设备手册上标注的地址 40001 开始的2个寄存器:
- 你发送的报文里,功能码填
0x03。 - 起始地址填
0x0000(因为 40001 - 40001 = 0)。 - 寄存器数量填
0x0002。 - 如果你想读取地址 30001,你应该使用功能码 0x04(读输入寄存器),并在报文中使用地址
0x0000。
每次看 Modbus-RTU 通讯协议都想抓头发,就目前情况来说,通讯协议全部是写给人看的,应该提供对人读友好的格式比如40001、30005、00006这样的地址,如果想方便自己,可以再放一列自认为方便的地址比如偏移地址0x0000这样的地址。
保持简单化傻瓜化,让每个人都开心

直接写 40001 这样的 5 位数字地址,不仅表明了功能码还表明了地址,比说功能码+偏移地址方便多了。 使用功能码可能是开发板或者单片机中使用的较多,通信协议更多的还是给客户的工程师使用,客户水平有高有低,还是建议提供最简单明了的协议给客户。客户不会因为你提供简单易用的内容而生气。
版权声明:
作者:xinyu2ru
链接:https://www.rxx0.com/software/modbus-rtutong-xun-zhong.html
来源:RUBLOG-分享我的生活
文章版权归作者所有,未经允许请勿转载。
THE END
二维码

共有 0 条评论