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 |
全部0条评论
快来发表一下你的评论吧 !