跳到主要内容

IEC 61850 MMS 驱动

概述

IEC 61850 MMS (Manufacturing Message Specification) —— 电厂 / 变电站 / ESS / 风电场自动化的国际标准。运行于 ISO 完整协议栈 (TPKT → COTP → ISO Session → ISO Presentation → ACSE → MMS) 之上。采用自研 Java ASN.1/BER 实现(无外部依赖)。

项目
opc_typeIEC61850
实现类plantpulse.driver.protocol.iec61850.IEC61850Driver
自研 Java 实现(无外部依赖,ASN.1 BER 自行编写)
继承BaseProtocolDriver
readOK (ReadRequest → AccessResult(MmsValue),轮询)
writeOK (isWriteSupported() = true)
安全无 (未实现 IEC 62351)
默认端口102 (TCP)
报告(BRCB/URCB)支持

除轮询 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_portport 为 0 时使用 102IED IP / 端口
options.connect-timeout5000 msTCP connect 超时
options.read-timeout5000 msread SO 超时
options.enable-information-reportfalse是否启用 BRCB/URCB 报告
options.report-control-blocks(无)逗号分隔的 RCB 引用列表 —— 例如:LD0/LLN0$BR$brcb01(允许点号表示法)
options.report-gitrueRCB 激活后立即通过 GI=true write 执行 general interrogation(全量重新接收最新值)
options.report-cache-ttl-ms30000 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$phsAwire 表示法,含义相同
LD1/LLN0.Mod.stValLD LD1,LN LLN0,DO Mod,DA stVal

FC(Functional Constraint)可通过 $FC 显式指定,或在表示法中包含标准位置($MX / $ST 等)。


Read / Write

  • read:buildReadRequesttransact()(synchronized) → parseReadResponse → 将 AccessResult(MmsValue) 以字符串返回。即使 InformationReport 在等待响应期间交错到达,也会先做缓存处理后继续等待。连续 read 失败 3 次(READ_FAIL_STREAK_LIMIT)则 connected 置为下降 —— 触发边缘恢复(PLCRecovery)。
  • write:isWriteSupported() = truedata_type → MmsValue 映射:
data_type 别名MmsValue
boolean / boolbool
integer / int / long / short / byteinteger (long 解析)
unsigned / uint / ulongunsigned
float / double / real / floating-pointfloating
octet-string / octet / bytesoctet
visible-string / string / "" / varcharvisible
mms-string / utf8mmsString
其他visible (回退)

data-access-error 代码通过 WriteResponse.errorCode 暴露。


未支持的范围

  • GOOSE / Sampled Values(multicast)—— 需要单独的 raw-Ethernet 协议栈。
  • SCL (.icd / .scd) 解析 —— 无法自动发现数据模型,需用户手动输入。
  • IEC 62351-3/-6 —— 无 TLS / 认证 / 完整性保护。
fixture 级成熟度

本实现的 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/