DLT645 通讯协议JAVA解码器_dlt 645-2007 java代码

工具

DLT645电表模拟器

源码

  • fox-edge-server-protocol-dlt645-core

源码

  • fox-edge-server-protocol-dlt645-1997

源码

Maven

    
    <dependencies>
        <!-- fox-tech协议解码器的core包-->
        <dependency>
            <groupId>cn.fox-tech</groupId>
            <artifactId>fox-edge-server-protocol-core</artifactId>
            <version>1.0.0</version>
        </dependency>
        
        <!-- dlt645解码器的core包-->
        <dependency>
            <groupId>cn.fox-tech</groupId>
            <artifactId>fox-edge-server-protocol-dlt645-core</artifactId>
            <version>1.0.0</version>
        </dependency>
        
        <!-- dlt645解码器-->
        <dependency>
            <groupId>cn.fox-tech</groupId>
            <artifactId>fox-edge-server-protocol-dlt645-1997</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>

模板

模板文件

可以参考下列文件的格式,自己配置配置一个模板文件,那么可以让解码器装载这些模板文件,就可以自动解析数据

模板文件

fox-edge
├─template
│  ├─dlt645
│  │  └─1.0.0
│  │    └─DLT645-1997.csv
│  │    └─DLT645-2007.csv

格式说明

  • DLT645-2007.csv
di1hdi1ldi0hdi0lformatlengthunitreadwritename
di1高位di1低位di0高位di0低位数据格式长度单位是否可读是否可写对象名称
说明:DLT645解码器会根据这张表,对设备进行读取数据后,进行解析成方便用户理解的数据对象

1、di1h/di1l/di0h/di0l
DLT645协议中,将一个个对象用固定的数字ID标识,在报文中进行传输,可以参考DLT645协议的文档

2、format/length/unit/read/write
DLT645协议中,将一个个对象在传输的时候,会根据DI指明该数据对象的解析格式,单位是什么,是否可读可写,可以参考DLT645协议的文档

3、name
DI值只是方便对象在报文传输,对象具体含有还是要给它取个对象名,方便解析之后,被后面的业务应用进行使用



说明:
具体内容,可以参考DLT645-1997.csv和DLT645-2007.csv文件内容
然后,开发者修改模板文件的内容,就能适配各个厂家的DLT645设备了


报文配置
  1. 读取DLT645的电表数据
[
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "日期及周次",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "时间",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "电表运行状态字",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "电网状态字",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "周休日状态字",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "表号",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "用户号",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  },
  {
       "param": {
            "tableName": "DLT645-v1997/1.0.0/DLT645-1997.csv",
            "objectName": "自动抄表日期",
            "deviceAddress": "351253111111"
       },
       "timeout": 2000,
       "operateMode": "exchange",
       "operateName": "读数据"
  }
]

DLT645电表接入演示

软件下载
    1、虚拟串口

    virtualserialportdriver8.rar

    2、串口监听工具

    CEIWEI_CommMonitor_v12.0.1.exe

    3、DLT645模拟器软件下载

    DLT645%20simulator 20v2.7.1.rar


    上述软件,可以去百度下载后安装到本地
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/97b5b522220c67f34ced4ca5a83c02de.png)

