
Modbusはフィールドバスであり、産業用コンピュータネットワークプロトコルです。[ 1 ]元々はプログラマブルロジックコントローラ(PLC)で使用するために設計されましたが、[ 2 ]幅広いバスやネットワークで産業用電子機器間の通信のための事実上の標準通信プロトコルとなっています。[ 3 ] [ 1 ]
Modbusは、オープンソースでロイヤリティフリーであるため、産業環境で広く利用されています。産業用途向けに開発され、他の規格に比べて導入や保守が比較的容易であり、送信するデータのフォーマットに対する制約も少ないのが特徴です。
Modbusプロトコルは、トランスポート層としてシリアル通信線、イーサネット、またはインターネットプロトコルスイートを使用します。[ 1 ] Modbusは、同じケーブルまたはイーサネットネットワークに接続された複数のデバイスとの通信をサポートします。たとえば、温度を測定するデバイスと湿度を測定する別のデバイスが同じケーブルに接続され、両方ともModbusを介して同じコンピュータに測定値を送信できます。
Modbusは、監視制御およびデータ収集(SCADA )システムにおいて、プラント/システムの監視コンピュータとリモート端末装置(RTU)を接続するためによく使用されます。データタイプの多くは、リレー駆動に使用されるラダーロジックなど、工場機器の産業制御に由来する名前が付けられています。1ビットの物理出力はコイルと呼ばれ、1ビットの物理入力は離散入力または接点と呼ばれます。
これは元々1979年にModicon (1997年にSchneider Electricに買収)によって出版されました。2004年に、Modiconは権利をModbus Organization [ 4 ]に譲渡しました。Modbus Organizationは、Modbus準拠デバイスのユーザーとサプライヤーの業界団体であり、この技術の継続的な使用を提唱しています。[ 5 ]

Modbus規格またはバスには以下が含まれます: [ 1 ]

