BACnetのReadPropertyMultipleRequestについて調べています。調査・検証結果を下記に残します。
BACnetはKNXやDALIと違い1回のリクエストで複数のオブジェクトのプロパティを取得する方法があります。それがReadPropertyMultipleRequestという機能です。これにより、複数のリクエストを送信する必要がなくなり、通信の効率が向上します。
構造
ReadPropertyMultipleRequestメッセージは次の情報を含みます。
対象オブジェクト (Object Identifier)
- どのオブジェクトを対象にしているかを指定します(例: 温度センサー)。
プロパティリスト (Property Identifier List)
- 取得したいプロパティのリスト(例: 現在値、デバイスの状態)。
オプション (Array Index)
- プロパティが配列の場合、特定のインデックスを指定できます。
注意点
対応するデバイスReadPropertyMultipleRequest
に対応していないデバイスもあるため、事前に仕様を確認が必要です。
応答のデコード
応答は複雑になる場合があります。応答データの構造を理解し、正確にデコードすることが重要です。
エラーハンドリング
例えば、要求したプロパティがデバイスに存在しない場合、エラー応答が返されることがあります。
YABEで確認
YABEからCoolAutomation社のCoolMasterのBACnetオブジェクトを確認してみます。
YABEにDeviceを追加した直後は、CoolMasterの各オブジェクトが「OBJECT_BINARY_INPUT:258」のようになっていますが、マウスでクリックすると「L1.101 room_temp」の様にBACnetPropertyのObjectName を取得することができます。
その時にYABEのLogには「Sending ReadPropertyMultipleRequest」と「ComplexAck」が表示されています。これをWireshark でみてみましょう。
WiresharkでCoolMasterとYABEの通信をキャプチャ
WiresharkのフィルターをCoolMasterのIPアドレス(ip.addr == 192.168.1.100)にした状態で、YABEから「L1.101 room_temp」オブジェクトをクリックした画面キャプチャです。
「Sending ReadPropertyMultipleRequest」と「ComplexAck」の内容となります。
WiresharkでSending ReadPropertyMultipleRequestをチェック
左下スクリーンに表示されるFrame 168から始まる部分をクリックすると、この通信の全体の概要が表示されます。
パケットの中にBuilding Automation and Control Network NPDUとBuilding Automation and Control Network APDUがあります。
ちなみに「Building Automation and Control Network」がBACnetのことです。
このNPDUとAPDUが一番重要な部分です。
上の図は前枝昌弘さんが電気設備学会誌2022年3月に掲載されたBACnetネットワーク層とデータリンクという記事から引用させていただきました。
NPDUは(Network Protocol Data Unit)の略で上図の「BACnet Network Layer」になり、ネットワーク層で使用されるデータ単位であり、BACnetメッセージをネットワーク間でルーティングする役割を果たします。
もうひとつのAPDUは(Application Protocol Data Unit)の略で上図の「BACnet Application Layer」となり、BACnetプロトコルスタックのアプリケーション層で使用されるデータ単位で、デバイス間でやり取りされるアプリケーションレベルのコマンドやデータを表します。APDUは、実際の制御操作や情報交換の主役となる部分です。
つまり、ReadPropertyMultipleRequestの内容はこのAPDUの内容となります。
Building Automation and Control Network APDU
こちらがAPDUの部分です。この記事の前半でReadPropertyMultipleRequest、には対象オブジェクト (Object Identifier)とプロパティリスト (Property Identifier List)が含まれていると解説しましたが、このパケットの中にObjectIdentifierとlistOfPropertyReferencesとして含まれています。
対象オブジェクトはAnalog-Inputでインスタンス番号256となっています。
YABEで指定したオブジェクトとも合致してます。
Property Identifierは all(8)となっています。
Property Identifier(プロパティ識別子)のID値について
PropertyIdentifierについてChatGPTに聞いてみた結果が下記です。
BACnetで使用されるProperty Identifier(プロパティ識別子)のID値は、オブジェクトの特定のプロパティを識別するための一意な値です。このID値には、BACnet標準で定義された多くのプロパティが含まれており、各値は異なる役割を持っています。
以下に主なID値をカテゴリごとに整理して紹介します。
1. オブジェクト共通プロパティ
すべてのオブジェクトで共通して使用されるプロパティです。
プロパティ名 | ID値 | 説明 |
---|---|---|
Object_Identifier | 75 | オブジェクトのユニーク識別子。 |
Object_Name | 77 | オブジェクトの名前。 |
Object_Type | 79 | オブジェクトの種類(例: アナログ入力)。 |
Description | 28 | オブジェクトの説明。 |
2. 値や状態に関連するプロパティ
センサーやアクチュエーターの状態や値を表します。
プロパティ名 | ID値 | 説明 |
---|---|---|
Present_Value | 85 | 現在の値。 |
Units | 117 | 測定値の単位(例: 度、アンペア)。 |
Min_Pres_Value | 69 | 設定可能な最小値。 |
Max_Pres_Value | 65 | 設定可能な最大値。 |
Status_Flags | 111 | オブジェクトのステータスを示すフラグ。 |
3. アラームおよびイベント関連プロパティ
アラームやイベントの管理に関連するプロパティです。
プロパティ名 | ID値 | 説明 |
---|---|---|
Event_State | 36 | オブジェクトの現在のイベント状態。 |
Acked_Transitions | 0 | 確認されたアラームトランジション。 |
Notification_Class | 17 | 通知クラスを指定。 |
Time_Delay | 113 | アラームが発生する前の遅延時間。 |
Limit_Enable | 52 | アラームのしきい値が有効かどうか。 |
4. スケジュールおよびトレンドログ関連プロパティ
スケジュールやログに関連するプロパティです。
プロパティ名 | ID値 | 説明 |
---|---|---|
Weekly_Schedule | 123 | 毎週のスケジュールを定義。 |
Exception_Schedule | 38 | 例外スケジュールを定義。 |
Log_Buffer | 131 | ログのデータを格納するバッファ。 |
Log_Interval | 134 | ログの記録間隔。 |
Stop_When_Full | 130 | ログがいっぱいになったときの動作を制御。 |
5. デバイス関連プロパティ
BACnetデバイスに特化したプロパティです。
プロパティ名 | ID値 | 説明 |
---|---|---|
System_Status | 112 | デバイスのシステムステータス。 |
Vendor_Identifier | 120 | デバイスのメーカー識別子。 |
Vendor_Name | 121 | メーカー名。 |
Model_Name | 70 | デバイスのモデル名。 |
Firmware_Revision | 44 | デバイスのファームウェアバージョン。 |
6. セキュリティおよびアクセス制御関連プロパティ
BACnetシステムのセキュリティやアクセス制御を扱います。
プロパティ名 | ID値 | 説明 |
---|---|---|
Authentication_Policy | 24 | 認証ポリシーを指定。 |
Access_Rights | 11 | アクセス権限を管理。 |
Security_Level | 104 | 現在のセキュリティレベルを示す。 |
7. その他の特殊なプロパティ
特殊な機能や高度な制御に関連するプロパティです。
プロパティ名 | ID値 | 説明 |
---|---|---|
Reliability | 103 | 信頼性の状態(正常/エラー)。 |
Priority_Array | 87 | 優先度が設定された値のリスト。 |
Relinquish_Default | 104 | 優先度がない場合のデフォルト値。 |
Active_Text | 4 | アクティブ状態のテキスト表現。 |
Inactive_Text | 46 | 非アクティブ状態のテキスト表現。 |
特殊な識別子
特定の条件に基づいてプロパティを操作する際に使用される特殊なID値です。
プロパティ名 | ID値 | 説明 |
---|---|---|
all | 8 | オブジェクトのすべてのプロパティを対象。 |
required | 9 | 必須のプロパティのみを対象。 |
optional | 10 | オプションのプロパティのみを対象。 |
BACnetのProperty Identifierには多数のID値があり、それぞれが特定のプロパティを指します。これらを正確に理解し使用することで、BACnetネットワーク上のデバイスやオブジェクトを効果的に制御および管理できます。
Complex-ACKパケットの確認
ReadPropertyMultipleRequestからの返答(Complex-ACK)がこちらです。
この中のlistOfResultsが返信内容です。
この中の「Property Identifier: event-state(36)」についてですが、
まずは、先ほどのProperty Identifierで36がEvent_Stateだということが確認できます。
YABEでみるとEvent Stateとあり、これの内容となります。
値もevent-state : normal(0)となっておりYABEの内容と一致しています。
このように、ReadPropertyMultipleRequestのProperty IdentifierがALL(8)の時に、Complex-ACKで各プロパティの値が返ってきたことが確認できました。
まとめ
以上、BACnetのReadPropertyMultipleRequestとそれに対するAckについてWiresharkから確認しました。
今回のRequestはあるオブジェクトのすべてのプロパティを取得するというものでしたが、複数のデバイスにまたがりそれぞれのプロパティを指定してデータを取得するということもできそうです。
上記は確認していませんが、PythonのBACpypesでObject listをこのように記述すれば複数のObjectのプロパティを取得するできるとのこと。
ただし、BACnetクライアント側からObjectとPropertyを指定してReadPropertyMultipleRequestがだせるかどうかは、引き続き検証が必要になるので頑張ります。