メインコンテンツまでスキップ

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 に対して接続ごとに RptEna=true(+オプション GI=true)を MMS write し、レポート購読を自動復元します。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 推奨)。セッションは 1 つのみ使用 — 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-reportfalseBRCB/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 の形式

MmsAddressLD/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) → parseReadResponseAccessResult(MmsValue) を文字列で返します。InformationReport は応答待ち中にインターリーブで到着してもキャッシュ処理後に待機を継続します。read の連続失敗が 3 回(READ_FAIL_STREAK_LIMIT)に達すると connected が false になり、エッジ復旧(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 レベル完全互換は今後のフェーズです。運用適用前に十分な検証を推奨します。


参考

  • 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/