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

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_typeBACNET
実装クラスplantpulse.driver.protocol.bacnet.BACnetDriver
ライブラリ独自ネイティブplantpulse-plc-protocolbacnet — ReadProperty)
継承BaseProtocolDriver(PLC4j ではありません)
デフォルトポート47808(0xBAC0, UDP)
状態安定(ReadProperty ポーリング)
readOK(ReadProperty、単一 property)
write❌(読み取り専用 — WriteProperty 未実装)
セキュリティなし(BACnet/SC 非対応)
EDE ファイルは不要

旧 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_ipBACnet device IP192.168.1.50
opc_agent_portUDP ポート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:0AI 0 の present-value(REAL) — property 省略
analog-input:0:present-value同一(明示)
binary-input:1BI 1 present-value(Boolean)
analog-value:10AV 10(計算値)
multi-state-input:2MSI 2(Unsigned)
device:1:object-nameDevice 1 の名称(CharacterString)
0:5:85object-type 0(AI) / instance 5 / property 85(present-value) — 数値コード

support / 非対応

  • read: ReadProperty(単一 property) — OK。
  • write: 非対応isWriteSupported() = falsewrite() は常に 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-protocolbacnet パッケージ。
  • 運用: 同一 L2 ブロードキャストドメインが必要です。ルータ越しの device には BBMD または別途ゲートウェイが必要(非対応)。