SerialTool で使う Modbus RTU、ASCII、TCP

最終更新日 作成者 Oliver Reed

Modbus とは

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

簡単に言えば、電子機器同士がシリアル回線を通じて情報をやり取りするための方法です。情報を要求する装置は Modbus Client、情報を提供する装置は Modbus Server と呼ばれます。標準的な Modbus ネットワークでは 1 台の client と最大 247 台の server が存在し、それぞれ 1〜247 の一意なアドレスを持ちます。client は server に対して書き込みも行えます。


もともとは産業用途向けに作られたプロトコルですが、時間の経過とともに他の分野にも広がり、最も普及したプロトコルの一つになりました。40 年以上経った現在でも、オペレータパネル、PLC、ホームオートメーション機器、さらには Arduino のようなシンプルな機器でも利用されています。

シリアル経由の Modbus RTU / ASCII 伝送

このプロトコルが作られた当時、通信はシリアルポート経由で使われることが想定されていたため、SerialTool に実装されています。 Modbus は SCADA(Supervisory Control and Data Acquisition)システムにおいて、監視コンピュータと遠隔端末装置(RTU)を接続するためによく使われます。データの伝送形式に応じて、プロトコルは次のように分かれます。

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

エラーチェック方式は 2 つで異なります。MODBUS RTU ではコマンド末尾に CRC(Cyclic Redundancy Check)が付加され、MODBUS ASCII ではコマンド後に LRC(Longitudinal Redundancy Check)が付加されます。

Modbus TCP 伝送

1999 年に “Modbus TCP” が開発されました。これは TCP/IP プロトコル群を利用するネットワーク向けの標準で、実質的にはシリアル Modbus RTU を TCP/IP 上に載せたものです。そのため、Internet/Intranet ネットワークで通信できます。近年では Open Source で実装が容易、開発コストが低く、必要なハードウェアサポートも最小限で済むことから、TCP/IP 版の利用がますます増えています。

エラーチェック方式は 2 つで異なります。MODBUS RTU ではコマンド末尾に CRC(Cyclic Redundancy Check)が付加され、MODBUS ASCII ではコマンド後に LRC(Longitudinal Redundancy Check)が付加されます。

Modbus TCP/IP プロトコルは、バイナリデータ符号化と TCP/IP のエラー検出機構を使用します。シリアル Modbus と異なり、TCP/IP 版はコネクション指向であり、同一 slave または複数デバイスに対して同時接続が可能です。Modbus TCP/IP も master-slave パラダイムを用い、この通信ではさらに 4 種類のメッセージタイプが使われます。

Modbus は ISO/OSI スタックのレベル 7(Application Layer)に位置し、framing と呼ばれるメッセージ形式や、データおよび制御機能の送信方式を定義します。通信は client-server パラダイムで行われます。プロトコルは、下位通信層に依存しない Protocol Data Unit(PDU)を定義します。Application Data Unit(ADU)は、アドレッシングとエラー制御のための追加フィールドを導入します。

SerialTool Modbus Client(Master / Polling)

SerialTool は、polling、レジスタスキャン、トラフィック監視、ライブチャートを備えた Modbus RTU / ASCII / TCP クライアントで、産業機器のテストとデバッグに適しています。

Modbus Client では、Serial(RTU または ASCII)または Network(IPv4 / IPv6 上の TCP)を通じて Modbus Slave/server デバイスへ接続し、標準 Modbus 機能でデータの読み書きを行い、さらに独自マッピングを持つ Modbus デバイスを作成して、その上で定期 polling を実行できます。
プロトタイプデバイス内には Modbus 構造(Discrete Output Coils、Discrete Input Contacts、Analog Input Register、Analog Output Holding Register)を追加でき、必要に応じて再利用できるよう保存することも可能です。また、この Modbus プロトタイプデバイスは Text、CSV、PDF 形式でエクスポートでき、簡単かつ直感的に共有できます。
正しいマッピングを持つデバイスを作成すると、定期 polling により Slave デバイスから読み取った値をリアルタイムチャートで表示できます。
SerialTool には、生成および受信された Modbus トラフィック(Serial / TCP)を専用ターミナルで表示する機能もあります。高度なターミナルでは、データのエクスポートや入出力データのリアルタイムフィルタリングが可能です。
さらに、Modbus Scanner 機能によってリモート Slave デバイスをスキャンすることもできます。適切なフィルタを設定すれば、現在サポートされているレジスタを知らなくても、リモートデバイス(Modbus Slave)のマッピングを試みることができます。Modbus Scanner は、特性が不明または一部しか分からないデバイスを調査する場合に特に有効です。

