DNP3(电力 / 公用事业)
DNP3(分布式网络协议 v3)是电力公司 / 水务 / 燃气等公用事业 SCADA 中最广泛使用的协议。它是 RTU / IED 与 SCADA 主站之间的通信标准,其核心特点是带时间戳的事件(time-stamped events) 和可靠的上报(unsolicited responses)。
注册表单输入值
| 输入字段 | 填写内容 | 示例 |
|---|---|---|
| IP 地址 | RTU / IED 的 IP | 192.168.0.120 |
| 端口 | DNP3 TCP 端口 | 20000(标准) |
| 主站地址 (master-address) | 网关(主站)自身的地址 | 1 |
| 子站地址 (outstation-address) | 对端(从站)的 DNP 地址 | 10 |
| 响应超时 (request-timeout) | 等待响应时间(毫秒) | 5000 |
| 非请求响应 (enable-unsolicited) | 启用 RTU 的主动上报(推送) — 驱动缓存后在 read() 时优先返回 | all / 1 / 2 / 3 / 1,2(默认留空 = 未使用) |
DNP3 要求主站地址 / 子站地址双方必须完全一致。请检查 RTU 侧配置(通常是 ABB / SEL / GE 的 IED 配置工具)中,“源地址”和“目标地址”是否与网关的主站/子站地址配对。
标签的 PLC 地址表示
DNP3 通过 组 / 变体 / 索引 来标识数据点。常见的组:
| 组 | 类型 | 备注 |
|---|---|---|
| 1 | 二进制输入 (BI) | 断路器、触点状态等 |
| 10 | 二进制输出 (BO) | 输出状态 |
| 20 | 计数器 | 累积计数器 |
| 30 | 模拟量输入 (AI) | 电流、电压、温度 — 最常见 |
| 40 | 模拟量输出 (AO) | 输出设定值 |
| 41 | 模拟量输出块(写入目标) | 设定值写入 |
在网关中,按 g<group>v<variation>.<index> 或 class<n> 格式输入。
| 表示 | 含义 |
|---|---|
g30v1.5 | 模拟量输入,变体 1(32 位 + 标志),索引 5 |
g30v5.5 | 模拟量输入,变体 5(浮点),索引 5 |
g1v2.0 | 二进制输入,变体 2(带标志),索引 0 |
g20v1.0 | 计数器,32 位,索引 0 |
class0 | Class 0 轮询(静态数据全量扫描) |
class1 | Class 1 事件(事件性变化) |
在项目初期,如果“想先全部取回来看看”,用 class0 一次性获取,然后只挑选所需点位,再用 g30v... 精确注册,这样比较方便。
数据类型匹配
| 组 | 数据类型 | 格式辅助 |
|---|---|---|
| g1 (BI) | Boolean | (留空) |
| g30v1 (AI 32 位有符号) | Integer | DW |
| g30v2 (AI 16 位有符号) | Integer | (留空) |
| g30v5 (AI 浮点) | Float | REAL |
| g30v6 (AI 双精度) | Double | LREAL |
| g20v1 (计数器 32 位) | Integer | DW |
写入(Write)支持
DNP3 子站的写入目标通常有两种。
| 表示 | 含义 |
|---|---|
g41v1.5 | 模拟量输出块 32 位有符号设定值,索引 5 |
g41v3.5 | 模拟量输出块浮点设定值,索引 5 |
g12v1.0 | 控制继电器输出块 (CROB) — 断路器跳闸/合闸等 |
g12 (CROB) 会直接操作断路器 / 继电器。在运行环境中,务必遵循 select-before-operate 流程并确认权限后再使用。
常见问题与解决
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| “无响应” | 地址不匹配 | 检查主站 / 子站地址双方是否一致 |
| 所有值为 0 或陈旧 | 未收到非请求响应,链路层问题 | 用 class0 显式轮询尝试 |
| “对象未找到” | 组/变体错误 | 查看 RTU 的 “DNP 点位映射” 文档 |
| 时间偏差很大 | DNP3 时间戳为 UTC 与本地时间差异 | 网关以 UTC 接收。在显示端进行转换 |
组 / 变体详细表
DNP3 的数据模型是“组”中包含多个“变体”的结构。即使是相同的组 30 (AI),也有 32 位 / 16 位 / 浮点 / 双精度多种表示,需要匹配 RTU 所暴露的变体。
| 组 | 变体 | 含义 | 大小 / 格式 |
|---|---|---|---|
| 1 | 1 | 二进制输入 — 打包格式(无标志) | 1 位 |
| 1 | 2 | 带状态二进制输入(含标志位) | 1 字节 |
| 2 | 1 | 二进制输入变化 — 无时间 | 事件 |
| 2 | 2 | 二进制输入变化 — 绝对时间 | 事件 + 6 字节时间 |
| 10 | 2 | 二进制输出状态(带标志) | 1 字节 |
| 12 | 1 | CROB(控制继电器输出块)— 仅写入 | 11 字节结构 |
| 20 | 1 | 计数器 — 32 位 | 4 字节 |
| 20 | 2 | 计数器 — 16 位 | 2 字节 |
| 30 | 1 | AI 32 位有符号(带标志) | 5 字节 |
| 30 | 2 | AI 16 位有符号(带标志) | 3 字节 |
| 30 | 3 | AI 32 位有符号(无标志) | 4 字节 |
| 30 | 5 | AI 单精度浮点(带标志) | 5 字节 |
| 30 | 6 | AI 双精度浮点(带标志) | 9 字节 |
| 32 | 1 | AI 变化 — 无时间 | 事件 |
| 32 | 7 | AI 变化 — 单浮点,绝对时间 | 事件 |
| 40 | 1 | AO 状态 32 位有符号(带标志) | 5 字节 |
| 41 | 1 | AO 块 32 位有符号(写入目标) | 5 字节 |
| 41 | 3 | AO 块浮点(写入目标) | 5 字节 |
常用运维模式
模式 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³ 等)
计数器(组 20)是累积值。在显示端计算差值,转换为“每小时用量”。
| 标签名称 | 地址 | 数据类型 |
|---|---|---|
| 累积有功电能 (kWh) | g20v1.0 | Integer |
| 累积无功电能 (kvarh) | g20v1.1 | Integer |
模式 3. 用 CROB 控制断路器(写入)
g12v1.0 = "Pulse-On / Trip / Close" 명령 코드
CROB 1 字节控制码:
| 值 | 含义 |
|---|---|
0x01 | Pulse-On |
0x02 | Pulse-Off |
0x03 | Latch-On |
0x04 | Latch-Off |
0x41 | Trip(保护动作) |
0x81 | Close |
许多 RTU 要求 CROB 必须执行 SBO(选择 → 执行)流程。即使 PlantPulse 侧发出单次写入命令,RTU 也可能拒绝。在这种环境中,需在 RTU 侧启用非 SBO 模式,或通过单独的自动化脚本执行两步操作。
参考 / 下一步
- RTU 制造商(ABB、SEL、GE、Schneider)的 “DNP3 设备配置文件” PDF 中包含完整的组/变体/索引映射。
- IEEE 1815-2012 标准文档(DNP3)是官方规范。
- 参考高级 — REST API中的 DNP3 自动化示例。