【物联网-电总协议(EMP)】
·
物联网-电总协议(EMP)
■ 电总底层协议(EMP)
| 编号 | 描述 |
|---|---|
| 1 | 电总协议(Electricity Master Protocol,EMP)是一种用于电力系统中设备间数据交换的通信协议。该协议旨在实现不同厂商电力设备之间的互操作性,提高电力系统的自动化和智能化水平。本文档详细描述了电总协议通讯包的格式和内容,以便开发者在设计和实施基于EMP的系统时参考。 |
| 2 | 异步串行协议 UART。缺省为 9600bps。 传输方式为异步方式, 起始位 1 位,数据位 8 位,停止位 1 位,无校验。 |
| 3 | 采用主从通信方式。 |
| 4 | |
| 5 | |
| 6 | |
| 7 | 信息分两种类型: (1)由主机发出到从机的命令信息(简称命令信息) (2)由从机返回到主机的响应信息(简称响应信息) |
■ 01. 信息类型
信息分两种类型:
(1)由主机发出到从机的命令信息(简称命令信息)
(2)由从机返回到主机的响应信息(简称响应信息)
■ 02. 电总协议格式


| 序号 | 字段 | 字节数 | 说明 | 说明2 |
|---|---|---|---|---|
| 1 | SOI ( 0x7E) |
1 | 帧起始标志,固定为十六进制 7EH |
|
| 2 | VER | 1 | 协议版本号 | |
| 3 | ADR | 1 | 设备地址 | |
| 4 | CID1 | 1 | 控制字1 | |
| 5 | CID2 | 1 | 控制字2 | |
| 6 | LENGTH | 2 | 数据长度 (LENID + LCHKSUM) |
LENGTH 数据格式: ![]() LENGTH共2个字节,由 LENID 和 LCHKSUM 组成,LENID表示INFO项的ASCII码字节数,当LENID = 0时,INFO为空,即无该项。 LENGTH传输中先传高字节,再传低字节,分四个ASCII码传送。 LCHKSUM 校验码的计算: D11D10D9D8 + D7D6D5D4 + D3D2D1D0,求和后模16余数取反加1。 例:INFO项的ASCII码字节数为18,即 LENID = 0000 0001 0010B = 18。 LCHKSUM:D11D10D9D8 + D7D6D5D4 + D3D2D1D0 = 0000B + 0001B + 0010B = 0011B,模16余数为 0011B,0011B取反加1 就是1101B,即 LCHKSUM 为1101B。可得:LENGTH 为1101 0000 0001 0010B,即D012H。 |
| 7 | INFO | X | 数据信息区,长度由LENGTH决定(可为空) | 两个字节的整型数据传送顺序为先高字节后低字节。 |
| 8 | CHKSUM | 2 | 整个报文的校验和 | CHKSUM的计算是除SOI、EOI和CHKSUM外,其他字符按ASCII码值累加求和,所得结果模65536余数取反加1。 |
| 9 | EOI ( 0xOD) |
1 | 帧结束标志,固定为十六进制 0DH |
■ 03. 基本数据格式
基本格式中的各项 除SOI和EOI是以( SOI = 7EH,EOI = 0DH)十六进制传输外,其余各项都是以ASCII码的方式传输, 每个字节用两个ASCII码表示,即高四位一个ASCII码表示,低四位用一个ASCII码表示。
例:CID2(控制字2 ) = 4BH,传送时顺序发送34H,42H。
■ 04. LENGTH 数据格式

■ 05. CHKSUM(校验和)
CHKSUM的计算是 除SOI、EOI和CHKSUM外 ,其他字符按ASCII码值累加求和,所得结果模65536余数取反加1。
■ 06. INFO 数据格式

■ 07. CID1

■ 08. CID2(UPS系统编码表)

■ 09. DATAINFO
其 DATAINFO 字段首先为一标示字节 DATAFLAG,标示字节描述如下:
■ 001. DATAFLAG