以下は SerialTool の Modbus モジュールのメイン画面です。

Modbus Client (Master/Polling) Main page

SerialTool Modbus Client のメイン画面

メイン画面では、SerialTool と Modbus Client(Master)の主要機能が分かりやすく示されています。

SerialTool Modbus Client(Master / Polling)

画面左側では、Serial 接続または TCP 接続モードを選択できます。

Modbus Client Connection

Modbus Client 接続画面

前述のとおり、シリアル Modbus プロトコルには RTU と ASCII の 2 種類があります。シリアル接続でリモートデバイスと正しく通信するには、Slave デバイスがどの Modbus プロトコルに対応しているかを把握しておくことが不可欠です。

一方、ModBus TCP 接続は IPv4 と IPv6 に対応しています。TCP 経由で Modbus 接続を設定するには、slave の IP アドレスと接続先ポートを指定する必要があります。

接続画面には、Modbus Slave デバイスから返ってくる応答に関する 2 つのタイムアウトパラメータがあります。
1 つは一般的な応答タイムアウト(Response Timeout)で、この時間を超えると Client(Master)は slave の応答待ちを終了します。もう 1 つは、Slave から最後の 1 バイトを受信してからのタイムアウトです。

Modbus ENRON / Daniel エミュレーション

接続パラメータの中には、ENRON/Daniel エミュレーション(単に Enron Modbus または Daniels Modbus と呼ばれることもあります)があり、これは標準 Modbus 通信プロトコルの特定の派生仕様を指します。
これはもともと Enron Corporation によって開発され、Daniel Measurement and Control の flow computer に広く実装されました。やがて Oil & Gas 分野を中心に、電子流体計測(EFM)の事実上の標準となりました。

デバイスで ENRON/Daniel エミュレーションを有効にすると、Modbus の動作が変更され、次の重要な特徴がサポートされます。

  • 1. 単一レジスタでの 32 ビットデータ処理: これは最も重要な技術的違いです。Standard Modbus ではレジスタは 16 ビット(2 バイト)で、32 ビット値には 2 レジスタの読み出しが必要です。Enron Modbus では 32 ビット値が単一レジスタ(1 レジスタあたり 4 バイト)にマッピングされます。
  • 2. 特殊なアドレスマッピング: 32 ビットデータのために事前定義された範囲を使用します。5000 番台(例 45001 - 45999)は Long Integers、7000 番台(例 47001 - 47999)は Floating Points 用です。
  • 3. 履歴データとイベント: 標準 Modbus がほぼリアルタイム読み出し専用であるのに対し、履歴ログやアラームアーカイブを取得するための特別なコマンドをサポートします。
  • 4. Offset なし: 要求アドレスがレジスタ番号と完全に一致するため、標準 Modbus でよくある「+1 offset」問題を排除できます。

要約: Oil & Gas 分野でネイティブな 32 ビットデータを送信するデバイスと接続する場合、このエミュレーションは通信エラー(バイトずれ)を避けるために重要です。


Modbus Client の機能

画面中央には、SerialTool がサポートする Modbus 機能が表示されます。

Modbus Client の機能

Modbus Client モードでサポートされる機能

ModBus Client の機能は次の表のようにまとめられます。

機能コード 操作 テーブル名 / 説明
0x01 読み取り Discrete Output Coils
0x02 読み取り Discrete Input Contacts
0x03 読み取り Analog Output Holding Register
0x04 読み取り Analog Input Registers
0x05 単一書き込み Discrete Output Coil
0x06 単一書き込み Analog Output Holding Register
0x07 読み取り Exception Status
0x08 診断 診断 (Serial Line only)
0x0B (dec 11) 読み取り Comm Event Counter (Serial Line only)
0x0F (dec 15) 複数書き込み Discrete Output Coils
0x10 (dec 16) 複数書き込み Analog Output Holding Registers
0x11 (dec 17) レポート Server ID (Serial Line only)
0x16 (dec 22) マスク書き込み Holding Register
0x17 (dec 23) 複数読み書き Holding Registers
0x2B / 0x0E (dec 43 / 14) 読み取り Device Identification

