Modbus 功能
一般说明
Modbus 协议提供了在 Modbus 网络上读写数据的众多功能。Modbus 协议还提供了诊断和网络管理功能。
本节介绍由断路器处理的 Modbus 功能。
读功能
有以下读功能:
功能代码 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
3 (0x03) |
– |
读取保持寄存器 |
读取 n 个输出或内部寄存器 |
4 (0x04) |
– |
读取输入寄存器 |
读取 n 个输入寄存器 |
43 (0x2B) |
14 (0x0E) |
读取设备标识 |
读取服务器的标识数据 |
43 (0x2B) |
15 (0x0F) |
获取日期和时间 |
读取服务器的日期和时间 |
“读取寄存器”示例
下表显示了如何在寄存器 1016 中读取相 1 的 RMS 电流 (I1) 。寄存器 1016 的地址为 1016 - 1 = 1015 = 0x03F7。Modbus 服务器的 Modbus 地址为 47 = 0x2F。
客户端请求 |
服务器应答 |
||
---|---|---|---|
字段名称 |
示例 |
字段名称 |
示例 |
Modbus 服务器地址 |
0x2F |
Modbus 服务器地址 |
0x2F |
功能代码 |
0x03 |
功能代码 |
0x03 |
要读取的寄存器地址(最高有效位) |
0x03 |
数据长度(字节) |
0x02 |
要读取的寄存器地址(最低有效位) |
0xF7 |
寄存器值(最高有效位) |
0x02 |
寄存器数量(最高有效位) |
0x00 |
寄存器值(最低有效位) |
0x2B |
寄存器数量(最低有效位) |
0x01 |
CRC(最高有效位) |
0xXX |
CRC(最高有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
– |
寄存器 1016(地址 0x03F7)的内容为 0x022B = 555。因此,相 1 上的 RMS 电流 (I1) 为 555 A。
“获取日期和时间”示例
下表显示了如何获取 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 个非连续寄存器 |
n 的最大值为 100,但使用 MasterPacT MicroLogic A 或 E 脱扣单元时,建议 n 等于或小于 21。
借助分散保持寄存器读功能,用户可以:
-
避免在只需要少数寄存器的情况下读取大量连续寄存器
-
避免多次使用功能 3 和 4,以读取非连续寄存器
“读取分散保持寄存器”示例
下表显示了如何读取 Modbus 服务器寄存器 664(地址 0x0297)和寄存器 666(地址 0x0299)的地址。Modbus 服务器的 Modbus 地址为 47 = 0x2F。
客户端请求 |
服务器应答 |
||
---|---|---|---|
字段名称 |
示例 |
字段名称 |
示例 |
Modbus 服务器地址 |
0x2F |
Modbus 服务器地址 |
0x2F |
功能代码 |
0x64 |
功能代码 |
0x64 |
数据长度(字节) |
0x06 |
数据长度(字节) |
0x06 |
子功能代码 |
0x04 |
子功能代码 |
0x04 |
传输数 (1) |
0xXX |
传输数 (1) |
0xXX |
要读取的第一个寄存器的地址(最高有效位) |
0x02 |
要读取的第一个寄存器的值(最高有效位) |
0x12 |
要读取的第一个寄存器的地址(最低有效位) |
0x97 |
要读取的第一个寄存器的值(最低有效位) |
0x0A |
要读取的第二个寄存器的地址(最高有效位) |
0x02 |
要读取的第二个寄存器的值(最高有效位) |
0x74 |
要读取的第二个寄存器的地址(最低有效位) |
0x99 |
要读取的第二个寄存器的值(最低有效位) |
0x0C |
CRC(最高有效位) |
0xXX |
CRC(最高有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
CRC(最低有效位) |
0xXX |
(1) 客户端在请求中给出传输编号。服务器在应答中返回同样的传输编号。 |
写功能
提供了以下写功能:
功能代码 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
6 (0x06) |
– |
预置一个寄存器 |
写入 1 个寄存器 |
16 (0x10) |
– |
预置多个寄存器 |
写入 n 个寄存器 |
43 (0x2B) |
16 (0x10) |
设置日期和时间 |
写入服务器的日期和时间 |
诊断功能
提供了以下诊断功能:
功能代码 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
8 (0x08) |
– |
诊断 |
管理诊断计数器 |
8 (0x08) |
10 (0x0A) |
清空计数器和诊断寄存器 |
复位所有诊断计数器 |
8 (0x08) |
11 (0x0B) |
返回总线消息计数器 |
读取服务器管理的正确总线消息的计数器 |
8 (0x08) |
12 (0x0C) |
返回总线通讯错误计数器 |
读取服务器管理的错误总线消息的计数器 |
8 (0x08) |
13 (0x0D) |
返回总线异常错误计数器 |
读取服务器管理的异常应答的计数器 |
8 (0x08) |
14 (0x0E) |
返回服务器消息计数器 |
读取发送给服务器的消息的计数器 |
8 (0x08) |
15 (0x0F) |
返回服务器无应答计数器 |
读取广播消息计数器 |
8 (0x08) |
16 (0x10) |
返回服务器否定确认计数器 |
读取发送给服务器,但是因为出现否定确认异常代码 07 而没有应答的消息的计数器 |
8 (0x08) |
17 (0x11) |
返回服务器繁忙计数器 |
读取发送给服务器,但是因为出现“服务器设备繁忙”异常代码 06 而没有应答的消息的计数器 |
8 (0x08) |
18 (0x12) |
返回总线溢出计数器 |
读取因为溢出错误而出现的错误总线消息的计数器 |
11 (0x0B) |
– |
获取通讯事件计数器 |
读取 Modbus 事件计数器 |
诊断计数器
Modbus 使用诊断计数器来进行性能和错误管理。可以通过 Modbus 诊断功能(功能代码 8 和 11)访问这些计数器。下表介绍了 Modbus 诊断计数器和 Modbus 事件计数器:
计数器编号 |
计数器名称 |
描述 |
---|---|---|
1 |
总线消息计数器 |
服务器管理的正确总线消息的计数器 |
2 |
总线通讯错误计数器 |
服务器管理的错误总线消息的计数器 |
3 |
服务器异常错误计数器 |
服务器管理的异常响应以及错误广播消息的计数器 |
4 |
服务器消息计数器 |
发送给服务器的消息的计数器 |
5 |
服务器无应答计数器 |
广播消息计数器 |
6 |
服务器否定确认计数器 |
发送给服务器,但是因为出现否定确认异常代码 07 而没有应答的消息的计数器 |
7 |
服务器繁忙计数 |
发送给服务器,但是因为出现“服务器设备繁忙”异常代码 06 而没有应答的消息的计数器 |
8 |
总线字符溢出计数器 |
因为溢出错误而出现的错误总线消息的计数器 |
9 |
通讯事件计数器 |
Modbus 事件计数器(通过功能代码 11 读取此计数器) |
计数器复位
在以下情况,将诊断计数器复位为 0:
-
达到最大值 65535,
-
已通过 Modbus 命令将其复位(功能代码 8,子功能代码 10),
-
在断电以后,或者,
-
修改通讯参数以后。