Modbus RTUとModbus TCPの違い|通信仕様・ファンクションコード一覧・RS-485配線の基本
Modbus RTU と Modbus TCP は、名前が似ているぶん「何が違うのか」が分かりにくい組み合わせです。結論から言うと、データの読み書きの決まり(PDU)は共通で、運び方が違うだけです。
- Modbus RTU:RS-485 などのシリアル通信で運ぶ
- Modbus TCP:Ethernet(TCP/IP)で運ぶ
「保持レジスタを読む」「コイルを書く」といった中身は同じなので、RTU と TCP の違いは、相手の指定のしかた・誤り検出・フレームの区切り方・物理層の違いに集約されます。
この記事で分かること:
- RTU と TCP の違い(比較表)
- 4種類のデータとファンクションコード一覧、例外コード
- 番地が1つずれる理由(1始まりと0始まり)
- RTU の通信設定と RS-485 の配線(終端・台数・距離)
- 通信しない時のチェック表
※この記事の数値・仕様は、Modbus Organization の仕様書3つ(末尾の参考資料)に書かれている範囲だけで書いています。PLC・タッチパネル・インバータなど各機器での設定方法は、各機器のマニュアルで確認してください。
Modbusとは|共通部分(PDU)と運び方(RTU・ASCII・TCP)
要求する側と応答する側
Modbus は、マスタ(クライアント)が要求を出し、スレーブ(サーバ)が応答する方式です(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)。
呼び名は仕様書の版で違います。シリアルの仕様書(V1.02)では「マスタ/スレーブ」、新しい版の仕様書では「クライアント/サーバ」と書かれています。指している役割は同じなので、この記事では「マスタ(クライアント)」のように両方を書きます。
PDU(共通部分)と ADU(運ぶときの形)
Modbus のメッセージは2層で考えると整理できます。
- PDU:運び方に関係なく共通の部分。ファンクションコード(何をするか)や、読み書きする番地はここで指定します。
- ADU:PDU に、運び方ごとの「宛先」と「誤り検出・区切り」の情報を付けたもの。RTU と TCP で違うのはこの部分です。
PDU の大きさは最大253バイトです。シリアル通信の ADU の上限256バイトから、サーバ(スレーブ)のアドレス1バイトと CRC 2バイトを引いた値として決められています(出典: MODBUS Application Protocol Specification V1.1b3)。
運び方は3つ(RTU・ASCII・TCP)
シリアル通信には、伝送モードが2つあります(出典: MODBUS over Serial Line V1.02)。
- RTU:1バイトを8ビットのまま送る
- ASCII:1バイトを2文字の ASCII 文字にして送る。フレームはコロン「:」で始まる
これに Ethernet で運ぶ TCP を加えた3つが、Modbus の主な運び方です。現場で比べられることが多いのは RTU と TCP なので、以下はこの2つを中心に扱います。
Modbus RTUとModbus TCPの違い(比較表)
違いを1枚にまとめると次のとおりです。PDU(データの読み書きの決まり)は共通で、表の項目はすべて「運び方」の違いです。
| 項目 | Modbus RTU | Modbus TCP |
|---|---|---|
| 物理層 | シリアル(RS-485・RS-232 など) | Ethernet(TCP/IP) |
| 役割の呼び名 | マスタ/スレーブ(バス上のマスタは同時に1台) | クライアント/サーバ |
| 相手の指定 | スレーブアドレス 1〜247(0 はブロードキャスト) | IP アドレス+Unit Identifier(1バイト) |
| 誤り検出 | CRC(16ビット) | ADU に CRC を含まない(MBAP ヘッダ+PDU) |
| フレームの区切り | 3.5文字時間以上の無通信 | MBAP ヘッダ(7バイト)。長さ(Length)の項目を持つ |
| ADU の最大 | 256バイト(PDU 253+アドレス1+CRC 2) | 260バイト(PDU 253+MBAP 7) |
| ポート | - | 502 |
(出典: MODBUS Application Protocol Specification V1.1b3)(出典: MODBUS over Serial Line V1.02)(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)
ADU の最大は、RTU(RS-232/RS-485)が 253+1+2=256バイト、TCP が 253+7=260バイトです(出典: MODBUS Application Protocol Specification V1.1b3)。TCP の ADU は MBAP ヘッダと PDU だけでできていて、RTU のような CRC は含まれません。
ASCII モードとの違い
同じシリアル通信でも ASCII モードは、1バイトを2文字の ASCII 文字で送り、フレームはコロン「:」で始まります。誤り検出は CRC ではなく LRC(8ビット)です(出典: MODBUS over Serial Line V1.02)。シリアルの機器を設定するときは、相手の機器が RTU と ASCII のどちらのモードかも確かめます。
4種類のデータとファンクションコード一覧
データモデルは4種類
Modbus で読み書きするデータは、次の4種類に分かれます(出典: MODBUS Application Protocol Specification V1.1b3)。英語名は仕様書のまま、日本語は一般的な呼び名です。
| 英語名(仕様書) | 日本語の呼び名 | 大きさ | 読み書き | 中身 |
|---|---|---|---|---|
| Discretes Input | ディスクリート入力 | 1ビット | 読み出し専用 | I/O から来るデータ |
| Coils | コイル | 1ビット | 読み書き | アプリケーションから変更できるデータ |
| Input Registers | 入力レジスタ | 16ビット | 読み出し専用 | - |
| Holding Registers | 保持レジスタ | 16ビット | 読み書き | - |
「1ビットか16ビットか」「読み出し専用か読み書きか」の2軸で4つに分かれる、と覚えると整理しやすくなります。どのデータがどの種類に割り当てられているかは機器ごとに違うので、機器のマニュアルの「Modbus のアドレス表(マップ)」で確かめます。
ファンクションコード一覧
仕様書で公開されているファンクションコードのうち、主なものは次のとおりです(出典: MODBUS Application Protocol Specification V1.1b3)。
| 10進 | 16進 | 名前 | 何をするか |
|---|---|---|---|
| 01 | 0x01 | Read Coils | コイルを読む |
| 02 | 0x02 | Read Discrete Inputs | ディスクリート入力を読む |
| 03 | 0x03 | Read Holding Registers | 保持レジスタを読む |
| 04 | 0x04 | Read Input Registers | 入力レジスタを読む |
| 05 | 0x05 | Write Single Coil | コイルを1点書く |
| 06 | 0x06 | Write Single Register | 保持レジスタを1つ書く |
| 15 | 0x0F | Write Multiple Coils | コイルを複数まとめて書く |
| 16 | 0x10 | Write Multiple Registers | 保持レジスタを複数まとめて書く |
| 23 | 0x17 | Read/Write Multiple Registers | 保持レジスタの読み出しと書き込みを1回で行う |
| 43 | 0x2B | Encapsulated Interface Transport | サブコード14(0x0E)の Read Device Identification で、機器の識別情報を読む |
次のコードはシリアル通信専用です(出典: MODBUS Application Protocol Specification V1.1b3)。Modbus TCP では使いません。
| 10進 | 16進 | 名前 | 何をするか |
|---|---|---|---|
| 07 | 0x07 | Read Exception Status | 例外ステータスを読む |
| 08 | 0x08 | Diagnostics | 診断 |
| 11 | 0x0B | Get Comm Event Counter | 通信イベントのカウンタを読む |
| 12 | 0x0C | Get Comm Event Log | 通信イベントのログを読む |
| 17 | 0x11 | Report Server ID | サーバ(スレーブ)の ID を返す |
名前で分けると、読み出しが 01〜04、書き込みが 05・06・15・16 です。03 と 04 はどちらも16ビットのデータを読みますが、03 は読み書きできる保持レジスタ、04 は読み出し専用の入力レジスタを読む、という違いがあります。
例外応答と例外コード(01〜04)
スレーブ(サーバ)が要求を受け付けられなかったときは、例外応答を返します。例外応答では、ファンクションコードに 0x80 を足した値(最上位ビットを1にした値)が返ってきます(出典: MODBUS Application Protocol Specification V1.1b3)。たとえば 03 の要求に対する例外応答のファンクションコードは 0x83 です。
例外応答には、理由を表す例外コードが付きます。基本の4つは次のとおりです(出典: MODBUS Application Protocol Specification V1.1b3)。
| 例外コード | 名前 | 意味 |
|---|---|---|
| 01 | ILLEGAL FUNCTION | そのファンクションコードは受け付けられない |
| 02 | ILLEGAL DATA ADDRESS | アドレス、または先頭アドレスと個数の組み合わせが無効 |
| 03 | ILLEGAL DATA VALUE | データの値が不正 |
| 04 | SERVER DEVICE FAILURE | 要求を実行中に回復不能なエラーが起きた |
相手の機器から例外応答が返ってくるということは、要求そのものは相手に届いて読み取られているということでもあります。まったく応答が無い場合とは、疑う場所が違います(後半のチェック表で整理します)。
番地が1つずれる|データモデルは1から、PDUは0から
Modbus でつまずきやすいのが、番地の数え方です。仕様書には次のように書かれています(出典: MODBUS Application Protocol Specification V1.1b3)。
- PDU の中では、データは 0 から 65535 の番地で指定する
- データモデルの中では、各要素に 1 から n の番号が付く
つまり、データモデルで X 番の要素は、PDU では X−1 で指定します。データモデルで1番の保持レジスタは、PDU の中では0番として送られます。
データモデルの番号は1から、PDU の番地は0から。同じデータを指していても、数字は1つずれる。
現場に置き換えると、「1つ隣の値が読める」「書いたはずの値が1つずれた所に入る」ときは、まずここを疑います。マスタ側(PLC・タッチパネル・パソコンのソフトなど)とスレーブ側の機器のマニュアルが、それぞれ1始まりと0始まりのどちらで番地を書いているかを確かめてください。表記は機器ごとに違うので、片方のマニュアルだけを見て合わせるとずれることがあります。