■ 002. 通信的建立
1. 发送设备查询命令,监控收到查询命令后,返回设备地址。
2. 代码用新的地址区读取操作访问数据,
■ UPS和NR-modebus地址对应关系
uint16_t elecEmm[][2] =
{
{40500,0x44}, //获取告警状态 44H LENID = 00H
{41000,0x43}, //获取开关输入状态 43H
{41500,0xE7}, //获取电池系统模拟量量化数据 E7H
{42000,0xE3}, //获取并机系统模拟量量化数据 E3H
{42500,0xE2}, //获取输出与负载模拟量量化数据 E2H
{43000,0xE1}, //获取输入与旁路模拟量量化数据 E1H
{43500,0x41}, //获取系统模拟量量化数据 41H
// {44000,0x4F}, //获取协议版本号 4FH
// {44500,0x50}, //获取设备地址 50H
// {45000,0x51}, //获取设备厂家信息 51H
{49999,0x00} //无
};
| 41000对应的地址 | 读取寄存器长度 | UPS地址规则 | 描述 | 限制长度0xFF |
|---|---|---|---|---|
| 40500 | 2 | ![]() |
获取告警状态 44H | 数据位置限制在500内 |
| 41000 | 2 | ![]() |
获取开关输入状态 43H | 数据位置限制在500内 |
| 41500 | 2 | ![]() |
获取电池系统模拟量量化数据 E7H | 数据位置限制在500内 |
| 42000 | 2 | ![]() |
获取并机系统模拟量量化数据 E3H | 数据位置限制在500内 |
| 42500 | 2 | ![]() |
获取输出与负载模拟量量化数据 E2H | 数据位置限制在500内 |
| 43000 | 2 | ![]() |
获取输入与旁路模拟量量化数据 E1H | 数据位置限制在500内 |
| 43500 | 2 | ![]() |
获取系统模拟量量化数据 41H | 数据位置限制在0xFF内 |
■ UPS原始数据
■ 测试数据 (验证版本)
■ 01. 获取协议版本号 4FH

[2026-06-24 14:09:58.757]# RECV ASCII>
~22012A4F0000FD8E
■ 02. 获取设备地址 50H

[2026-06-24 14:10:09.368]# RECV ASCII>
~22012A500000FDA3
■ 03. 获取设备厂家信息 51H


[2026-06-24 14:10:18.711]# RECV ASCII>
~22012A510000FDA2
■ 04. 获取告警状态 44H

协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0x44
[2026-06-17 21:50:34.884][发送]: 7e 32 32 30 31 32 41 34 34 30 30 30 30 46 44 41 30 0d (~22012A440000FDA0 )
[2026-06-17 21:50:35.211][接收]: 7e 32 32 30 31 32 41 30 30 39 31 30 36 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 37 41 30 30 30 30 20 20 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 30 30 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 44 33 44 0d (~22012A00910603000000000000007A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD3D )
7e //SOI
32 32 //VER
30 31 //ADR
32 41 //2A
30 30 //RTN
39 31 30 36 //LINGTH 0x9106 == 0x106 = 262
------------------DETA INFO
30 33 //03
30 30 //00 逆变器不同步 00H:正常
30 30 //00 主路电压异常 00H:正常
30 30
30 30
30 30
30 30
30 30 //
37 41 //7A 用户自定义告警数量p 填122(7AH)
30 30 30 30 20 20 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 30 30 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 44 33 44 0d
■ 05. 获取开关输入状态 43H

