目录
- Modbus通讯协议初学
- 什么是Modbus?
- Modbus用来做什么?
- 4个种类的寄存器
- 协议速记
- 功能码
- Modbus 报文帧
- 示例解读
Modbus通讯协议初学
什么是Modbus?
顾名思义,它是一个bus,即总线协议。比如串口协议、IIC协议、SPI都是通讯协议。你接触到这种协议,相信你所处的行业是工业方面或者你的产品用于工业。
Modbus用来做什么?
用两个来概括:通讯。
4个种类的寄存器
线圈状态(Coil Status) 可读可写
离 散 输入状 态(Discrete Input Status) 只读
保 持 寄 存 器(Holding Register) 可读可写
输 入 寄 存 器( Input Register)只读
协议速记
Modbus 是一主多从的协议
主控发出的数据里,必定含有如下信息:
① 设备地址:你要访问从设备 1,还是访问从设备 2
② 访问哪类寄存器,是读还是写,只访问 1 个寄存器,还是多个寄存器:这被称为功能码
③ 起始寄存器地址、寄存器数量:这在数据里定义
④ 为了保证数据传输的可靠,还附带有 CRC 检验码
以 Modbus RTU 协议为例,主控发出的数据包格式如下:
功能码
功能代码有哪些?常用的功能码如下:
① 读线圈状态(01)
② 读离散输入状态(02)
③ 写单个线圈(05)、写多个线圈(15)
④ 读保持寄存器(03)
⑤ 读输入寄存器(04)
⑥ 写单个保存寄存器(06)、写多个保存寄存器(16)
Modbus 报文帧
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。
Modbus 报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。
Modbus 协议 RTU 报文格式如下所示:
帧结构 = 地址 + 功能吗 + 数据 + 校验
地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)。
功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。
数据:根据功能码不同,有不同结构,在后续的实例中有说明。
校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。
示例解读
以(0x01)读取线圈为例
从我上图的这个例子中,进行如下的解析
主机发送:07 01 00 00 00 08 3D AA
从机回复:07 01 01 20 50 D8
解析如下:
07(从设备地址) 01(功能码) 00 00(起始地址16bit,高位在前,低位在后) 00 08(寄存器数16bit 高位在前,低位在后) 3D AA (CRC校验)
07(从设备地址) 01(功能码) 01(数据域字节数) 20(数据 1) 50 D8(校验)
参考资料:
https://blog.csdn.net/qq_39400113/article/details/118369506