首页 - 关于研博 - 技术笔记 - 电能表DLT645协议解析
电能表DLT645协议解析
2025.02.07

一、概述

  DLT645-2007协议是由中国电力公司发布的一种用于电能表与外部设备(如集抄终端)之间通信的标准协议。它主要用于实时获取电能表的数据,支持数据传输、参数设定、控制等功能。该协议的传输方式一般是通过串口或TCP/IP网络进行。DLT645-2007协议结构简单,以数据帧的形式组织信息。每帧数据包含起始符、地址域、控制域、数据域和校验码等信息。

(一) 协议数据格式

1.起始符:一般为0x68字节。

2.地址域:用于标识电能表的地址,通常为1个字节。

3.控制域:定义操作类型(读、写等),一般为1个字节。

4.数据域:包含实际传输的数据,长度可变。

5.校验码:用于校验数据的完整性,通常采用LRC(纵向冗余校验)。

6.结束符:标志报文结束

  在DLT645-2007协议中,所有数据的传输都需要校验和控制,确保数据的正确性和可靠性。

(二) 示例报文

FE FE FE FE        //数据起始
68                 //帧起始符
62 01 76 00 00 81  //地址域
68                 //帧起始符
11                 //控制码
04                 //数据域长度
35 37 33 37        //数据域
15                 //校验码
16                 //结束符

(三) 控制码格式

  如下所示的是智能DLT645-2007通信时的控制码格式,通过不同的控制码,可以实现对电表进行写入或读取电表的数据信息。

(四) 数据解析

发送咨询用电量命令:fefefefe 68 292507072120 68 11 04 33333333 4e16
格式讲解
fefefefe 数据头每条数据都要带
68 针起始符
292507072120 表号 解析为 202107072529 从右向左每一个16进制byte拼接在一起,就是电表贴的条码上的数字
68 针起始符
11 控制码 读取的意思
04 读取寄存器的数据长度
33333333 寄存器,解析为要读取00000000号寄存器,从右向左每一个16进制-33(16进制拼接) (33-33)+(33-33)+(33-33)+(33-33)=00000000
4e 校验位和后两位 68+29+25+07+07+21+20+68+11+04+33+33+33+33=24e 取后两位=4e
16 结束符

接收到数据fefefefe 68 292507072120 68 91 08 33333333 a94a3633 2e16
格式讲解
fefefefe 数据头每条数据都要带
68 针起始符
292507072120 表号 解析为 202107072529 从右向左每一个16进制byte拼接在一起
68 针起始符
91 控制码 读取的意思
08 返回寄存器加数据的长度为8个byte
33333333 寄存器,解析为要读取00000000号寄存器,从右向左每一个16进制-33(16进制拼接) (33-33)+(33-33)+(33-33)+(33-33)=00000000
a94a3633 返回的数据,代表电量, 从右向左每一个16进制-33(16进制拼接)(33-33)+(36-33)+(4a-33)+(a9-33)=31776*0.01=317.76 kw/h
2e 校验位和后两位,除去数据头对其它数据进行16进制相加68+29+25+07+07+21+20+68+11+04+33+33+33+33+a9+4a+36+33=42e 取后两位=2e
16 结束符

二、协议包编写

(一) decode方法

public void decode(OperatorSupplier supplier, DeviceSession deviceSession, ProtocolMessage<?> message, MessageExporter<DeviceMessage<?>> messageExporter) {
        TcpProtocolMessage message1 = (TcpProtocolMessage) message;
        ByteBuf payload = message1.getPayload();
        /*byte[] bytes = new byte[payload.readableBytes()];
        payload.readBytes(bytes);
        String payloadStr = HexStringUtil.bytes2HexStr(bytes);*/
        if (payload.readableBytes() < 6) {
            return; // 数据不足,等待更多数据
        }

        // 获取起始符(0x68)
        byte startByte = payload.readByte();
        if (startByte != (byte) 0x68) {
            throw new ServiceException("Invalid start byte");
        }

        // 获取数据长度
        int length = payload.readByte(); // 假设1字节长度字段
        if (payload.readableBytes() < length + 2) {
            return; // 等待数据完整
        }

        // 解析数据域
        byte[] data = new byte[length];
        payload.readBytes(data);

        // 校验数据(LRC校验)
        byte checkByte = payload.readByte();
        if (!checkLRC(data, checkByte)) {
            throw new ServiceException("LRC checksum failed");
        }

        // 构造消息实体通过消息总线发布
        DLT645Data dlt645Data = new DLT645Data(data);

    }

  校验方法

private boolean checkLRC(byte[] data, byte checkByte) {
        byte lrc = 0;
        for (byte b : data) {
            lrc ^= b;
        }
        return lrc == checkByte;
    }

  以上就是对于DLT645协议的解析,如有不足之处望大家多多指出,我们加以学习改进。

获取相关资料
下载地址将会发送至您填写的邮箱
相关新闻
HJ212环境监测数据传输协议
2025-02-14
水文SL651协议解析
2025-01-17
JT/T808 协议解析
2025-01-10
  • 在线客服
  • 电话咨询
  • 微信
  • 短视频