Modbus 功能
一般说明
Modbus 协议提供了在 Modbus 网络上读写数据的众多功能。Modbus 协议还提供了诊断和网络管理功能。
这里仅介绍由 ATSE 处理的 Modbus 功能。
读功能
有以下读功能:
功能代码 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
3 (0x03) |
– |
读取保持寄存器 |
读取 n 个输出或内部寄存器 |
43 (0x2B) |
14 (0x0E) |
读取设备标识 |
读取服务器的标识数据 |
43 (0x2B) |
15 (0x0F) |
获取日期和时间 |
读取服务器的日期和时间 |
“读取寄存器”示例
下表显示了如何在寄存器 2000 中读取 SI 电压。寄存器 2000 的地址为 2000-1=1999 = 0x07CF。Modbus 服务器的 Modbus 地址为 47 = 0x2F。
客户端请求 |
服务器应答 |
||
---|---|---|---|
字段名称 |
示例 |
字段名称 |
示例 |
Modbus 服务器地址 |
0x2F |
Modbus 服务器地址 |
0x2F |
功能代码 |
0x03 |
功能代码 |
0x03 |
要读取的寄存器地址(最高有效位) |
0x07 |
数据长度(字节) |
0x02 |
要读取的寄存器地址(最低有效位) |
0xCF |
寄存器值(最高有效位) |
0x02 |
寄存器数量(最高有效位) |
0x00 |
寄存器值(最低有效位) |
0x2B |
寄存器数量(最低有效位) |
0x01 |
CRC(最高有效位) |
0xXX |
CRC(最高有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
– |
“获取日期和时间”示例
下表显示了如何获取 Modbus 服务器的日期和时间。Modbus 服务器的 Modbus 地址为 47 = 0x2F。
客户端请求 |
服务器应答 |
||
---|---|---|---|
字段名称 |
示例 |
字段名称 |
示例 |
Modbus 服务器地址 |
0x2F |
Modbus 服务器地址 |
0x2F |
功能代码 |
0x2B |
功能代码 |
0x2B |
子功能代码 |
0x0F |
子功能代码 |
0x0F |
保留 |
0x00 |
保留 |
0x00 |
– |
– |
日期和时间 |
请参阅 DATETIME 数据类型 |
“设置日期和时间”示例
下表显示了如何设置 Modbus 服务器的日期和时间。Modbus 服务器的 Modbus 地址为 47 = 0x2F,最新日期为 2014 年 10 月 2 日,最新时间为下午 2:32:03:500。
客户端请求 |
服务器应答 |
||
---|---|---|---|
字段名称 |
示例 |
字段名称 |
示例 |
Modbus 服务器地址 |
0x2F |
Modbus 服务器地址 |
0x2F |
功能代码 |
0x2B |
功能代码 |
0x2B |
子功能代码 |
0x10 |
子功能代码 |
0x10 |
Reserved1 |
0x00 |
Reserved1 |
0x00 |
未使用 |
0x00 |
未使用 |
0x00 |
年份 = 2014 |
0x0E |
年份 = 2014 |
0x0E |
月份 = 10 月 |
0x0A |
月份 = 10 月 |
0x0A |
日期 = 2 日 |
0x02 |
日期 = 2 日 |
0x02 |
小时 = 14 |
0x0E |
小时 = 14 |
0x0E |
分钟 = 32 |
0x20 |
分钟 = 32 |
0x20 |
3 秒 500 毫秒 |
0x0DAC |
3 秒 502 毫秒 |
0x0DAE |
正常回应是应答该请求,在远程设备更新日期时间后返回。如果日期时间结构内容与正确的日期时间不符(即无效日期时间),则设备会将返回日期时间字段的数值设置为 0。
如果断开 24 VDC 的电源,则不再刷新没有电池的 Modbus 服务器的日期和时间。因此在接通 24 VDC 电源后,必须设置所有 Modbus 服务器的日期和时间。
另外,因为每个 Modbus 服务器都有时钟漂移,因此必须定期设置所有 Modbus 服务器的日期和时间。建议至少每 15 分钟设置一次。
分散保持寄存器读功能
提供了以下分散保持寄存器读功能:
功能 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
100 (0x64) |
4 (0x04) |
读取分散保持寄存器 |
读取 n 个非连续寄存器 |
借助分散保持寄存器读功能,用户可以:
-
避免在只需要少数寄存器的情况下读取大量连续寄存器
-
避免多次使用功能 3 和 4,以读取非连续寄存器
“读取分散保持寄存器”示例
下表显示了如何读取 Modbus 服务器寄存器 1022(地址 0x03FD)和寄存器 1100(地址 0x044B)的地址。Modbus 服务器的 Modbus 地址为 47 = 0x2F。
客户端请求 |
服务器应答 |
||
---|---|---|---|
字段名称 |
示例 |
字段名称 |
示例 |
Modbus 服务器地址 |
0x2F |
Modbus 服务器地址 |
0x2F |
功能代码 |
0x64 |
功能代码 |
0x64 |
数据长度(字节) |
0x06 |
数据长度(字节) |
0x06 |
子功能代码 |
0x04 |
子功能代码 |
0x04 |
传输数 (1) |
0xXX |
传输数 (1) |
0xXX |
要读取的第一个寄存器的地址(最高有效位) |
0x03 |
要读取的第一个寄存器的数值(最高有效位) |
0x12 |
要读取的第一个寄存器的地址(最低有效位) |
0xFD |
要读取的第一个寄存器的数值(最低有效位) |
0x0A |
要读取的第二个寄存器的地址(最高有效位) |
0x04 |
要读取的第二个寄存器的数值(最高有效位) |
0x74 |
要读取的第二个寄存器的地址(最低有效位) |
0x4B |
要读取的第二个寄存器的数值(最低有效位) |
0x0C |
CRC(最高有效位) |
0xXX |
CRC(最高有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
(1) 客户端在请求中给出传输编号。服务器在应答中返回同样的传输编号。 |
写功能
提供了以下写功能:
功能代码 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
6 (0x06) |
– |
预置一个寄存器 |
写入 1 个寄存器 |
16 (0x10) |
– |
预置多个寄存器 |
写入 n 个寄存器 |
43 (0x2B) |
16 (0x10) |
设置日期和时间 |
写入服务器的日期和时间 |