Atlas Copco Open Protocol Treiber
Überblick
Eigene Java-Implementierung auf Basis der Open Protocol Specification von Atlas Copco (öffentliches PDF des Herstellers). Die Erfassung von Drehmomentsteuerungen / Verschraubungsergebnissen erfolgt vollständig innerhalb einer einzigen JVM; die Abhängigkeit von einem externen Node.js-Runner bzw. NDJSON-Pipe entfällt.
| Punkt | Wert |
|---|---|
opc_type | OP (nativ) |
| Implementierungsklasse | plantpulse.driver.protocol.op.OpenProtocolJavaDriver |
| Bibliothek | (keine — Eigenimplementierung, Atlas Copco OP spec) |
| read | gut (auf Basis des Abonnement-Caches) |
| write | gut (isWriteSupported() = true) — nur bestimmte MIDs |
| Standardport | 4545 |
| Sicherheit | keine (direkte TCP-Verbindung) |
OPDriverDas ältere OPDriver desselben Pakets startete einen externen Node.js-Prozess (spawn), während
OpenProtocolJavaDriver als reiner Java-Socket mit Receiver-Thread arbeitet und damit
die Bereitstellung vereinfacht. Für Neuanlagen ist dieser Treiber zu verwenden.
Klassen / Struktur
OpenProtocolJavaDriver (BaseProtocolDriver)
├── Socket — host:4545
├── receiverThread — daemon, "OP-Receiver-<opc_id>"
├── lastByMID — ConcurrentHashMap<MID4, Map<field,value>>
├── pendingWriteAck — CompletableFuture<String> (MID 0005/0004 단일-flight)
└── writeLock — synchronized (write 직렬화)
connect() → Handshake (MID 0001 → 0002) → Abonnement der wichtigsten MIDs (0060, 0070) → Start des receiverThread.
Zusammenfassung des Wire-Formats
LLLL MMMM RRR x SS PP CC m n | <body ASCII> | NUL(0x00)
└ 4 4 3 1 2 2 2 1 1 = 20 byte 헤더
| Feld | Länge | Bedeutung |
|---|---|---|
| LLLL | 4 | Gesamtlänge (Header 20 + Body, ohne NUL) |
| MMMM | 4 | MID (0-padded, z. B. 0061) |
| RRR | 3 | Revision |
| NoAck | 1 | ' ' (Ack erforderlich) / '1' (no-ack) |
| SS | 2 | StationID |
| PP | 2 | SpindleID |
| CC | 2 | Sequence |
| m | 1 | MsgNum |
| n | 1 | MsgTotal |
Alle Felder ASCII (US-ASCII). Nachrichten werden mit \0 abgeschlossen.
Wichtige MIDs
Empfang (Abonnement)
| MID | Bedeutung |
|---|---|
| 0001 → 0002 | Kommunikationsstart / Handshake |
| 0060 → 0061 | Abonnement des letzten Verschraubungsergebnisses / Daten. Beim Empfang Ack mit 0062 |
| 0070 → 0071 | Alarm-Abonnement / Alarmdaten |
| 9999 | Keep-alive (automatischer Versand bei Empfangs-Timeout) |
Senden (write-Unterstützung)
| Konstante | MID | Aktion | Body |
|---|---|---|---|
MID_SELECT_PSET | 0018 | Select Pset | 4-char ASCII |
MID_SELECT_JOB | 0038 | Select Job | 2-char ASCII |
MID_DISABLE_TOOL | 0042 | Disable tool | leerer String |
MID_ENABLE_TOOL | 0043 | Enable tool | leerer String |
MID_SET_VEHICLE_ID | 0050 | Set Vehicle ID | 25-char ASCII (rechtsseitiges Leerzeichen-Padding) |
MID_ABORT_TIGHTEN | 0127 | Abort tightening | leerer String |
Das Write-Ack wird über pendingWriteAck.complete(...) signalisiert, sobald die receiverLoop MID 0005 (accepted) / 0004 (error) empfängt;
write() wartet mit future.get(DEFAULT_WRITE_ACK_TIMEOUT_MS=5000ms, ...).
Format der Tag-Adressen
| Notation | Bedeutung |
|---|---|
0061:resultData | Feld resultData von MID 0061 (Verschraubungsergebnis) |
0061 | vollständige Rohnachricht der MID |
0071:alarmCode | alarmCode der Alarmmeldung |
61 | automatisches 0-Padding auf 4 Stellen → 0061 |
read() gibt lediglich den Cache von lastByMID zurück, daher ist das Abfrageintervall (timecycle) unabhängig von der PLC-Last.
Aliase für Write-Adressen (Groß-/Kleinschreibung wird ignoriert): pset, job, select-job, vehicle-id / vehicleid,
disable / disable-tool, enable / enable-tool, abort / abort-tightening,
oder in der Form MID:0018, MID0018, 0018, 18.
Unterstützt / Nicht unterstützt
- ✅ Handshake / Keep-alive / automatisches Neu-Abonnement
- ✅ Cache für MID 0061 / 0071 (raw + Extraktion der ersten Teilfelder)
- ✅ Write MID 0018 / 0038 / 0042 / 0043 / 0050 / 0127 (synchrones Warten auf Ack)
- ❌ detaillierter Feldparser je MID (derzeit nur
__raw__+data— spätere Phase) - ❌ spindleId-Routing bei Multi-Spindle-Controllern
- ❌ Sicherheit/Authentifizierung (im Open Protocol selbst nicht vorhanden)
Testabdeckung
test/java/plantpulse/driver/protocol/op/
| Klasse | Anzahl Tests |
|---|---|
OPDriverTest | 9 (Legacy-Treiber) |
OpenProtocolJavaDriverTest | 10 |
OpenProtocolSpecTest | 15 |
OpenProtocolWriteTest | 31 |
Insgesamt 65 Tests.
Referenzen
- Atlas Copco Open Protocol Specification (öffentliches PDF des Herstellers)
- Code:
src/plantpulse/driver/protocol/op/OpenProtocolJavaDriver.java