プロトコル

Modbusとは?RTUとTCPの違い・レジスタとファンクションコードを実装目線で解説

Modbusは、PLCや電力計、温調器といった現場機器から値を読み書きするための産業用プロトコルです。仕様が無償で公開されていて実装に許諾が要らないため、1979年の登場から今も新製品に載り続けています。この記事では、マスタ・スレーブの要求応答モデル、コイルと保持レジスタという四つのデータモデル、ファンクションコードと例外コード、RTU・ASCII・TCPの通信仕様の違い、OPC UAやMQTTとの棲み分け、IoTゲートウェイでのポーリング設計までを、収集システムを設計できる粒度で整理しました。

まとめ:Modbusの守備範囲とRTU・TCPの選び分け、OPC UAとの併用境界

Modbusが決めているのは「どのアドレスの16ビット値を読むか書くか」だけです。単位も型もスケールも仕様には含まれません。1.5という値がkPaなのか℃なのか、100倍された整数なのかは、機器メーカーのレジスタマップ側にあります。この非対称が、Modbus案件の工数を決めます。

RTUとTCPの選び分けは、機器側が持っている口で決まります。RS-485しか出ていない既設機器はRTU、Ethernetポートを持つ機器はTCP。両方を持つなら収集点数が多い側をTCPに寄せると周期の余裕が出ます。Modbus/TCPの既定ポートは502です。

OPC UAとの併用は、層で切ると迷いません。現場機器との1対1はModbus、ゲートウェイから上位への送信は情報モデルを持つOPC UAかMQTT。Modbusを広域ネットワーク越しに直結させる設計は、認証も暗号化も仕様に無いため取りません。収集した先で何を作るかまで含めて相談したい場合は、AI/IoTソリューションで扱っている構成例が判断材料になります。

Modbusの定義とマスタ・スレーブ方式で1往復ごとに完結する通信の仕組み

Modbusは、OSI参照モデルの第7層に位置するアプリケーション層のメッセージングプロトコルです。物理層を規定しないため、RS-232でもRS-485でもEthernetでも同じ命令体系が通ります。

1979年のModicon製PLC由来という出自と仕様公開による普及の経緯

Modicon社が自社PLC向けに定めた通信手順が原型です。仕様書が誰でも入手でき、実装にライセンス料が発生しない状態が続いたため、PLCメーカー以外の計測器・インバータ・電力量計メーカーが自社製品に載せました。仕様の管理は現在 Modbus Organization が担っています。

中心となる MODBUS Application Protocol Specification は V1.1b3(2012年4月26日)、シリアル線向けの MODBUS over Serial Line Specification は V1.02(2006年12月20日)が最新版です。10年以上更新が止まっているのは放置ではなく、追加すべき機能が無い状態を示します。

問い合わせた側だけが発話権を持つ半二重の要求応答モデルと設計制約

通信を始められるのはマスタ(クライアント)だけです。スレーブ(サーバ)は聞かれたときにしか答えません。センサ側で異常を検知しても、自分から通知を送る手段がプロトコルに存在しない、ということです。

この制約が設計に効きます。異常検知の遅れは、そのままポーリング周期の長さになる。5秒周期の系で瞬間的なアラーム接点が0.5秒だけONになれば、その事象は取りこぼされます。イベントを確実に拾いたいなら、機器側のラッチ機能(一度立ったビットを読み出すまで保持する設定)を使うか、Modbus以外の経路を併設するかの二択です。なお Modbus Organization は2020年7月に master/slave 表記を client/server 表記へ改めています。

コイル・入力ステータス・入力レジスタ・保持レジスタの4種類の使い分け

Modbusのデータモデルは四つだけです。ビット単位が二つ、16ビット単位が二つ、それぞれ読み出し専用と読み書き可能に分かれます。

種別 単位 アクセス 典型的な割り当て
入力ステータス 1ビット 読み出しのみ 接点入力・稼働状態
コイル 1ビット 読み書き 出力接点・運転指令
入力レジスタ 16ビット 読み出しのみ 測定値・カウンタ
保持レジスタ 16ビット 読み書き 設定値・しきい値

