Modbus-RTUドライバーの概念と仮想テストガイド

Modbus-RTUドライバーの概念と仮想テストガイド

Modbus-RTUは、工場や設備の現場で以前から使われてきた通信方式であるため、資料も多く、実際に触れる機会もよくあります。しかし、回線を直接接続して目で確認するにはRS-485コンバーターや実際の機器が必要なため、いざ試そうとすると手軽に扱えないことが多くあります。

この投稿では、まずModbusの概念を簡単に整理し、実際の機器を使わずにPC内だけでcom0com(仮想シリアルポート)とModbus Poll/Modbus Slave(テスト用プログラム)の2つを使って、通信を実際に構築してみる方法を紹介します。

1. Modbusとは?

Modbusは1979年に初めて作られて以来、現在でも産業現場で最も広く使われている通信プロトコルです。PLC、センサー、計測器、インバーターなどの機器は、異なるメーカーの製品であっても、この規格に合わせれば通信できるため、現在も新しい機器に採用され続けています。

Modbusの通信構造は、常に「マスター(Master)」と「スレーブ(Slave)」に分かれます。マスターが先に要求を送った場合にのみスレーブが応答する方式であるため、スレーブが自発的にデータを先に送ることはありません。1台のマスターに複数のスレーブを接続でき、各スレーブは固有のスレーブID(1~247)で識別されます。

このマスターとスレーブのやり取りが、物理的にどのような回線を通るかによって、Modbusは大きく2種類に分かれます。

区分

Modbus TCP

Modbus RTU

物理層

イーサネット(LANケーブル)

RS-232 / RS-485シリアル

アドレスの識別

IPアドレス + ポート

スレーブID(1~247)

フレーム構成

MBAPヘッダー + PDU

スレーブID + PDU + CRC16

特徴

ネットワーク構成が簡単で高速

配線が安価で長距離に伸ばせる(RS-485は1.2 km、最大32台)ため、現場の計測器や旧型機器で現在も広く使われている

RTUフレームは、次のような非常に単純な構造です。

Slave ID(1バイト)

Function Code(1バイト)

Data(可変長)

CRC16(2バイト)

要求を受ける機器の番号

何をするか(読み取り/書き込みなど)

レジスターアドレス、個数、値など

エラー検出用のチェックサム

よく使われるFunction Codeをいくつか知っているだけでも、ほとんどの実習を理解できます。

  • 03 (Read Holding Registers) — レジスターの値を読み取る。実習で最もよく使う。

  • 06 (Write Single Register) — 1つのレジスターに値を書き込む。

  • 01 (Read Coils) — On/Off値(ビット)を読み取る。

  • 16 (Write Multiple Registers) — 複数のレジスターに一度に値を書き込む。

RTU通信を行うには、マスターとスレーブで次の4つの通信パラメーターを正確に一致させる必要があります。Baud Rate(通信速度、例:9600)、Parity(パリティ、通常はNone)、Data Bits(通常は8)、Stop Bits(通常は1)です。このうち1つでも異なると、まったく応答がないか、壊れた値が返ってきます。

まとめ:RTUは「誰が(スレーブID)何を(ファンクションコード)どこから(アドレス)いくつ(個数)送受信するか」を非常に短いバイト列で表し、最後にCRCでエラーを検証するシンプルなプロトコルです。

2. 仮想シリアルポートでテストする理由

RTUを目で確認するには、本来RS-485コンバーター、ケーブル、そして応答してくれる実際のスレーブ機器が必要です。しかし、「通信そのものが正常に行われているか」だけを先に確認したいのであれば、このようなハードウェアなしでもPC内で再現できます。com0comはWindowsで無料で使用できるオープンソースの仮想ヌルモデムドライバーで、インストールすると内部的に接続されたCOMポートのペアを作成します。一方のポートに書き込んだバイトが、そのまま反対側のポートの受信バッファーに届くため、実際のケーブルで2台の機器を接続した場合と同じ状況を作れます。

この仮想ポートペアの両端にプログラムを1つずつ接続すれば、それぞれにマスターとスレーブの役割を担わせることができます。

  • Modbus Slave — 仮想フィールド機器の役割。特定のアドレスに値を設定しておき、要求を受けると応答する。

  • Modbus Poll — マスターの役割。スレーブから定期的に値を読み取ったり、書き込んだりする。

どちらのプログラムもWitte Software(modbustools.com)が提供する対になったWindowsユーティリティで、無料評価版でも基本的なテストには十分です。

