【本文发布于https://blog.csdn.net/Stack_/article/details/132946097,未经许可不得转载,转载须注明出处】
协议文档:DL-T 645-2007 多功能电能表通信协议
先用电表厂家提供的上位机进行通讯并拦截数据,再对照协议文档进行以下分析:
一、读取从站地址
读地址的协议格式

请求帧
读地址方式
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 校验码 | 结束符 | FE FE68AA AA AA AA AA AA681300DF16
或者读数据方式
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE68AA AA AA AA AA AA68110434 37 33 37B616
前导字节:作用是唤醒接收方,FE的个数不强求,各厂家自定,给某些电表发送前导码反而是不会回应的,请求数据时不发送即可。
校验码:第一个起始码68至校验码前一个字节的和取低8位。
数据标识:34 37 33 37,各减去33H,得01H 04H 00H 04H,传输是低字节在前的,故实际是04 00 04 01。对应下图标识码,该标识读取通信地址,即表身上的编号。

应答帧
读地址方式的应答
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768930633 84 77 4B 44 4A4516
或者读数据方式的应答
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768910A34 37 33 37 33 84 77 4B 44 4A1C16
前导码:有的电表没有,有的电表有但个数不定,接收时忽略即可。
地址 : 171118445100
标识:34 37 33 37,和请求帧携带的数据标识一致。
数据:33 84 77 4B 44 4A ,还原为BCD码(减33H)后正是地址 17 11 18 44 51 00
获取到通信地址后,使用该地址向从机请求电能数据。
二、读取总电能
读数据的协议格式

请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE6800 51 44 18 11 1768110433 33 33 338616

数据标识: 33 33 33 33 即 00 00 00 00,有功总电能
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768910833 33 33 33 3B 33 33 33DE16
数据:3B 33 33 33,即00 00 00 08,值为8,总电能分辨率为0.01,所以得0.08kWh
三、读取A相电压
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE6800 51 44 18 11 1768110433 34 34 358A16

数据标识: 33 34 34 35 即 02 01 01 00,A相电压
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768910633 34 34 35 4C 55AD16
数据:4C 55,即22 19,值为2219,电压分辨率为0.1V,所以得221.9V
四、读取A相电流
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE6800 51 44 18 11 1768110433 34 35 358B16

应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768910733 34 35 35 33 33 33A716
数据: 33 33 33,即00 00 00,值为0,电流分辨率为0.001A
五、读取A相有功功率
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE6800 51 44 18 11 1768110433 34 36 358C16

应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768910733 34 36 35 33 33 33A816
数据: 33 33 33,即00 00 00,值为0,功率分辨率为0.0001kW
六、读取电网频率
请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE6800 51 44 18 11 1768110435 33 B3 350A16

应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 1768910635 33 B3 35 36 834516
数据: 36 83,即50 03,值为5003,频率分辨率为0.01Hz,所以得实际值50.03Hz
七、修改通信波特率
修改波特率的协议格式

请求帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识(DI0-DI3) | 校验码 | 结束符 | FE FE6800 51 44 18 11 17681701430016

波特率 | 19200 | 9600 | 4800 | 2400 | 1200 | 600 | 特征字73(40)53(20)43(10)3B(08)37(04)35(02)
应答帧
前导码 | 起始码 | 地址域(A0-A5) | 起始符 | 控制码 | 数据域长度 | 数据域/数据标识 | 校验码 | 结束符 | FE FE FE FE6800 51 44 18 11 17689701438016
八、单片机读取
待续