Modbusプロトコルの基礎
Modbusは産業機器でよく使われている通信プロトコルです。産業界のデファクトスタンダードとして広く活用されています。ModbusはEthernetやRS-485など複数のハードウェアインターフェース、および多種多様な産業機器に対応しています。シンプルな構造で実装が比較的容易なため、特徴と実装時の注意点を頭に入れておけば使い始めることが可能です。
ModbusプロトコルはModicon社が開発したものですが、現在はModbusを利用するユーザとサプライヤーの集団であるModbus Organizationがプロトコル仕様や関連情報を公開、管理しています。
Modbusのプロトコル
Modbus通信のプロトコルはRS-485を使う場合はModbus RTU、Ethernetを使う場合はModbus TCPを使用します。それぞれの特徴は以下のとおりです。
Modbus RTU
Modbus RTUはRS-485などのシリアルインターフェース上に実装されて使用されます。短距離を確実に伝送する必要があるケースによく使用されます。サポートしているメーカーも多いため、異なるデバイスを統合したうえでリアルタイムの処理が求められる工場などで主に利用されています。各メーカーによって仕様が異なる可能性があるため、実装前に確認しましょう。
Modbus TCP
Ethernet上でModbusを使えるようにしたのがModbus TCPです。TCP/IPを利用した通信のため、LANケーブルやスイッチングハブなど一般的なネットワーク機器を使って構成できます。特別な機器を必要としない分、シンプルかつ低コストでの導入が可能です。導入済のネットワークに参加できることに加えて、リモートでの監視や制御ができる点でも導入のメリットがあります。
RTUとTCPの違い
RTUはシリアル通信であるのに対し、TCPはEthernet通信である点が大きな違いです。シリアル通信の特徴である、短距離でリアルタイム性を保ったの確実な伝送を必要とする工場のラインなどではRTUが使われるケースが多いです。大量の機器が接続される場合や、広範囲なネットワークの制御を必要とする場合はTCPを使うほうが向いています。
Modbusメッセージフレームの特徴
Modbusのメッセージフレームはスタートおよびアドレス、ファンクションコード、データ、エラーチェックの4種類で構成されます。それぞれの特徴を紹介します。
スタートおよびアドレス
Modbus RTUのメッセージフレームは、3.5文字分のサイレントインターバルから始まります。続いて、1Byte(8bit)分のアドレス領域が割り当てられます。
Modbus TCPの場合、サイレントインターバルは設定されません。代わりに「トランザクション識別子」「プロトコル識別子」「フィールド長」の順で2Byteずつ、その後に「ユニット識別子(スレーブ・アドレス)」が1Byte割り当てられます。
ファンクションコード
スレーブの状態を読みだしたり、内容を更新したりする機能をコードで指定します。機器によって定義されている機能やファンクションコードが異なるため、通信する者同士の仕様にあわせて必要なファンクションコードを使用します。
データ
ファンクションコードに関連するデータの送信に用います。要求メッセージではレジスタのアドレスや数を指定し、応答メッセージではレジスタの値を返却するような、データの受け渡しをする領域です。ファンクションに応じて必要なデータが変わるため、ファンクションとあわせて確認しましょう。
エラーチェック
Ethernetの場合TCP/IP通信の中でデータの破損チェックがおこなわれるため、エラーチェックのためのメッセージは持ちません。
RTUではCRCチェックを実施します。送信側の機器でCRC値が計算されてメッセージに付加されたのち、受信側で受信した値と再計算した値が等しいかを比較してデータの破損チェックを実施します。その後、3.5文字分のサイレントインターバルが付加されます。
また、RTU モードの全データは、連続して一気に送信しきる必要があります。バイト間に 1.5 バイト分の無通信状態が続くと、そこで受信側は異常を検知してそれまで受信したデータを破棄するというルールがあります。
Modbus実装時の注意点
Modbusプロトコルを実装する際に注意したい点を記載します。
実装時に商用利用可能なModbusプロトコルスタックを使用することが一般的
Modbusでは、通信プロトコルの構成やライブラリをまとめた「Modbusプロトコルスタック」が公開されています。Modbusのプロトコルは複雑ではなく、仕様も公開されているため、自分でプログラムを作ることも可能です。その一方、機器同士で対応しているスタックが異なる場合、細かい調整が必要となります。Modbusは、プロトコルのルールが比較的緩やかな通信プロトコルになっており、接続性に関しては実機も使用しながら確認をする必要があります。
このため開発をおこなう際は、商用利用可能なModbusプロトコルスタックを使用するのが一般的です。すでに動作が保証されている組み合わせであれば通信をおこなえる前提で開発でき、メインの処理に工数を割けます。
通信周期とタイムアウトの設定
マスタがスレーブに対して要求を出す形で通信するModbusはレスポンスの時間を考慮して再送設定とリトライ回数を設計する必要があります。応答するスレーブはマスタに呼ばれたものだけのため、返答の時間をしっかりと待てば、次のスレーブへの要求に重なることがありません。
特にRTUではスタートメッセージとして3.5バイトの無通信時間が必要です。この時間が短すぎると、続きのデータとみなされて正しく伝送ができなくなります。またデータが破損していたり、CRCが合わなかったりと正しいデータではなかった場合、スレーブは応答を返しません。また、送受信する一連のメッセージの各バイト間は、1.5バイト以下の時間でなければなりません。そのため、メッセージを送信しはじめたら、途切れることなく送信できるようなパフォーマンスを出せるような設計が必要です。
また、送受信双方ともに適切なところでタイムアウトを設定し、リトライする設計にしなければなりません。
例外コード
マスタからの要求をスレーブが受け取ったが応答できない場合、スレーブは例外コードを発行します。マスタは例外コードを読み取ってパラメータ修正や再送など、次に必要な処理を実施します。例外コードの発行を契機として、不具合の調査をおこなうケースも多いでしょう。
例外コードの応答はそのコードがエラーであることを示す値と、具体的なエラーコードに分かれます。使用するModbusプロトコルスタックにより、エラーコードの内容は異なる場合があります。事前に仕様を把握したうえで例外コードの実装をおこないましょう。


