# BACnet

> BACnet/IP のビル自動化機器につなぎます。デバイスインスタンス、オブジェクトの型とインスタンスによるアドレス指定、Who-Is の機器検出、そして presentValue。

**BACnet** のドライバーは、BACnet/IP でビル自動化の設備と話します。どのタグも、BACnet のオブジェクト 1 つの**現在値**を読みます。アナログ入力の実時間の読み取り、バイナリ出力の状態、多状態値の位置などです。[Connector](connector) の BACnet のドライバーの下に機器を追加してください。パネルは、このプロトコルが使う項目だけを見せます。

## 接続 {#connection}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ホスト** | BACnet の機器（またはそれに代わって答えるルーター）の IP アドレスかホスト名。名前は機器の接続のときに IPv4 アドレスに解決されます。このコンピューターが解決できない名前では機器は接続されず、理由にそう書かれます。 | 空 |
| **ポート** | 機器の UDP のポート（1 から 65535）。欄が空のときは BACnet/IP の標準である 47808 が灰色で表示され、機器にはそのポートで届きます。0 で保存された機器も同じように表示されます。 | 47808 |
| **機器 ID** | その機器のインスタンス番号、つまり Device オブジェクトの番号で、BACnet のネットワークの中で一意です。 | 0 |

機器の見出しは、組み立てられた接続先を見せます。たとえば `bacnet://192.168.0.30:47808/1234` です。接続では、設備が答えることを確かめるために、機器のオブジェクトの一覧の大きさを尋ねる要求を 1 つ送ります。一覧そのものを巡ることはしません。その答えが接続です。答えない機器は、接続済みに見せかけるのではなくオフラインのままになり、その理由（UDP のポートがすでに取られている、アドレスがアドレスになっていない）が Events のページとその日のログのファイルに書かれます。このドライバーには読み出し周期の項目がありません。そのタグは 1 秒に 1 回読まれます。

## アドレス指定 {#addressing}

BACnet のタグは、タグの「信号源」のカードの 2 つの型付きの項目でアドレスを取ります。自由記述のアドレスはありません。

| 項目 | 意味 | 受け付ける値 | 既定 |
| --- | --- | --- | --- |
| **オブジェクトの型** | 読む BACnet のオブジェクトの種類。 | 下の 9 つの型 | `AnalogInput` |
| **インスタンス** | その型の中でのオブジェクトのインスタンス番号。 | 0 以上 | 0 |

出るオブジェクトの型と、その標準の BACnet の型コードは次のとおりです。

| オブジェクトの型 | コード | 現在値が持つもの |
| --- | --- | --- |
| `AnalogInput` | 0 | 測定された数値 |
| `AnalogOutput` | 1 | 指令された数値 |
| `AnalogValue` | 2 | 保存された数値 |
| `BinaryInput` | 3 | 非動作／動作 |
| `BinaryOutput` | 4 | 非動作／動作 |
| `BinaryValue` | 5 | 非動作／動作 |
| `MultiStateInput` | 13 | 1 以上の状態の番号 |
| `MultiStateOutput` | 14 | 1 以上の状態の番号 |
| `MultiStateValue` | 19 | 1 以上の状態の番号 |

機器 1234 の `AnalogInput` 5 は、「その機器のアナログ入力 5 の現在値」という意味です。読み取りのたびに、そのオブジェクトの `presentValue` プロパティを尋ねます。ほかのプロパティを指すことはできません。「信号源」のカードの読み取り専用の**取得元のアドレス（バス上）**の行が、編集しているそばから組み立てられた `type,instance` の組を見せます。

## データ型 {#data-types}

**データ型**の選択肢には 4 つの型が出ます。オブジェクトに合うものを選んでください。

| データ型 | 合う相手 | 備考 |
| --- | --- | --- |
| Float | アナログのオブジェクト | Real の現在値。倍精度は Float に縮められます |
| Boolean | バイナリのオブジェクト | Boolean の現在値、またはバイナリのオブジェクトが答える列挙の 0 と 1 |
| Int32 | 多状態やそのほかの整数の値 | 符号付き、符号なし、列挙の答えは、どれもここに届きます |
| String | 文字列の値 | 機器が送ってくるままの文字 |

選んだ型は、そのオブジェクトが持つものと合っている必要があります。別のもので答える機器は、そのタグの読み取りを失敗させます。タグは品質が悪くなり、理由が何が届いたかを名指しします（「Integer と宣言された点に対して、機器は Single の値で答えました。」）。変換された数値がトレンド、履歴、警報に入っていくことはありません。アナログのオブジェクトをブール値として読む、Real を Int32 として読む、というのがまさにこの場合です。機器の残りは読み取りを続けます。型の合っていないタグのために再接続が起こることもありません。