Modbus データ構造

情報は Server デバイス内の 4 種類のテーブルに保存されます。2 つのテーブルは離散的なオン/オフ値(coils)を、残り 2 つは数値(registers)を保存します。coils と registers にはそれぞれ読み取り専用テーブルと読み書き可能テーブルがあります。各テーブルには 9999 個の値があります。各 coil または contact は 1 bit で、データアドレスは 0000〜270E の範囲です。各 register は 1 word = 16 bits = 2 bytes で、同様に 0000〜270E の範囲のデータアドレスを持ちます。

Coil / Register 番号 データアドレス タイプ テーブル名
1-9999 0x0000 to 0x270E 読み書き Discrete Output Coils
10001-19999 0x0000 to 0x270E 読み取り専用 Discrete Input Contacts
30001-39999 0x0000 to 0x270E 読み取り専用 Analog Input Register
40001-49999 0x0000 to 0x270E 読み書き Analog Output Holding Register

Modbus デバイス

SerialTool では、接続先となる Slave デバイスのレジスタマッピングを表す Modbus Slave デバイスを作成できます。 このマッピングは非常に重要で、リモート slave デバイス内の値をローカルテーブルに表示できるようにします。

Modbus Client の機能

Modbus Slave functions map

Modbus Client で利用できる機能

機能バーからは、「Load Device」で以前作成したデバイスの読み込み、「Save Device」で現在のデバイスの保存、さらに「Add Item」で単一レジスタ、「Add Items」で複数レジスタをデバイスマッピングに追加できます。

Add Multiple Modbus Registers

Modbus レジスタを Modbus デバイスマッピングへ追加


Modbus デバイス Slave Memory Mapping

Modbus Slave デバイスのメモリエリア(Modbus デバイス)

Modbus Slave デバイスのマッピングが作成されると、SerialTool では後で再利用するために保存したり、その内容を CSV、Text、PDF 形式でエクスポートして第三者と共有・処理したりできます。 次の画像は、Modbus Slave デバイスマッピングをエクスポートした例です。

Modbus Slave Mapping

Modbus Slave デバイスマッピングの PDF エクスポート例

このリンクから PDF をダウンロードできます。

Modbus Polling

Modbus Slave デバイスを作成すると、接続先 slave デバイスの一部レジスタを定期的に読み取る polling を実行できます。
そのためには、まず Slave を作成してマッピングし、polling 対象にしたいレジスタを追加する必要があります。次の図を参照してください。

Modbus Master to Slave Polling

この画像は、slave に対する polling に項目を追加する様子を示しています。

1 つまたは複数の項目を polling に追加した後、それらの項目に対する polling を開始できます。

Modbus Master to Slave Polling Mask

この画像は、polling 用に選択された項目を示しています。

Modbus 機能へのアクセス

SerialTool Modbus Client(Master / Polling)は、次の 3 つの方法で機能を実行できるよう設計されています。

Modbus execute function

Modbus 機能の実行

  • "Execute from Device Table" - デバイスマッピングを参照して Modbus 機能を実行します。
  • "Execute Function" - Modbus 機能を直接実行し、結果をログウィンドウに表示します。
  • "Send Raw Data" - 16 進バイト列から構成された直接リクエストを送信し、応答を待ちます。

Execute from Device Table

このモードでは、ローカルで読み込んだ、または作成したデバイステーブルを直接使用して選択した Modbus 機能を実行します。 ユーザーは Coils、Discrete Inputs、Holding Registers、Input Registers などの Modbus 参照タイプを選択し、開始アドレスと読み書きする要素数を指定したうえで、1 クリックで slave にコマンドを送信できます。
このモードの最大の利点は、結果がすぐにデバイスマップへ反映され、ローカルテーブルの値が更新されることです。 これにより、リモートデバイスの状態を整理された永続的な形で把握でき、テスト時だけでなく監視や保守にも役立ちます。
書き込み機能に関するコマンドでは、SerialTool によりデータ型、表示形式、選択したレジスタへ書き込む内容を選択して送信データを簡単に準備できます。 そのため、Modbus デバイスの論理構造に直接対して作業したい場合に特に適しています。

Execute Function