协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0x43--
[2026-06-17 21:48:22.022][发送]: 7e 32 32 30 31 32 41 34 33 30 30 30 30 46 44 41 31 0d (~22012A430000FDA1 )
[2026-06-17 21:48:22.254][接收]: 7e 32 32 30 31 32 41 30 30 38 30 36 32 30 33 30 32 32 45 45 32 45 30 45 31 45 32 45 30 45 30 45 31 45 30 45 31 45 31 45 30 45 31 45 31 45 30 45 30 45 30 45 30 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 46 46 30 33 36 30 45 30 45 31 45 30 45 30 45 30 45 31 45 30 20 20 20 20 30 30 35 35 35 35 30 35 30 30 30 30 35 34 45 38 45 43 0d (~22012A00806203022EE2E0E1E2E0E0E1E0E1E1E0E1E1E0E0E0E0E0000000000000000000FF0360E0E1E0E0E0E1E0 00555505000054E8EC )
7e //SOI
32 32 //VER
30 31 //ADR
32 41 //2A
30 30 //RTN
38 30 36 32 //80 62
------------------DETA INFO
30 33 //03 DATAFLAGE
30 32 //02 02H: 旁路供电
32 45 //2E 用户自定义数量 填47(2EH)
45 32 //E2 E2H:旁路供电
45 30 45 31 45 32 45 30 45 30 45 31 45 30 45 31 45 31 45 30 45 31 45 31 45 30 45 30 45 30 45 30 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 46 46 30 33 36 30 45 30 45 31 45 30 45 30 45 30 45 31 45 30 20 20 20 20 30 30 35 35 35 35 30 35 30 30 30 30 35 34 45 38 45 43 0d
■ 06. 获取电池系统模拟量量化数据 E7H

协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0xE7 00
[2026-06-17 22:46:19.053][发送]: 7e 32 32 30 31 32 41 45 37 45 30 30 32 30 30 46 44 31 35 0d (~22012AE7E00200FD15 )
[2026-06-17 22:46:19.249][接收]: 7e 32 32 30 31 32 41 30 30 35 30 35 36 30 32 30 30 30 41 30 30 43 30 31 46 34 34 30 30 30 30 30 30 38 30 30 30 30 30 43 38 34 32 36 36 36 36 34 39 34 33 30 30 30 30 30 30 30 30 30 30 30 30 43 43 34 31 30 30 43 30 39 46 34 33 30 30 30 30 30 30 38 30 30 30 43 30 39 46 34 33 30 30 30 30 30 30 38 30 45 43 33 31 0d (~22012A00505602000A00C01F44000000800000C84266664943000000000000CC4100C09F430000008000C09F4300000080EC31 )
7e //
32 32
30 31
32 41
30 30
35 30 35 36 //LINGTH
------------------DETA INFO
30 32 //02 DATAFLAG
30 30 //00 查询对象(TARGET)
30 41 //0A 模拟量个数(10)
30 30 43 30 31 46 34 34 //00C01F44 441FC000=639 电池电压V
30 30 30 30 30 30 38 30 //00000080 80000000=-5.877471754111438e-39 电池电流A
30 30 30 30 43 38 34 32 //0000C842 42C80000=100 电池容量%
36 36 36 36 34 39 34 33 //66664943 43496666=201.39999389648438 电池后备时间min
30 30 30 30 30 30 30 30 //00000000 00000000=00000000 电池健康状态%
30 30 30 30 43 43 34 31 //0000CC41 41CC0000=25.5 电池温度℃
30 30 43 30 39 46 34 33 //预留
30 30 30 30 30 30 38 30 //预留
30 30 43 30 39 46 34 33 //预留
30 30 30 30 30 30 38 30 //预留
45 43 33 31 //SUM
0d //
■ 07. 获取并机系统模拟量量化数据 E3H


