SerialTool で扱う Modbus RTU・ASCII・TCP

Modbus とは

Modbus は、1979 年に Modicon®(現在は Schneider Electric の一部)によって自社の PLC(プログラマブルロジックコントローラ)を接続するために作られたシリアル通信プロトコルです。産業用通信における事実上の標準規格となっており、世界中の産業用電子機器で最も広く使われているプロトコルの一つです。Modbus はロイヤリティフリーのプロトコルであり、その仕様は The Modbus Organization のサイトで公開されています。

簡単に言うと、電子機器同士でシリアルラインを通じて情報を送受信するための方式です。情報を要求する側を Modbus クライアント、情報を提供する側の機器を Modbus サーバと呼びます。標準的な Modbus ネットワークでは、クライアントは 1 台で、サーバは最大 247 台まで接続でき、それぞれ 1~247 の一意なサーバアドレスを持ちます。クライアントはサーバに対して情報の書き込みも行えます。


当初は産業用途を想定して設計されましたが、時間の経過とともにさまざまな分野で採用され、現在では最も普及しているプロトコルの一つとなっています。40 年以上経った今でも、操作パネルや PLC、ホームオートメーション機器、さらには Arduino のようなシンプルなデバイスにまで広く組み込まれています。

Modbus RTU / ASCII のシリアル通信

Modbus プロトコルは、もともとシリアルポート経由で使用されることを前提としており、そのため SerialTool にも実装されています。Modbus は、SCADA(Supervisory Control and Data Acquisition)システムにおいて監視用コンピュータとリモート端末装置(RTU)を接続する用途でよく使われます。データの転送形式に応じて、プロトコルは次のように区別されます。

  • MODBUS RTU – データは 16 進数形式で送信されます。
  • MODBUS ASCII – データは ASCII 形式で送信されます。

誤り検出方式は両者で異なります。MODBUS RTU では Cyclic Redundancy Check(CRC)が用いられ、コマンドの後に付加されます。一方、MODBUS ASCII では Longitudinal Redundancy Check(LRC)がコマンドの後に送信されます。

Modbus TCP 通信

1999 年には「Modbus TCP」が開発され、TCP/IP プロトコルスイートを使用するネットワーク向けの標準として定義されました。これは本質的に、Modbus RTU を TCP/IP 上で動作させるバージョンであり、インターネット/イントラネット経由の通信を可能にします。近年では、オープンソースで実装が容易、開発コストが低く、必要なハードウェア要件も最小限で済むことから、TCP/IP 版の利用が増えています。

誤り検出方式は前述のとおり、MODBUS RTU では CRC が、MODBUS ASCII では LRC がコマンドの後に付加されます。

Modbus TCP/IP プロトコルではデータをバイナリ形式で符号化し、TCP/IP のエラーチェック機構を利用します。シリアル版 Modbus と異なり、TCP/IP 版はコネクション指向であり、同一スレーブあるいは複数デバイスに対する同時実行が可能です。Modbus TCP/IP もマスタ・スレーブ(クライアント・サーバ)モデルを採用し、4 種類のメッセージタイプを使用します。

Modbus は ISO/OSI 参照モデルの第 7 層(アプリケーション層)に位置し、フレーミングと呼ばれるメッセージフォーマットや、データおよび制御機能の送信方法を定義します。通信はクライアント・サーバモデルで行われます。プロトコルは、下位の通信媒体に依存しない Protocol Data Unit(PDU)を定義し、さらに Application Data Unit(ADU)ではアドレッシングやエラーチェック用のフィールドが追加されます。

SerialTool Modbus クライアント

SerialTool は RTU・ASCII・Modbus TCP の各送信モードをサポートしており、Modbus クライアントとして高い柔軟性を提供します。
また、開発者の多様なニーズに応えるため、Raw コマンドの送信機能も備えています。

送信したコマンドのログ画面

送信された低レベルコマンドの画面


Modbus の機能コード

以下は、SerialTool が Modbus プロトコル向けに実装している機能です。

機能コード 動作 テーブル名
0x01 Read Discrete Output Coils
0x02 Read Discrete Input Contacts
0x03 Read Analog Output Holding Register
0x04 Read Analog Input Registers
0x05 Write Single Discrete Output Coil
0x06 Write Single Analog Output Holding Register
0x0F (dec 15) Write Multiple Discrete Output Coils
0x10 (dec 16) Write Multiple Analog Output Holding Registers

Modbus のデータ構造

情報はサーバデバイス内部で 4 種類のテーブルに格納されます。2 つのテーブルは ON/OFF の離散値(コイル)を、残り 2 つは数値データ(レジスタ)を保存します。コイルとレジスタには、それぞれ読み取り専用テーブルと読み書き可能テーブルがあります。各テーブルは最大 9999 個の値を持ちます。各コイルまたはコンタクトは 1 ビットで、データアドレスは 0000~270E の範囲です。各レジスタは 1 ワード(16 ビット = 2 バイト)で、同じく 0000~270E のデータアドレスを持ちます。

コイル/レジスタ番号 データアドレス タイプ テーブル名
1-9999 0x0000 ~ 0x270E Read/Write Discrete Output Coils
10001-19999 0x0000 ~ 0x270E Read Only Discrete Input Contacts
30001-39999 0x0000 ~ 0x270E Read Only Analog Input Register
40001-49999 0x0000 ~ 0x270E Read/Write Analog Output Holding Register