ネットワーク上でModbus通信をサポートするために、多くのモデムやゲートウェイは独自の設計を採用しています(図「Modbus通信用ネットワークのアーキテクチャ」を参照)。実装では、 ISM無線帯域などの有線または無線通信、さらにはショートメッセージサービス(SMS)やGPRS( General Packet Radio Service)が使用される場合もあります。
Modbusでは、クライアントとは、要求レシーバーから特定のタスクを要求するトランザクションを開始するエンティティであると定義されています。[ 6 ]クライアントがトランザクションを開始したクライアントの「要求レシーバー」は、サーバーと呼ばれます。[ 6 ]例えば、マイクロコントローラが有線ネットワーク(RS485バスなど)上のModbusでセンサーに接続してデータを読み取る場合、このコンテキストではMCUがクライアントであり、センサーがサーバーです。以前の用語では、クライアントはマスター、サーバーはスレーブと呼ばれていました。
Modbus は、プロトコルスタック内の下位レイヤプロトコルとは独立してプロトコルデータユニット(PDU) を定義します。特定のバスまたはネットワークに MODBUS プロトコルをマッピングするには、アプリケーションデータユニット (ADU) として定義されるいくつかの追加フィールドが必要です。ADU は、クライアントがトランザクションを開始したときに、Modbus ネットワーク内のクライアントによって形成されます。内容は次のとおりです。[ 7 ]
ADUはModbus Organizationによって正式にはModbusフレームと呼ばれていますが[ 7 ] 、フレームはOSIおよびTCP/IPモデルではデータリンク層のデータユニットとして使用されます(Modbusはアプリケーション層プロトコルです)。
PDUの最大サイズは253バイトです。RS232/RS485ネットワークでのADUの最大サイズは256バイト、TCPでは260バイトです。[ 8 ]
データエンコーディングに関して、Modbusはアドレスとデータフィールドにビッグエンディアン表現を使用します。したがって、16ビット値の場合、最上位バイトが最初に送信されます。たとえば、16ビットレジスタの値が0x1234の場合、バイト0x12がバイト0x34より先に送信されます。[ 8 ]
関数コードは、実行する関数のコードを示す1バイトのデータです。関数コードは1から255までの整数値で、128から255の範囲は例外応答に使用されます。
PDU のデータ フィールドのアドレスは 0 ~ 65535 です (ADU の追加アドレス フィールドのアドレスと混同しないでください)。[ 9 ] PDU のデータ フィールドは空にすることができ、その場合サイズは 0 になります。この場合、サーバーは情報を要求せず、関数コードによって実行される関数が定義されます。実行プロセス中にエラーがない場合、サーバーからクライアントへの ADU 応答のデータ フィールドには、要求されたデータ、つまりクライアントが以前に受信したデータが含まれます。エラーが発生した場合は、サーバーは例外コードで応答します。[ 6 ]
クライアントとサーバー間の Modbus トランザクションには以下が含まれます。[ 6 ] [ 10 ]
それに基づいて、Modbusは3種類のPDUを定義しています。[ 8 ]
Modbusは、4つの主要なタイプの一連のテーブルに基づいてデータモデルを定義します。[ 11 ]
各プライマリテーブルについて、プロトコルでは65536個のデータ項目を個別に選択することができ、それらの項目の読み取りまたは書き込み操作は、トランザクション機能コードに依存するデータサイズ制限まで、複数の連続したデータ項目にまたがるように設計されています。[ 11 ]
Modbusでは、パブリック、ユーザー定義、予約済みの3種類の機能コードが定義されています。[ 13 ]
注:一部の情報源では、標準とは異なる用語が使用されています。たとえば、「Write Single Coil」の代わりに「Force Single Coil」が使用されています。[ 14 ]
機能コード01(コイル読み取り)を使用すると、リモートデバイスの1~2000個のコイルの状態を読み取ることができます。mb_req_pdu(PDU要求)は、最初に読み取るコイルのアドレス(0x0000~0xFFFF)を示す2バイトと、読み取るコイルの数を示す2バイトを持ちます。mb_req_pduは、インデックス0でコイルのアドレスを定義します。つまり、最初のコイルのアドレスは0x0です。mb_rsp_pduが正常に実行されると、機能コード(0x01)を示す1バイトと、返されるデータバイト数(n)を示す1バイトが返されます。nは、mb_req_pduによって要求されたコイルの数を1バイトあたり8ビットで割って切り上げた値になります。応答の残りの部分は、指定されたデータバイト数(n)になります。[ 15 ]つまり、機能コード 01 の mb_req_pdu と mb_rsp_pdu は次の形式になります。[ 15 ]
例えば、20~38番コイルの状態を読み取るためのmb_req_pduとmb_rsp_pduは次のようになります。[ 16 ]
ユーザー定義機能コードは、ユーザーが定義する機能コードです。Modbusでは、ユーザー定義機能コードに65~72と100~110の2つの値の範囲が与えられています。当然ながら、ユーザー定義機能コードは一意ではありません。[ 13 ]
予約済み機能コードは、一部の企業がレガシー製品に使用する機能コードであり、一般には使用できません。[ 13 ]
クライアントがサーバーにリクエストを送信すると、そのリクエストに対して4つのイベントが発生する可能性があります。[ 17 ]
例外応答メッセージには、通常の応答メッセージと比較して、他に 2 つのフィールドが含まれています。[ 17 ]
すべての Modbus 例外コード: [ 18 ]
Modbus 規格では、シリアルバス上で Modbus アプリケーション層プロトコルを通信するための OSI モデルのデータリンク層上のプロトコルである Modbus over Serial Line も定義されています。[ 19 ] Modbus Serial Line プロトコルは、シリアルバスで 1 つのマスターと複数のスレーブをサポートするマスタースレーブ プロトコルです。 [ 20 ]アプリケーション層上の Modbus プロトコルでは、通信チャネル上のデバイスにクライアント/サーバ モデルが使用されます。Modbus over Serial Line では、クライアントの役割はマスターによって実装され、サーバの役割はスレーブによって実装されます。[ 20 ] [ 21 ]
この組織の命名規則は、複数のクライアントと1つのサーバーのみという一般的な使用法を逆転させています。この混乱を避けるため、RS-485トランスポート層では「サーバー」の代わりに「ノード」または「デバイス」という用語を使用し、「クライアント」は「ノード」ではありません。[ 21 ]
(Modbus Organization) は、Modbus 通信を説明するために「クライアント/サーバー」という用語を使用しています。これは、通信を開始してサーバー デバイスに要求を行い、サーバー デバイスが要求を処理して適切な応答 (またはエラー メッセージ) を返すという通信を特徴としています。
シリアルライン上の Modbus 用のシリアルバスでは、1 つのマスターと通信するスレーブは最大 247 台までです。これらのスレーブには、1 ~ 247 (16進数で 01 ~ F7 )の範囲の固有のアドレスが割り当てられます。248 ~ 255 ( 16 進数で F8~ FF )のアドレスは予約されており、使用してはなりません。[ 22 ]マスターはアドレスを持つ必要はありません。[ 22 ]通信プロセスはマスターによって開始されます。Modbus トランザクションを開始できるのはマスターのみだからです。スレーブはマスターからの要求がない限り、データを送信したり、アクションを実行したりすることは決してなく、スレーブ同士で通信することもできません。[ 23 ]
Modbus over Serial Line では、マスターはユニキャストまたはブロードキャストモードでスレーブに要求を開始します。ユニキャストモードでは、マスターは特定のアドレスを持つ単一のスレーブに要求を開始します。スレーブは要求を受信して完了すると、マスターにメッセージで応答します。[ 22 ]このモードでは、Modbus トランザクションには 2 つのメッセージが含まれます。1 つはマスターからの要求、もう 1 つはスレーブからの応答です。各スレーブは、通信のために個別にアドレス指定される一意のアドレス (1 ~ 247) を持つ必要があります。[ 22 ]ブロードキャストモードでは、マスターはブロードキャスト アドレス 0 を使用してすべてのスレーブに要求を送信できます。[ 22 ]これはブロードキャスト交換用に予約されたアドレスです (マスター アドレスではありません)。スレーブはブロードキャスト交換を受け入れる必要がありますが、応答してはなりません。[ 23 ] Modbus の PDU を Modbus over Serial Line プロトコルのシリアル バスにマッピングすると、Modbus Serial Line PDU が生成されます。[ 22 ]
ModbusシリアルラインPDU = アドレス + PDU + CRC(またはLRC)
PDU = 機能コード + データ
物理層では、シリアルライン上のMODBUSはRS485またはRS232を使用してビット単位で通信を行い、最も一般的な方法はTIA/EIA-485 2線式インターフェースです。RS485 4線式インターフェースも使用されます。TIA/EIA-232-E (RS232)も使用できますが、ポイントツーポイントの短距離通信に限定されます。[ 20 ]シリアルライン上のMODBUSには、 RTUとASCIIの2つの伝送モードがあり、これはModbus RTUとModbus ASCIIとして知られるプロトコルの2つのバージョンに対応しています。[ 24 ]
Modbus RTU (リモートターミナルユニット) は、Modbus で最も一般的な実装であり、プロトコル通信のためにデータのコンパクトなバイナリ表現を使用します。RTU フォーマットは、コマンド/データに続いて、データの信頼性を確保するためのエラーチェックメカニズムとして巡回冗長検査チェックサムが続きます。Modbus RTU メッセージは、文字間のためらいなく連続して送信する必要があります。Modbus メッセージは、アイドル (無音) 期間によってフレーム (分離) されます。データの各バイト (8 ビット) は 11 ビットとして送信されます。[ 3 ] [ 24 ]
デフォルトは偶数パリティですが、奇数パリティまたはパリティなしは追加オプションとして実装できます。[ 24 ]
Modbus RTUフレームは次のようになります。[ 25 ]
CRC の計算は CRC-16-MODBUS として広く知られており、その多項式はx 16 + x 15 + x 2 + 1 です (通常の 16 進代数多項式は であり8005、 は逆ですA001)。[ 26 ]
Modbus RTUフレームの16進数表記の例:(からまで01 04 02 FF FF B8 80の5バイトに対するCRC-16-MODBUS計算結果はとなり、これは最下位バイトから順に送信されます)。01FF80B8
送信中のフレームの完全性を確保するため、2つのフレーム間の時間間隔は少なくとも3.5文字の送信時間でなければならず、連続する2文字間の時間間隔は1.5文字の送信時間以下でなければなりません。[ 25 ]例えば、デフォルトのデータレート19200ビット/秒の場合、3.5文字(t3.5)と1.5文字(t1.5)の11ビット文字の送信時間は次のようになります。
より高いデータレートの場合、Modbus RTU はt1.5 に750 μs、t3.5 に 1.750 ms の固定値を使用することを推奨しています。 [ 25 ]
Modbus ASCII は、プロトコル通信にASCII文字 (char)を使用します。ASCII フォーマットは、縦方向の冗長性チェック (LRC) チェックサムを使用します。Modbus ASCII メッセージは、先頭のコロン (":", ASCII 値 3A 16 ) と末尾の改行 (CR/LF、ASCII 値 0D 16および 0A 16 ) で囲まれます。Modbus ASCII フレームは、Modbus RTU のようにバーストで送信する必要はなく、デフォルトでは各文字の送信間に最大 1 秒の遅延が許容されます。各 ASCII 文字は 10 ビットとして送信されます。
デフォルトは偶数パリティですが、奇数パリティまたはパリティなしは追加オプションとして実装できます。
Modbus ASCIIフレームには以下が含まれます。[ 27 ]
アドレス、ファンクション、データ、および LRC は ASCII 16 進数でエンコードされた値であり、各バイト (8 ビット) の情報は、0 ~ 9 と A ~ F の範囲の人間が読み取れる 2 つの ASCII 文字としてエンコードされます。たとえば、バイト値 122 ( 1111010 2または7A 16 ) は、2 つの ASCII 文字「7」と「A」としてエンコードされ、2 バイト55(37 16、「7」の ASCII 値) と65(41 16、「A」の ASCII 値) として送信されます。
LRC は、8 ビット値の合計 (開始文字と終了文字を除く) を否定 ( 2 の補数) し、8 ビット値としてエンコードして計算されます。たとえば、アドレス、機能、データが 247、3、19、137、0、10 の場合、それらの合計 (416) の 2 の補数は -416 です。これを 8 ビットにトリミングすると 96 (256 × 2 − 416 = 60 16 ) となり、次の 17 文字の ASCII フレームが得られます。LRC:F7031389000A60␍␊はチェックサムとしてのみ使用することが規定されています。エンコードされたデータに対して計算されるため、送信された文字に対して計算されるのではなく、その「縦方向」の特性は、パリティ ビットと組み合わせて 1 ビットのエラーを特定するために使用することはできません。
Modbus TCPまたはModbus TCP/IPは、 TCP/IPネットワーク上で通信を行うために使用される Modbus のバリアントで、ポート 502 を介して接続します。[ 28 ]下位レイヤーが既にチェックサム保護を提供しているため、チェックサム計算は必要ありません。
Modbus TCP の命名法は、シリアルライン上の Modbus プロトコルと同じで、Modbus コマンドを送信するデバイスはすべて「クライアント」であり、応答は「サーバー」から返されます。[ 29 ]
Modbus TCP の ADU は、Modbus 組織によって正式にはModbus TCP/IP ADUと呼ばれており[ 30 ] 、他の団体ではModbus TCP フレームとも呼ばれています。[ 3 ]
MODBUS TCP/IP ADU = MODBUSアプリケーションプロトコルヘッダー + 機能コード + データ
MODBUSアプリケーションプロトコルヘッダー - これは、TCP/IP上でMODBUSアプリケーションデータユニットを識別するために使用される専用ヘッダーです。
MODBUSアプリケーションプロトコルヘッダーには、次のフィールドが含まれています。[ 31 ]
ユニット識別子は、複数のModbusデバイスを組み合わせたModbus TCPデバイス(例:Modbus TCP-Modbus RTUゲートウェイ)で使用されます。このような場合、ユニット識別子はゲートウェイの背後にあるデバイスのサーバアドレスになります。
MODBUS TCP/IP ADU/Modbus TCPフレームフォーマットは次のようになります。[ 31 ] [ 30 ]
12 34 00 00 00 06 01 03 00 01 00 01
0x12また0x34 、Modbus TCPクライアント/サーバー間で識別される「一意の番号」としてトランザクションID = 0x1234(2バイト)を使用する場合、トランザクションIDの上位バイトは0x12、下位バイトは0x34となります。0x00および0x00 :プロトコル識別子の上位バイトと下位バイト0x00長さは上位バイトと下位バイトで構成されます0x06 。長さは6バイトで、内訳は以下のとおりです。ユニット識別子(スレーブアドレス)(1バイト)、機能コード(1バイト)、読み取るレジスタアドレスの上位バイト(1バイト)、読み取るレジスタアドレスの下位バイト(1バイト)、およびデータ(2バイト=読み取るレジスタ数の上位バイトと下位バイト)0x01 : ユニット識別子(スレーブアドレス)0x03 機能コード(複数の保持レジスタの読み出し)0x00および0x01 : 読み取るレジスタ アドレスの上位バイトと下位バイト。この場合、読み取るレジスタ アドレスは です0x0001。0x00および0x01 : 読み取るレジスタ数の上位バイトと下位バイト。この場合、読み取るレジスタ数は です0x0001。(つまり、1 レジスタ)広く使われているModbus RTU、Modbus ASCII、Modbus TCPの他にも、Modbusプロトコルには多くのバリエーションが存在する。
上記に挙げた最初の4つのバリアントは、データモデルと関数呼び出しは同一であり、カプセル化の方法のみが異なります。ただし、これらのバリアントは相互運用性がなく、フレーム形式も互換性がありません。
Modbusと密接に関連するもう一つの事実上のプロトコルが後に登場し、PLCメーカーのApril Automatesによって定義されました。これは、1985年にフランスのRenault AutomationとMerlin Gerin et Cieの共同作業の成果であり、JBUSと呼ばれています。当時、ModbusとJBUSの違い(エンティティ数、サーバステーション数など)は、AEG Schneider Automationが1994年に買収し、その後廃止したApril PLCシリーズとともにこのプロトコルがほぼ消滅したため、現在では重要ではありません。しかし、JBUSという名称は、ある程度残っています。
JBUSは機能コード1、2、3、4、5、6、15、16をサポートしており、したがって上記で説明したすべてのエンティティをサポートしていますが、番号付けは異なります。
{{cite web}}: CS1 maint: postscript (リンク)