(一)初识 DLT645协议
DLT645协议是一种国内电表远传协议,与Modbus协议类似,采用请求应答式交互模型,采集器和电表一问一答进行通信,电气层可以是经典的RS485有线通信,也可以是非接触式红外无线通信。
非接触式红外读表方式最为常见,它的特点是易于工程实施,电表、计量柜不需要停电接线,将支持DLT645标准的红外读表器放置在电表前方就可以读到电表电量、电压、电流、功率等数据。本篇文章主要是初步认识DLT645,后面几篇文章会介绍新科TH076红外读表器和DLT645协议数据帧的详细解析。
DLT645是国内电力行业通信标准,国网南网的表基本都支持,距今为止有两个版本,DL/T645-1997协议和DL/T645-2007协议,以下简称97协议和07协议,两者帧结构类似,新出厂的表具都会支持07协议,电表厂商为了向前兼容,支持07的表,会同时支持97协议,用两种协议都可以进行通信。
下图展示的是DLT645-2007协议读取电表电量的交互过程,数据请求帧里面请求的数据类型是当前正向有功电量。
PC请求帧: 68 AA AA AA AA AA AA 68 11 04 33 33 34 33 AE 16
电表应答帧: 68 01 72 00 72 00 00 68 91 08 33 33 34 33 33 33 33 33 E7 16
数据请求帧和应答帧都以十六进制68开头,以16结尾,本节文章主要是初步认识DL/T645协议,具体数据帧字段构成和解析,将会在下篇文章载出。
支持DLT645协议的表,会在表盘位置写明DL/T645-2007或者1997的字样,有少数表会表DLT614,614协议是645协议的超集。
支持645协议的表,表盘上会有明显位置放置红外收发窗口,一般是一个椭圆形窗口,内部有一个发送报文的红外发光二极管和一个接收报文的38K一体化红外接收头。
DLT645协议其实规定了两种红外通信方式,调制型通信和非调制型红外(另一种说法叫做近红外,其实两种红外的波长都一样,都是940nm),电表厂商一般都会采用调制型红外,采用37.9k红外调制信号收发信号,调制型会比非调试型的光电耦合传输更方便,有更高的抗干扰性和通信距离。
贴几张平时调试时候留下的图,覆盖了几个主要电表厂商,有科陆、华立、浩宁达,赫美、安科瑞、凤凰仪表、深宝电等,大家先认识下,注意看2个表盘特征:
1)表盘DLT645字样
2)表盘红外收发串口
电表和读表器
(二)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为前导码,用于发送方让接收方提前准备好接收数据,不同厂家不同型号的表前导码FE的个数是不同的,还有些厂家不会发送前导码FE,我们解析接收数据的一般方法是忽略前面N个FE,寻找数据帧中的68帧头作为一帧的起始位置,下面我们进行解析。
解析表号:
从第一个68开始到第二个68之间的绿色数据为表号字段,在DLT645协议中规定,表号字段,数据字段都是逆序的,也就是与实际表号循序相反,我们要得到实际表号,需要反转数据帧中的表号字段 72 00 32 09 17 20,反转后我们得到:20 17 09 32 00 72,对比实际表号,确认解析正确。
面板表号
解析控制码:
应答帧中紫色1字节数据91为帧控制码,它表示本数据帧的帧类型,我们可以根据这个字节判断识别是07还是97协议,也可以通过此字节判断是请求帧还是应答帧,DLT645-2007协议定义如下:
控制码位定义
解析控制码,我们需要将十六进制的控制码 91 转换成二进制数据 10010001,高位的1对应上图控制码中的D7位,我们将转换后二进制数据一一对应到上图中,得出 91 的含义为主站发送的读数据应答帧,从站正确应答,且无后续数据帧。
解析数据段长度:
应答帧中黑色1字节数据 08 为数据段长度,它表示从本帧数据中数据段的长度,也就是从长度字节 08 之后有多少个字节是数据段。本帧中长度字段为 08,表示数据段长度为8字节,我们可以据此,将数据段截取出来,即:
解析数据段的数据项标识:
应答帧中黄色和蓝牙部分数据为数据段,数据段分为两部分,数据项标识部分和数值部分。数据像标识部分为黄色部分 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计算器
解析电量:
应答帧中蓝色部分数据是当前正向有功电能,也就是我们常用的电量,同样的,它也是逆序传输的,且需要统一逐个减去十六进制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 不同类型的数据项小数点格式不同,解析其他数据项时,应根据协议规定套用不同数据格式。
数据格式定义
解析和计算校验和:
通信校验是很重要,但是DLT645只有一个字节的简单校验和,即接收帧中紫色6D,他固定为倒数第二字节,它的值是它前面从第一个68起始符开始到最后一字节数据段的单字节累加和(单字节累加,忽略溢出),如下图删除线指示的累加范围:
计算方式是十六进制加法:
68+72+00+32+09+17+20+68+91+08+33+33+34+33+B9+34+33+33=46D
计算结果为十六进制的46D,超出一个字节的高位溢出部分我们忽略,也就是忽略高位4,最后计算出的校验和为6D,经过对比我们收到的校验码也是6D,校验通过。