Modbus协议的读取保持寄存器值

描述

10.5.4

0x03)读取保持寄存器值

1. 功能说明

03功能码用于读取从设备保持寄存器的内容,不支持广播模式。消息顿中指定了需要读取的保持寄存器的起始地址和数目。而保持寄存器中各地址的具体内容和意义则由设备开发者自行规定。

2. 查询报文

在查询报文中,必须指定保持寄存器的开始地址和需要读取的寄存器数量,例如,如下表所示,从设备地址为7(0x07),需要读取保持寄存器地址40201~40203共计3个寄存器的内容即读取Modbus协议地址200~202的内容,在报文中表示如下。

起始地址:0x00C8(十进制200)。

读取数量:0x0003(十进制3)。

功能码03查询报文示例:

字段 例(Hex) ASCII模式字符型 RTU模式8位
(Hex)
帧头   “:”  
从设备地址 0x07 “0”,“7” 0x07
功能码 0x03 “0”,“3” 0x03
起始地址
(高位)
0x00 “0”,“0” 0x00
起始地址
(低位)
0xc8 “c”,“8” 0xc8
寄存器数
(高位)
0x00 “0”,“0” 0x00
寄存器数
(低位)
0x03 “0”,“3” 0x03
差错校验   LRC(2字符) CRC(2字节)
帧尾   CR/LF  
  合计字节数 17 8

本功能码的起始地址由2字节构成,取值范围为0x00000xFFFF;寄存器数量由2字节构成取值范围为0x00010x007D(即十进制1~125),即最多可以连续读取125个寄存器。

需要特别注意的是,Modbus的保持寄存器和输入寄存器是以字(Word)为基本单位的(1Word=2Byte),所以如果读取保持寄存器地址为40001开始的一个16位(bit)的无符号数,那么返回2字节,并可以从40002开始读取下一个16位的无符号数。如果需要读取寄存器地址为40001开始的一个32位浮点数,则需要返回4字节,即必须连续读取40001和40002的内容,而且下一个32位的浮点数必须从40003开始读取。对于浮点数(或者32位的整数)而言,连续读取的两个寄存器之间存在字节序和大小端的问题,这一点在开发时必须引起注意。

3. 响应报文

响应报文的各项构成和意义如下表所示。因为Modbus的保持寄存器和输入寄存器是以字为基本单位的,在上面的例子中,查询报文连续读取3个寄存器的内容,将返回6 字节,参考表下表中数据1~3的高位和低位。

功能码03响应报文示例:

字段 例(Hex) ASCII模式字符型 RTU模式8位
(Hex)
帧头   “:”  
从设备地址 0x07 “0”,“7” 0x07
功能码 0x03 “0”,“3” 0x03
数据域字节数 0x06 “0”,“6” 0x06
数据1(高位) 0x03 “0”,“3” 0x03
数据1(低位) 0x53 “5”,“3” 0x53
数据2(高位) 0x01 “0”,“1” 0x01
数据2(低位) 0xF3 “F”,“3” 0xF3
数据3(高位) 0x01 “0”,“1” 0x01
数据3(低位) 0x05 “0”,“5” 0x05
差错校验   LRC(2字符) CRC(2字节)
帧尾   CR/LF  
  合计字节数 23 11

10.5.5

(0x04)读取输入寄存器值

1. 功能说明

与功能码03类似,04功能码用于读取从设备输入寄存器的内容,不支持广播模式。消息顿中指定了需要读取的输入寄存器的起始地址和数目,而输入寄存器中各地址的具体内容和意义则由设备开发者自行规定。

2. 查询报文

在查询报文中必须指定输入寄存器的起始地址和需要读取的寄存器数量。例如,如表4-9所示,从设备地址为7(0x07),需要读取输入寄存器地址30301~30303共计 3个寄存器的内容即读取Modbus协议地址300~302的内容,在报文中表示如下。

起始地址:0x012C(十进制300)。

读取数量:0x0003(十进制3)。

功能码04查询报文示例:

字段 例(Hex) ASCII模式字符型 RTU模式8位
(Hex)
帧头   “:”  
从设备地址 0x07 “0”,“7” 0x07
功能码 0x04 “0”,“4” 0x04
起始地址
(高位)
0x01 “0”,“1” 0x01
起始地址
(低位)
0x2c “2”,“c” 0x2c
寄存器数
(高位)
0x00 “0”,“0” 0x00
寄存器数
(低位)
0x03 “0”,“3” 0x03
差错校验   LRC(2字符) CRC(2字节)
帧尾   CR/LF  
  合计字节数 17 8

本功能码中,起始地址由2字节构成,取值范围为0x0000~0xFFFF;寄存器数量由2字节构成,取值范围为0x0001~0x007D(即十进制1~125),即最多可以连续读取125个寄存器同样有一点需要注意,Modbus的保持寄存器和输入寄存器是以字为基本单位的。所以对于浮点数(或者32位的整数)而言,连续读取的两个寄存器之间存在字节序和大小端的问题,这一点在开发时必须引起注意。

3. 响应报文

响应报文的各项构成和意义如下表所示。因为Modbus的保持寄存器和输入寄存器是以字为基本单位的,上面的例子中,查询报文连续读取3个寄存器的内容,那么将返回6字节,参考下表中数据1~3的高位和低位。

功能码04响应报文示例:

字段 例(Hex) ASCII模式字符型 RTU模式8位
(Hex)
帧头   “:”  
从设备地址 0x07 “0”,“7” 0x07
功能码 0x04 “0”,“4” 0x04
数据域字节数 0x06 “0”,“6” 0x06
数据1(高位) 0x03 “0”,“3” 0x03
数据1(低位) 0x53 “5”,“3” 0x53
数据2(高位) 0x01 “0”,“1” 0x01
数据2(低位) 0xF3 “F”,“3” 0xF3
数据3(高位) 0x01 “0”,“1” 0x01
数据3(低位) 0x05 “0”,“5” 0x05
差错校验   LRC(2字符) CRC(2字节)
帧尾   CR/LF  
  合计字节数 23 11

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分