概述

dlt645 驱动实现 DL/T 645-2007 多功能电能表通信协议,支持 RS-485 串口(RTU)与 TCP 透传(经串口服务器/网关)两种链路。架构参照 S7/Modbus 三层模式:transport + decoder + scheduler

连接方式

串口 (RTU)

适用于直连 RS-485 总线。

配置项 键名 说明 示例
连接方式 connectionType serial serial
串口设备 port 设备路径 /dev/ttyS1
波特率 baudRate 常见 2400/9600 9600
数据位 dataBits 通常 8 8
停止位 stopBits 通常 1 1
校验 parity N/O/E N
超时 (ms) timeout 响应超时 2000
前导字节 preambleBytes 唤醒 0xFE 个数,默认 4 4
发送间隔 (ms) sendInterval 多表轮询间隔 200

TCP 透传

适用于串口服务器、645 协议网关。

配置项 键名 说明 示例
连接方式 connectionType tcp tcp
IP ip 网关/表计 IP 192.168.1.100
端口 port 透传端口 8001
超时 (ms) timeout 响应超时 3000

UI 通道配置见 通道管理 → DLT645 → 连接方式;设备级表地址在设备配置中填写 12 位 BCD 地址。创建设备时可开启 导入标准点位,按 DL/T 645-2007 常用 DI 模板自动生成采集点(配置键 auto_points_enabled,默认开启)。

点位地址格式

{12位表地址}#{DI3-DI2-DI1-DI0}[#{扩展}]

示例:

地址 含义
210220003011#02-01-01-00 A 相电压
210220003011#02-02-01-00 A 相电流
210220003011#00-00-00-00 组合有功总电能
02-01-01-00 仅 DI(表地址取自设备 station_address

DL/T 645-2007 帧格式

68H A0..A5 68H C L DATA CS 16H
字段 长度 说明
起始 1 固定 0x68
地址 A0–A5 6 压缩 BCD,低字节在前
控制 C 1 0x11,读应答 0x91;写 0x14,写应答 0x94
长度 L 1 DATA 域字节数
数据 DATA L 传输时各字节 +0x33
校验 CS 1 从首个 0x68 至 DATA 末字节累加和的低 8 位
结束 1 固定 0x16

串口模式连接前可发送 1–4 字节 0xFE 作为唤醒前导。

表地址编码

12 位十进制地址按 从低位到高位 每 2 位压缩为一个 BCD 字节。
例:21022000301111 30 00 20 02 21(A0 为最低字节)。

数据标识 (DI)

4 字节 DI0 DI1 DI2 DI3,低字节在前;读请求 DATA 为编码后的 DI。
例:02-01-01-00(A 相电压)→ 原始 00 01 01 02,线上为 33 34 34 35

代码结构

internal/driver/dlt645/
├── dlt645.go       # Driver 接口实现
├── transport.go    # TCP / 串口连接、帧收发、重试
├── decoder.go      # 地址解析、帧编解码、BCD 数值转换
├── scheduler.go    # 批量读/写调度与统计
├── config.go       # 配置解析
├── protocol.go     # 协议常量与 +0x33 / 校验和
└── *_test.go       # 单元测试

测试

go test ./internal/driver/dlt645/... -v

覆盖:帧编解码、校验和、表地址/DI 解析、TCP 与串口(含前导字节)mock 收发、调度读写。

常见问题

现象 排查
无应答 表地址、波特率、645-2007/1997 版本、A/B 线
校验失败 线路干扰、增大 sendInterval
TCP 不通 确认网关透传模式与端口
读数为 0 DI 是否正确;检查 Scale 与小数位

参考

  • 开发方案:docs/development_plan/drivers/DL-T-645-2007驱动开发.md
  • UI 帮助:ui/src/components/channel-help/Dlt645Help.vue