Modbusは、1979年にModicon社が
[プログラマブルロジックコントローラ]向けに開発した
シリアル通信プロトコルです。現在では、
産業用電子機器間の通信においてデファクトスタンダードとして広く普及しています。その理由は、以下の通りです。
仕様の公開と無料利用:誰でも自由に利用できるオープンなプロトコルです。
容易な実装:比較的容易に実装できるため、様々な機器への導入が容易です。
ベンダー非依存性:データの転送方法にベンダー特有の制約が少ないため、異なるベンダーの機器でも互換性が高いです。
多数機器接続:同じネットワーク上に多数の機器を接続して通信できます。例えば、複数のセンサーから取得した温度や湿度データなどを一括して
コンピュータに送信できます。
Modbusは、
[SCADA]システムにおいて、監視用
コンピュータと遠隔端末装置(RTU)間の通信に頻繁に使用されています。
プロトコルのバージョン
Modbusプロトコルには、主に以下の3種類のバージョンがあります。
1.
Modbus RTU:
シリアル通信用のバージョンで、データのコンパクトなバイナリ表現を用います。巡回冗長検査(CRC)チェックサムを用いてデータの完全性を確認します。
2.
Modbus ASCII:
シリアル通信用のバージョンで、人間が読みやすいASCII文字列でデータを表します。水平冗長検査(LRC)チェックサムを用います。
3.
Modbus/TCP:
イーサネットなどのTCP/IPネットワーク上で動作するバージョンです。チェックサムは下位層に任せます。
これらのバージョンは、データモデルとファンクションコールは共通ですが、データのエンコーディングと伝送方法が異なります。Modbus Plusという高速な独自拡張バージョンもありますが、専用のコプロセッサが必要となります。
通信と機器
Modbusネットワーク上の各機器には、一意なアドレスが割り当てられます。
シリアル通信とModbus Plusでは、マスターノードだけがコマンドを発行できます。Modbus/TCPでは、任意のノードがコマンドを発行できますが、通常は1つのマスターノードがコマンドを発行します。Modbusコマンドには、対象機器のアドレスが含まれており、指定された機器だけがコマンドを実行します。ブロードキャストコマンドも存在します。コマンドにはチェックサムが含まれており、データの完全性を確認できます。
基本的なModbusコマンドとしては、レジスタの値の読み書き、I/Oポートの読み書きなどが可能です。Modbusは単純なプロトコルであるため、様々なモデムやゲートウェイ、専用機器が存在し、有線だけでなく無線通信やSMS/GPRSによる実装も可能です。ただし、無線通信ではレイテンシやタイミングを考慮する必要があります。
実装上の注意点
Modbusの実装は、公式規格からの逸脱が多く見られます。そのため、異なるベンダーの機器間で互換性の問題が生じる可能性があります。よく見られる違いは以下の通りです。
データ型: 浮動小数点、32ビット整数、8ビットデータ、混合データ型など、データ型の扱いに違いがあります。
プロトコル拡張: 16ビットスレーブアドレス、32ビットデータサイズ、ワードの並び順など、プロトコル自体を拡張している場合があります。
Modbusの制約
Modbusは1970年代に設計されたため、以下の制約があります。
データ型の制限: PLCが扱えるデータ型しかサポートしていません。
データの説明不足: レジスタ値の意味(例えば、温度を表すなど)を記述する標準的な手段がありません。
例外処理の不足: マスタースレーブ型プロトコルであるため、スレーブ機器が例外を報告する仕組みが不足しています。
アドレス数の制限: 1つのデータリンクで扱えるアドレス数は最大247個に制限されています。
*
連続転送: データ転送は連続的でなければなりません。
これらの制約を理解した上で、Modbusプロトコルを使用する必要があります。
オープンソース実装
Modbusプロトコルは、様々なプログラミング言語でオープンソース実装が公開されています。C言語、C#、Java、Perl、Rubyなど、多くの言語でライブラリやアプリケーションが利用可能です。これらの実装を利用することで、Modbus対応機器との通信を容易に実現できます。