Execute Function モードでは、利用可能な機能コード一覧から直接 Modbus 機能を選択して実行できます。 たとえば coils の読み取り、discrete inputs の読み取り、holding registers の読み取り、input registers の読み取り、単一/複数書き込みなど、プロトコルがサポートする機能が対象です。
この場合、結果はデバイスマップ上の表示だけに限定されず、アプリケーションのログ領域にも表示されます。 そのため、受信した応答内容を素早く確認したいとき、特定の Modbus 機能を試したいとき、あるいはデバイスマッピングを変更せずに変化するアドレスや数量に対してテストしたいときに非常に便利です。
また、このモードはデバッグにも非常に有効で、実行結果、slave から返されたエラー、要求と応答に関する情報をすぐに確認できます。

Send Raw Data

この機能は、16 進形式で slave に任意のコマンドを送受信します。 ユーザーは、シリアルや TCP/IP など現在の接続上に送信するバイト列を手動で入力でき、ソフトウェア側で自動的にフレームを構築することはありません。
この機能は、高度なテスト、リバースエンジニアリング、診断、Modbus デバイスや互換プロトコルの検証に非常に役立ちます。 実際には、client はユーザーが入力したバイト列をそのまま送信するため、パケット内容を完全に制御できます。これにより、カスタム要求のシミュレーション、異常応答のテスト、手動で準備した完全なフレームの送信が可能になります。
応答待ちオプションを有効にすると、SerialTool は slave から返ってきたフレームを受信してトラフィックログに表示でき、送信データと受信データを即座に比較できます。

Modbus Raw Data

Raw データ送信

Modbus Scanner 機能

SerialTool には、接続された Slave デバイスの Modbus アドレスをスキャンする機能があります。 この機能では、開始アドレスから終了アドレスまでの範囲を素早く探索でき、スキャン時に使用する機能コードも指定できます。
リモートデバイスの全体マップが正確には分からない場合や、有効なアドレスや意味のあるデータを含むアドレスを確認したい場合に、この scanner は特に有効です。 各問い合わせアドレスについて、SerialTool はテーブル上に使用した機能タイプ、アドレス、読み取った値、処理結果を表示します。
このモードにより、サードパーティ製デバイスとの診断や統合作業を大幅に高速化でき、slave が実際に使用している Modbus メモリ領域を素早く特定し、スキャン結果を後続の分析や共有のためにエクスポートできます。

Modbus Slave Scanner

アドレステーブル

Slave Modbus レジスタのチャート

Modbus レジスタの値はチャートで表示できます。 この機能により、デバイスマッピング内の 1 つまたは複数の要素を専用チャートウィンドウに結び付け、polling または更新処理中に値を時間軸上で表示できます。
チャートに接続された各レジスタは、それぞれ独自のトレースとして表示でき、特定の色や Modbus 参照、アドレス、現在値、要素名などで識別されます。 これにより、アナログ変数、設定値、測定値、またはデバイス動作中に変化する数値レジスタの時間変化を簡単に観察できます。
このチャート機能は、監視、試験、動的解析に特に有用であり、単なる表形式の読み取りにとどまらず、データが時間とともにどのように変化するかをすぐに把握できます。

Modbus Client/Slave Chart

Modbus レジスタチャート

Modbus トラフィックログ

送受信されたすべてのコマンドは、Modbus トラフィックログウィンドウにバイト単位で表示されます。 トラフィックログは通信デバッグの基本的なツールであり、client が送信したデータと slave デバイスから受信したデータを詳細に可視化し、バイト列を読みやすい形で表示できます。
このウィンドウにより、フレームの実際の内容を確認し、生成されたコマンドが正しいかを検証し、タイムアウト、異常応答、Modbus 例外、予期しないデータなどを診断できます。 トラフィックは通常のクライアント使用時、自動 polling 実行時、または raw データ送信時にも確認できます。
また、このトラフィックウィンドウでは、ASCII または 16 進形式でのデータコピー、ファイル保存、内容検索、行選択、色・フォント・間隔・表示設定などのグラフィックカスタマイズといった高度な機能も利用できます。 そのため、トラフィックログは単なるビューアではなく、開発者、技術者、インテグレータにとって非常に有用な実務ツールでもあります。

Modbus Client/Slave Traffic

Modbus トラフィック