実務で触る割合は保持レジスタが圧倒的です。読み出し専用のはずの測定値まで保持レジスタに載せている機器が多く、種別から用途は判断できません。設計時はレジスタマップの記載を正とし、種別を推測で決めないでください。32ビットの積算値は16ビットレジスタ2本にまたがるため、上位ワードと下位ワードのどちらが先に並ぶか(ワードオーダ)の確認も必要になります。

ファンクションコードと例外コード・アドレス指定でつまずく実装上の規則

要求フレームの2バイト目に入る1バイトの数値が、その通信で何をするかを決めます。ここを間違えると、例外応答が返るか、無言でタイムアウトします。

実装で使う主要ファンクションコード8種と読み書き対象の対応表

公開ファンクションコードは20種類ほどありますが、収集システムで実際に使うのは次の8種類に収束します。

コード 名称 対象 数量上限
01 Read Coils コイル 2,000点
02 Read Discrete Inputs 入力ステータス 2,000点
03 Read Holding Registers 保持レジスタ 125本
04 Read Input Registers 入力レジスタ 125本
05 Write Single Coil コイル1点 1点
06 Write Single Register 保持レジスタ1本 1本
15 Write Multiple Coils コイル 1,968点
16 Write Multiple Registers 保持レジスタ 123本

まず押さえるのは03と04の2種類です。監視だけの案件はこの2つで完結します。書き込みを含む案件では、単発の06と一括の16を使い分けます。複数の設定値が同時に切り替わらないと機器が中途半端な状態になるケースは、06を並べずに16で一括送信してください。

PDU253バイトと保持レジスタ125個という1トランザクションの上限

Modbusのプロトコルデータユニット(PDU)は253バイトが上限です。シリアル線上のフレーム全体(ADU)はスレーブアドレス1バイトとCRC2バイトが付いて256バイト、TCPではMBAPヘッダが付いて260バイトになります。

この253バイトから逆算した結果が、FC03の125レジスタという上限です。300点を一度に読む要求は仕様上作れません。実装側では読み出し範囲を125本以内のブロックに区切り、連続要求を投げます。分割数がそのまま往復回数になるため、必要な値が飛び飛びに配置されている機器ほど収集周期が伸びます。

例外コード02・03が返る原因と4xxxx表記と0始まりアドレスのずれ

例外応答は、ファンクションコードの最上位ビットを立てた値(03なら0x83)と1バイトの例外コードで返ります。現場で遭遇するのはほぼ02と03です。

02(Illegal Data Address)は、要求したアドレス範囲が機器の持つ範囲を外れたときに返ります。原因の大半はアドレス表記のずれです。機器マニュアルの「40001」という表記は保持レジスタの1本目を指す伝統的な記法で、通信フレームに載せる番号は0になります。40001を指定して02が返るのは正常な動作です。マニュアルが0始まりか1始まりかは製品ごとに違います。03(Illegal Data Value)は、数量が上限を超えた場合や、書き込む値が機器の許容範囲外の場合に返ります。

Modbus RTU・ASCII・TCPの通信仕様の違いと物理層から決める選定

命令体系は共通で、変わるのは包み方だけです。RTUはバイナリ、ASCIIは文字列、TCPはEthernetフレームに載せます。

RTUの3.5文字サイレントインターバルとCRC16によるフレーム区切り

RTUにはフレームの開始を示す記号がありません。3.5文字分の無通信時間が空いたら次のフレームが始まる、という時間ベースの区切りです。文字間の間隔は1.5文字時間以内に収める規定もあります。

この時間依存が、USBシリアル変換器で問題を起こします。USBは転送をまとめてバッファリングするため、送信側で意図した3.5文字の無通信が受信側で潰れ、隣接する2フレームが1つに見えることがあります。長時間の連続収集で「たまにCRCエラーが出る」現象の典型的な原因です。産業用のシリアルボードを使うか、変換器のレイテンシタイマ設定を詰めるかで対処します。誤り検出はCRC16(多項式0xA001)です。

