IEC 61850 MMS 驱动
概述
IEC 61850 MMS (Manufacturing Message Specification) —— 电厂 / 变电站 / ESS / 风电场自动化的国际标准。运行于 ISO 完整协议栈 (TPKT → COTP → ISO Session → ISO Presentation → ACSE → MMS) 之上。采用自研 Java ASN.1/BER 实现(无外部依赖)。
| 项目 | 值 |
|---|---|
opc_type | IEC61850 |
| 实现类 | plantpulse.driver.protocol.iec61850.IEC61850Driver |
| 库 | 自研 Java 实现(无外部依赖,ASN.1 BER 自行编写) |
| 继承 | BaseProtocolDriver |
| read | OK (ReadRequest → AccessResult(MmsValue),轮询) |
| write | OK (isWriteSupported() = true) |
| 安全 | 无 (未实现 IEC 62351) |
| 默认端口 | 102 (TCP) |
除轮询 read 外,对通过 report-control-blocks 指定的 RCB,每次连接时都会 MMS write RptEna=true(+可选 GI=true),从而自动恢复报告订阅。InformationReport(unsolicited push)由 lastReportByVariable 缓存处理,read 仅提供 TTL(report-cache-ttl-ms)以内的新鲜缓存 —— 过期时回退为轮询。
类结构(自上而下)
TCP
└ ISO TPKT (RFC 1006) — Tpkt.java
└ ISO COTP (Class 0) — Cotp.java
└ ISO Session — IsoSession.java
└ ISO Presentation — IsoPresentation.java
└ ACSE — Acse.java
└ MMS (ASN.1 BER) — MmsPdu.java + Asn1.java + MmsAddress.java
连接时序(connect()):COTP CR → CC → Session CONNECT(封装 Presentation CP / ACSE AARQ / MMS Initiate-Request) → AARE → 解码校验 MMS Initiate-Response。常量 DEFAULT_TPDU_SIZE = 0x0B(2048 byte,IEC 61850 推荐值)。仅使用单个会话 —— transact() 通过 synchronized 将事务串行化,并校验响应的 invokeID(不一致 = stale reject + 套接字失效)。
OPC 注册选项
| 键 | 默认值 | 说明 |
|---|---|---|
opc_agent_ip / opc_agent_port | port 为 0 时使用 102 | IED IP / 端口 |
options.connect-timeout | 5000 ms | TCP connect 超时 |
options.read-timeout | 5000 ms | read SO 超时 |
options.enable-information-report | false | 是否启用 BRCB/URCB 报告 |
options.report-control-blocks | (无) | 逗号分隔的 RCB 引用列表 —— 例如:LD0/LLN0$BR$brcb01(允许点号表示法) |
options.report-gi | true | RCB 激活后立即通过 GI=true write 执行 general interrogation(全量重新接收最新值) |
options.report-cache-ttl-ms | 30000 ms | 报告缓存新鲜度 TTL —— 过期时回退为轮询。<=0 表示禁用过期 |
标签 plc_address 格式
MmsAddress 同时允许 LD/LN.DO.DA[$FC] 表示法与 wire 表示法(LD/LN$FC$DO$DA)。斜杠(/)用于区分 domain/item,点号(.)在转换为 wire 表示时被替换为 $。
| 表示法 | 含义 |
|---|---|
IED1Server/MMXU1.MX.A.phsA | 域 IED1Server / Item MMXU1$MX$A$phsA |
IED1Server/MMXU1$MX$A$phsA | wire 表示法,含义相同 |
LD1/LLN0.Mod.stVal | LD LD1,LN LLN0,DO Mod,DA stVal |
FC(Functional Constraint)可通过 $FC 显式指定,或在表示法中包含标准位置($MX / $ST 等)。
Read / Write
- read:
buildReadRequest→transact()(synchronized) →parseReadResponse→ 将AccessResult(MmsValue) 以字符串返回。即使 InformationReport 在等待响应期间交错到达,也会先做缓存处理后继续等待。连续 read 失败 3 次(READ_FAIL_STREAK_LIMIT)则 connected 置为下降 —— 触发边缘恢复(PLCRecovery)。 - write:
isWriteSupported() = true。data_type→ MmsValue 映射:
data_type 别名 | MmsValue |
|---|---|
boolean / bool | bool |
integer / int / long / short / byte | integer (long 解析) |
unsigned / uint / ulong | unsigned |
float / double / real / floating-point | floating |
octet-string / octet / bytes | octet |
visible-string / string / "" / varchar | visible |
mms-string / utf8 | mmsString |
| 其他 | visible (回退) |
data-access-error 代码通过 WriteResponse.errorCode 暴露。
未支持的范围
- GOOSE / Sampled Values(multicast)—— 需要单独的 raw-Ethernet 协议栈。
- SCL (.icd / .scd) 解析 —— 无法自动发现数据模型,需用户手动输入。
- IEC 62351-3/-6 —— 无 TLS / 认证 / 完整性保护。
本实现的 ASN.1 BER 工具在 spec 层面准确,但与实际 IED 的 wire-level 完全兼容将在后续阶段完成。投入运行前建议进行充分验证。
参考
- IEC 61850-7-2 (ACSI), -8-1 (mapping to MMS), ISO 9506 (MMS)。ASN.1 BER —— ITU-T X.690。
- 代码:
plantpulse-edge-driver/src/plantpulse/driver/protocol/iec61850/。