概述
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 字节。
例:210220003011 → 11 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