DNP3 — 电力 / Utility 标准
DNP3(Distributed Network Protocol v3)是电力公司、供水、燃气等 utility SCADA 中应用最广泛的协议。它是 RTU / IED 与 SCADA master 之间的通信标准,核心特性是时间同步(time-stamped events)与可靠上报(unsolicited responses)。
注册表单输入项
| 输入栏 | 填写内容 | 示例 |
|---|---|---|
| IP 地址 | RTU / IED 的 IP | 192.168.0.120 |
| 端口 | DNP3 TCP 端口 | 20000(标准) |
| Master 地址 (master-address) | 网关(master)自身地址 | 1 |
| Outstation 地址 (outstation-address) | 对端(slave)的 DNP 地址 | 10 |
| 响应超时 (request-timeout) | 响应等待时间(ms) | 5000 |
| Unsolicited (enable-unsolicited) | 启用 RTU 主动发送(push)— 驱动缓存后在 read() 时优先返回 | all / 1 / 2 / 3 / 1,2(默认留空 = 不使用) |
DNP3 要求 master 地址与 outstation 地址两端完全一致。请在 RTU 侧设置(通常是 ABB / SEL / GE 的 IED 配置工具)中确认 “Source Address” 与 “Destination Address” 是否与网关的 master/outstation 相互对应。
标签的 PLC 地址表示法
DNP3 通过 Group / Variation / Index 来标识数据点。常见 group:
| Group | 类型 | 备注 |
|---|---|---|
| 1 | Binary Input (BI) | 断路器、触点状态等 |
| 10 | Binary Output (BO) | 输出状态 |
| 20 | Counter | 累计计数器 |
| 30 | Analog Input (AI) | 电流、电压、温度 — 最常见 |
| 40 | Analog Output (AO) | 输出 setpoint |
| 41 | Analog Output Block(写入对象) | setpoint 写入 |
在网关中按 g<group>v<variation>.<index> 或 class<n> 格式输入。
| 表示法 | 含义 |
|---|---|
g30v1.5 | Analog Input, var 1 (32-bit + flag), index 5 |
g30v5.5 | Analog Input, var 5 (Float), index 5 |
g1v2.0 | Binary Input, var 2 (with flag), index 0 |
g20v1.0 | Counter, 32-bit, index 0 |
class0 | Class 0 polling(静态数据全量扫描) |
class1 | Class 1 events(事件性变化) |
在项目初期若想“先把所有数据都取回来看看”,建议先用 class0 一次性获取,再挑出需要的点用 g30v... 精确注册,这样更方便。
数据格式匹配
| Group | 数据格式 | 格式辅助 |
|---|---|---|
| g1 (BI) | Boolean | (留空) |
| g30v1 (AI 32-bit signed) | Integer | DW |
| g30v2 (AI 16-bit signed) | Integer | (留空) |
| g30v5 (AI float) | Float | REAL |
| g30v6 (AI double) | Double | LREAL |
| g20v1 (Counter 32-bit) | Integer | DW |
写入(Write)支持
DNP3 outstation 的写入对象通常有两类。
| 表示法 | 含义 |
|---|---|
g41v1.5 | Analog Output Block 32-bit signed setpoint, index 5 |
g41v3.5 | Analog Output Block float setpoint, index 5 |
g12v1.0 | Control Relay Output Block (CROB) — 断路器 trip/close 等 |
g12 (CROB) 会直接动作断路器 / 继电器。在生产环境中务必在完成 select-before-operate 流程并确认权限后再使用。
常见问题与解决方法
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| “No reply” | 地址不匹配 | 确认 master / outstation 两侧地址 |
| 所有值为 0 或 stale | 未收到 unsolicited、link layer 问题 | 尝试用 class0 进行显式 polling |
| “Object not found” | group/variation 错误 | 查阅 RTU 的 “DNP point map” 文档 |
| 时间严重偏差 | DNP3 timestamp 为 UTC 而非本地时间 | 网关按 UTC 接收,在展示端转换 |
Group / Variation 详细对照表
DNP3 的数据模型是“Group”中包含多个“Variation”的结构。即使同为 Group 30 (AI),也存在 32-bit / 16-bit / float / double 等多种表示,需要与 RTU 实际暴露的 variation 保持一致。
| Group | Var | 含义 | 大小 / 格式 |
|---|---|---|---|
| 1 | 1 | Binary Input — packed format (no flag) | 1 bit |
| 1 | 2 | Binary Input with status(含 flag bit) | 1 byte |
| 2 | 1 | Binary Input Change — no time | event |
| 2 | 2 | Binary Input Change — absolute time | event + 6-byte time |
| 10 | 2 | Binary Output Status (with flag) | 1 byte |
| 12 | 1 | CROB (Control Relay Output Block) — 仅写 | 11 byte struct |
| 20 | 1 | Counter — 32-bit | 4 byte |
| 20 | 2 | Counter — 16-bit | 2 byte |
| 30 | 1 | AI 32-bit signed (with flag) | 5 byte |
| 30 | 2 | AI 16-bit signed (with flag) | 3 byte |
| 30 | 3 | AI 32-bit signed (no flag) | 4 byte |
| 30 | 5 | AI single-precision float (with flag) | 5 byte |
| 30 | 6 | AI double-precision float (with flag) | 9 byte |
| 32 | 1 | AI Change — no time | event |
| 32 | 7 | AI Change — single float, abs time | event |
| 40 | 1 | AO Status 32-bit signed (with flag) | 5 byte |
| 41 | 1 | AO Block 32-bit signed(写入对象) | 5 byte |
| 41 | 3 | AO Block float(写入对象) | 5 byte |
常用运行模式
模式 1. 变电站 IED 的基本测量值(电流、电压、功率)
ABB REC615 / SEL-451 / SEL-735 电表等 IED 通常按如下方式映射。
| 标签名称 | 地址 | 数据格式 | 格式辅助 |
|---|---|---|---|
| A 相电流 | g30v5.0 | Float | REAL |
| B 相电流 | g30v5.1 | Float | REAL |
| C 相电流 | g30v5.2 | Float | REAL |
| 总有功功率 | g30v5.10 | Float | REAL |
| 频率 | g30v5.20 | Float | REAL |
| 断路器 1 位置 | g1v2.0 | Boolean | (留空) |
| 断路器 2 位置 | g1v2.1 | Boolean | (留空) |
模式 2. 累计计数器(kWh / 燃气 m³ 等)
Counter (Group 20) 为累计值。在展示端计算差值,转换为“每小时用量”。
| 标签名称 | 地址 | 数据格式 |
|---|---|---|
| 累计有功电量 (kWh) | g20v1.0 | Integer |
| 累计无功电量 (kvarh) | g20v1.1 | Integer |
模式 3. 用 CROB 控制断路器(write)
g12v1.0 = "Pulse-On / Trip / Close" 명령 코드
CROB 1 byte control code:
| 值 | 含义 |
|---|---|
0x01 | Pulse-On |
0x02 | Pulse-Off |
0x03 | Latch-On |
0x04 | Latch-Off |
0x41 | Trip(保护动作) |
0x81 | Close |
许多 RTU 对 CROB 强制要求 SBO(select → operate)流程。即使 PlantPulse 侧以单次 write 下发命令,RTU 也可能拒绝。在这类环境中,需在 RTU 侧开启不使用 SBO 的模式,或通过独立的自动化脚本分两步执行。
参考 / 后续步骤
- RTU 厂商(ABB、SEL、GE、Schneider)的 “DNP3 device profile” PDF 中包含完整的 group/variation/index 映射。
- IEEE 1815-2012 标准文档(DNP3)为官方 spec。
- 参见高级 — REST API 中的 DNP3 自动化示例。