Modbus 功能
概述
Modbus 协议提供了在 Modbus 网络上读写数据的众多功能。Modbus 协议还提供了诊断和网络管理功能。
本节介绍由断路器处理的 Modbus 功能。
读功能
有以下读功能:
功能代码 |
子功能代码 |
名称 |
描述 |
---|---|---|---|
3 (0x03) |
– |
读保持寄存器 |
读取 n 个输出或内部寄存器 |
4 (0x04) |
– |
读输入寄存器 |
读取 n 个输入寄存器 |
43 (0x2B) |
14 (0x0E) |
读取设备标识 |
读取从设备的标识数据 |
43 (0x2B) |
15 (0x0F) |
获取日期和时间 |
读取从设备的日期和时间 |
读寄存器的实例
下表展示了如何读取寄存器 1016 相 A (IA) rms 电流。寄存器 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。因此,相 A (IA) 的 rms 电流为 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 |
保留 1 |
0x00 |
保留 1 |
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),
-
在断电以后,或者,
-
修改通讯参数以后。