BACnet/IP ドライバ
概要
BACnet/IP — ビルオートメーション(HVAC / 照明 / 火災 / 入退室管理)の標準プロトコル。UDP/47808 上で BVLC + NPDU + APDU の各層として動作します。2026-07 ネイティブ再実装 — 旧 Apache PLC4j bacnet-ip への委譲は削除されました(PLC4j 0.13.1 の BACnet は canRead()=false(passive/EDE 専用)であり、connect 時に "doesn't support reading" 例外が発生して収集そのものができませんでした)。現在は plantpulse-plc-protocol の独自 BACnet/IP confirmed ReadProperty ポーリング実装(BacnetIpPLC)を使用します — AB-ETH と同一のネイティブパターンです。
| 項目 | 値 |
|---|---|
opc_type | BACNET |
| 実装クラス | plantpulse.driver.protocol.bacnet.BACnetDriver |
| ライブラリ | 独自ネイティブ(plantpulse-plc-protocol の bacnet — ReadProperty) |
| 継承 | BaseProtocolDriver(PLC4j ではありません) |
| デフォルトポート | 47808(0xBAC0, UDP) |
| 状態 | 安定(ReadProperty ポーリング) |
| read | OK(ReadProperty、単一 property) |
| write | ❌(読み取り専用 — WriteProperty 未実装) |
| セキュリティ | なし(BACnet/SC 非対応) |
旧 PLC4j 実装では EDE(Engineering Data Exchange)CSV ファイルでオブジェクト一覧を静的にマッピングしていました。ネイティブドライバは EDE ファイルを使用しません — タグアドレスから直接 confirmed ReadProperty を送信します。旧フォームの ede-file-path / ede-directory-path オプションは無視されます(削除済み)。
クラス構造
BaseProtocolDriver
└── BACnetDriver — connect() 에서 BacnetIpPLC(host, port) 생성 (UDP connectionless)
UDP は connectionless のためハンドシェイクがありません — ソケットの準備がそのまま接続であり、通信のライブネスは read 失敗時に setConnected(false) で管理します(AB-ETH パターン)。read 失敗時はソケットを無効化し、Edge に再接続を促します。
wire フォーマット概要(独自実装)
- BVLC(Block Virtual Link Control)→ NPDU(Network)→ APDU(Application)。
- ReadProperty-Request:
objectIdentifier+propertyIdentifier。 - ReadProperty-ACK: BACnet プリミティブ型(Real / Unsigned / Boolean / Enumerated / CharacterString)を文字列にデコード。
- BBMD(Foreign Device Registration)は未使用 — 同一サブネットのブロードキャストドメイン内でのみ動作します。
OPC 登録オプション
| フィールド | 意味 | デフォルト |
|---|---|---|
opc_agent_ip | BACnet device IP | 192.168.1.50 |
opc_agent_port | UDP ポート | 47808(通常は固定) |
options.read-timeout | 応答タイムアウト (ms) | 3000 |
タグ plc_address 形式
<object-type>:<instance>[:<property>]
property を省略した場合は present-value とみなされます。object-type / property は名称または数値コードのどちらも指定できます。旧 PLC4j 表記(property の前にドット: analog-input:1.present-value)も互換として受け付けます。
| 表記 | 意味 |
|---|---|
analog-input:0 | AI 0 の present-value(REAL) — property 省略 |
analog-input:0:present-value | 同一(明示) |
binary-input:1 | BI 1 present-value(Boolean) |
analog-value:10 | AV 10(計算値) |
multi-state-input:2 | MSI 2(Unsigned) |
device:1:object-name | Device 1 の名称(CharacterString) |
0:5:85 | object-type 0(AI) / instance 5 / property 85(present-value) — 数値コード |
support / 非対応
- read: ReadProperty(単一 property) — OK。
- write: 非対応 —
isWriteSupported() = false、write()は常にfalse。(WriteProperty は今後実装。) - COV(Change Of Value)subscription: 非対応 — ポーリングベース。
- BBMD / Foreign Device: 非対応 — 同一サブネットのみ。
- BACnet/SC(Secure Connect WebSocket)および BACnet MS/TP シリアル: 非対応。
curl 登録例
curl -X POST http://<edge-host>/api/v1/opc \
-H "Content-Type: application/json" \
-d '{
"opc_id": "OPC_BACNET_AHU1",
"opc_type": "BACNET",
"opc_name": "AHU-1 Controller",
"opc_agent_ip": "192.168.1.50",
"opc_agent_port": "47808",
"site_id": "SITE_00001",
"auto_collect": true,
"timecycle": 2000,
"options": { "read-timeout": "3000" },
"tag_list": [
{"tag_id":"OPC_BACNET_AHU1_T01","tag_name":"SupplyTemp","plc_address":"analog-input:0","data_type":"Float"},
{"tag_id":"OPC_BACNET_AHU1_T02","tag_name":"FanRun","plc_address":"binary-input:1","data_type":"Boolean"}
]
}'
参考
- BACnet ASHRAE 135 規格。
- コード:
plantpulse-edge-driver/src/plantpulse/driver/protocol/bacnet/BACnetDriver.java+plantpulse-plc-protocolのbacnetパッケージ。 - 運用: 同一 L2 ブロードキャストドメインが必要です。ルータ越しの device には BBMD または別途ゲートウェイが必要(非対応)。