【本文发布于https://blog.csdn.net/Stack_/article/details/132946097,未经许可不得转载,转载须注明出处】
协议文档:DL-T 645-2007 多功能电能表通信协议
先用电表厂家提供的上位机进行通讯并拦截数据,再对照协议文档进行以下分析:
一、读取从站地址
读地址的协议格式
请求帧
读地址方式
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|
FE FE | 68 | AA AA AA AA AA AA | 68 | 13 | 00 | DF | 16 |
或者读数据方式
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | AA AA AA AA AA AA | 68 | 11 | 04 | 34 37 33 37 | B6 | 16 |
前导字节:作用是唤醒接收方,FE的个数不强求,各厂家自定,给某些电表发送前导码反而是不会回应的,请求数据时不发送即可。
校验码:第一个起始码68至校验码前一个字节的和取低8位。
数据标识:34 37 33 37,各减去33H,得01H 04H 00H 04H,传输是低字节在前的,故实际是04 00 04 01。对应下图标识码,该标识读取通信地址,即表身上的编号。
应答帧
读地址方式的应答
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 93 | 06 | 33 84 77 4B 44 4A | 45 | 16 |
或者读数据方式的应答
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 91 | 0A | 34 37 33 37 33 84 77 4B 44 4A | 1C | 16 |
前导码:有的电表没有,有的电表有但个数不定,接收时忽略即可。
地址 : 171118445100
标识:34 37 33 37,和请求帧携带的数据标识一致。
数据:33 84 77 4B 44 4A ,还原为BCD码(减33H)后正是地址 17 11 18 44 51 00
获取到通信地址后,使用该地址向从机请求电能数据。
二、读取总电能
读数据的协议格式
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | 00 51 44 18 11 17 | 68 | 11 | 04 | 33 33 33 33 | 86 | 16 |
数据标识: 33 33 33 33 即 00 00 00 00,有功总电能
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 91 | 08 | 33 33 33 33 3B 33 33 33 | DE | 16 |
数据:3B 33 33 33,即00 00 00 08,值为8,总电能分辨率为0.01,所以得0.08kWh
三、读取A相电压
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | 00 51 44 18 11 17 | 68 | 11 | 04 | 33 34 34 35 | 8A | 16 |
数据标识: 33 34 34 35 即 02 01 01 00,A相电压
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 91 | 06 | 33 34 34 35 4C 55 | AD | 16 |
数据:4C 55,即22 19,值为2219,电压分辨率为0.1V,所以得221.9V
四、读取A相电流
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | 00 51 44 18 11 17 | 68 | 11 | 04 | 33 34 35 35 | 8B | 16 |
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 91 | 07 | 33 34 35 35 33 33 33 | A7 | 16 |
数据: 33 33 33,即00 00 00,值为0,电流分辨率为0.001A
五、读取A相有功功率
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | 00 51 44 18 11 17 | 68 | 11 | 04 | 33 34 36 35 | 8C | 16 |
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 91 | 07 | 33 34 36 35 33 33 33 | A8 | 16 |
数据: 33 33 33,即00 00 00,值为0,功率分辨率为0.0001kW
六、读取电网频率
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | 00 51 44 18 11 17 | 68 | 11 | 04 | 35 33 B3 35 | 0A | 16 |
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 91 | 06 | 35 33 B3 35 36 83 | 45 | 16 |
数据: 36 83,即50 03,值为5003,频率分辨率为0.01Hz,所以得实际值50.03Hz
七、修改通信波特率
修改波特率的协议格式
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE | 68 | 00 51 44 18 11 17 | 68 | 17 | 01 | 43 | 00 | 16 |
波特率 | 19200 | 9600 | 4800 | 2400 | 1200 | 600 |
---|---|---|---|---|---|---|
特征字 | 73(40) | 53(20) | 43(10) | 3B(08) | 37(04) | 35(02) |
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 |
---|---|---|---|---|---|---|---|---|
FE FE FE FE | 68 | 00 51 44 18 11 17 | 68 | 97 | 01 | 43 | 80 | 16 |
八、单片机读取
待续