传感网应用开发(微课版)
上QQ阅读APP看书,第一时间看更新

1.5.5 Modbus功能码

Modbus功能码具有严密的逻辑体系,在通信应用开发中发挥着重要的作用。本小节首先介绍Modbus功能码基本分类,然后详细介绍读写单个和多个线圈,以及保持寄存器的具体功能码值。

1.Modbus功能码分类

Modbus功能码是Modbus消息帧的一部分,它代表将要执行的动作。以RTU模式为例,RTU模式的消息帧的Modbus功能码占用一个字节,取值范围为1~127。

Modbus标准规定了3类Modbus功能码:公共功能码、用户自定义功能码和保留功能码。

Modbus协会明确定义了公共功能码,具有唯一性。部分常用的公共功能码如表1-6所示。

表1-6 部分常用的公共功能码

续表

用户自定义功能码由用户自己定义,无法确保其唯一性,其范围为65~72和100~110。

本项目讨论RTU模式的公共功能码。

保留功能码是某些公司在传统产品上现行使用的功能码不作为公共使用。

2.读线圈状态值功能码01

该功能码用于读取从机的线圈或离散量(Digital Output,DO)的输出状态(ON/OFF)。

该功能码的请求报文:06 01 00 16 00 21 1C 61,如表1-7所示。

表1-7 功能码01的请求报文

从表1-7中可以看到,从机地址为06,需要读取的Modbus起始地址为22(0x16),结束地址为54(0x36),共读取33(0x21)个状态值。

地址22~54的线圈寄存器的值如表1-8所示,状态“ON”与“OFF”分别代表线圈的“开”与“关”。

表1-8 地址22~54的线圈寄存器的值

该功能码的响应报文:06 01 05 23 8B 24 C4 01 ED 9C,如表1-9所示。

表1-9 功能码01的响应报文

3.读离散输入状态值功能码02

该功能码用于读取从机的离散量(Digital Input,DI)的输入状态(ON/OFF)。

该功能码的请求报文:04 02 00 77 00 1E 48 4D,如表1-10所示。

表1-10 功能码02的请求报文

从表1-10中可以看到,从机地址为04,需要读取的Modbus起始地址为119(0x77),结束地址为148(0x94),共读取30(0x1E)个离散量输入状态。

地址119~148的线圈寄存器的值如表1-11所示。

表1-11 地址119~148的离散量寄存器的值

该功能码的响应报文:04 02 04 AD B7 05 38 3C EA,如表1-12所示。

表1-12 功能码02的响应报文

4.读保持寄存器值功能码03

该功能码用于读取从机保持寄存器的二进制数据,不支持广播,请求报文:06 03 00 D2 00 04 E5 87,如表1-13所示。

表1-13 功能码03的请求报文

从表1-13中可以看到,从机地址为06,需要读取Modbus地址从210(0xD2)至213(D5)共4个保持寄存器的内容。

该功能码的响应报文:06 03 08 02 6E 01 F3 01 06 59 AB 1E 6A,如表1-14所示。

表1-14 功能码03的响应报文

注意 Modbus的保持寄存器和输入寄存器以字节为基本单位,即每个寄存器分别对应2个字节。请求报文连续读取4个寄存器的内容,将返回8个字节。

5.读输入寄存器值功能码04

该功能码用于读取从机输入寄存器的二进制数据,不支持广播,请求报文:06 04 01 90 00 05 30 6F,如表1-15所示。

表1-15 功能码04的请求报文

从表1-15中可以看到,从机地址为06,需要读取Modbus地址从400(0x0190)至404(0x0194)共5个寄存器的内容。

该功能码的响应报文:06 04 0A 1C E2 13 5A 35 DB 23 3F 56 E3 51 3A,如表1-16所示。

表1-16 功能码04的响应报文

6.写单个线圈值功能码05

该功能码用于将单个线圈或单个离散输出状态设置为“ON”或“OFF”。0xFFOO表示状态“ON”,0x0000表示状态“OFF”,其他值对线圈无效。例如,请求报文:04 05 00 98 FF 00 0D 80(见表1-17),从机地址为04,设置Modbus地址152(0x98)为“ON”状态。

表1-17 功能码05的请求报文

该功能码的响应报文:04 05 00 98 FF 00 0D 80,如表1-18所示。

表1-18 功能码05的响应报文

7.写单个保持寄存器值功能码06

该功能码用于更新从机单个保持寄存器的值,请求报文:03 06 00 82 02 AB 68 DF,如表1-19所示。

表1-19 功能码06的请求报文

从表1-19中可以看到,从机地址为03,要求设置从机Modbus地址130(0x82)的内容为683(0x02AB)。

该功能码的响应报文:03 06 00 82 02 AB 68 DF,如表1-20所示。

表1-20 功能码06的响应报文

8.写多个线圈值功能码15(0x0F)

该功能码用于将连续的多个线圈或离散输出状态设置为“ON”或“OFF”,支持广播模式。其请求报文:03 0F 00 14 00 0F 02 C2 03 EE E1,如表1-21所示。

表1-21 功能码15的请求报文

从表1-21中可以看到,从机地址为03,Modbus起始地址为20(0x14),需要将地址从20至34共15个线圈寄存器的状态设定为表1-22所示的值。

表1-22 线圈寄存器的值

该功能码的响应报文:03 0F 00 14 00 0F 54 29,如表1-23所示。

表1-23 功能码15的响应报文

9.写多个保持寄存器值功能码16(0x10)

该功能码用于设置或写入从机保持寄存器的多个连续的地址块,支持广播模式。数据字段用于保存需写入的数据,每个寄存器可存放2个字节。该功能码的请求报文:05 10 00 15 00 03 06 53 6B 05 F3 2A 08 3E 72,如表1-24所示。

表1-24 功能码16的请求报文

从表1-24可以看到,从机地址为05, Modbus起始地址为21(0x15),需要改变地址从21至23共3个寄存器(6个字节数据)的内容,需要变更的数据为“53 6B 05 F3 2A 08”。

该功能码的响应报文:05 10 00 15 00 03 90 48,如表1-25所示。

表1-25 功能码16的响应报文