
(二)DLT645-2007协议数据帧结构解析
书接上回,下图展示的是DLT645-2007协议读取电表电量的交互过程,数据请求帧里面请求的数据类型是当前正向有功电量。

串口助手通过TH076红外读表器连接电表
PC请求帧: 68 AA AA AA AA AA AA 68 11 04 33 33 34 33 AE 16
电表应答帧: FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
PC请求帧是广播请求当前正向有功电能的DTL646-2007协议数据帧,我们暂时跳过它,首先分析它的应答帧。DLT645-2007协议规定了数据帧结构,如下图:

DLT645-2007帧结构
根据帧结构定义,我们分析出应答帧是电表回复的正向有功电能数据,由固定前导码FE、固定68帧头、表地址、控制码、数据长度、数据类型、校验、帧尾组成,下面将对数据帧不同字段进行着色,方便展示。
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
其中红色部分数据为固定值,FE FE为前导码,用于发送方让接收方提前准备好接收数据,不同厂家不同型号的表前导码FE的个数是不同的,还有些厂家不会发送前导码FE,我们解析接收数据的一般方法是忽略前面N个FE,寻找数据帧中的68帧头作为一帧的起始位置,下面我们进行解析。
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
从第一个68开始到第二个68之间的绿色数据为表号字段,在DLT645协议中规定,表号字段,数据字段都是逆序的,也就是与实际表号循序相反,我们要得到实际表号,需要反转数据帧中的表号字段 72 00 32 09 17 20,反转后我们得到:20 17 09 32 00 72,对比实际表号,确认解析正确。

面板表号
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
应答帧中紫色1字节数据91为帧控制码,它表示本数据帧的帧类型,我们可以根据这个字节判断识别是07还是97协议,也可以通过此字节判断是请求帧还是应答帧,DLT645-2007协议定义如下:

控制码位定义
解析控制码,我们需要将十六进制的控制码 91 转换成二进制数据 10010001,高位的1对应上图控制码中的D7位,我们将转换后二进制数据一一对应到上图中,得出 91 的含义为主站发送的读数据应答帧,从站正确应答,且无后续数据帧。
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
应答帧中黑色1字节数据 08 为数据段长度,它表示从本帧数据中数据段的长度,也就是从长度字节 08 之后有多少个字节是数据段。本帧中长度字段为 08,表示数据段长度为8字节,我们可以据此,将数据段截取出来,即:
33 33 34 33 B9 34 33 33
解析数据段的数据项标识:
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
应答帧中黄色和蓝牙部分数据为数据段,数据段分为两部分,数据项标识部分和数值部分。数据像标识部分为黄色部分 33 33 34 33 ,它也是逆序传输的,且需要统一逐个减去十六进制0x33后才是真实值,步骤如下:
第一步:减去十六进制0x33
33 33 34 33 -------减33-------> 00 00 01 00
第二步:四个字节反转顺序
00 00 01 00 -------反转-------> 00 01 00 00
得到数据项标识 00 01 00 00,查询DLT645-2007协议,可以知道,00 01 00 00 标识当前正向有功总电能,即我们常用的电量值。

DLT645协议数据标识定义
tips:减0x33计算可用windows计算器完成,记得切换到程序员十六进制下。

windows计算器
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
应答帧中蓝色部分数据是当前正向有功电能,也就是我们常用的电量,同样的,它也是逆序传输的,且需要统一逐个减去十六进制0x33后才是真实值,下面我们对 B9 34 33 33 进行三步处理:
第一步:减去十六进制0x33
B9 34 33 33 --------减33--------> 86 01 00 00
第二步:四个字节反转顺序
86 01 00 00 --------反转--------> 00 00 01 86
第三步:在指定位置加入小数点
00 00 01 86 ------加小数点-----> 00 00 01.86
三步骤完成得出当前电量为1.86kW.h,对比电表实际示数,发现计算正确,下图是实际电表👇

实际值
第三步中的小数点位置在DL645协议中由规定,查询得知,它的固定格式为: XXXXXX.XX 不同类型的数据项小数点格式不同,解析其他数据项时,应根据协议规定套用不同数据格式。

数据格式定义
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
通信校验是很重要,但是DLT645只有一个字节的简单校验和,即接收帧中紫色6D,他固定为倒数第二字节,它的值是它前面从第一个68起始符开始到最后一字节数据段的单字节累加和(单字节累加,忽略溢出),如下图删除线指示的累加范围:
FE FE 68 72 00 32 09 17 20 68 91 08 33 33 34 33 B9 34 33 33 6D 16
计算方式是十六进制加法:
68+72+00+32+09+17+20+68+91+08+33+33+34+33+B9+34+33+33=46D
计算结果为十六进制的46D,超出一个字节的高位溢出部分我们忽略,也就是忽略高位4,最后计算出的校验和为6D,经过对比我们收到的校验码也是6D,校验通过。

上面是一帧数据的手工解析方法,为的是深入理解DLT645协议,实际工程中我们还需要借助工具解析数据帧,为此我开发了DLT645调试小程序"红外抄表",大家可以在微信上搜索小程序“红外抄表”或者扫描下方二维码找到小程序,里面有自动解析工具可以解析DLT645协议的数据帧。

微信小程序

小程序操作界面

小程序解析结果
上面介绍的数据交互都是通过新科聚合的TH076红外读表器与电表交互的,TH076红外读表器是新科聚合专门针对电表采集行业推出的红外读表器,它可以将红外信号转换成RS485信号,连接各类物联网关或者电脑,相比传统停电接485线缆,具有低施工成本,高实施速度的特点。
上面介绍的“红外抄表”微信小程序是TH076红外读表器的配套的小程序,借助小程序用户可以直接手机蓝牙连接TH076红外读表器,现场就可以测试电表的可接入性。
TH076红外读表器可以实现免停电,免拆装电表、非侵入式的数据采集,它采用38k红外调制波与电表建立DL/T645通信,采集正向有功电量,电压,电流,功率等重要参数,红外数据采集器的红外读头贴在计量柜玻璃窗或者电表附近即可。

至此,我们初步完成DLT645-2007协议电量数据应答帧的解析,成功解析出当前电量数据项,并于实际电表表盘示数确认一致。
下一篇文章我们将解析DLT645-2007的电量请求帧。