Modbus RTUの通信設定|速度・パリティ・ストップビット・アドレス
Modbus RTU では、通信速度・パリティ・ストップビットをバス上の全台で合わせる必要があります。設定が違う機器とは通信できません。仕様書の決まりは次のとおりです。
通信速度
9600bps と 19200bps は、対応が必須とされています。既定値は 19200bps です(出典: MODBUS over Serial Line V1.02)。
パリティとストップビット
パリティは偶数(Even)が必須で、既定値も偶数です。奇数やパリティなしも使えます(出典: MODBUS over Serial Line V1.02)。
RTU の1文字は 11ビットで、内訳はスタートビット1・データ8・パリティ1・ストップビット1です。パリティなしにする場合は、ストップビットを2にして11ビットにそろえます(出典: MODBUS over Serial Line V1.02)。
| パリティ | スタート | データ | パリティ | ストップ | 合計 |
|---|---|---|---|---|---|
| 偶数(既定)・奇数 | 1 | 8 | 1 | 1 | 11ビット |
| なし | 1 | 8 | 0 | 2 | 11ビット |
フレームの区切り(3.5文字時間)
RTU では、3.5文字時間以上の無通信でフレームを区切ります。また、フレームの途中で文字と文字の間が 1.5文字時間を超えて空くと、そのフレームは不完全とみなされます(出典: MODBUS over Serial Line V1.02)。
スレーブアドレス
- バスにつなぐマスタは、同時に1台です。
- スレーブのアドレスは 1〜247 で、同じアドレスを2台に付けてはいけません。
- アドレス0はブロードキャスト(全スレーブ宛て)で、スレーブはブロードキャストには応答しません。
(出典: MODBUS over Serial Line V1.02)
使っている機器の初期値と設定方法は、各機器のマニュアルで確認してください。
RS-485の配線|2線+コモン・終端は両端・32台・1000m
Modbus RTU の物理層としてよく使われる RS-485(2線式)について、シリアルの仕様書に書かれている配線の決まりをまとめます(出典: MODBUS over Serial Line V1.02)。
2線+コモン
2線式の RS-485 では、信号の2線に加えて、コモン線で全機器をつなぎます(出典: MODBUS over Serial Line V1.02)。「2線式」という名前でも、信号線2本だけでよいという意味ではありません。
配線の形:デイジーチェーンか短い分岐
機器は直接つなぎ渡す(デイジーチェーン)か、短い分岐でつなぎます。分岐は20m以内です(出典: MODBUS over Serial Line V1.02)。
終端はバスの両端の近く
終端は、バスの両端の近くに入れます。終端には 150Ω(0.5W)の抵抗が使えます。ライン偏り(polarization)が必要な場合は、120Ω と 1nF の直列が推奨されています(出典: MODBUS over Serial Line V1.02)。
両端以外の途中の機器に終端を入れたり、両端のどちらかが抜けていたりすると、終端の位置が仕様と合いません。機器に終端の切り替えスイッチがあるかどうか、その位置は機器のマニュアルで確かめてください。
台数:リピーター無しで32台
リピーター無しで 32台は、どのシステムでもつなげます。機器の資料にそれ以上つなげると書かれていれば、それ以上も可能です(出典: MODBUS over Serial Line V1.02)。アドレスが1〜247まであるからといって、247台をそのまま1本のバスにつなげるわけではない点に注意してください。
距離:9600bps・AWG26以上で1000m
最大距離は、9600bps で、AWG26 以上の太さのケーブルを使った場合に 1000m です(出典: MODBUS over Serial Line V1.02)。AWG26 が mm² でどのくらいの太さかはAWG⇔mm²換算ツール【AWG番号から直径・断面積・近いJISサイズを計算】で確かめられます。
ケーブルのシールドの扱い(接地のしかた)は、この記事の出典の範囲外です。シールドの考え方はシールド付きケーブルとは?ノイズ対策の仕組みと接地(片側/両側)の考え方【FA配線の基本】を参照し、具体的な接地方法は機器のマニュアルで確認してください。
Modbus TCPの仕組み|MBAPヘッダ・ポート502・Unit ID
Modbus TCP では、PDU の前に MBAP ヘッダ(7バイト)を付けて送ります。MBAP ヘッダは次の4項目でできています(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)。
| 項目 | 大きさ | 備考 |
|---|---|---|
| Transaction Identifier | 2バイト | - |
| Protocol Identifier | 2バイト | Modbus は 0 |
| Length | 2バイト | 長さ |
| Unit Identifier | 1バイト | シリアルのスレーブアドレスに当たる |
ポートは502
Modbus TCP の ADU は、すべて TCP の登録ポート 502 で送られます(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)。
Unit ID(Unit Identifier)は何のためにあるか
シリアルの「スレーブアドレス」は、Modbus TCP では MBAP ヘッダの Unit Identifier(1バイト)に置き換わります(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)。
Unit Identifier は、Ethernet とシリアルのあいだのゲートウェイの先にあるシリアル機器を指すために使います。ゲートウェイを通さず Ethernet で直接つながる機器では不要で、0xFF が推奨されています(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)。機器のマニュアルに指定があれば、それに合わせてください。
RTUとTCPをつなぐ(変換)|ゲートウェイとUnit ID
RS-485 の Modbus RTU 機器を、Ethernet 側の Modbus TCP のクライアント(PLC やパソコンなど)から読み書きしたい。このときに間に入るのがゲートウェイです。PDU は共通なので、違うのは「運び方」の部分です。
- Ethernet 側の宛先は、ゲートウェイの IP アドレス
- ゲートウェイの先のどのシリアル機器かは、MBAP ヘッダの Unit Identifier で指す
シリアルのスレーブアドレスが Unit Identifier に置き換わる、という仕様の関係から、TCP 側で指定する Unit Identifier が、シリアル側のスレーブアドレスに当たると考えます(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)。
ゲートウェイの先は、ふつうの Modbus RTU のバスです。前の章の通信設定(速度・パリティ・ストップビット)と RS-485 の配線(終端・台数・距離)は、ゲートウェイのシリアル側にもそのまま当てはまります。Unit Identifier とスレーブアドレスの対応のさせ方の設定は、ゲートウェイのマニュアルで確認してください。
通信しない時のチェック表
仕様書の範囲で言える「まず見る所」を症状別にまとめます。各機器での確認方法・設定画面は、各機器のマニュアルで確認してください。
| 症状 | まず見る所 |
|---|---|
| RTU:まったく応答しない |
・通信速度・パリティ・ストップビットが全台で合っているか(パリティなしならストップビット2) ・要求のスレーブアドレスと機器のアドレスが合っているか、アドレスの重複は無いか ・アドレス0(ブロードキャスト)で送っていないか(ブロードキャストには応答しない) ・RTU と ASCII のモードが合っているか ・終端がバスの両端の近くに入っているか、コモン線がつながっているか |
| 例外コード01が返る | そのファンクションコードを機器が受け付けていない。機器が対応しているコードを確かめる(シリアル専用のコードを TCP で使っていないか) |
| 例外コード02が返る | 番地、または先頭番地と個数の組み合わせが機器の範囲外。番地の1始まり・0始まりと、読み書きする個数を見直す |
| 値が1つずれる | 番地の0始まり(PDU)と1始まり(データモデル)の取り違え |
| 読めるが値の中身がおかしい | 保持レジスタ(03)と入力レジスタ(04)、コイル(01)とディスクリート入力(02)の取り違え |
| TCP:つながらない・応答しない |
・ポートが502になっているか ・Unit Identifier:ゲートウェイの先の機器なら、シリアル側のスレーブアドレスに合っているか。直接つながる機器なら、機器の指定(仕様書の推奨は 0xFF)に合っているか |
(出典: MODBUS Application Protocol Specification V1.1b3)(出典: MODBUS over Serial Line V1.02)(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)
例外応答が返ってくるなら、要求は相手に届いています。疑う先は、返ってきた例外コードが示す内容(上の表の01〜04)です。逆に何も返ってこないなら、通信設定と配線の側から見ていきます。
タッチパネル(GOT)と PLC の間の通信で、設定・配線・PLC 側のどこが原因かを切り分ける考え方はGOT(タッチパネル)がPLCと通信しない時の確認箇所|設定・配線・PLC側の3層で切り分けるで扱っています。
よくある質問(FAQ)
Q1. Modbus RTUとModbus TCPの違いは何ですか?
A. データの読み書きの決まり(PDU)は共通で、運び方が違います。RTUはRS-485などのシリアル通信で、相手をスレーブアドレス(1〜247)で指定し、誤り検出にCRC(16ビット)を使います。TCPはEthernetで、相手をIPアドレスとUnit Identifierで指定し、ポート502を使います。TCPのADUはMBAPヘッダとPDUで、CRCは含まれません。
Q2. ファンクションコード03と04の違いは何ですか?
A. 03(Read Holding Registers)は保持レジスタ(Holding Registers)を、04(Read Input Registers)は入力レジスタ(Input Registers)を読みます。どちらも16ビットのデータですが、保持レジスタは読み書きできる領域、入力レジスタは読み出し専用の領域です。読みたい値がどちらに入っているかは、機器のマニュアルで確かめてください。
Q3. RS-485のModbus RTUは何台・何mまでつなげますか?
A. 仕様書では、リピーター無しで32台はどのシステムでも可能とされ、機器の資料に書いてあればそれ以上もつなげます。スレーブのアドレスは1〜247です。距離は、9600bps・AWG26以上の太さのケーブルで最大1000mです。終端はバスの両端の近くに入れ、分岐は20m以内にします。
Q4. Modbus TCPのポート番号は何番ですか?
A. 502番です。仕様書では、Modbus TCPのADUはすべてTCPの登録ポート502で送るとされています。ゲートウェイを通さず直接つながる機器では、Unit Identifierは0xFFが推奨されています。
まとめ
Modbus RTU と Modbus TCP は、データの読み書きの決まり(PDU)は共通で、運び方が違うだけです。
- RTU:シリアル(RS-485 など)、スレーブアドレス1〜247、CRC 16ビット、3.5文字時間の無通信で区切る、ADU 最大256バイト
- TCP:Ethernet、IP アドレス+Unit Identifier、MBAP ヘッダ7バイト(ADU に CRC は含まない)、ポート502、ADU 最大260バイト
- データは4種類(コイル・ディスクリート入力・入力レジスタ・保持レジスタ)。例外応答はファンクションコード+0x80
- データモデルは1から、PDU は0から。値が1つずれたらまず番地の数え方を疑う
- RTU の設定は全台で合わせる。既定は19200bps・偶数パリティ。パリティなしならストップビット2
- RS-485:2線+コモン、終端はバスの両端の近く、リピーター無しで32台、9600bps・AWG26以上で1000m、分岐20m以内
- RTU と TCP の変換はゲートウェイ。TCP 側の Unit Identifier がシリアル側のスレーブアドレスに当たる
(出典: MODBUS Application Protocol Specification V1.1b3)(出典: MODBUS over Serial Line V1.02)(出典: MODBUS Messaging on TCP/IP Implementation Guide V1.0b)
通信しないときは、応答がまったく無いのか、例外応答が返ってくるのかで、疑う場所が分かれます。機器ごとの設定方法は、各機器のマニュアルで確認してください。
