中华人民共和国电力行业标准 DL/T 645-2007 多功能电表通信规约解析
最近在给一家企业做能源管理系统(EMS),用C#做上位机采集用电、用水、用汽等信息,其中常用的接线方式为RS485,常用通信协议为MODBUS协议。
在做电能表数据采集的时候,电表的协议是 DL/T 645-2007,之前花了好多时间寻找资料,解析协议,所以特此记录一下。
整个EMS系统的通信方式为:
主机发送请求——从机接收请求——从机返回数据——主机接收数据
下图是实际在厂区中安装的一块电能表,我印象中这种表好像是宁波三星生产的(不是韩国那个三星)。
这块电能表的编号(条形码)是:20200211849964,这一串编号中包含了这块表的地址。
编号的最后12个数字是 20 02 11 84 99 64
这12个数字两两一组,颠倒顺序:64 99 84 11 02 20,这就是这块表的地址!!!
以下数据均为16进制数据!!!
读正向有功总电能
主机发送:FE FE FE FE 68 64 99 84 11 02 20 68 11 04 33 33 34 33 66 16
从机返回:FE FE FE FE 68 64 99 84 11 02 20 68 91 08 33 33 34 33 66 37 33 33 ED 16
请求的命令:FE FE FE FE 68 64 99 84 11 02 20 68 11 04 33 33 34 33 66 16
FE FE FE FE 唤醒接收方,发送一个或多个FE(发4个正好凑够20字节)。
68 帧起始符,规定68。
64 99 84 11 02 20 地址域,上面的地址。
68 帧起始符,规定68。
11 控制码,11代表读取数据。
04 数据长度,长度是多少看协议。
33 33 34 33 数据域(这个计算比较复杂,以后再说)
7D 校验码(8位校验和)
16 结束符,规定是16
返回的数据:FE FE FE FE 68 64 99 84 11 02 20 68 91 08 33 33 34 33 66 37 33 33 ED 16
FE FE FE FE 唤醒接收方(同上)
68 帧起始符(同上)
68 93 38 18 80 00 地址,表号按两位拆分后倒序排列(同上)
68 帧起始符(同上)
91 控制码(91无后续数据帧,B1有后续数据帧)
08 返回的数据长度
33 33 34 33 数据域
64 34 34 33 数据域(真正的数据,这才是需要解析的数据)
ED 校验码(8位校验和)
16 结束符(同上)
理论上来说,是这样,但是!!!在实际的调试过程中,地址并不是这样!!!
地址是 64 99 84 11 00 00 !!!只用到了最后8个数字。
实际发送:FE FE FE FE 68 64 99 84 11 00 00 68 11 04 33 33 34 33 44 16
实际接收:FE 68 64 99 84 11 00 00 68 91 08 33 33 34 33 66 37 33 33 CB 16
XCOM调试界面:
返回的数据起始也只有一个FE。
初除此之外,另外一个厂家生产的电能表,同样支持DL/T 645-2007协议的表,其地址又不相同!!!
编号:1808359810008897
发送:FE FE FE FE 68 97 88 00 00 00 00 68 11 04 33 33 34 33 D1 16
返回:FE 68 97 88 00 00 00 00 68 91 08 33 33 34 33 B9 54 54 33 E9 16
这里只用了编号的最后4位数字(两两倒序)作为地址。
虽然发送和返回的数据都遵守DL/T 645-2007通信规约,但地址是多少,还需要根据具体的电能表来测试。