# Modbus RTU

> シリアルバス越しの Modbus。物理的な回線を明示して形にし、ユニット ID を持つ機器がそれを共有します。

Modbus RTU のドライバーは、シリアルバス上の Modbus の機器と話します。RS-485 か RS-232 で、物理的な COM ポート、USB のアダプター、仮想やリダイレクトのポートを通して届きます。バスが物理的に共有されるので、構成は**ドライバー → 回線 → 機器 → タグ**になります。**回線**が電気に関わるものすべて（ポート、ボーレート、形式、タイミング）を持ち、その上の各**機器**は自分のユニットのアドレス、読み出し、タグだけを持ちます。

## シリアル回線 {#serial-line}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **名前** | バスの分かりやすい名前。いつでも編集できます。 | 必須 |
| **シリアルポート** | オペレーティングシステムのポート、たとえば `COM3`。この項目は自由記述で、物理、仮想、リダイレクトのどのポートでも使えます。横の矢印は、Windows が現在検出しているポートを出し（アダプターの抜き差しのための**再読み込み**も付きます）、検出された一覧はあくまで便宜のもので、許可リストではありません。 | `COM1` |
| **ボーレート** | バス上のすべての機器が共有するビットの速さ。 | 9600 |
| **伝送モード** | バス上のすべての機器がメッセージをどう組み立てるかです。**RTU** は CRC で検査するバイナリのフレーム、**ASCII** はコロンから改行までテキストで書かれ LRC で検査するフレームで、古い機器が使います。1 本のバスは 1 つのモードしか話さないので、モードは回線のものです。 | RTU |
| **シリアルの形式** | `8N1`、`8N2`、`8E1`、`8E2`、`8O1`、`8O2` から選び、ASCII の回線ではさらに `7N2`、`7E1`、`7E2`、`7O1` も選べます。数字はデータビット、文字はパリティ（`N` はなし、`E` は偶数、`O` は奇数）、最後の数字はストップビットです。RTU のフレームにはデータビットが 8 必要なので、RTU の回線は 8 ビットの形式だけを示します。ASCII の回線から残った 7 ビットの形式は空欄で表示され、別の形式を選ぶまで受け付けられません。ほかのビット幅、マーク／スペースのパリティ、1.5 ストップビットには対応しません。 | `8E1` |
| **応答のタイムアウト（ms）** | 1 台のユニットの応答を待つ最長時間、100 から 60,000。長くすると遅い現場設備に合わせられますが、応答のないユニットや機器検出の判定には時間がかかります。 | 1000 |
| **通信の最小間隔（ms）** | 回線全体に効く互換のための間隔調整、0 から 1000。0 ならプロトコルの自動の休止だけが残ります。正の値はそれを引き上げることはできても、下げることはできません。 | 0 |

ASCII の回線には、次に説明する休止は当てはまりません。ASCII のフレームは改行で終わるので、自動の休止は 0 ms と表示され、**通信の最小間隔（ms）**がフレームの間の唯一の休止になります。カードはその下で「ASCII のフレームは改行で終わるので、回線は独自の休止を入れません。この間隔がフレームの間の唯一の休止です。」と示します。伝送モードは物理的な設定で、回線が有効なあいだはポート、ボーレート、形式、応答のタイムアウトとともにロックされます。ASCII の回線にある機器のランタイムのアドレスは `/ascii` で終わります。

プロトコル自身がフレームのあいだの休止を求めており、回線は常にそれを守ります。19,200 ボー以下では、自動の休止は設定した形式から計算した 3.5 文字分の時間です。19,200 ボーより速いときは、仕様が勧める固定の 1.75 ms です。実効の休止は、その自動の下限と設定した間隔の**大きいほう**であり、合計ではありません。パネルは両方の値を見せます。間隔を引き上げると、その回線のすべてのユニットが意図してゆっくりになります。これは互換のための補助であり、配線、終端、接地、ノイズの不具合を直すものではありません。

新しい回線は、先に物理的な設定を入力できるよう**無効**な状態で始まります。1 つの物理ポートは、多くても 1 本の回線に属します。比較では大文字と小文字を区別せず、回線が無効であっても同じです。名前と通信の間隔は、回線が動いているあいだも編集できます（タイミングの変更はポートを開き直さずに効きます）。ポート、ボーレート、形式、応答のタイムアウトは、回線が有効なあいだロックされます。先に無効にして保存してください。回線を無効にすると、その機器の個々の有効の選択を変えずに、すべての機器の通信が止まります。

回線は、物理的な通信路の状態を機器とは別に報告します。**オフ**、**待機**（有効な機器がない）、**接続中**、**オンライン**、または診断を添えた**ポート障害**です。空の回線を削除すると、その回線だけが消えます。機器のある回線を削除するときは、はっきりとした確認を求め、その機器とタグも一緒に削除します。