機器が持っていないオブジェクトを指すタグは、機器自身の答えとともに読み取りに失敗します。理由は、そのアドレスに機器のオブジェクトがないことを伝え、機器が送ってきたエラー（`ERROR_CODE_UNKNOWN_OBJECT`）を名指しします。そのため、アドレスの誤りは、答えなくなった機器とは別のものとして読めます。機器は接続されたままです。

## 書き込み {#writes}

**アクセス**が読み書きか書き込みのみのタグは書き込めます。書き込みは、そのオブジェクトの `presentValue` を、タグのデータ型にかかわらず、BACnet の規格がその種類のオブジェクトに定める型で設定します。

| オブジェクト | 書き込む型 | 受け付けるもの |
| --- | --- | --- |
| バイナリの入力、出力、値 | Enumerated | 非動作 (0) か動作 (1)。Boolean のタグ、または 0 か 1 の Int32 から |
| 多状態の入力、出力、値 | Unsigned | 1 以上の状態の番号 |
| アナログの入力、出力、値 | Real | Float か Int32 のタグからの数値 |
| そのほかの型のオブジェクト | タグのデータ型 | Float は Real、Boolean は Boolean、Int32 は符号付きの整数、String は文字列 |

書き込みに指令の優先度は付けません。オブジェクトが持てない値、たとえば多状態のオブジェクトへの 0 やバイナリのオブジェクトへの 2 は、何も送る前に拒否され、その拒否が理由を伝えます。機器が書き込みにエラーで答えたときは、タグは成功を装うのではなく、機器が送ってきたエラーのクラスとコードを報告し、機器は接続されたままです。新しいタグは読み取りのみから始まります。

## 機器検出 {#discovery}

Connector の機器検出のボタンは、BACnet の **Who-Is** を同報し、**I-Am** の答えを 10 秒間聞きます。答えたすべての機器が、そのアドレス、ポート、デバイスインスタンスを運ぶ候補になり、接続の項目が埋まった状態ですぐ追加できます。しかも 10 秒の終わりではなく答えた瞬間に一覧に現れるので、途中で取りやめたスキャンでも、すでに答えていたものはすべて残ります。スキャンはオブジェクトを巡らないので、候補はタグ 0 件で届きます。オブジェクトの型とインスタンスの組は自分で追加してください。

Who-Is は、**スキャンの範囲** カードが指すネットワークへ出ます。その入力欄には、そのネットワーク上の IPv4 アドレス（機器のアドレスか、そのネットワークでのこのコンピューター自身のアドレス、例：`192.168.1.20`）を書きます。するとスキャンはそのネットワークだけに同報します。空欄なら Who-Is はこのコンピューターのすべてのネットワークへ出るので、ネットワークカードが 2 枚ある、VPN がある、Docker があるコンピューターでも、それぞれのネットワークの機器が見つかります。最後まで書き切った IPv4 アドレスでないものは入力欄の下で拒否され、直すまで機器検出のボタンは灰色のままです。

**BACnet のルーター越し**に答える機器も、同じように追加されます。その候補はルーターのアドレスと、それに添えてその機器自身のネットワークと、そのネットワーク上でのアドレスを運びます。追加するときはどちらも保たれ、読み取りはすべて、中の機器を名指ししてルーターへ送られます。こうして見つかった機器は、ほかと同じように読まれ、その接続先は「ルーター経由の機器」と読めます。手で追加した機器は経路を持たず、そのホストへ直接届きます。

## 知っておくとよいこと {#good-to-know}

- BACnet/IP だけです。MS/TP や BACnet/SC の設備には、それを BACnet/IP で見せるルーター越しにしか届きません。そしてそれを見つけるのがスキャンです。機器が答えた経路はスキャンから保たれるので、項目を手で入力するのではなく、検出された一覧から追加してください。
- ネットワークインターフェースが複数あるコンピューター（ネットワークカードが 2 枚、VPN、Docker）では、各機器には、このコンピューターがそのアドレスへの経路に使うインターフェースから届きます。ここでほかのプログラムが使うのと同じものなので、選ぶものはありません。
- このステーションの標準の BACnet の UDP ポート 47808 を使うのは、機器からのメッセージを待ち受けるソケットだけです。そのため、同じコンピューターで別の BACnet のアプリケーションがそのポートを占有していると、ぶつかることがあります。機器への要求は、クライアントごとにシステムが選ぶポートから出ます。
- このドライバーでは、読み出しはどのタグも 1 秒に固定です。いつもの読み出し周期の項目は出ません。