TCPのMBAPヘッダとポート502・トランザクション識別子の扱い

Modbus/TCPでは、TCP層の再送と検査を使うためフレーム末尾のCRCが消え、先頭へ7バイトのMBAPヘッダが付きます。内訳はトランザクション識別子2バイト、プロトコル識別子2バイト、長さ2バイト、ユニット識別子1バイトです。

実装で効くのはトランザクション識別子です。RTUと違い応答を待たずに次の要求を送れる(パイプライン化できる)ため、どの応答がどの要求に対応するかをこの2バイトで突き合わせます。ただし機器側の同時受け付け数は製品ごとに違い、4接続や8接続で頭打ちになるものが珍しくありません。既定ポートは502、TLSで包むModbus Securityは802を使います。

RS-485の1セグメント32台・終端抵抗という物理層側の制約

RTUで使うRS-485は、1本のペア線に複数のスレーブをぶら下げるマルチドロップ構成です。標準的な受信器では1セグメント32台までで、超えるならリピータかセグメント分割が要ります。

観点 Modbus RTU Modbus ASCII Modbus TCP
物理層 RS-485・RS-232 RS-485・RS-232 Ethernet
区切り 3.5文字の無通信 コロンとCR・LF MBAPヘッダ長
誤り検出 CRC16 LRC TCP層に依存
効率 高い 約半分 高い
並列要求 不可 不可 可能

ASCIIモードは1バイトを16進2文字で送るため、実効速度がRTUの半分になります。選ぶ理由は、文字間に最大1秒の遅延が許容される点だけです。遅延が読めない経路でのみ検討し、通常はRTUを選んでください。配線側は、線路の両端に120Ωの終端抵抗を入れる、スタブ(分岐線)を短く保つ、の2点で通信エラーの大半が防げます。

意味情報を持たないModbusとOPC UA・MQTTの棲み分けの決め方

Modbusを何に置き換えるか、という問いは立て方が違います。置き換えではなく、どの層で使うかの切り分けです。

レジスタ番号だけが渡るModbusと型と単位を運ぶOPC UAの差

Modbusのフレームが運ぶのは、アドレスと16ビットの生値だけです。受け取った側は、そのレジスタが何を意味するかを知りません。機器を1台追加するたびに、レジスタマップから係数と単位を書き写す作業が発生します。

OPC UA(IEC 62541)はここが違います。ノードごとに型・単位・アクセス権・親子関係を情報モデルとして持ち、クライアントは接続後にサーバをブラウズして構造を取得できます。機器追加時の実装が減るのは、この自己記述性によるものです。ただしサーバ実装を持つ機器は限られ、既設のインバータや電力計はまずModbusしか話しません。現実解は、現場側をModbusで読み、ゲートウェイでOPC UAサーバとして再公開する構成です。監視制御層まで含めた全体像はSCADAとは?スキャダの仕組みとPLC・DCS・MESとの役割分担を実装目線で解説で整理しています。

現場側はModbus・上位はMQTTという層で分ける収集構成の型

クラウドへ値を上げる案件では、ゲートウェイから先をMQTTにする構成が定番になっています。Modbusのポーリングで集めた値を、変化があったときだけMQTTでPublishする形です。

この構成の利点は通信量です。1秒周期で100点をポーリングしても、変化した点だけを上位へ送れば、上りの帯域は実際の変動量に比例します。しきい値超過の瞬間だけQoS 1で送り、定常値はQoS 0で間引く制御もできます。ゲートウェイから上の設計はMQTTとは?Pub/Subの仕組み・QoS・MQTT 5.0の実装からHTTPとの使い分けまで実装者向けに解説を参照してください。どこまでを現場側で処理するかの線引きは、エッジコンピューティングとは?仕組み・クラウドとの違いから導入判断までわかりやすく解説の判断軸が使えます。

IoTゲートウェイでのModbus収集実装とポーリング設計の注意点

Modbus案件が失敗する箇所は、プロトコルの理解ではなく周期設計に偏ります。机上で1秒周期と決めた系が、現場では3秒かかる、という形で出ます。

