Modbus 数据类型定义
各设备的数据类型
下表列出了每个 ULP 设备可用的 Modbus 数据类型:
|
数据类型 |
MicroLogic 控制或脱扣单元类型 |
BCM ULP 模块 |
BSCM 模块 |
EIFE/IFE 接口 |
IFM 接口 |
IO 模块 |
|||
|---|---|---|---|---|---|---|---|---|---|
|
X |
Active |
A/E/P/H |
5/6/7 |
||||||
|
INT16U |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
|
INT16 |
✓ |
✓ |
✓ |
✓ |
✓ |
– |
✓ |
– |
– |
|
INT32U |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
|
INT32 |
✓ |
– |
✓ |
✓ |
– |
– |
✓ |
– |
– |
|
INT64U |
✓ |
– |
✓ |
– |
– |
– |
– |
– |
– |
|
INT64 |
✓ |
✓ |
✓ |
✓ |
– |
– |
– |
– |
✓ |
|
SFIXPT |
– |
– |
✓ |
– |
– |
– |
– |
– |
– |
|
FLOAT32 |
✓ |
✓ |
✓ |
✓ |
– |
– |
✓ |
– |
✓ |
|
OCTET STRING |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
|
MOD10000 |
– |
✓ |
✓ |
– |
– |
– |
– |
– |
– |
|
DATE |
– |
✓ |
✓ |
– |
✓ |
– |
– |
– |
– |
|
XDATE |
✓ |
✓ |
✓ |
– |
✓ |
– |
✓ |
– |
– |
|
DATETIME |
✓ |
– |
✓ |
✓ |
– |
– |
✓ |
✓ |
✓ |
|
ULP DATE |
– |
✓ |
✓ |
✓ |
✓ |
✓ |
– |
– |
✓ |
注意
-
“类型”栏说明了获取变量所需读取的寄存器数。例如,INT16U 要求读取一个寄存器,而 INT32 需要读取 2 个寄存器。
-
某些变量必须作为多个寄存器块来读取,例如电能测量值。如果只读一部分数会导致错误。
-
从未记录的寄存器读取会导致 Modbus 异常。
-
数值采用十进制表示。如果需要使用十六进制来表示,那么将其显示为一个 C 语言类常数:0xdddd。比如,十进制值 123 的十六进制表示方式为:0x007B。
-
假如测量值与由寄存器“系统类型”确定的中性线相关,那么读取数值将返回 32768 (0x8000)(如果不适用)。对于出现这种情况的每个寄存器表,都会分别在脚注中予以说明。
-
乱序和不相关数据取决于数据类型。
注: 如果使用旧有的寄存器实现方式,某些寄存器可能显示不同的乱序和不相关数值。比如,INT16U 寄存器可能返回 32768 (0x8000),INT32U 可能显示 0x80000000。
|
数据类型 |
乱序和不相关数值 |
|---|---|
|
INT16U |
65535 (0xFFFF) |
|
INT16 |
-32768 (0x8000) |
|
INT32U |
4294967295 (0xFFFFFFFF) |
|
INT32 |
0x80000000 |
|
INT64U |
0xFFFFFFFFFFFFFFFF |
|
INT64 |
0x8000000000000000 |
|
FLOAT32 |
0xFFC00000 |
Big-Endian 格式
INT32、INT32U、INT64 和 INT64U 变量以 big-endian 格式存储:最高有效寄存器首先传输,最低有效寄存器最后传输。
INT32、INT32U、INT64 和 INT64U 变量由 INT16U 变量组成。
这些变量的十进制值计算公式为:
-
INT32:(0-bit31)x231 + bit30x230 + bit29x229 + ...bit1x21 + bit0x20
-
INT32U:bit31x231 + bit30x230 + bit29x229 + ...bit1x21 + bit0x20
-
INT64:(0-bit63)x263 + bit62x262 + bit61x261 + ...bit1x21 + bit0x20
-
INT64U:bit63x263 + bit62x262 + bit61x261 + ...bit1x21 + bit0x20
示例 1:
标准数据集中的总有功电能为寄存器 32096 至 32099 中编码的 INT64 变量。
如果寄存器中的值为:
-
寄存器 32096 = 0
-
寄存器 32097 = 0
-
寄存器 32098 = 0x0017 或 23
-
寄存器 32099 = 0x9692 或 38546(作为 INT16U 变量)以及 -26990(作为 INT16 变量)(使用 INT16U 值计算总有功电能的值)。
则总有功电能等于 0x248 + 0x232 + 23x216 + 38546x20 = 1545874 Wh。
示例 2:
旧有数据集中的无功电能为寄存器 12052 至 12053 中编码的 INT32 变量。
如果寄存器中的值为:
-
寄存器 12052 = 0xFFF2 = 0x8000 + 0x7FF2 或 32754
-
寄存器 12053 = 0xA96E 或 43374(作为 INT16U 变量)以及 -10606(作为 INT16 变量)(使用 INT16U 值计算无功电能的值)。
则无功电能等于 (0-1)x231 + 32754x216 + 43374x20 = -874130 kvarh。
寄存器中位的特性
以 INT16U 数据类型编码的寄存器中作为位枚举的每个位的特性在该寄存器之前的寄存器中予以指示。
示例:
寄存器 32001(断路器状态)的每个位的特性在前一个寄存器 32000 中给出。
与寄存器 32001 的位 0(OF 状态指示触点)对应的数据的特性在寄存器 32000 的位 0 中给出:
-
寄存器 32000 的位 0 = OF 状态指示的特性
-
寄存器 32001 的位 0 = OF 状态指示触点
|
如果 |
则 |
|---|---|
|
如果寄存器 32000 的位 0 = 1 并且寄存器 32001 的位 0 = 0 |
OF 触点指示设备已分闸 |
|
如果寄存器 32000 的位 0 = 1 并且寄存器 32001 的位 0 = 1 |
OF 触点指示设备已合闸 |
|
如果寄存器 32000 的位 0 = 0 |
OF 触点指示无效 |
数据类型:SFIXPT
此数据类型的数值范围取决于比例因数。
下表介绍了 SFIXPT 寄存器数值范围随比例因数变化的示例:
|
如果比例因数等于... |
则数值范围等于... |
|---|---|
|
1 |
-32768 至 +32767 |
|
100 |
-327.68 至 +327.67 |
|
1000 |
-32.768 至 +32.767 |
数据类型:FLOAT32
数据类型 FLOAT32 是用单精度 IEEE 754 表示的(用于浮点算法的 IEEE 标准)。按如下方式计算数值 N:
N = (-1)S x 2E-127 x (1+M)
|
系数 |
表示 |
描述 |
位数 |
|---|---|---|---|
|
S |
有符号 |
定义数值符号: 0 = 正数 1 = 负数 |
1 位 |
|
E |
指数 |
添加的额外 127 二进制整数。 0 < E < 255 时,实际指数为:e = E - 127。 |
8 位 |
|
M |
尾数 |
幅值,标准化二进制(有意义) |
23 位 |
示例:
0 = 0 00000000 00000000000000000000000
-1.5 = 1 01111111 10000000000000000000000
具有:
-
S = 1
-
E = 01111111 = 127
-
M = 10000000000000000000000 = 1x2-1 + 0x2-2 +...+ 0x2-23 = 0.5
-
N = (-1) x 20 x (1+0.5) = -1.5
数据类型:MOD10000
MOD10000 对应 INT16 格式的 n + 1 寄存器。每个寄存器都包含一个介于 -9999 到 9999 之间的整数。表示 n + 1 个寄存器且为 MOD10000 格式的值 V 的计算方式如下:
V = sum(R[x] + R[x+1] x 10000 +...+ R[x+n] x 10000n),其中 R[x] 是寄存器号 x 的值。
例如,要计算 4 个寄存器中编码的有功电量 Ep:
-
寄存器 2000 = 123,因此 R[x = 2000] = 123
-
寄存器 2001=4567
-
寄存器 2002=89
-
寄存器 2003=0
所以 Ep = R[2000] + R[2001] x 100001 + R[2002] x 100002 + R[2003] x 100003
= 123 + 4567 x 10000 + 89 x 100002 + 0
= 8 945 670 123 kWh
数据类型:DATE 和 XDATE
本表列出了 DATE(寄存器 1 至 3)和 XDATE(寄存器 1 至 4)的数据类型:
|
寄存器 |
类型 |
位 |
范围 |
描述 |
|---|---|---|---|---|
|
1 |
INT16U |
0-7 |
0x01–0x1F |
日 |
|
8-15 |
0x01–0x0C |
月 注: 只有位 8-14 用于 MasterPacT NT/NW、ComPacT NS 和 PowerPacT P 及 R 型断路器
|
||
|
15 |
0-1 |
日期和时间的品质,适用于MasterPacT NT/NW、ComPacT NS 和 PowerPacT P 及 R 型断路器。 如果已设置位 15,日期和时间可能不正确。有两种可能:
|
||
|
2 |
INT16U |
0-7 |
0x00–0x17 |
小时 |
|
8-15 |
0x50–0xC7 |
年
例如,0x7D (125) 对应年份 2025。 |
||
|
3 |
INT16U |
0-7 |
0x00–0x3B |
秒 |
|
8-15 |
0x00–0x3B |
分 |
||
|
4 |
INT16U |
0-15 |
0x0000–0x03E7 |
补码(毫秒)(仅限 XDATE 格式) |
例如,如果 4 个寄存器中编码的 BCM ULP 当前日期为:
-
寄存器 679 = 0x0513
-
寄存器 680 = 0x7D0A
-
寄存器 681 = 0x222E
-
寄存器 682 = 0x0358
那么 BCM ULP 的当前日期和时间为 19/05/2025(2025 年 5 月 19 日)10 时 34 分 46 秒 856 毫秒。
因为:
-
0x0513
-
0x05 = 5(月)
-
0x13 = 19(日)
-
-
0x7D0A
-
0x7D = 125(年)
-
0x0A = 10(小时)
-
-
0x222E
-
0x22 = 34(分钟)
-
0x2E = 46(秒)
-
-
0x0358 = 856(毫秒)
数据类型:DATETIME
DATETIME 是用于对 IEC 60870-5 标准定义的日期和时间进行编码的数据类型。
|
寄存器 |
类型 |
位 |
范围 |
描述 |
|---|---|---|---|---|
|
1 |
INT16U |
0-6 |
0x00–0x7F |
年: 0x00 (00) 至 0x7F (127) 对应年份 2000 至 2127 例如,0x19 (25) 对应年份 2025。 |
|
7-15 |
– |
保留 |
||
|
2 |
INT16U |
0-4 |
0x01–0x1F |
日 |
|
5-7 |
– |
保留 |
||
|
8-11 |
0x00–0x0C |
月 |
||
|
12–15 |
– |
保留 |
||
|
3 |
INT16U |
0–5 |
0x00–0x3B |
分 |
|
6-7 |
– |
保留 |
||
|
8-12 |
0x00–0x17 |
小时 |
||
|
13–15 |
– |
保留 |
||
|
4 |
INT16U |
0-15 |
0x0000–0xEA5F |
毫秒 |
DATETIME 时间戳的特性
以 DATETIME 数据类型编码的时间戳的特性在时间戳的 4 个寄存器之后的寄存器中予以指示。在这种情况下,时间戳特性的编码如下:
|
位 |
描述 |
|---|---|
|
0-11 |
保留 |
|
12 |
外部同步:
|
|
13 |
已同步:
|
|
14 |
日期和时间设置:
|
|
15 |
保留 |
数据类型:ULP DATE
ULP DATE 是用于编码日期和时间的数据类型。本表介绍了 ULP DATE 数据类型。
|
寄存器 |
类型 |
位 |
范围 |
描述 |
|---|---|---|---|---|
|
1 2 |
INT32U |
– |
0x00000000-0xFFFFFFFF |
自 2000 年 1 月 1 日起的秒数 |
|
3 |
INT16U |
– |
– |
补码(毫秒) |
|
0-9 |
– |
对毫秒数进行编码 |
||
|
10-11 |
– |
未使用 |
||
|
12 |
0–1 |
IFM或 IFE 通信接口外部同步状态 0 = 通信接口最后 2 小时内未进行外部同步化。 1 = 通信接口最后 2 小时内进行了外部同步化。 |
||
|
13 |
0–1 |
ULP 模块本地同步状态 0 = ULP 模块没有进行本地同步化。 1 = ULP 模块进行了本地同步化。 |
||
|
14 |
0–1 |
自上次通电后设置绝对日期 0 = 无 1= 是 |
||
|
15 |
– |
保留 |
ULP 日期计数器
自 2000 年 1 月 1 日起,计数(秒)ULP DATE 格式的日期。
如果 IMU 模块出现断电,将复位时间计数器,并从 2000 年 1 月 1 日重新开始。
如果在断电后出现外部同步化,将更新时间计数器,并将同步日期转换为自 2000 年 1 月 1 日起的秒数。
ULP 日期转换原则
要将自 2000 年 1 月 1 日起的秒数日期转换为当前日期,使用以下规则:
-
1 平年 = 365 天
-
1 闰年 = 366 天
年份 2000、2004、2008、2012,...(4 的倍数)为闰年(2100 除外)。
-
1 天 = 86400 秒
-
1 小时 = 3600 秒
-
1 分钟 = 60 秒
下表描述了将自 2000 年 1 月 1 日起的秒数日期转换为当前日期的步骤:
|
步骤 |
操作 |
|---|---|
|
1 |
计算自 2000 年 1 月 1 日起的秒数:S =(寄存器 1 的内容 x 65536)+(寄存器 2 的内容) |
|
2 |
计算自 2000 年 1 月 1 日起的天数:D = S / 86,400 的商的整数值 计算剩余秒数:s = S - (D x 86,400) |
|
3 |
计算当年过去的天数:d = D - (NL x 365) - (L x 366) 其中 NL = 自 2000 年起的平年数量,L = 自 2000 年起的闰年数 |
|
4 |
计算小时数:h = s / 3600 得数的整数值 计算剩余秒数:s’ = s - (h x 3600) |
|
5 |
计算分钟数:m = s’/ 60 得数的整数值 计算剩余秒数:s’’ = s’ - (m x 60) |
|
6 |
计算毫秒数:ms =(寄存器 3 的内容)加上 0x03FF |
|
7 |
结果:
|