协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0xE3 --
[2026-06-17 21:40:19.175][发送]: 7e 32 32 30 31 32 41 45 33 30 30 30 30 46 44 39 30 0d (~22012AE30000FD90 )
[2026-06-17 21:40:19.406][接收]: 7e 32 32 30 31 32 41 30 30 37 30 35 34 31 33 30 41 39 41 39 39 39 39 33 45 43 44 43 43 43 43 33 44 30 30 30 30 38 30 33 46 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 39 41 39 39 39 39 33 45 43 44 43 43 43 43 33 44 30 30 30 30 38 30 33 46 33 33 33 33 42 46 34 31 45 42 38 38 0d (~22012A007054130A9A99993ECDCCCC3D0000803F0000000000000000000000009A99993ECDCCCC3D0000803F3333BF41EB88 )
7e
32 32
30 31
32 41
30 30
37 30 35 34 //LINGTH
------------------DETA INFO
31 33 //13 DATAFLAG
30 41 //0A 模拟量个数(13)
39 41 39 39 39 39 33 45 //9A99993E 3E99999A =0.30000001192092896 并机系统A相输出有功功率 4字节KW
43 44 43 43 43 43 33 44 //CDCCCC3D 3DCCCCCD =0.10000000149011612 并机系统B相输出有功功率 4字节KW
30 30 30 30 38 30 33 46 //0000803F 3F800000 = 1 并机系统C相输出有功功率 4字节KW
30 30 30 30 30 30 30 30 //并机系统A相输出无功功率 kVA
30 30 30 30 30 30 30 30 //并机系统B相输出无功功率 kVA
30 30 30 30 30 30 30 30 //并机系统c相输出无功功率 kVA
39 41 39 39 39 39 33 45 //9A99993E 3E99999A =0.30000001192092896 并机系统A相输出视在功率 Kvar
43 44 43 43 43 43 33 44 //CDCCCC3D 3DCCCCCD =0.10000000149011612 并机系统B相输出视在功率 Kvar
30 30 30 30 38 30 33 46 //0000803F 3F800000 = 1 并机系统C相输出视在功率 Kvar
33 33 33 33 42 46 34 31 //环境温度 度
------------------SUM
45 42 38 38
0d
■ 08. 获取输出与负载模拟量量化数据 E2H


协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0xE2 00
[2026-06-17 21:25:12.931][发送]: 7e 32 32 30 31 32 41 45 32 45 30 30 32 30 30 46 44 31 41 0d (~22012AE2E00200FD1A )
[2026-06-17 21:25:13.274][接收]: 7e 32 32 30 31 32 41 30 30 33 30 46 45 31 33 30 30 31 46 33 33 42 33 36 31 34 33 30 30 30 30 36 33 34 33 43 44 43 43 36 32 34 33 30 30 30 30 43 34 34 33 30 30 38 30 43 34 34 33 36 36 45 36 43 33 34 33 33 33 33 33 31 33 34 30 33 33 33 33 31 33 34 30 33 33 33 33 39 33 34 30 39 41 39 39 34 37 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 44 41 31 0d (~22012A0030FE13001F33B3614300006343CDCC62430000C4430080C44366E6C3433333134033331340333393409A994742000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 CDA1 )
7e
32 32
30 31
32 41
30 30
33 30 46 45 //LINGTH
------------------DETA INFO
31 33 //13 DATAFLAG
30 30 //00 查询对象(TARGET)
31 46 //1F 1F=31 模拟量个数(34)
33 33 42 33 36 31 34 33 //33B36143 A项输出电压
30 30 30 30 36 33 34 33 //00006343 B
43 44 43 43 36 32 34 33 //CDCC6243 C
30 30 30 30 43 34 34 33 //0000C443 43C40000=392 AB线输出电压
30 30 38 30 43 34 34 33 //0080C443 43C48000=393 BC
36 36 45 36 43 33 34 33 //66E6C343 43C3E666=391.79998779296875 CA
33 33 33 33 31 33 34 30 //33331340 40133333= 2.299999952316284 A相输出电流
33 33 33 33 31 33 34 30 //33331340 40133333= 2.299999952316284 B
33 33 33 33 39 33 34 30 //33339340 40933333= 4.599999904632568 C
39 41 39 39 34 37 34 32 //9A994742 4247999A= 49.900001525878906 输出频率(三相一致)Hz
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30 //A相输出有功功率
30 30 30 30 30 30 30 30 //B相输出有功功率
30 30 30 30 30 30 30 30 //c相输出有功功率
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30 //A相输出负载率
30 30 30 30 30 30 30 30 //B
30 30 30 30 30 30 30 30 //C
30 30 30 30 30 30 30 30 //A相输出电能(预留)
30 30 30 30 30 30 30 30 //B
30 30 30 30 30 30 30 30 //C
20 20 20 20 20 20 20 20 //总输出有功功率 KW 8空格 ??????为啥会输出空
20 20 20 20 20 20 20 20 //总输出无功功率 Kvar 8空格
20 20 20 20 20 20 20 20 //总输出视在功率 KVA 8空格
--------------------------SUM
43 44 41 31 //
0d
■ 09. 获取输入与旁路模拟量量化数据 E1H