1秒周期が成立するかをボーレートとレジスタ本数から見積もる手順

RTUの1トランザクションに必要な時間は、要求と応答のバイト数から計算できます。9600bpsで8データビット・パリティ無し・ストップ1なら、1バイトは約1.04ミリ秒です。

  1. 1トランザクションのバイト数を数える(要求8バイト+応答は3+レジスタ数×2バイト)
  2. バイト数×10ビット÷ボーレートで伝送時間を出す
  3. 3.5文字分の待ち時間(9600bpsで約4ミリ秒)を前後に加える
  4. スレーブの応答遅延(機器仕様値・数ミリ秒から数十ミリ秒)を足す
  5. ブロック数×台数を掛け、目標周期の7割以下に収まるか確認する

9600bpsで20レジスタを読む1往復は、待ち時間と応答遅延を含めて100ミリ秒前後です。20台をぶら下げれば2秒。この時点で1秒周期は成立しません。対処は、ボーレートを19200や38400へ上げる、レジスタを連続配置して読み出しブロック数を減らす、系統を分けてシリアルポートを増やす、の3つになります。余裕を7割に置くのは再送1回分を吸収するためです。

pymodbus 3.14系での実装とタイムアウト・リトライの初期値

Python実装では pymodbus が事実上の標準で、PyPI上は 3.14系(2026年8月4日時点・Python 3.10以上)が公開されています。同期版と非同期版の両方のクライアントを持ち、シリアルとTCPを同じインタフェースで扱えます。

初期値として置くのは、タイムアウト1秒・リトライ2回・リトライ間隔は指数的に伸ばす、という組み合わせです。短く詰めすぎると応答の遅い機器で正常な応答を取りこぼし、長すぎると1台の不調が全体の周期を引き延ばします。連続失敗が一定回数を超えた機器はポーリング対象から一時的に外し、間隔を空けて復帰確認する仕組みを入れてください。これが無いと、電源を落とした1台のために系全体の周期が崩れます。ログにはスレーブアドレス・ファンクションコード・レジスタ先頭番号・例外コードの4点を残します。

認証も暗号化も持たない仕様を前提にしたネットワーク分離の設計方針

Modbusには、認証の仕組みも暗号化も定義されていません。ポート502に到達できる者は、誰でもコイルを書き換えられます。TLSで包むModbus Security(ポート802)は仕様として存在しますが、対応機器は限られます。

現実的な防御はネットワーク分離です。制御系セグメントをOAネットワークから分け、ゲートウェイだけを両側に足を持つ位置に置き、上りはMQTTやHTTPSの片方向に寄せる。Modbus/TCPを外部から直接叩ける経路は作らない、という設計になります。VPN越しにポート502を通す構成は、経路が暗号化されていても機器側に認証が無いため、内部に入られた時点で守るものが残りません。書き込み系ファンクションコード(05・06・15・16)をゲートウェイ側でブロックする運用も併せて有効です。

Modbusを採用してよい条件と、載せ替えを選ぶべき場面の切り分け

ここは判断を言い切ります。Modbusは古いから避けるべき、という結論にはなりません。条件を満たすなら第一候補です。

既設機器がModbusしか持たない場合に採用を決めてよい三つの条件

次の三つが揃えば、Modbusで組んで問題ありません。収集点数が1系統あたり数百点以内であること、要求される周期が秒オーダーであること、収集が読み出し中心で書き込みが設定変更程度に留まること。

この範囲なら、実装コストは他の選択肢より確実に低く収まります。仕様が枯れていて実装スタックが安定しており、機器メーカー側のサポートも厚い。ライセンス費用も発生しません。既設機器がModbusしか持たない状況で、OPC UA対応のゲートウェイ機器へ入れ替える判断は、点数と周期が上の条件に収まる限り過剰です。

イベント駆動と数千点規模でModbus直結を見送るべき典型的な失敗例

