node-red通过指令方式读取DL/T645-2007通信协议数据
- 一、DL/T645-2007通信协议介绍
- 1.1 DL/T645通信链路
- 1.2 DL/T645-2007数据格式
- 1.3 CS校验码生成算法
- 1.4 返回数据解析
- 1.5 返回数据处理
- 二、node-red实现
参考链接:
- DLT645-2007电表协议解析
- DL/T645-2007通信协议应用层
- dlt645-2007协议解析
一、DL/T645-2007通信协议介绍
DL/T645协议是针对电表通信而制定的通信协议,主要有两个版本,分别是DL/T645-97和DL/T645-07。
- DL/T645-1997是1997年版本,DL/T645-2007是2007年的修正版本,目前最新版本是2007版。
- 目前电表根据型号不同可能支持其中一个版本,开发时需要注意。
- 实际应用过程中电表虽然有多个型号,但只要采用的都是07版本,就仅需要兼容这一个版本的协议即可。
- 本文限只针对DL/T645-2007。
1.1 DL/T645通信链路
DL/T645协议设计初时采用RS-485 标准串行电气接口,为主-从结构的半双工通信方式。所以设计了起始符、结束符、效验码等标记保证数据准确性,当然也可以通过TCP方式通信。
回到目录
1.2 DL/T645-2007数据格式
每条数据由:帧起始符、从站地址域、控制码、数据域长度、数据域、帧信息纵向校验码及帧结束符7个域组成。每部分由若干字节组成。
测试数据信息如下:
- 测试电表编号:1023504796
- 通讯波特率:2400
- 数据位:8位
- 停止位:1位
- 校验方式:CS检验
有点类似ModBus协议,格式如下:
其中:
-
地址域的地址刚好和电表上的
地址号相反
,如1023504796 编号对应的地址域号 A0=96 ,A1=47,A2=50,A3=23,A4=10,A5=00 -
控制码格式如下:
-
读取数据发送的数据域根据协议附件的 DI0 DI1 DI2 DI3 顺序来填写 ,
需要注意的是协议上顺序刚好是反过来的。
-
上图实例解析:
发送咨询用(当前)正向有功总电能 :fefefefe 68 964750231000 68 11 4 33333433 xx16
- fefefefe:报文解析
- 68:帧起始符
- 964750231000 :表号,解析为:1023504796
- 11 :控制码-读数据
- 04:读取寄存器的数据长度
- 33333433:对应了DI0到DI3的值 00 00 01 00对应了协议表的(当前)正向有功总电能
- xx:CS校验码,算法详见下节
- 16:结束符
回到目录
1.3 CS校验码生成算法
除去数据头,对其它数据进行16进制相加,将得到的校验位和取后两位。
/**十六进制相加得到十六进制数*/
function hexAdd(hexarr) {
let sum = 0;
for (let h of hexarr) {
sum += h;
}
return sum.toString(16).toUpperCase(); // 将结果转换为大写的十六进制字符串
}
运行结果如下,得到校验和‘312’,取后两位,即校验码为:‘12
’
回到目录
1.4 返回数据解析
返回的数据:fefefefe 68 964750231000 68 91 8 33333433 834B3353 16
格式讲解:
- fefefefe :数据头每条数据都要带(
返回的不一定就是4个,自行截取
)- 68:针起始符
- 964750231000:表号 解析为:1023504796. 从右向左每一个字节的bcd码拼接在一起,就是电表贴的条码上的数字
- 68 :针起始符
- 91:控制码 读取成功
- 08:返回寄存器加数据的长度为8个byte
- 33333433:对应了DI0到DI3的值 00 00 01 00对应了协议表的(当前)正向有功总电能
- 834B3353 :返回的数据,数据处理详见下节
- 16 :结束符
回到目录
1.5 返回数据处理
返回的数据’834B3353’ ,代表(当前)正向有功总电能,数据处理如下:
V0=(D3-DI0).toString(); //十六进制数相减后转成字符串
V1=(D2-DI1).toString(); //十六进制数相减后转成字符串
V2=(D1-DI2).toString(); //十六进制数相减后转成字符串
V3=(D0-DI3).toString(); //十六进制数相减后转成字符串
实际的值V :V= (V0+V1+V2+V3);
将字符串转成整型:V = parseInt(V);
数据格式是两位小数,将数据乘以0.01:V = V*0.01 (kwh);
回到目录