10.5Modbus功能码详解
本节大部分内容参考《Modbus软件开发实战指南》。
10.5.1
功能码概要
Modbus标准在协议中规定了以下3类Modbus功能码。
公共功能码:
①被明确定义的功能码
②保证唯一性
③由Modbus协会确认,并提供公开的文档
④可进行一致性测试
⑤包括协议定义的功能码和保留将来使用的功能码
用户自定义功能码:
①有两个用户自定义功能码区域,分别是65~72和100~110。
②用户自定义,无法保证唯一性。
保留功能码:
保留功能码因为历史遗留原因,某些公司的传统产品现行使用的功能码不作为公共使用。
10.5.2
0x01)读取线圈
1. 功能说明
01功能码用于读取从设备的线圈或离散量输出的状态,即各Do(DiscreteOutput,离散输出)的ON/OFF状态。消息帧中指定了需要读取的线圈起始地址和线圈数目。需要注意的是,在Modbus协议规定的PDU中,所有线圈或寄存器地址都必须从0开始计算。
2. 查询报文
如下表所示,查询帧的消息中定义了从设备地址为3,并读取从设备的Modbus地址0001900055(线圈地址 0002000056)共计37个状态值。起始线圈地址为0x13(即十进制00019),因为线圈地址是从0开始计数的。
功能码01查询报文示例:
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
帧头 | “:” | ||
从设备地址 | 0x03 | “0”,“3” | 0x03 |
功能码 | 0x01 | “0”,“1” | 0x01 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器数 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器数 (低位) |
0x25 | “2”,“5” | 0x25 |
差错校验 | LRC(2字符) | CRC(2字节) | |
帧尾 | CR/LF | ||
合计字节数 | 17 | 8 |
Modbus协议规定,起始地址由2字节构成,取值范围为0x0000~0xFFFF。
线圈数量由2字节构成,取值范围为0x0001~0x07D0(即+进制1~2000)另外,注意观察ASCII模式和RTU模式的区别,ASCII模式直接按每4位拆分成对应的字符表示。
3. 响应报文
在响应报文的数据字段中,每个线圈占用1位(bit),状态被表示为1=ON和O=OFF两种类型。第1个数据字节的LSB(最低有效位)标识查询报文中的起始地址线圈的状态值,其他线圈以此类推,一直到这个字节的MSB(最高有效位)为止,并在后续字节中按照同样的方式(由低到高)排列。
例如,下表中线圈20~27的状态值分别是ON-ON-OFF OFF-ON-OFF-ON-OFF表示为二进制则为01010011(0x53),注意观察对应的顺序。1字节可以表示8个线圈的状态如果最后的数据字节中不能填满8个线圈的状态,则用0填充。对应于查询报文中需要读取37个线圈的状态,共需要5字节保存状态值。
功能码01响应报文示例:
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
帧头 | “:” | ||
从设备地址 | 0x03 | “0”,“3” | 0x03 |
功能码 | 0x01 | “0”,“1” | 0x01 |
数据域字节数 | 0x05 | “0”,“5” | 0x05 |
数据1 | 0x53 | “5”,“3” | 0x53 |
数据2 | 0x6B | “6”,“B” | 0x6B |
数据3 | 0x01 | “0”,“1” | 0x01 |
数据4 | 0xF4 | “F”,“B” | 0xF4 |
数据5 | 0x1B | “1”,“B” | 0x1B |
差错校验 | LRC(2字符) | CRC(2字节) | |
帧尾 | CR/LF | ||
合计字节数 | 21 | 10 |
10.5.3
(0x02)读取离散量输入值
1. 功能说明
02功能码用于读取从设备的离散输入,即DI(Discrete Input)的ON/OFF状态。消息顿中指定了需要读取的离散输入寄存器的起始地址和数目,可以读取1~2000个连续的离散量输入状态如果从设备接受主设备的请求则回复功能码02,并返回离散量且输入各变量的当前状态。如果返回的离散输入数量的个数不是8的整数倍,将用0填充最后的数据字节的剩余位。
2. 查询报文
如下表所示,查询顿的消息中定义了从设备的地址为3,并读取从设备的离散输入寄存器中地址10101~10120(Modbus地址表示为十进制100~119)共计20个离散输入状态值。从下表中可以发现,起始地址为0x64(即十进制100),因为消息PDU中的Modbus地址从0开始计数。
功能码02查询报文示例:
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
帧头 | “:” | ||
从设备地址 | 0x03 | “0”,“3” | 0x03 |
功能码 | 0x02 | “0”,“2” | 0x02 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x64 | “6”,“4” | 0x64 |
寄存器数 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器数 (低位) |
0x14 | “1”,“4” | 0x14 |
差错校验 | LRC(2字符) | CRC(2字节) | |
帧尾 | CR/LF | ||
合计字节数 | 17 | 8 |
与5.4.2节中的功能码(01(0x01)读取线圈/离散量输出状态(ReadCoil status/DOs))一样,本功能码的起始地址由2字节构成,取值范围为0x0000~0xFFFF;离散量数量由2字节构成,取值范围为0x0001~0x07D0(即十进制1~2000),最多一次性可读取2000人离散输入状态值。
3. 响应报文
响应报文的各项构成和意义与5.4.2章节的功能码(01(0x01)读取线圈/离散量输出状态(Re-ad Coil Status/DOs))一样,如下表所示:
功能码02响应报文示例
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
帧头 | “:” | ||
从设备地址 | 0x03 | “0”,“3” | 0x03 |
功能码 | 0x02 | “0”,“2” | 0x02 |
数据域字节数 | 0x03 | “0”,“3” | 0x03 |
数据1 | 0x53 | “5”,“3” | 0x53 |
数据2 | 0x6B | “6”,“B” | 0x6B |
数据3 | 0x01 | “0”,“1” | 0x01 |
差错校验 | LRC(2字符) | CRC(2字节) | |
帧尾 | CR/LF | ||
合计字节数 | 21 | 10 |
需要技术支持?
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。
-
MODBUS
+关注
关注
28文章
1755浏览量
76723 -
设备
+关注
关注
2文章
4430浏览量
70476 -
ModBus协议
+关注
关注
3文章
173浏览量
33357 -
功能码
+关注
关注
0文章
5浏览量
2098
原文标题:Moubus功能码详解 - RZ MPU工业控制教程连载(30)
文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论