协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0xE1 00
[2026-06-17 23:53:31.723][发送]: 7e 32 32 30 31 32 41 45 31 45 30 30 32 30 30 46 44 31 42 0d (~22012AE1E00200FD1B )
[2026-06-17 23:53:32.101][接收]: 7e 32 32 30 31 32 41 30 30 34 30 45 45 30 32 30 30 31 44 30 30 30 30 36 35 34 33 39 41 39 39 36 35 34 33 36 36 45 36 36 35 34 33 43 44 38 43 43 36 34 33 33 33 46 33 43 36 34 33 33 33 42 33 43 36 34 33 30 30 30 30 38 30 34 30 39 41 39 39 41 39 34 30 43 44 43 43 39 43 34 30 31 34 41 45 34 37 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 44 43 43 43 43 33 44 43 44 43 43 34 43 33 46 33 33 33 33 33 33 33 46 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39 41 39 39 36 34 34 33 33 33 42 33 36 35 34 33 43 44 34 43 36 35 34 33 36 36 36 36 43 36 34 33 30 30 43 30 43 36 34 33 30 30 34 30 43 36 34 33 45 31 37 41 34 37 34 32 43 44 32 35 0d (~22012A0040EE02001D000065439A99654366E66543CD8CC64333F3C64333B3C643000080409A99A940CDCC9C4014AE4742000000000000000000000000000000000000000000000000CDCCCC3DCDCC4C3F3333333F 9A99644333B36543CD4C65436666C64300C0C6430040C643E17A4742CD25 )
7e
32 32
30 31
32 41
30 30
34 30 45 45 //LINGTH
------------------DETA INFO
30 32 //02 DATAFLAG
30 30 //00 查询对象(TARGET)
31 44 //1D =29 模拟量个数(29)
30 30 30 30 36 35 34 33 //00006543 43650000=229 A相输入电压 4字节 V
39 41 39 39 36 35 34 33 //9A996543 4365999A=229.60000610351562 B
36 36 45 36 36 35 34 33 //66E66543 4365e666=229.89999389648438 c
43 44 38 43 43 36 34 33 //CD8CC643 43c68c43=397.0957946777344 AB线输入电压 4字节 V
33 33 46 33 43 36 34 33 //33F3C643 43c6f333=397.8999938964844 BC
33 33 42 33 43 36 34 33 //33B3C643 43c6b333=397.3999938964844 CA
30 30 30 30 38 30 34 30 //A相输入电流 4字节 V
39 41 39 39 41 39 34 30 //B
43 44 43 43 39 43 34 30 //C
31 34 41 45 34 37 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 44 43 43 43 43 33 44 43 44 43 43 34 43 33 46 33 33 33 33 33 33 33 46 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39 41 39 39 36 34 34 33 33 33 42 33 36 35 34 33 43 44 34 43 36 35 34 33 36 36 36 36 43 36 34 33 30 30 43 30 43 36 34 33 30 30 34 30 43 36 34 33 45 31 37 41 34 37 34 32 43 44 32 35 0d
■ 10. 获取时间 4DH == 77

注: LENID = 0EH,0E==14 14/2=7字节 DATAINFO由DATATIME组成,见表6.5.1。
日期时间数据,按照年、月、日、时、分和秒的顺序发送,最终拆分成14个ASCII码传送 7个字节
modebus-RTU地址:4D00
[2026-06-17 20:44:03.150][发送]: 7e 32 32 30 31 32 41 34 44 30 30 30 30 46 44 39 30 0d (~22012A4D0000FD90 )
[2026-06-17 20:44:03.217][接收]: 7e 32 32 30 31 32 41 30 30 32 30 30 45 30 37 45 39 30 43 30 41 30 45 30 35 31 34 46 41 38 39 0d (~22012A00200E07E90C0A0E0514FA89 )
■ 11. 获取系统模拟量量化数据 41H

