跳到主要内容

DNP3 — 电力 / Utility 标准

DNP3(Distributed Network Protocol v3)是电力公司、供水、燃气等 utility SCADA 中应用最广泛的协议。它是 RTU / IED 与 SCADA master 之间的通信标准,核心特性是时间同步(time-stamped events)可靠上报(unsolicited responses)


注册表单输入项

输入栏填写内容示例
IP 地址RTU / IED 的 IP192.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类型备注
1Binary Input (BI)断路器、触点状态等
10Binary Output (BO)输出状态
20Counter累计计数器
30Analog Input (AI)电流、电压、温度 — 最常见
40Analog Output (AO)输出 setpoint
41Analog Output Block(写入对象)setpoint 写入

在网关中按 g<group>v<variation>.<index>class<n> 格式输入。

表示法含义
g30v1.5Analog Input, var 1 (32-bit + flag), index 5
g30v5.5Analog Input, var 5 (Float), index 5
g1v2.0Binary Input, var 2 (with flag), index 0
g20v1.0Counter, 32-bit, index 0
class0Class 0 polling(静态数据全量扫描)
class1Class 1 events(事件性变化)
Class 0 vs g30v1.x

在项目初期若想“先把所有数据都取回来看看”,建议先用 class0 一次性获取,再挑出需要的点用 g30v... 精确注册,这样更方便。


数据格式匹配

Group数据格式格式辅助
g1 (BI)Boolean(留空)
g30v1 (AI 32-bit signed)IntegerDW
g30v2 (AI 16-bit signed)Integer(留空)
g30v5 (AI float)FloatREAL
g30v6 (AI double)DoubleLREAL
g20v1 (Counter 32-bit)IntegerDW

写入(Write)支持

DNP3 outstation 的写入对象通常有两类。

表示法含义
g41v1.5Analog Output Block 32-bit signed setpoint, index 5
g41v3.5Analog Output Block float setpoint, index 5
g12v1.0Control Relay Output Block (CROB) — 断路器 trip/close 等
CROB 存在风险

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 保持一致。

GroupVar含义大小 / 格式
11Binary Input — packed format (no flag)1 bit
12Binary Input with status(含 flag bit)1 byte
21Binary Input Change — no timeevent
22Binary Input Change — absolute timeevent + 6-byte time
102Binary Output Status (with flag)1 byte
121CROB (Control Relay Output Block) — 仅写11 byte struct
201Counter — 32-bit4 byte
202Counter — 16-bit2 byte
301AI 32-bit signed (with flag)5 byte
302AI 16-bit signed (with flag)3 byte
303AI 32-bit signed (no flag)4 byte
305AI single-precision float (with flag)5 byte
306AI double-precision float (with flag)9 byte
321AI Change — no timeevent
327AI Change — single float, abs timeevent
401AO Status 32-bit signed (with flag)5 byte
411AO Block 32-bit signed(写入对象)5 byte
413AO Block float(写入对象)5 byte

常用运行模式

模式 1. 变电站 IED 的基本测量值(电流、电压、功率)

ABB REC615 / SEL-451 / SEL-735 电表等 IED 通常按如下方式映射。

标签名称地址数据格式格式辅助
A 相电流g30v5.0FloatREAL
B 相电流g30v5.1FloatREAL
C 相电流g30v5.2FloatREAL
总有功功率g30v5.10FloatREAL
频率g30v5.20FloatREAL
断路器 1 位置g1v2.0Boolean(留空)
断路器 2 位置g1v2.1Boolean(留空)

模式 2. 累计计数器(kWh / 燃气 m³ 等)

Counter (Group 20) 为累计值。在展示端计算差值,转换为“每小时用量”。

标签名称地址数据格式
累计有功电量 (kWh)g20v1.0Integer
累计无功电量 (kvarh)g20v1.1Integer

模式 3. 用 CROB 控制断路器(write)

g12v1.0 = "Pulse-On / Trip / Close" 명령 코드

CROB 1 byte control code:

含义
0x01Pulse-On
0x02Pulse-Off
0x03Latch-On
0x04Latch-Off
0x41Trip(保护动作)
0x81Close
select-before-operate

许多 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 自动化示例。