Hobby Lab 趣味のモノ作り実験のサイトです。
Software Protocol MODBUS 全般
1 概要
1.1 ModBusプロトコル
1.2 通信媒体とModBus
1.3 符号化方式の比較
1.4 通信時間制限(RTU)
2 メッセージ構造(RTU)
2.1 フレーム
2.2 DeviceAddress
2.3 Function
2.4 Data
2.5 CRC
2.5.1 MODBUS CRCの概要
2.5.2 技術的仕様(CRC-16)
2.5.3 CRC検証フロー
3 問いかけメッセージ例
4 応答メッセージ例

Mod Bus関係 プロトコル
 MODBUS
装置
 電力量計:KWS-AC301
 測定器(交流):pzem-016
 測定器(直流):pzem-017
 充電器(太陽光):BDZ 60A
 充電器(太陽光):AL40A

Sf:Pt プロトコル関係
SfPt:MODBUS
Sf:OS関係
SfO:Mint 関係
 PCへMint導入
 アプリ導入
 その他1
 アイコンを作る
SfO:Ubuntu 関係
 PCへUbuntu導入
 アプリ導入
SfO:RaspberryPi 関係
はじめに
 RaspberryPiへOS導入
 アプリ導入
 Programming
シェル・コマンド関係
 LXTerminal
 sed
 i2ctools
I/O・アプリ関係
 RealVNCとViewer
 IO動作確認
 MySQL
 Python
 raspberrypiハード
Sf:Server 関係
SfS:レンタルサーバー
 CORE-X
SfS:Windowsサーバー
 XAMPPの概要と導入
 Note XAMPP
 Note XAMPP Err
 Note Apache
 Note PHP
 Note MyQSL
Sf:Programming関係
C 関係
 C言語でプログラムミング
Python 関係
はじめに
 RaspberryPi開始
 Windows開始
共通事項
 プログラミングNote
 パッケージ導入 pip
 標準ライブラリ
 Serialライブラリ
 SMBusライブラリ
HTML関係
 開始とNote
Sf:IDE 開発環境
SfI:STM32
 STM32CubeIDEでプログラム
 HALと直接レジスター操作の速度
SfI:CH32
 MounRiver Studioでプログラム
SfI:Arduino
各ボード毎の設定
 Uno 設定
 Mega2560 設定
 DUE_CH340 設定
 ESP_WROOM02 設定
 ESP12F_D1mini 設定
 ESP32 設定
 CH32V 設定
ライブラリー
 OneWire使い方
その他
 日本語リファレンス(外部リンク)
 WiFi Macアドレスを調査
Sf:AP アプリ関係
SfA:エディタ
SfA:回路図CAD
SfA:回路シミュレータ
 シミュレーションの設定
 色の設定
 電源設定設定
SfA:リモートソフト
Sf:Otgers その他

ここでは主にシリアル通信の符号化方式としてRTUについて説明する。


1 概要

Modbus プロトコルは、Modicon Inc.(AEG Schneider Automation International S.A.S.)が PLC 用に 開発した通信プロトコルで、プロトコル仕様書(PI-MBUS-300 Rev.J)に記載されています。
Modbus プロトコルで定義されているのは通信プロトコルのみで、通信媒体などの物理レイヤは規定されていない。
いかについては、当方で調べた結果を記載しているので、違う点があれば、お教えください。

1.1 ModBusプロトコル

Modbus の通信方式は、シングルマスター/マルチスレーブ方式です。
マスターだけがクエリ(通信の開始)を発行することができる。
スレーブは、このクエリを見て、指定された機能を実行し、応答メッセージを返す。
マスターは、指定のスレーブに対するクエリ、または全てのスレーブに対するブロードキャストクエリのいずれかを発行することができる。
ブロードキャストクエリの場合には、スレーブは指定の機能を実行するのみで、応答メッセージは返しない。
スレーブは、自分に対するクエリのときにだけ応答メッセージを返す。
クエリの伝送フォーマットは、スレーブのアドレス(またはブロードキャスト)、要求内容を定義するファンクションコード、 データおよびエラーチェックフィールドから構成されている。
また、応答メッセージの伝送フォーマットは、要求内容の確認フィールド、応答データおよびエラーチェックフィールドから構成されている。
クエリと応答メッセージの伝送フォーマットを下図に示す。
マスター:メッセージ
デバイスアドレス
ファンクションコード
クエリデータ1
クエリデータ2
クエリデータ3
クエリデータ4
CRC-16


問いかけ ➡

⬅ 応 答
スレーブ:メッセージ
自分のアドレス
確認したファンクションコード
応答データ1
応答データ2
応答データn
CRC-16

1.2 通信媒体とModBus

『Modbus プロトコルで定義されているのは通信プロトコルのみで、通信媒体などの物理レイヤは規定されていない。』と前に記載したが、主にシリアル通信(RTU、ASCII)とEthernet(TCP/IP~)上で使用されている。
シリアル通信Ethernet
物理層RS232CRS-422RS485Ethernet
方式マスター・スレーブ左記に加えマルチスターや1対1の通信も可能
通信速度最大19.2kbps10M又は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がエラー制御を担うため、必要ない。
ラップして通信する方法は、既存のシリアルデバイスとの互換性を維持したり、特定のゲートウェイ機能を実現したりするために使用されている。

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)以上




2 メッセージ構造(RTU)

2.1 フレーム

項目DeviceAddressFunctionDataCRC
使用Buyte11n2
RTU信号については、このメッセージを送る前後に 3.5Byte分の無信号時間を入れる事になっている。

2.2 DeviceAddress

