IEC 61850 驱动
dc3-driver-iec61850 作为 IEC 61850 MMS 客户端,按 IED 设备维护一条 MMS 关联,读/写以对象引用与功能约束寻址的数据属性。
协议背景
IEC 61850 是变电站自动化标准,数据对象按逻辑设备/逻辑节点/数据对象组织,MMS 协议取值。
驱动 code:Iec61850Driver,类型:DRIVER_CLIENT,底层库:OpenMUC openiec61850
属性配置
驱动属性
| 属性 | code | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| Host | host | STRING | (空) | IED 服务器地址 |
| Port | port | INT | 102 | MMS 端口 |
位号属性
| 属性 | code | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| Object Reference | objectReference | STRING | (空) | 数据对象引用,如 S1MMXU1.TotW.actVal |
| Functional Constraint | functionalConstraint | STRING | MX | MX, ST, CO, SP, SE |
命令属性
| 属性 | code | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| Object Reference | objectReference | STRING | (空) | 命令对象引用 |
采集与健康
- 采集周期:
read调度默认 cron0/30 * * * * ?。 - 健康/在线:设备健康检查默认 cron
0/15 * * * * ?,租约超时45 秒。
能力矩阵
| 能力 | 支持 |
|---|---|
| 读 | ✓ |
| 写 | ✓ |
| 订阅 | — |
实现状态:完整
服务器模型每个关联检索一次并缓存;读调用 getDataValues 并取第一个 BasicDataAttribute 的 getValueString()。
故障排查
- 连不上 IED,日志出现
Failed to associate IEC 61850 server: <host>:<port>→ 原因:host未填会先抛Required attribute 'host' is missing;填了但地址不可达、或 MMS 端口(默认102)没开,关联建立失败。排查:核对设备上的host/port,在驱动所在环境telnet <host> 102验证链路,并确认 IED 允许 MMS 客户端接入。 - 读抛
IEC 61850 object reference not found: <引用>→ 原因:引用在服务器模型里找不到——拼写、层级或功能约束与 IED 实际模型不符;模型只在关联建立时拉取一次并缓存,IED 侧新增的节点在旧缓存里同样找不到。排查:对照 IED 的模型描述(SCD/ICD)逐一核对objectReference与functionalConstraint;模型变更后需重连才生效(更新或删除设备会关闭关联,也可重启驱动)。 functionalConstraint填了枚举外的值 → 原因:驱动按Fc.valueOf(名称大写)解析,非枚举名会抛异常并被包成IEC 61850 read failed/write failed。排查:改回MX/ST/CO/SP/SE等标准功能约束。- 写抛
IEC 61850 node has no writable data attribute→ 原因:引用定位到的是结构节点(逻辑节点或数据对象),不是可写的数据属性。排查:把objectReference配到叶子属性,如S1MMXU1.TotW.actVal。 - 写抛
Unsupported IEC 61850 data type,或值写不进去 → 原因:写入值按目标属性的类型解析字符串,仅支持布尔、8/16/32/64 位整数、32/64 位浮点与 VisibleString,数值解析失败或类型不支持都直接抛异常;布尔例外——按Boolean.parseBoolean解析,只有true视为真,其余字符串一律静默写false不报错。排查:确认值能被目标类型解析——浮点属性别发非数字字符串。 - 读写一失败就重连,重连后第一轮变慢 → 原因:
read()/write()抛出的任何异常都会作废关联——关连接、清缓存,下次访问重建关联并重新拉取服务器模型。排查:反复重连多半是网络不稳或 IED 拒绝服务,对着Driver connection established日志的时间点定位。
在 IoT DC3 中如何落地
一台设备对应一台 IED,host / port 都填在设备上。驱动按 deviceId 缓存 MMS 关联:首次访问(读写或健康检查触发)时建立连接,随即 retrieveModel() 把整个服务器模型拉回来缓存,之后这台设备的所有读写都复用这条关联,不再重复建连。你接入多台 IED,就是多台设备各持一条互不干扰的关联。
读和写都只消费位号属性。read() 用 objectReference + functionalConstraint(缺省 MX)在缓存模型里定位节点,发 getDataValues 后取第一个基本数据属性的字符串值——节点下没有数据属性时,回退成整个节点的 toString()。write() 复用同一套位号属性定位节点:先 getDataValues 拿到目标属性的当前类型,把命令值按该类型解析,再 setDataValues 写回;它只写第一个基本数据属性,所以引用务必配到叶子。
与平台其它机制的衔接:健康检查就是 client.isOpen(),关联不存在时健康检查会先把连接建起来再判断;设备被更新或删除时,元数据事件负责关闭并移除关联;读写异常同样作废关联、下次访问重建。validate() / validatePoint() 分别校验 host 与 objectReference 必填,缺失会进校验报告。
最小接入示例
- 选 IEC 61850 驱动创建设备,填 host、port=102。
- 加位号(READ_ONLY),填 objectReference=S1MMXU1.TotW.actVal、functionalConstraint=MX。
- 启动驱动,按采集周期读取测量值。