协议版本:0x22
地址:0x01
CD1:0x2A
CD2:0x41--
[2026-06-17 23:45:27.563][发送]:
7e 32 32 30 31 32 41 34 31 30 30 30 30 46 44 41 33 0d (~22012A410000FDA3 )
[2026-06-17 23:45:27.711][接收]:
7e 32 32 30 31 32 41 30 30 41 30 36 30 30 32 43 44 43 43 36 34 34 33 36 36 36 36 36 35 34 33 30 30 30 30 36 36 34 33 30 30 38 30 36 33 34 33 36 36 36 36 36 34 34 33 43 44 34 43 36 35 34 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 30 31 46 34 34 39 41 39 39 34 37 34 32 30 30 30 30 30 30 45 39 46 34 0d (~22012A00A06002CDCC644366666543000066430080634366666443CD4C654300000000000000000000000000C01F449A994742000000E9F4 )
7e
32 32
30 31
32 41
30 30
41 30 36 30 //LINGTH
------------------DETA INFO
30 32 //02 DATAFLAG
43 44 43 43 36 34 34 33 //CDCC6443 4364CCCD=228.8000030517578 A相输入电压
36 36 36 36 36 35 34 33 //66666543 43656666=229.39999389648438 B
30 30 30 30 36 36 34 33 //00006643 43660000=230
30 30 38 30 36 33 34 33 //00806343 43638000=227.5 A相输出电压
36 36 36 36 36 34 34 33 //66666443 43646666=228.39999389648438
43 44 34 43 36 35 34 33 //CD4C6543 43654CCD=229.3000030517578
30 30 30 30 30 30 30 30 //00000000 00000000=0 A相输出电流
30 30 30 30 30 30 30 30 //
30 30 30 30 30 30 30 30 //
30 30 43 30 31 46 34 34 //00C01F44 441FC000=639 //直流输入电压(电池电压)
39 41 39 39 34 37 34 32 //9A994742 4247999A=49.900001525878906 输出频率(三相一致) 4(如不支持,则为8个空格) H
30 30 //标示电池数量m(m=0)
30 30 //标示温度数量n(n=0)
30 30 //用户自定义遥测内容数量p(p=0)
------------------sum
45 39 46 34
0d
■ 后面优化后的数据
[2026-07-22 14:02:20.754]# RECV ASCII>
~22012A4F0000FD8E
//1. 获取协议版本号 4FH
[2026-06-24 14:09:58.757]# RECV ASCII>
~22012A4F0000FD8E
-------------------------------------------------------------------
[2026-07-22 14:02:41.324]# RECV ASCII>
~22012A500000FDA3
//2. 获取设备地址 50H
[2026-06-24 14:10:09.368]# RECV ASCII>
~22012A500000FDA3
-------------------------------------------------------------------
[2026-07-22 14:03:00.610]# RECV ASCII>
~22012A510000FDA2
//3. 获取设备厂家信息 51H
[2026-06-24 14:10:18.711]# RECV ASCII>
~22012A510000FDA2
-------------------------------------------------------------------
[2026-07-22 14:03:20.538]# RECV ASCII>
~22012A440000FDA0
//4. 获取告警状态 44H
CD2地址:44--
[2026-06-17 21:50:34.884][发送]: 7e 32 32 30 31 32 41 34 34 30 30 30 30 46 44 41 30 0d (~22012A440000FDA0 )
-------------------------------------------------------------------
[2026-07-22 14:03:41.090]# RECV ASCII>
~22012A430000FDA1
//5. 获取开关输入状态 43H
[2026-06-24 14:10:39.300]# RECV ASCII>
CD2地址:43--
[2026-06-17 21:48:22.022][发送]: 7e 32 32 30 31 32 41 34 33 30 30 30 30 46 44 41 31 0d (~22012A430000FDA1 )
-------------------------------------------------------------------
[2026-07-22 14:04:00.435]# RECV ASCII>
~22012AE7E00200FD15
//6. 获取电池系统模拟量量化数据 E7H
CD2地址:E700
[2026-06-17 22:46:19.053][发送]: 7e 32 32 30 31 32 41 45 37 45 30 30 32 30 30 46 44 31 35 0d (~22012AE7E00200FD15 )
-------------------------------------------------------------------
[2026-07-22 14:04:20.365]# RECV ASCII>
~22012AE30000FD90
//7. 获取并机系统模拟量量化数据 E3H
CD2地址:E3--
[2026-06-17 21:40:19.175][发送]: 7e 32 32 30 31 32 41 45 33 30 30 30 30 46 44 39 30 0d (~22012AE30000FD90 )
-------------------------------------------------------------------
[2026-07-22 14:04:40.913]# RECV ASCII>
~22012AE2E00200FD1A
//8. 获取输出与负载模拟量量化数据 E2H
CD2地址:E200
[2026-06-17 21:25:12.931][发送]: 7e 32 32 30 31 32 41 45 32 45 30 30 32 30 30 46 44 31 41 0d (~22012AE2E00200FD1A )
-------------------------------------------------------------------
[2026-07-22 14:05:00.210]# RECV ASCII>
~22012AE1E00200FD1B
//9. 获取输入与旁路模拟量量化数据 E1H
CD2地址:E100
[2026-06-17 23:53:31.723][发送]: 7e 32 32 30 31 32 41 45 31 45 30 30 32 30 30 46 44 31 42 0d (~22012AE1E00200FD1B )
-------------------------------------------------------------------
[2026-07-22 14:05:20.129]# RECV ASCII>
~22012A410000FDA3
//10.获取系统模拟量量化数据 41H
CD2地址:41--
[2026-06-17 23:45:27.563][发送]:
7e 32 32 30 31 32 41 34 31 30 30 30 30 46 44 41 33 0d (~22012A410000FDA3 )
■ 错误返回码RTN


