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 に対して接続ごとに 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_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 が false になり、エッジ復旧(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 レベル完全互換は今後のフェーズです。運用適用前に十分な検証を推奨します。
参考
- 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/。