![img](https://img-blog.csdnimg.cn/img_convert/e10a8bb424942f7aeba3c4573ffd62f2.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/309805635956ab287e2cea258ddd1d14.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/6a8bbda6a458535bcf5fc177a1ce76c5.png)

![img](https://img-blog.csdnimg.cn/img_convert/78160110be2ec522cc0830074905f96c.png)

![img](https://img-blog.csdnimg.cn/img_convert/7019013f1396a522953b0c3fddd8251b.png)

![](https://img-blog.csdnimg.cn/img_convert/8af25d9f87bc79ae13df9149d67c137e.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


1)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现DLT645协议的编解码通讯的基本代码实现,仅供参考: 1. 连接电能表 ``` import jssc.SerialPort; import jssc.SerialPortException; public class DLT645Connect { private SerialPort serialPort; public void connect(String portName) { serialPort = new SerialPort(portName); try { // 设置串口参数 serialPort.openPort(); serialPort.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (SerialPortException e) { e.printStackTrace(); } } public void disconnect() { try { serialPort.closePort(); } catch (SerialPortException e) { e.printStackTrace(); } } public byte[] sendCommand(byte[] cmd) { byte[] response = null; try { serialPort.writeBytes(cmd); response = serialPort.readBytes(10, 2000); // 等待最多2秒钟 } catch (SerialPortException e) { e.printStackTrace(); } return response; } } ``` 2. 发送请求帧 ``` public class DLT645Protocol { private static final byte[] START_CODE = new byte[] { (byte) 0xFE }; private static final byte[] ADDRESS_CODE = new byte[] { (byte) 0x68, 0x01, 0x00, 0x00, 0x00, 0x01 }; private static final byte[] CONTROL_CODE = new byte[] { (byte) 0x11 }; private static final byte[] REQUEST_CODE = new byte[] { 0x01, 0x02, 0x43, 0x03 }; private static final byte[] END_CODE = new byte[] { (byte) 0x16 }; private DLT645Connect connect; public DLT645Protocol(DLT645Connect connect) { this.connect = connect; } public double readEnergy() { byte[] cmd = buildCommand(REQUEST_CODE); byte[] response = connect.sendCommand(cmd); double energy = parseEnergy(response); return energy; } private byte[] buildCommand(byte[] data) { byte[] cmd = new byte[15]; int len = data.length; int sum = 0; for (int i = 0; i < len; i++) { cmd[i + 5] = data[i]; sum += data[i]; } sum += 0x68 + 0x11 + len; cmd[0] = START_CODE[0]; System.arraycopy(ADDRESS_CODE, 0, cmd, 1, 6); cmd[7] = CONTROL_CODE[0]; cmd[8] = (byte) len; System.arraycopy(data, 0, cmd, 9, len); cmd[9 + len] = (byte) (sum & 0xFF); cmd[10 + len] = END_CODE[0]; return cmd; } } ``` 3. 接收响应帧 ``` public class DLT645Protocol { private static final byte[] START_CODE = new byte[] { (byte) 0xFE }; private static final byte[] ADDRESS_CODE = new byte[] { (byte) 0x68, 0x01, 0x00, 0x00, 0x00, 0x01 }; private static final byte[] CONTROL_CODE = new byte[] { (byte) 0x11 }; private static final byte[] REQUEST_CODE = new byte[] { 0x01, 0x02, 0x43, 0x03 }; private static final byte[] END_CODE = new byte[] { (byte) 0x16 }; private DLT645Connect connect; public DLT645Protocol(DLT645Connect connect) { this.connect = connect; } public double readEnergy() { byte[] cmd = buildCommand(REQUEST_CODE); byte[] response = connect.sendCommand(cmd); double energy = parseEnergy(response); return energy; } private byte[] buildCommand(byte[] data) { byte[] cmd = new byte[15]; int len = data.length; int sum = 0; for (int i = 0; i < len; i++) { cmd[i + 5] = data[i]; sum += data[i]; } sum += 0x68 + 0x11 + len; cmd[0] = START_CODE[0]; System.arraycopy(ADDRESS_CODE, 0, cmd, 1, 6); cmd[7] = CONTROL_CODE[0]; cmd[8] = (byte) len; System.arraycopy(data, 0, cmd, 9, len); cmd[9 + len] = (byte) (sum & 0xFF); cmd[10 + len] = END_CODE[0]; return cmd; } private double parseEnergy(byte[] response) { double energy = Double.NaN; if (response != null && response.length >= 14) { int dataLen = response[8]; if (response.length == 14 + dataLen && response[0] == START_CODE[0] && response[6] == CONTROL_CODE[0] && response[7] == dataLen) { int sum = 0; for (int i = 0; i < dataLen; i++) { sum += response[i + 9] & 0xFF; } sum += 0x68 + 0x91 + dataLen; if ((sum & 0xFF) == response[response.length - 2]) { int value = 0; for (int i = 0; i < dataLen; i++) { value <<= 8; value |= response[i + 9] & 0xFF; } energy = value * 0.01; } } } return energy; } } ``` 需要注意的是,上述代码仅为示例代码,并未进行完整测试和优化,具体实现还需要根据实际需求进行调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值