HART-IP ドライバ
概要
HART (Highway Addressable Remote Transducer) の IP バリアント。4-20 mA 産業用計測器を IP ゲートウェイ 経由でデジタル read/write する。HCF の公開 HART-IP 仕様に基づく。
| 項目 | 値 |
|---|---|
opc_type | HART |
| 実装クラス | plantpulse.driver.protocol.hart.HARTDriver |
| ライブラリ | 独自 Java 実装 (HCF spec ベース、外部ライブラリ依存なし) |
| read | ✅ (cmd 1, 3, 13) |
| write | ✅ (cmd 6, 17, 18, 19, 22) |
| セキュリティ | なし (HART-IP spec 自体に認証/暗号化がない) |
| デフォルトポート | 5094 (TCP) |
クラス構成
| クラス | 役割 |
|---|---|
HARTDriver | ライフサイクル / アドレスパーサ / read・write ディスパッチ / KeepAlive スレッド |
HartIpHeader | 13-byte HART-IP ヘッダ (version, type, id, status, sequence, byteCount BE) |
HartCommand | HART コマンド PDU ビルダ — preamble + 0x82 + 5-byte address + cmd + byteCount + data + XOR |
HartChecksum | longitudinal XOR (preamble を除く) |
HartDecode | float32 BE / packed-ASCII 6-bit デコーダ、communication status ビット解釈 |
Wire フォーマット
HART-IP 메시지 = 13-byte 헤더 + payload
byte 0 Version 1
byte 1 Message Type 0=Request 1=Response 2=Publish 3=NAK
byte 2 Message ID 0=Session-Init 1=Session-Close 2=KeepAlive 3=PDU
byte 3 Status / Error
byte 4-5 Sequence (BE)
byte 6-7 ByteCount (BE, 헤더 13 byte 포함)
byte 8-12 Reserved (0)
PDU payload (Message ID 3) =
Preamble(0xFF×N) + Start(0x82) + Address(5) + Command(1) + ByteCount(1) + Data(N) + XOR(1)
ハンドシェイク: connect() が Session Init (master-type 1 byte + inactivity-close-time 4 byte BE) を
送信 → Response を受信。以降、KeepAlive バックグラウンドスレッドが周期的に Message ID 2 を送信する。
OPC 登録オプション
| フィールド | 意味 | デフォルト |
|---|---|---|
opc_agent_ip / opc_agent_port | ゲートウェイ IP / ポート | (port 0 の場合は 5094) |
options.master-type | primary / secondary | primary |
options.inactivity-ms | Session inactivity close time | 600000 (10 分) |
options.keepalive-ms | KeepAlive 送信周期 | 30000 |
options.connect-timeout | TCP connect タイムアウト | 5000 |
options.read-timeout | read SO タイムアウト | 5000 |
タグ plc_address 形式
| 表記 | 意味 | デコード |
|---|---|---|
1 または 1:pv | cmd 1 — Read PV | float32 BE (status 2 byte 以降の offset 3) |
3:0 ~ 3:3 または 3:pv/sv/tv/qv | cmd 3 — PV/SV/TV/QV | 4 × float32 BE (簡易モデル) |
13 または 13:tag | cmd 13 — Tag 8 char | packed-ASCII (3 byte → 4 char) |
write アドレス (address.getValue() と併用):
| 表記 | 意味 | value 形式 |
|---|---|---|
6 / polling-address | cmd 6 — Write Polling Address | 0..63 の整数 |
17 / message | cmd 17 — Write Message | 32-char packed-ASCII |
18 / tag / descriptor / date | cmd 18 — Tag/Descriptor/Date | tag|desc|DD/MM/YY または sub-field 単位 |
19 / final-assembly | cmd 19 — Final Assembly Number | 0..16777215 |
22 / long-tag | cmd 22 — Long Tag (32 byte ISO-Latin-1) | 任意の文字列 |
非対応範囲
- WirelessHART (HART 7) burst モード、publish (Message Type 2) の非同期受信。
- Cmd 0/cmd 50/cmd 9 などの device-discovery 系 — 追加可能。
- Long-frame 以外の Short-frame address。
- 5-byte device address の manufacturer/device-type マッチング (現状は zero-fill)。
- Keepalive 応答の同期処理 — 簡略化のため keepalive 応答は無視 (別 receiver thread + seq correlation で補強可能)。
テストカバレッジ
test/java/plantpulse/driver/protocol/hart/
| テスト | 検証内容 |
|---|---|
HartIpHeaderTest | 13-byte ヘッダの round-trip |
HartChecksumTest | XOR の既知 vector |
HartCommandTest / HartCommandWriteTest | cmd 0/1/3/13/6/17/18/19/22 の PDU ビルド |
HartDecodeTest / HartEncodeTest | float32 BE、packed-ASCII (双方向)、BCD date |
HARTDriverAddressTest / HARTDriverWriteTest | アドレスパーサ + write ディスパッチ |
HartSpecExtraTest | 追加の spec 適合性 |
参考
- HART-IP spec — FieldComm Group / HART Communication Foundation (会員向け文書)。
- コード:
plantpulse-edge-driver/src/plantpulse/driver/protocol/hart/。 - 運用時はゲートウェイ (例: ABB AC500-eCo、Pepperl+Fuchs HART Multiplexer) で TCP 5094 が公開されている必要がある。