ここでは主にシリアル通信の符号化方式としてRTUについて説明する。
1 概要
Modbus プロトコルは、Modicon Inc.(AEG Schneider Automation International S.A.S.)が PLC 用に
開発した通信プロトコルで、プロトコル仕様書(PI-MBUS-300 Rev.J)に記載されています。
Modbus プロトコルで定義されているのは通信プロトコルのみで、通信媒体などの物理レイヤは規定されていない。
いかについては、当方で調べた結果を記載しているので、違う点があれば、お教えください。
Modbus プロトコルで定義されているのは通信プロトコルのみで、通信媒体などの物理レイヤは規定されていない。
いかについては、当方で調べた結果を記載しているので、違う点があれば、お教えください。
1.1 ModBusプロトコル
Modbus の通信方式は、シングルマスター/マルチスレーブ方式です。
マスターだけがクエリ(通信の開始)を発行することができる。
スレーブは、このクエリを見て、指定された機能を実行し、応答メッセージを返す。
マスターは、指定のスレーブに対するクエリ、または全てのスレーブに対するブロードキャストクエリのいずれかを発行することができる。
ブロードキャストクエリの場合には、スレーブは指定の機能を実行するのみで、応答メッセージは返しない。
スレーブは、自分に対するクエリのときにだけ応答メッセージを返す。
クエリの伝送フォーマットは、スレーブのアドレス(またはブロードキャスト)、要求内容を定義するファンクションコード、 データおよびエラーチェックフィールドから構成されている。
また、応答メッセージの伝送フォーマットは、要求内容の確認フィールド、応答データおよびエラーチェックフィールドから構成されている。
クエリと応答メッセージの伝送フォーマットを下図に示す。
マスターだけがクエリ(通信の開始)を発行することができる。
スレーブは、このクエリを見て、指定された機能を実行し、応答メッセージを返す。
マスターは、指定のスレーブに対するクエリ、または全てのスレーブに対するブロードキャストクエリのいずれかを発行することができる。
ブロードキャストクエリの場合には、スレーブは指定の機能を実行するのみで、応答メッセージは返しない。
スレーブは、自分に対するクエリのときにだけ応答メッセージを返す。
クエリの伝送フォーマットは、スレーブのアドレス(またはブロードキャスト)、要求内容を定義するファンクションコード、 データおよびエラーチェックフィールドから構成されている。
また、応答メッセージの伝送フォーマットは、要求内容の確認フィールド、応答データおよびエラーチェックフィールドから構成されている。
クエリと応答メッセージの伝送フォーマットを下図に示す。
マスター:メッセージ
|
問いかけ ➡ ⬅ 応 答 |
スレーブ:メッセージ
|
|---|
1.2 通信媒体とModBus
『Modbus プロトコルで定義されているのは通信プロトコルのみで、通信媒体などの物理レイヤは規定されていない。』と前に記載したが、主にシリアル通信(RTU、ASCII)とEthernet(TCP/IP~)上で使用されている。
| シリアル通信 | Ethernet | |||
|---|---|---|---|---|
| 物理層 | RS232C | RS-422 | RS485 | Ethernet |
| 方式 | マスター・スレーブ | 左記に加えマルチスターや1対1の通信も可能 | ||
| 通信速度 | 最大19.2kbps | 10M又は100Mbps | ||
| 符号化モード | RTU(1)モード又はASCII(2)モード | (3)イーサネット用に最適化された形式(MBAPヘッダーを使用) | ||
(1)RTUモード: バイナリ形式のデータを使用する。
エラーチェックはCRC-16(Cyclical Redundancy Checkでチェック出力が16bit=2Byte)を使用する。
(2)ASCIIモード: ASCII形式のデータを使用する。
エラーチェックは、LRC(Longitudinal Redundancy Check)を使用する。
(3)イーサネット物理層上でシリアル通信(RS-232/RS-485)で使用されるRTUまたはASCIIプロトコルを「そのまま」ラップして通信する機能を提供している場合がある。
なおRTUであればCRC16などはTCP/IPがエラー制御を担うため、必要ない。
ラップして通信する方法は、既存のシリアルデバイスとの互換性を維持したり、特定のゲートウェイ機能を実現したりするために使用されている。
エラーチェックはCRC-16(Cyclical Redundancy Checkでチェック出力が16bit=2Byte)を使用する。
(2)ASCIIモード: ASCII形式のデータを使用する。
エラーチェックは、LRC(Longitudinal Redundancy Check)を使用する。
(3)イーサネット物理層上でシリアル通信(RS-232/RS-485)で使用されるRTUまたはASCIIプロトコルを「そのまま」ラップして通信する機能を提供している場合がある。
なおRTUであればCRC16などはTCP/IPがエラー制御を担うため、必要ない。
ラップして通信する方法は、既存のシリアルデバイスとの互換性を維持したり、特定のゲートウェイ機能を実現したりするために使用されている。
1.3 符号化方式の比較
| RTUモード | ASCIIモード | |
|---|---|---|
| 符号化方式 | 8ビットバイナリデータ | 7または8ビットASCII文字 |
| 効率性 | 高い(同じデータを約半分のバイト数で送信可能) | 低い(同じデータ量で約2倍のバイト数が必要) |
| 可読性 | 人間が直接読むことはできない (バイナリ形式) | 人間が読める (トラブルシューティングが容易) |
| メッセージ区切り | 3.5文字時間以上の無通信時間を使用 (サイレンス期間) | 開始文字 :と終了文字 CR/LF を使用 (コロンと改行・復帰) |
| エラーチェック | 強力なCRCを使用 (Cyclic Redundancy Check) | LRCを使用 (Longitudinal Redundancy Check) |
上記からMCUなどで使用する場合は、効率性を優位として以下からの説明もRTUの説明を中心にする。
1.4 通信時間制限(RTU)
問いかけ(メッセージ)終わり→①→返答(メッセージ)完了→②→問いかけはじめまでの時間的制限
①50(ms)以内
②20(ms)以上
①50(ms)以内
②20(ms)以上
2 メッセージ構造(RTU)
2.1 フレーム
| 項目 | DeviceAddress | Function | Data | CRC |
|---|---|---|---|---|
| 使用Buyte | 1 | 1 | n | 2 |
2.2 DeviceAddress
アドレス・フィールドは、0 から 247(10 進数)が許される。
スレーブ・アドレスは 1 から 247 です。
マスターがスレーブにクエリを発する場合には、このアドレスフィールドにスレーブのアドレスをセットする。
スレーブがマスターに応答メッセージを返す場合には、スレーブのアドレスをセットする。
これによって、マスターはどのスレーブからの応答であるかを知ることができる。
アドレス 0 はブロードキャストクエリに用います。
スレーブ・アドレスは 1 から 247 です。
マスターがスレーブにクエリを発する場合には、このアドレスフィールドにスレーブのアドレスをセットする。
スレーブがマスターに応答メッセージを返す場合には、スレーブのアドレスをセットする。
これによって、マスターはどのスレーブからの応答であるかを知ることができる。
アドレス 0 はブロードキャストクエリに用います。
2.3 Function
設定可能なファンクション・コードは 1 から 255(10 進数)です。
ファンクション・コードに従って、スレーブは指定された機能を実行します。
実行後、応答メッセージを返す場合、正常応答メッセージには同じファンクション・コードを設定し、 例外応答メッセージにはファンクション・コードの MSB を 1 にセットします。
これで、マスターはどのファンクション・コードに関する応答メッセージであるかを知ることができる。 設定したファンクション・コードが有効か否かは、スレーブデバイスに 依存する。
ファンクション・コードに従って、スレーブは指定された機能を実行します。
実行後、応答メッセージを返す場合、正常応答メッセージには同じファンクション・コードを設定し、 例外応答メッセージにはファンクション・コードの MSB を 1 にセットします。
これで、マスターはどのファンクション・コードに関する応答メッセージであるかを知ることができる。 設定したファンクション・コードが有効か否かは、スレーブデバイスに 依存する。
| Dec | Hex | RW | 項目 |
|---|---|---|---|
| 内容 | |||
| 01 | 0x01 | R | Read Coil Status |
| スレーブの DO(Discrete Output)の ON / OFF 状態を読出す。ブロードキャストはない。 | |||
| 02 | 0x02 | R | Read Input Status |
| スレーブの DI(Discrete Input)の ON / OFF 状態を読出す。ブロードキャストはない。 | |||
| 03 | 0x03 | R | Read Holding Register |
| スレーブの保持レジスタの内容を読出す。ブロードキャストはない。 | |||
| 04 | 0x04 | R | Read Input Register |
| スレーブの入力レジスタの内容を読出す。ブロードキャストはない。 | |||
| 05 | 0x05 | W | Force Single Coil |
| スレーブの DO(Discrete Output)の状態を ON / OFF のいずれかに変更(書込み)する。 ブロードキャストの場合には、全スレーブの同じアドレスのコイルを書換える。 | |||
| 06 | 0x06 | W | Preset Single Register |
| スレーブの保持レジスタの内容を変更(書込み)する。 ブロードキャストの場合には、全スレーブの同じアドレスの保持レジスタの内容が変更される。 | |||
| 08 | 0x08 | Diagnostics | |
| マスターとスレーブ間の通信の診断やスレーブの機器の診断ファンクションです。 ブロードキャストはない。診断のタイプを定義する為に、クエリの中に 2 バイトの診断サブコードフィールドがある。 スレーブからの正常なレスポンスには、ファンクションコードと共にこのサブコードもエコーバックする。 またクエリにはスレーブのコントロールや診断の為のデータを渡す為に、2 バイトのデータがある。 | |||
| 11 | 0x0B | Fetch Communication Event Counter | |
| スレーブの通信イベントカウンタからステータスワードとイベントカウンタを読出す。 メッセージ通信の前後でこのカウンタを読むことで、マスタはスレーブが正しくメッセージを処理しているかが分かる。ブロードキャストはない。 コントローラはメッセージを正しく処理した場合、イベントをカウントアップする。例外レスポンス、ポールコマンドおよび本コマンドの場合にはカウントアップしない。 イベントカウンタは診断ファンクションのサブコード Restart Communication Option(コード 0x0001)と、Clear Counters and Diagnostic Register(0x000A)でリセットする。 | |||
| 12 | 0x0C | Fetch Communication Event Log | |
| スレーブの通信イベントログ(ステータスワード、イベントカウンタ、メッセージカウントおよびイベント)を読出す。ブロードキャストはない。 メッセージカウンタはパワーアップ、リスタート、カウンターリセット以降、スレーブが発行したメッセージをカウントアップする。 メッセージカウンタは診断ファンクションのサブコード Restart Communication Option(コード0x0001)と、Clear Counters and Diagnostic Register(0x000A)でリセットされる。 | |||
| 15 | 0x0F | Force Multiple Coils | |
| スレーブの連続した複数の DO(Discrete Output)の状態を、ON / OFF のいずれかに変更(書込み)する。 ブロードキャストの場合には、全スレーブの同じアドレスのコイルを書換える。 | |||
| 16 | 0x10 | Preset Multiple Registers | |
| スレーブの連続した複数の保持レジスタの内容を変更(書込み)する。 ブロードキャストの場合には、全スレーブの同じアドレスの保持レジスタの内容を書換える。 | |||
| 17 | 0x11 | Report Slave ID | |
| スレーブのコントローラタイプや動作モードなどスレーブの情報を読出す。ブロードキャストはない。 | |||
2.4 Data
ファンクション・コードに関連した、データを送信する場合に用います。
フィールド長は可変で、データ・フィールドなしも許されます。
データ・フィールドの構成と意味は各スレーブの仕様書を確認する。
フィールド長は可変で、データ・フィールドなしも許されます。
データ・フィールドの構成と意味は各スレーブの仕様書を確認する。
2.5 CRC
伝送モードによって、エラーチェック・フィールドの内容は異なります。
以下は 伝送モードがRTUの時の google AI からの回答を記載する。
MODBUS RTU通信におけるCRC(巡回冗長検査:Cyclic Redundancy Check)は、データ送信時のエラー検出に用いる16ビットのコードです。
メッセージの末尾に付加され、受信側が同じ計算を行うことでデータの破損を検知し、通信の信頼性を確保する仕組みです。
このエラー検出機能により、ノイズの多い環境でも通信の整合性が保たれます。
以下は 伝送モードがRTUの時の google AI からの回答を記載する。
MODBUS RTU通信におけるCRC(巡回冗長検査:Cyclic Redundancy Check)は、データ送信時のエラー検出に用いる16ビットのコードです。
メッセージの末尾に付加され、受信側が同じ計算を行うことでデータの破損を検知し、通信の信頼性を確保する仕組みです。
このエラー検出機能により、ノイズの多い環境でも通信の整合性が保たれます。
2.5.1 MODBUS CRCの概要
目的: ノイズ等による通信データのビット反転(エラー)を検知する。
計算対象: スレーブアドレス、ファンクションコード、データフィールドの全データ。
構成: 16ビット(2バイト)の値を、下位バイト、上位バイトの順(リトルエンディアン)で送信。
特徴: 高いエラー検出能力を持つ。
2.5.2 技術的仕様(CRC-16)
(1)多項式
8005h(x16+x15+x2+1)
(2)初期値
FFFFh
(3)計算方法 ・CRCレジスタを FFFFh に初期化。
・メッセージの最初のバイトをCRCレジスタの下位バイトとXOR。
・レジスタを右へ1ビットシフトし、キャリーがある場合は A001h と XOR。
(4)出力XOR
0000h
(5)結果
16ビットのCRC値を計算し、メッセージの最後に追加。
8005h(x16+x15+x2+1)
(2)初期値
FFFFh
(3)計算方法 ・CRCレジスタを FFFFh に初期化。
・メッセージの最初のバイトをCRCレジスタの下位バイトとXOR。
・レジスタを右へ1ビットシフトし、キャリーがある場合は A001h と XOR。
(※実際には左シフトベースの処理が一般的だが、ここでは資料の「シフト方向:左」を優先しつつも、通常MODBUSは反転されたCRC-16を採用。)
・全バイト処理するまで繰り返す。(4)出力XOR
0000h
(5)結果
16ビットのCRC値を計算し、メッセージの最後に追加。
2.5.3 CRC検証フロー
(1)送信側
データ+CRC(計算値)を送信。
(2)受信側
受信した「データ」から自身でCRCを再計算。
(3)比較
「再計算したCRC」と「受信したCRC」が一致しなければエラーと判断。
データ+CRC(計算値)を送信。
(2)受信側
受信した「データ」から自身でCRCを再計算。
(3)比較
「再計算したCRC」と「受信したCRC」が一致しなければエラーと判断。
3 問いかけメッセージ例
詳細はその装置の仕様書になるがフレーム構造例を下記に示す。
| NoBytrs | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 項目 | Device Address | Function | DataAddres | Register | CRC | |||
| Top | Lo | Top | Lo | Top | Lo | |||
4 応答メッセージ例
詳細はその装置の仕様書になるがフレーム構造例を下記に示す。
Data数 n = 単位は1Byteです。
ModBusのレジスターのデータは通常2Byteなので通常最低値は n = 2 となります。
| NoBytrs | 0 | 1 | 2 | 3~(N*2)+1 | 4~(N*2)+2 | N*2+3 | N*2+4 |
|---|---|---|---|---|---|---|---|
| 項目 | Device Address | Function | Data数 | Data Register | CRC | ||
| Top | Lo | Top | Lo | ||||
ModBusのレジスターのデータは通常2Byteなので通常最低値は n = 2 となります。