アドレス・フィールドは、0 から 247(10 進数)が許される。
スレーブ・アドレスは 1 から 247 です。
マスターがスレーブにクエリを発する場合には、このアドレスフィールドにスレーブのアドレスをセットする。
スレーブがマスターに応答メッセージを返す場合には、スレーブのアドレスをセットする。
これによって、マスターはどのスレーブからの応答であるかを知ることができる。
アドレス 0 はブロードキャストクエリに用います。

2.3 Function

設定可能なファンクション・コードは 1 から 255(10 進数)です。
ファンクション・コードに従って、スレーブは指定された機能を実行します。
実行後、応答メッセージを返す場合、正常応答メッセージには同じファンクション・コードを設定し、 例外応答メッセージにはファンクション・コードの MSB を 1 にセットします。
これで、マスターはどのファンクション・コードに関する応答メッセージであるかを知ることができる。 設定したファンクション・コードが有効か否かは、スレーブデバイスに 依存する。
DecHexRW項目
内容
010x01RRead Coil Status
スレーブの DO(Discrete Output)の ON / OFF 状態を読出す。ブロードキャストはない。
020x02RRead Input Status
スレーブの DI(Discrete Input)の ON / OFF 状態を読出す。ブロードキャストはない。
030x03RRead Holding Register
スレーブの保持レジスタの内容を読出す。ブロードキャストはない。
040x04RRead Input Register
スレーブの入力レジスタの内容を読出す。ブロードキャストはない。
050x05WForce Single Coil
スレーブの DO(Discrete Output)の状態を ON / OFF のいずれかに変更(書込み)する。
ブロードキャストの場合には、全スレーブの同じアドレスのコイルを書換える。
060x06WPreset Single Register
スレーブの保持レジスタの内容を変更(書込み)する。
ブロードキャストの場合には、全スレーブの同じアドレスの保持レジスタの内容が変更される。
080x08Diagnostics
マスターとスレーブ間の通信の診断やスレーブの機器の診断ファンクションです。
ブロードキャストはない。診断のタイプを定義する為に、クエリの中に 2 バイトの診断サブコードフィールドがある。
スレーブからの正常なレスポンスには、ファンクションコードと共にこのサブコードもエコーバックする。
またクエリにはスレーブのコントロールや診断の為のデータを渡す為に、2 バイトのデータがある。
110x0BFetch Communication Event Counter
スレーブの通信イベントカウンタからステータスワードとイベントカウンタを読出す。
メッセージ通信の前後でこのカウンタを読むことで、マスタはスレーブが正しくメッセージを処理しているかが分かる。ブロードキャストはない。
コントローラはメッセージを正しく処理した場合、イベントをカウントアップする。例外レスポンス、ポールコマンドおよび本コマンドの場合にはカウントアップしない。
イベントカウンタは診断ファンクションのサブコード Restart Communication Option(コード 0x0001)と、Clear Counters and Diagnostic Register(0x000A)でリセットする。
120x0CFetch Communication Event Log
スレーブの通信イベントログ(ステータスワード、イベントカウンタ、メッセージカウントおよびイベント)を読出す。ブロードキャストはない。
メッセージカウンタはパワーアップ、リスタート、カウンターリセット以降、スレーブが発行したメッセージをカウントアップする。
メッセージカウンタは診断ファンクションのサブコード Restart Communication Option(コード0x0001)と、Clear Counters and Diagnostic Register(0x000A)でリセットされる。
150x0FForce Multiple Coils
スレーブの連続した複数の DO(Discrete Output)の状態を、ON / OFF のいずれかに変更(書込み)する。
ブロードキャストの場合には、全スレーブの同じアドレスのコイルを書換える。
160x10Preset Multiple Registers
スレーブの連続した複数の保持レジスタの内容を変更(書込み)する。
ブロードキャストの場合には、全スレーブの同じアドレスの保持レジスタの内容を書換える。
170x11Report Slave ID
スレーブのコントローラタイプや動作モードなどスレーブの情報を読出す。ブロードキャストはない。

2.4 Data

ファンクション・コードに関連した、データを送信する場合に用います。
フィールド長は可変で、データ・フィールドなしも許されます。
データ・フィールドの構成と意味は各スレーブの仕様書を確認する。

2.5 CRC

伝送モードによって、エラーチェック・フィールドの内容は異なります。
以下は 伝送モードが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。
(※実際には左シフトベースの処理が一般的だが、ここでは資料の「シフト方向:左」を優先しつつも、通常MODBUSは反転されたCRC-16を採用。)
・全バイト処理するまで繰り返す。

(4)出力XOR
 0000h

(5)結果
 16ビットのCRC値を計算し、メッセージの最後に追加。

2.5.3 CRC検証フロー

(1)送信側
 データ+CRC(計算値)を送信。

(2)受信側
 受信した「データ」から自身でCRCを再計算。

(3)比較
 「再計算したCRC」と「受信したCRC」が一致しなければエラーと判断。




3 問いかけメッセージ例

詳細はその装置の仕様書になるがフレーム構造例を下記に示す。
NoBytrs01234567
項目Device
Address
FunctionDataAddresRegisterCRC
TopLoTopLoTopLo




4 応答メッセージ例

詳細はその装置の仕様書になるがフレーム構造例を下記に示す。
NoBytrs0123~(N*2)+14~(N*2)+2N*2+3N*2+4
項目Device
Address
FunctionData数Data RegisterCRC
TopLoTopLo
Data数 n = 単位は1Byteです。
ModBusのレジスターのデータは通常2Byteなので通常最低値は n = 2 となります。




































更新日 2026/02/21 11:25  管理者 平林 剛Hirabayashi Takeshi