zl程序教程

您现在的位置是:首页 >  工具

当前栏目

modbus学习笔记——帧

笔记学习 MODBUS
2023-09-11 14:18:38 时间

 几个需要先搞懂的概念

1.modbus的数据类型

 

modbus定义了四种数据类型,这四种数据类型分别叫“离散量输入”“线圈”“输入寄存器”“保存寄存器”,这四种数据类型的功能见上表,其实他这名字很容易让人搞混了,我们只要记住这四个仅仅是四种数据类型的名字就行了,不要与现实中其他同名的东西搞混就行(例如“线圈”在这了就是一个数据类型,这种数据类型是可读可写的,不要与物理上的线圈混为一谈)

数据类型功能解析:

离散量输入——只读,获取某个IO状态(1bit)。

线圈——读写,主要用于设置某个值。

输入寄存器——只读,获取某个16bit数据的值。

保持寄存器——读写,设置某个16bit数据的值。

2.modbus的功能码

下图是一个modbus的帧格式,其中PDU由两部分组成,功能码和数据。

功能码是一个8位的数据,的作用是说明该帧是干什么的。比如,0x01代表读取线圈,0x02代表读取输入离散量,详细功能见下图

 

下面正式开始说明modbus的帧。

 

上图中,左边是请求,右边是响应。

请求帧的PDU数据是:02  00  C4  00  16

02  是功能码,根据功能码的定义(上表)02的意思是读取离散数据量。

00  C4  这两个是起始地址,00是高8位,C4是低8位。离散数据量可以有很多,都被放置在一个数组中(比如A[100])。

00  16  是要读取的数据的数量,00 是高8位,16是低8位。意思就是读取0x16个数据(注意这里是16进制,转换成10进制就是22)连同上一行数据(00C4)合起来的意思就是从0x00C4开始,读取0x0016个数据。

 

右边是响应。

响应的PDU是:02  03  AC  DB  35

02  功能码。

03  说明返回了0x03个字节的数据。

AC  DB  35  这三个字节的数据就是请求中需要读取的从ox00C4开始的0x0016个数据,由于0x16(十进制是22)个数据(就是22个bit,因为离散数据量是单个bit的)在

两个字节(两个字节只有16个bit)里放不下,所有这里需要3个字节(并未全部占全,剩下的两个用0补齐)。

那么数据如何对应地址呢?

请求中需要得到的数据是0x00C5——0x00DA(共0x16个)。

于是,0xC5——0xCC、0xCD——0xD4、0xD5——0xDA。

对应的就是上面图中响应帧的204-197,212-205,218-213.注意,高位在前。