Atlas Copco Open Protocol ドライバ
概要
Atlas Copco の Open Protocol Specification (ベンダー公開 PDF) に基づく独自 Java 実装です。トルクコントローラ / 締付結果の 収集を単一 JVM 内で処理し、外部 Node.js runner / NDJSON pipe への依存を排除します。
| 項目 | 値 |
|---|---|
opc_type | OP (ネイティブ) |
| 実装クラス | plantpulse.driver.protocol.op.OpenProtocolJavaDriver |
| ライブラリ | (なし — 独自実装。Atlas Copco OP spec) |
| read | 良好 (サブスクリプションキャッシュベース) |
| write | 良好 (isWriteSupported() = true) — 一部 MID のみ |
| デフォルトポート | 4545 |
| セキュリティ | なし (TCP 直結) |
OPDriver との違い同一パッケージのレガシー OPDriver は外部 Node.js プロセスを spawn していましたが、
OpenProtocolJavaDriver は純粋な Java socket + receiver thread で動作するため
配備が単純です。新規登録では本ドライバを使用します。
クラス / 構造
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) → 主要 MID の購読 (0060, 0070) → receiverThread 起動。
wire フォーマット概要
LLLL MMMM RRR x SS PP CC m n | <body ASCII> | NUL(0x00)
└ 4 4 3 1 2 2 2 1 1 = 20 byte 헤더
| フィールド | 長さ | 意味 |
|---|---|---|
| LLLL | 4 | 全体長 (ヘッダ 20 + body、NUL は含まない) |
| MMMM | 4 | MID (0-padded、例 0061) |
| RRR | 3 | revision |
| NoAck | 1 | ' ' (ack 要求) / '1' (no-ack) |
| SS | 2 | StationID |
| PP | 2 | SpindleID |
| CC | 2 | Sequence |
| m | 1 | MsgNum |
| n | 1 | MsgTotal |
全フィールドは ASCII (US-ASCII)。メッセージは \0 で終端されます。
主要 MID
受信 (購読)
| MID | 意味 |
|---|---|
| 0001 → 0002 | 通信開始 / ハンドシェイク |
| 0060 → 0061 | 最終締付結果の購読 / データ。受信時に 0062 で ack |
| 0070 → 0071 | アラーム購読 / アラームデータ |
| 9999 | Keep-alive (受信 timeout 時に自動送信) |
送信 (write 対応)
| 定数 | MID | 動作 | 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 | 空文字列 |
MID_ENABLE_TOOL | 0043 | Enable tool | 空文字列 |
MID_SET_VEHICLE_ID | 0050 | Set Vehicle ID | 25-char ASCII (右側を空白 padding) |
MID_ABORT_TIGHTEN | 0127 | Abort tightening | 空文字列 |
write の ack は、receiverLoop が MID 0005 (accepted) / 0004 (error) を受信すると pendingWriteAck.complete(...) となり、
write() は future.get(DEFAULT_WRITE_ACK_TIMEOUT_MS=5000ms, ...) で待機します。
タグアドレス形式
| 表記 | 意味 |
|---|---|
0061:resultData | MID 0061 (締付結果) の resultData フィールド |
0061 | MID 全体の raw メッセージ |
0071:alarmCode | アラームメッセージの alarmCode |
61 | 4桁に自動 0-padding → 0061 |
read() は lastByMID のキャッシュを返すだけなので、ポーリング周期 (timecycle) は PLC 負荷と無関係です。
write アドレスの別名 (大文字小文字は区別しない): pset, job, select-job, vehicle-id / vehicleid,
disable / disable-tool, enable / enable-tool, abort / abort-tightening,
または MID:0018, MID0018, 0018, 18 形式。
対応 / 非対応
- ✅ Handshake / keep-alive / 自動再購読
- ✅ MID 0061 / 0071 キャッシュ (raw + 先頭部分フィールドの抽出)
- ✅ Write MID 0018 / 0038 / 0042 / 0043 / 0050 / 0127 (ack 同期待ち)
- ❌ MID ごとの詳細フィールドパーサ (現時点では
__raw__+dataのみ — 後続 phase) - ❌ Multi-spindle controller の spindleId ルーティング
- ❌ セキュリティ/認証 (Open Protocol 自体に存在しない)
テストカバレッジ
test/java/plantpulse/driver/protocol/op/
| クラス | テスト数 |
|---|---|
OPDriverTest | 9 (レガシー driver) |
OpenProtocolJavaDriverTest | 10 |
OpenProtocolSpecTest | 15 |
OpenProtocolWriteTest | 31 |
合計 65 テスト。
参考
- Atlas Copco Open Protocol Specification (ベンダー公開 PDF)
- コード:
src/plantpulse/driver/protocol/op/OpenProtocolJavaDriver.java