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

Atlas Copco Open Protocol ドライバ

概要

Atlas Copco の Open Protocol Specification (ベンダー公開 PDF) に基づく独自 Java 実装です。トルクコントローラ / 締付結果の 収集を単一 JVM 内で処理し、外部 Node.js runner / NDJSON pipe への依存を排除します。

項目
opc_typeOP (ネイティブ)
実装クラス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 헤더
フィールド長さ意味
LLLL4全体長 (ヘッダ 20 + body、NUL は含まない)
MMMM4MID (0-padded、例 0061)
RRR3revision
NoAck1' ' (ack 要求) / '1' (no-ack)
SS2StationID
PP2SpindleID
CC2Sequence
m1MsgNum
n1MsgTotal

全フィールドは ASCII (US-ASCII)。メッセージは \0 で終端されます。


主要 MID

受信 (購読)

MID意味
0001 → 0002通信開始 / ハンドシェイク
0060 → 0061最終締付結果の購読 / データ。受信時に 0062 で ack
0070 → 0071アラーム購読 / アラームデータ
9999Keep-alive (受信 timeout 時に自動送信)

送信 (write 対応)

定数MID動作body
MID_SELECT_PSET0018Select Pset4-char ASCII
MID_SELECT_JOB0038Select Job2-char ASCII
MID_DISABLE_TOOL0042Disable tool空文字列
MID_ENABLE_TOOL0043Enable tool空文字列
MID_SET_VEHICLE_ID0050Set Vehicle ID25-char ASCII (右側を空白 padding)
MID_ABORT_TIGHTEN0127Abort tightening空文字列

write の ack は、receiverLoop が MID 0005 (accepted) / 0004 (error) を受信すると pendingWriteAck.complete(...) となり、 write()future.get(DEFAULT_WRITE_ACK_TIMEOUT_MS=5000ms, ...) で待機します。


タグアドレス形式

表記意味
0061:resultDataMID 0061 (締付結果) の resultData フィールド
0061MID 全体の raw メッセージ
0071:alarmCodeアラームメッセージの alarmCode
614桁に自動 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/

クラステスト数
OPDriverTest9 (レガシー driver)
OpenProtocolJavaDriverTest10
OpenProtocolSpecTest15
OpenProtocolWriteTest31

合計 65 テスト。


参考

  • Atlas Copco Open Protocol Specification (ベンダー公開 PDF)
  • コード: src/plantpulse/driver/protocol/op/OpenProtocolJavaDriver.java