摘要:DL/T645规约是针对电表通信而制定的通信协议,主要有两个版本,分别是DL/T645-97和DL/T645-07,97代表是97年制定的协议,07则是2007年修正后的协议,而且基本上07版出来时,是要替代97版的通信协议的,但是比较坑的是,目前很多厂家的电表是支持这两种通信协议的,目前新表主流还是07版的。下面就解析这两种表通信协议:
DL/T645-07:
数据帧格式:
注意事项:
(1)前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,
我见过回复信息中,没有FE的,也有4个FE的,所以对于接受程序,一定要慎重。
(2)传输次序-所有的数据项都是先传低字节,再传高字节,这里的数据项,主要涉及到地址域和数据域,因为其他都是1个字节。
(3)差错控制-通信偶校验。
(4)数据与传输运算方式:主站加0x33,从站减0x33(为嘛这么定义,可能是考虑BCD码吧)
电表的数据参数有很多,而我们经常使用的就两种,读表地址和读当前正向有功总电量(耗电量)
1、读表地址
虽然电表出厂的地址已经在标牌上了,8位数,而且,他们都是 BCD码,不是十进制。
这个表的出厂地址为:00613310,虽然在协议里,表是6个字节,补0即可。
但是有些表是被改过地址的,为了读准确的地址,读表地址命令为:
FE FE FE 68 AA AA AA AA AA AA 68 13 00 DF 16
其中FE 为前导地址,AA AA AA AA AA AA算是读表地址专用地址,13控制码,根据协议,就是读地址控制码,DF为校验,16是结尾。
2、读当前正向有功总电量(假设表号为12345678)
命令:FE FE FE FE 68 78 56 34 12 00 00 68 11 04 33 33 34 33 C6 16
其中:78 56 34 12 00 00 是表地址,传输次序是低在前,高在后,而且是十六进制。
11-读数据命令。
04-数据域长度为4
33 33 34 33-这里真实的含义应该是想读 00 00 01 00,因为加了0x33 ,而
所以,传输次序-低在前,高在后,然后再加0x33,就是33 33 34 33了,(这里面好绕)
返回数据:68 78 56 34 12 00 00 68 91 08 33 33 34 33 A4 56 79 38 F5 16
注意,这里面没有前导字节FE,并不代表所有的电表厂家都没有,而且还是不固定的,所以一定小心写程序,因为不同厂家电表回的前导字节个数不一样。
其中:78 56 34 12 00 00 是表地址,传输次序是低在前,高在后,而且是十六进制。
91-为从返回命令
08-共8个字节
33 33 34 33-数据块,可以理解成寄存器地址。
A4 56 79 38-具体数据,分析时,应减33,所以为:
A4-33=71
56-33=23
79-33=46
38-33=5
实际的电表数为:54623.71度