逆に、次の場面ではModbus直結を採りません。ミリ秒単位のイベントを取りこぼせない要件、1系統で数千点を超える規模、機器ごとの型情報をシステム側で自動認識したい要件、そしてインターネットや広域網を越える経路。

典型的な失敗は、点数が増えた後に周期が破綻するパターンです。試験導入では5台20点で快調に動き、本番で60台600点に増やした途端に周期が10秒を超え、アラーム検知が用をなさなくなる。往復回数は台数に比例して増えるため、この破綻は必ず起きます。導入時点で最終台数を前提に周期を計算し、成立しないならシリアル系統の分割かTCP機器への置き換えを設計へ織り込んでください。「まず小さく始めて後で拡張」という進め方が、Modbusでは最も危険です。

収集基盤の設計と実装を外部に任せるかを分ける社内体制の判断目安

内製で回せるかは、レジスタマップを読める人が社内にいるかで決まります。プロトコル自体は半日で理解できる規模ですが、機器ごとのスケール係数・ワードオーダ・ラッチ仕様を読み解く作業は台数だけ発生します。

目安として、対象機器が3メーカー以内で点数が100点程度なら内製で足ります。メーカーが5社を超える、既設機器の仕様書が散逸している、収集した先でダッシュボードや異常検知まで作る。いずれかに当てはまるなら外部の設計を入れたほうが速く済みます。当社のAI/IoTソリューションでは、現場機器からの収集経路の設計と、集めたデータを扱うシステムの開発を一続きで請け負っています。

よくある質問

Modbusの実装検討でよく挙がる質問を、判断に直結する順で並べました。

Modbus通信とは何ですか?普通のTCP通信と何が違いますか?

Modbus通信は、産業機器のメモリ上のアドレスを指定して16ビット値を読み書きする、1往復で完結する通信です。一般的なTCP通信がバイト列を運ぶ土管であるのに対し、Modbusは「どのアドレスを何本読むか」という意味づけまでを規定します。ただし規定はそこまでで、読んだ値の単位や型は含まれません。Modbus/TCPはこの命令体系をEthernet上のポート502で運ぶ形式で、シリアル線を使うModbus RTUと命令の中身は共通です。

Modbus RTUとModbus TCPはどちらを選べばよいですか?

機器側が持っているインタフェースで決まります。RS-485端子しか無ければRTU、Ethernetポートがあるならその機器はTCPです。TCPは応答を待たずに次の要求を送れるため、多点収集で周期を詰められます。既設のRS-485機器をEthernet側へ載せたい場合は、Modbusゲートウェイ(RTU-TCP変換器)を挟む方法があり、機器の入れ替えより費用を抑えられます。

Modbusの通信ができないとき、まず何を確認すべきですか?

確認は上位から下位の順で進めます。まずスレーブアドレスが機器の設定値と一致しているか、次にボーレート・パリティ・ストップビットの3点が完全一致しているか。ここまでで大半が解決します。例外コード02が返る場合は、アドレス表記のずれ(40001と0の関係)を疑ってください。無応答が続くならRS-485のA・B線の極性反転と終端抵抗の有無を確認します。

Modbusは古いプロトコルですが、今から新規採用しても問題ないですか?

数百点・秒周期・読み出し中心という条件に収まるなら問題ありません。仕様の更新が2012年で止まっているのは、フィールドバス層として必要な機能が揃っているためです。国内で流通する計測機器・インバータ・電力量計の多くが今もModbusを標準搭載しており、機器選定の幅が広い点も利点になります。新規に情報モデルを持つ機器群を組む案件なら、最初からOPC UA対応機器を選ぶほうが後の拡張は楽です。

Modbusのセキュリティ対策はどうすればよいですか?

プロトコル側に認証も暗号化も無いため、ネットワーク側で守ります。制御系セグメントを情報系から分離し、ポート502へ到達できる範囲をゲートウェイだけに限定してください。上位への送信はMQTTやHTTPSで片方向に寄せます。TLSを使うModbus Security(ポート802)は対応機器が限られるため、当面はこの分離設計が主軸になります。

関連記事

資料請求

RELATED POSTS 関連記事