电能表与串口助手485通信基于DLT645-2007通讯协议
(1)拿到一个数字电表,是DDS6866杭州中奈电表,想要做485通信读取电表数据,首先要知道电表的地址域也就是通信地址,地址域由6个字节构成(A0~A5),每个字节2个BCD码,每块电表都有一个唯一的通信地址。这个地址域是可以更改的,下面两个图片是更改后的电表实际地址 ,出厂默认的地址是:201602240158,现在更改为:000000000001。
(2)本通信是基于DLT645-2007通讯协议
通信时串口助手要设置成8位数据位,偶校验和1个停止位。我手上这块电表的波特率默认是2400bps,如果不知道波特率可以一个个试。
下图是控制码格式
下图是数据域编码表,详细的参考DLT645-2007通讯协议,数据域为00 00 00 00是读取总电量,发送数据时每位要加上33
(3)下面是通信发送例子
以下的数据帧均以表地址000000000001为例:
1、广播设地址
控制字(C):15
数据:00 00 00 00 00 01
数据帧:FE FE 68 AA AA AA AA AA AA 68 15 06 34 33 33 33 33 33 1A 16
正确返回数据帧:68 01 00 00 00 00 00 68 95 00 66 16
2、读取总电量:
控制字(C):11
数据ID(DS):00 00 00 00
数据帧:FE FE 68 01 00 00 00 00 00 68 11 04 33 33 33 33 B2 16
返回数据帧:68 01 00 00 00 00 00 68 91 08 33 33 33 33 33 33 33 33 02 16
红色的部分是电量,要减33,减后为00 00 00 00 即0.00度
3、拉闸命令
控制字(C):1C
数据帧:68 01 00 00 00 00 00 68 1C 10 35 33 33 33 44 44 44 44 4D 33 45 68 47 53 43 47 2C 16
正确返回帧: 68 01 00 00 00 00 00 68 9C 00 6D 16
4、合闸命令
控制字(C):1C
数据帧:68 01 00 00 00 00 00 68 1C 10 35 33 33 33 44 44 44 44 4E 33 45 68 47 53 43 47 2D 16
正确返回帧: 68 01 00 00 00 00 00 68 9C 00 6D 16
5、读拉合闸状态
控制字(C):11
数据ID(DS):04000503
数据帧:68 01 00 00 00 00 00 68 11 04 36 38 33 37 BE 16
正确数据返回帧:68 01 00 00 00 00 00 68 91 06 36 38 33 37 33 33 A6 16
红色部分是返回来的状态数据:33 33,要减33,即00 00 根据07协议要求,数据的字节要调换一下,即00 00,即是合闸状态。
如果红色部分返回的数据是:83 33,要减33,即50 00 根据07协议要求,数据的字节要调换一下,即00 50 即是拉闸状态。
具体数据帧里的数据域的数据字节怎么处理请参照DL/T 645-2007标准。这里就不在具体解释了。
(4)下面是读取电表电量数据,通信正常图片。
波特率:2400bps
我发送数据解析:开头是68。电表地址是000000000001(发送地址时要先传送低位)。控制命令11(即读数据)。长度为04。命令为33 33 33 33(这个值要减去33H,即00 00 00 00,这个数据值,就是查电表总有功电量值)。B2是cs校验码,在我自己写的上位机程序里面是自动计算的不需要加上,如果用串口助手需要自己计算并加上。后面还要加上16结束字符;
返回的数据前面的FE忽略即可。91是应答命令(对应控制命令11,正确返回会加上0x80)。08为长度。33 33 33 33 为命令返回值。6C 33 33 33为 39 00 00 00(因为这里是数据域,需要每个字节需要减0x33,且数值为BCD码),这个值为0.39kwh,电表显示的就是这个值,所以符合协议。