3. com0comの設定

  1. com0comをダウンロードし、管理者権限でインストールします。

  2. インストールすると、デフォルトでCNCA0 ↔ CNCB0という名前のポートペアが1つ作成されます。設定画面で名前を任意のCOM番号に変更できます。ここでは、COM7(スレーブ側)とCOM8(マスター側)に変更したものとします。

  3. ポートオプションでは、「ボーレートエミュレーション」を有効にしておくことを推奨します。無効にすると、実際のシリアル回線とは異なり、データが通信速度に関係なく即座に伝達されます。しかし、一部のプログラムはフレームの終了を「文字間の無通信時間」で判断するため、タイミングが実際の機器に近い状態で進むほうが、テスト上は安全です。

  4. 設定を保存した後、Windowsのデバイスマネージャーの「ポート(COMとLPT)」一覧にCOM7とCOM8が表示されることを確認します。

image1.png

com0com設定画面の例 — COM7 ↔ COM8ポートペアおよびオプション(実際の画面はバージョンによって異なる場合があります)

image2.png

デバイスマネージャー画面の例 — COM7、COM8ポートの確認

4. Modbus Slaveで仮想機器を作る

Modbus Slaveを起動してCOM7に接続し、通信パラメータを指定した値に設定します。

  • ポート: COM7

  • ボーレート / パリティ / データビット / ストップビット: 9600 / なし / 8 / 1

  • スレーブID: 1

接続すると、レジスタ値を編集できる表が表示されます。SetupメニューでFunctionを03 Holding Registersに、開始アドレスを40001に、個数をいくつか設定した後、表の値をダブルクリックして任意のテスト値(例: 40001番地に1234)を入力しておきます。

image3.png

Modbus Slave画面の例 — 左: Connection設定(COM7、9600-N-8-1、スレーブID 1) / 右: レジスタ値(40001=1234)

5. Modbus Pollで値を読み取る

次にModbus Pollを起動し、反対側のポートであるCOM8に接続します。通信パラメータはModbus Slaveと完全に同じ設定にします。

  • ポート: COM8

  • ボーレート / パリティ / データビット / ストップビット: 9600 / なし / 8 / 1(Slaveと同じ)

  • スレーブID: 1(Slaveと同じ)

SetupメニューでRead/Write Definitionを開き、Functionを03 Holding Registersに、開始アドレスを40001、個数をModbus Slaveと同じように設定すると、Modbus Pollが一定間隔でCOM8 → (com0com) → COM7 → Modbus Slaveの順にリクエストを送信し、応答を受信して画面に表示します。先ほどSlave側に入力した値(1234)がそのまま表示されれば、通信は正常に行われています。

image4.png

Modbus Poll画面の例 — 左: Connection/Read設定(COM8) / 右: 応答結果(40001=1234、Slaveと一致)

Modbus Slave側の画面で値をもう一度変更すると、Modbus Poll側の画面も次のポーリング周期で更新されることが確認できます。この2つがずれることなく値を送受信できていることを確認できれば、RTUフレームの送受信から通信パラメータの照合まで、実機なしで検証が完了したことになります。

6. 問題が発生したときに確認すること

  • 応答がまったくない場合(タイムアウト): Modbus PollとModbus Slaveのボーレート・パリティ・データビット・ストップビットが正確に同じか、スレーブIDが一致しているかを確認します。

  • ポートを開けない場合: 別のプログラムが同じCOMポートをすでに使用していないか確認します。(1つのポートを開けるのは1つのプログラムのみ)

  • 値がおかしく表示される場合(CRCエラーなど): com0comのボーレートエミュレーションオプションと、両側の開始アドレス・個数の設定が同じレジスタを指しているかを確認します。

7. まとめ

まとめると、RTUとは結局、「スレーブID + ファンクションコード + データ + CRC」という短いバイト列を、定められた通信パラメータで送受信する仕組みです。そしてその流れは、実際の配線がなくてもcom0comで仮想COMポートのペアを作り、その両端にModbus Slave(仮想機器)とModbus Poll(マスター)を1台ずつ接続するだけで、RS-485配線や実際のフィールド機器なしに、Modbus-RTU通信全体の流れ — リクエストフレームの生成、シリアル送信、応答、CRC検証、値の表示 — を目で確認できます。リクエストフレームが作成され、シリアルで送信され、応答が返り、値が画面に表示される一連の過程を自分の目で確認できたなら、RTU通信の核心はすでにすべて確認できたと言えるでしょう。

ここまで、Modbusドライバーを使用して仮想ポート経由でテストする手順を実習しました。実際のRS-485機器が用意できれば、残る作業は多くありません。com0comの代わりに実際のRS-485コンバーターを接続したCOMポートを使用し、Modbus Pollの代わりに実際に使用するマスター機器またはソフトウェアに置き換え、ボーレート・パリティ・スレーブIDなどの通信パラメータをその機器の仕様に合わせて再設定するだけです。

参考資料

Luna

Site footer