IEC 61850 MMS Treiber
Überblick
IEC 61850 MMS (Manufacturing Message Specification) — internationaler Standard für die Automatisierung von Kraftwerken, Umspannwerken, ESS und Windparks. Läuft auf dem vollständigen ISO-Stack (TPKT → COTP → ISO Session → ISO Presentation → ACSE → MMS). Eigene Java-ASN.1/BER-Implementierung (keine externen Abhängigkeiten).
| Position | Wert |
|---|---|
opc_type | IEC61850 |
| Implementierungsklasse | plantpulse.driver.protocol.iec61850.IEC61850Driver |
| Bibliothek | Eigene Java-Implementierung (keine externen Abhängigkeiten, ASN.1 BER selbst geschrieben) |
| Vererbung | BaseProtocolDriver |
| read | OK (ReadRequest → AccessResult(MmsValue), Polling) |
| write | OK (isWriteSupported() = true) |
| Sicherheit | keine (IEC 62351 nicht implementiert) |
| Standardport | 102 (TCP) |
Zusätzlich zum Polling-read wird für die über report-control-blocks angegebenen RCBs bei jeder Verbindung RptEna=true (+ optional GI=true) per MMS write gesetzt und so das Report-Abonnement automatisch wiederhergestellt. InformationReport (unsolicited push) wird über den lastReportByVariable-Cache verarbeitet; read liefert nur Cache-Einträge, die innerhalb der TTL (report-cache-ttl-ms) frisch sind — bei Ablauf erfolgt ein Polling-Fallback.
Klassenstruktur (von oben nach unten)
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
Verbindungssequenz (connect()): COTP CR → CC → Session CONNECT (Kapselung von Presentation CP / ACSE AARQ / MMS Initiate-Request) → AARE → Dekodierung und Prüfung der MMS Initiate-Response. Konstante DEFAULT_TPDU_SIZE = 0x0B (2048 Byte, IEC 61850-Empfehlung). Es wird nur eine Sitzung verwendet — transact() serialisiert Transaktionen über synchronized und prüft die invokeID der Antwort (Abweichung = stale reject + Socket-Invalidierung).
OPC-Registrierungsoptionen
| Schlüssel | Standard | Beschreibung |
|---|---|---|
opc_agent_ip / opc_agent_port | 102 bei Port 0 | IED-IP / Port |
options.connect-timeout | 5000 ms | TCP-Connect-Timeout |
options.read-timeout | 5000 ms | read-SO-Timeout |
options.enable-information-report | false | BRCB/URCB-Reports aktivieren |
options.report-control-blocks | (keiner) | kommagetrennte Liste von RCB-Referenzen — z. B. LD0/LLN0$BR$brcb01 (Punktnotation zulässig) |
options.report-gi | true | direkt nach RCB-Aktivierung General Interrogation per GI=true write (vollständiger erneuter Empfang der aktuellen Werte) |
options.report-cache-ttl-ms | 30000 ms | Frischigkeits-TTL des Report-Caches — bei Ablauf Polling-Fallback. <=0 deaktiviert den Ablauf |
Format von Tag plc_address
MmsAddress akzeptiert sowohl die LD/LN.DO.DA[$FC]-Notation als auch die Wire-Notation (LD/LN$FC$DO$DA). Der Schrägstrich (/) trennt Domain und Item, der Punkt (.) wird bei der Wire-Umwandlung durch $ ersetzt.
| Notation | Bedeutung |
|---|---|
IED1Server/MMXU1.MX.A.phsA | Domain IED1Server / Item MMXU1$MX$A$phsA |
IED1Server/MMXU1$MX$A$phsA | Wire-Notation identisch |
LD1/LLN0.Mod.stVal | LD LD1, LN LLN0, DO Mod, DA stVal |
Die FC (Functional Constraint) wird entweder über $FC angegeben oder durch Angabe der Standardposition ($MX / $ST usw.) notiert.
Read / Write
- read:
buildReadRequest→transact()(synchronized) →parseReadResponse→AccessResult(MmsValue) wird als Zeichenkette zurückgegeben. Trifft ein InformationReport interleaved während des Wartens auf die Antwort ein, wird er im Cache abgelegt und weiter gewartet. Nach 3 aufeinanderfolgenden read-Fehlern (READ_FAIL_STREAK_LIMIT) fällt connected ab — die Edge-Wiederherstellung (PLCRecovery) wird ausgelöst. - write:
isWriteSupported() = true. Mappingdata_type→ MmsValue:
Alias data_type | MmsValue |
|---|---|
boolean / bool | bool |
integer / int / long / short / byte | integer (long-Parsing) |
unsigned / uint / ulong | unsigned |
float / double / real / floating-point | floating |
octet-string / octet / bytes | octet |
visible-string / string / "" / varchar | visible |
mms-string / utf8 | mmsString |
| sonstige | visible (Fallback) |
Der data-access-error-Code wird als WriteResponse.errorCode ausgegeben.
Nicht unterstützte Bereiche
- GOOSE / Sampled Values (Multicast) — erfordert einen separaten Raw-Ethernet-Stack.
- SCL-Parsing (.icd / .scd) — keine automatische Erkennung des Datenmodells, manuelle Eingabe durch den Benutzer erforderlich.
- IEC 62351-3/-6 — kein TLS, keine Authentifizierung, kein Integritätsschutz.
Die ASN.1-BER-Dienstprogramme dieser Implementierung sind spezifikationsgenau, die vollständige Wire-Level-Kompatibilität mit realen IEDs ist jedoch einer späteren Phase vorbehalten. Vor dem Produktiveinsatz wird eine ausreichende Verifizierung empfohlen.
Referenzen
- IEC 61850-7-2 (ACSI), -8-1 (Mapping auf MMS), ISO 9506 (MMS). ASN.1 BER — ITU-T X.690.
- Code:
plantpulse-edge-driver/src/plantpulse/driver/protocol/iec61850/.