Modbus-RTU通讯中功能码和5位数字地址对应关系

Modbus-RTU通讯中功能码和5位数字地址对应关系

Modbus地址通常有两种表示法:

  1. PLC地址(或数据表地址):就是我们常说的 40001、30001 这种5位数字。它是一种便于人类理解和设备手册标注的编号。
  2. 协议地址(或偏移地址):是在实际通讯报文里使用的,从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这样的地址。

保持简单化傻瓜化,让每个人都开心

DRY and KISS

直接写 40001 这样的 5 位数字地址,不仅表明了功能码还表明了地址,比说功能码+偏移地址方便多了。 使用功能码可能是开发板或者单片机中使用的较多,通信协议更多的还是给客户的工程师使用,客户水平有高有低,还是建议提供最简单明了的协议给客户。客户不会因为你提供简单易用的内容而生气。

版权声明:
作者:xinyu2ru
链接:https://www.rxx0.com/software/modbus-rtutong-xun-zhong.html
来源:RUBLOG-分享我的生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>