■ 代码实现
■ 问题点
■ 01. 接收信息中出现0x20字符
接收信息中出现0x20字符(0x20表示空格space)Ascii_To_Byte函数判断不是字符'high_char >= '0' && high_char <= '9') (low_char >= 'A' && low_char <= 'F') 范围返回false 问题 (==为啥中返回中会出现0x20==)
//获取告警状态 44H
注: LENID = 00H 返回130+1
注: DATAINFO由DATAFLAG与WARNSTATE组成, WARNSTATE为UPS供电系统告警状态,见表6.4.1。
modebus-RTU地址:44--
[2026-06-17 21:50:34.884][发送]: 7e 32 32 30 31 32 41 34 34 30 30 30 30 46 44 41 30 0d (~22012A440000FDA0 )
[2026-06-17 21:50:35.211][接收]: 7e 32 32 30 31 32 41 30 30 39 31 30 36 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 37 41 30 30 30 30 20 20 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 30 30 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 20 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 44 33 44 0d (~22012A00910603000000000000007A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CD3D )
#if 0
bool Ascii_To_Byte(char high_char, char low_char, uint8_t *result)
{
uint8_t high = 0, low = 0;
if (high_char >= '0' && high_char <= '9') high = high_char - '0';
else if (high_char >= 'A' && high_char <= 'F') high = high_char - 'A' + 10;
else return false; // 非法字符
if (low_char >= '0' && low_char <= '9') low = low_char - '0';
else if (low_char >= 'A' && low_char <= 'F') low = low_char - 'A' + 10;
else return false; // 非法字符
*result = (high << 4) | low;
return true;
}
#else
bool Ascii_To_Byte(char high_char, char low_char, uint8_t *result)
{
uint8_t high = 0, low = 0;
if (high_char >= '0' && high_char <= '9') high = high_char - '0';
else if (high_char >= 'A' && high_char <= 'F') high = high_char - 'A' + 10;
else if (high_char == 0x20) high=0;
else return false; // 非法字符
if (low_char >= '0' && low_char <= '9') low = low_char - '0';
else if (low_char >= 'A' && low_char <= 'F') low = low_char - 'A' + 10;
else if (low_char == 0x20) low = 0;
else return false; // 非法字符
*result = (high << 4) | low;
return true;
}
#endif
■ 02. 多次获取数据返回是一样的格式
■ 03.
■ 04.
■ 05.
更多推荐










所有评论(0)