## 機器 {#device}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **シリアル回線** | 固定です。機器はその回線の下に作られ、物理的な組を受け継ぎ、パネルには読み取り専用で出ます。目的の回線の下に機器を追加してください。 | 追加した先の回線 |
| **ユニット ID** | バス上でのその機器の Modbus のアドレス、1 から 247。回線の中で一意です（無効な機器も含みます）。 | 1 |
| **読み出し周期（ms）** | 上書きしないタグに対する既定の読み出しの速さ。 | 1000 |

内部のランタイムのアドレスは `modbus+rtu://<line-id>/<port>/<baud>/<format>/<timeout>/<unitId>/<interval>` で、回線の安定した識別名と物理的な設定の全体を運びます。分かりやすい名前は決して運びません。

## 回線を共有する振る舞い {#shared-line-behavior}

このドライバーは**回線ごとにシリアルのセッションを 1 つ**開き、すべての機器のすべての要求を 1 つの取りまとめ役で直列にするので、読み取りと書き込みがバス上で重なることはありません。待っている書き込みは、限度のある優先度で次の空いた順番を取ります。書き込みはすみやかに処理されますが、書き続けても読み出しが飢えることはありません。各ユニットのタイムアウトは、段階的な待ち延ばしとともに切り離されているので、黙っている機器 1 台が遅くするのは自分だけです。CRC の正しい Modbus の例外は、そのタグのその要求だけのエラーであり、回線は健全なままです。共有のセッションを無効にして、回線全体で協調した開き直しを始めるのは、物理的な入出力の失敗（ポートが消えた、アダプターが抜けた）だけです。最後の機器が手を離すと、ポートが閉じます。

## タグのアドレス指定 {#tag-addressing}

タグのアドレス指定は [Modbus TCP](driver-modbus-tcp) とまったく同じです。**レジスターの種類**（コイル（0xxxx）、ディスクリート入力（1xxxx）、入力レジスター（3xxxx）、保持レジスター（4xxxx）。既定はタグの型とアクセスから導かれます）、0 起算の**レジスター番号**、自動の**数量（レジスター数。空欄なら自動）**（ブール値、Int16、UInt16 はレジスター 1 つ、Int32 と Float は 2 つ、文字列は 4 つ。ほかの幅は決まっているので、入力欄は文字列のタグにだけ描かれます）、そして順序の 2 つの入力欄、バイト順の**上位バイトを先に（MSB first、ビッグエンディアン）**とワード順の**上位ワードを先に（high word first）**（2 レジスターの Int32 と Float にだけ描かれます）で、どちらも既定でオンです。「信号源」のカードの最後の**マニュアル上のアドレス**は、機器のマニュアルが印刷するとおりのタグのアドレスです（入力レジスター 0 は 30001）。使える値の型も同じ 6 つ、つまり Boolean、Int16、UInt16、Int32、Float、String です。Int16 と UInt16 は 16 ビットのレジスター 1 つを符号付きか符号なしで読み、当てはまるのはバイト順だけで、ワード順の入力欄は描かれません。読み書きの機能コードとバス上の並びは [Modbus TCP](driver-modbus-tcp) のページに書いてあり、ここでもそのまま当てはまります。

## 機器検出 {#discovery}

機器検出は、既存の回線でユニット ID の範囲を探索するもので、その回線のパネルにあります。

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ユニット ID の開始** | 最初に探索するユニット ID、1 から 247。 | 1 |
| **ユニット ID の終了** | 最後のユニット ID。開始から昇順です。 | 32 |

ASCII の回線では、探索は同じ要求を ASCII のフレームで送り、CRC の代わりに LRC を使います。LRC の正しい例外はユニットの存在を示し、LRC の合わないフレームは何も示しません。

スキャンは回線の保存済みの物理的な設定を読み直し、ポートを一度だけ開き、Read Basic Device Identification（機能コード 43/14）でその範囲を**順番に**探索し、回線の実効のフレーム間の休止に合わせて各探索の間隔を取ります。設定の組み合わせを試すことも、レジスターを読むこともありません。CRC の正しい Modbus の例外は、身元は分からなくてもそのユニットの存在を示します。タイムアウトや壊れたフレームは、示しません。

使用中の回線が自動で中断されたり切り替えられたりすることは決してありません。スキャンの前に無効にし、終わったら自分で有効に戻してください。取りやめるとシリアルのセッションが閉じ、すでに出ていた結果は、明示的に追加するまで一時的な候補として残ります。すでに設定されているユニット ID はそう示され、重複を作る代わりに既存の機器を開きます。結果はタグを運びません。レジスターは**追加**のあとで設定します。

機器検出と回線の設定は、物理ポートごとに 1 つの、すぐに失敗を返す予約を共有するので、スキャンと設定変更がポートを取り合うことはありません。取れなかったほうには、どの操作がポートを握っているかが伝えられます。

## 知っておきたい限界 {#limits-worth-knowing}

- 6 つの値の型が、バス上の変換の語彙のすべてです。ほかの幅の整数や Double は出ません。
- 通信量はバスの性質です。回線上のすべての機器が 1 本の要求の流れを共有し、実効のフレーム間の休止に合わせて間隔が取られるので、機器が多いときや間隔を引き上げたときは、どの読み出しの周回も長くなります。
