
Modbus(またはMODBUS )は、アプリケーション層におけるクライアント/サーバー型データ通信プロトコルです。[1]もともとはプログラマブルロジックコントローラー(PLC)用に設計されましたが、[2]現在では、幅広いバスやネットワークにおける産業用電子機器間の通信における事実上の標準通信プロトコルとなっています。[3] [1]
Modbusは、オープンに公開され、ロイヤリティフリーであるため、産業環境で人気があります。産業用途向けに開発されており、他の規格と比較して導入と保守が比較的容易で、伝送データの形式に対する制限もほとんどありません。
Modbusプロトコルは、シリアル通信回線、イーサネット、またはインターネットプロトコルスイートをトランスポート層として使用します。[1] Modbusは、同一のケーブルまたはイーサネットネットワークに接続された複数のデバイス間の通信をサポートします。例えば、温度を測定するデバイスと湿度を測定するデバイスが同じケーブルに接続され、両方の測定値をModbus経由で同一のコンピュータに送信することができます。
Modbusは、監視制御・データ収集(SCADA)システムにおいて、プラント/システム監視コンピュータとリモート端末ユニット(RTU)を接続するためによく使用されます。多くのデータ型は、工場機器の産業用制御に由来する名称が付けられています。例えば、リレーの駆動に用いられるラダーロジックなどです。1ビットの物理出力はコイル、1ビットの物理入力はディスクリート入力または接点と呼ばれます。
1979年にModicon社(1997年にSchneider Electric社に買収)によって最初に公開されました。2004年にModbus Organization [4]に権利が譲渡されました。Modbus Organizationは、 Modbus準拠デバイスのユーザーとサプライヤーの業界団体であり、Modbus技術の継続的な利用を推進しています。[5]

Modbus規格またはバスには以下のものがある: [1]

ネットワーク上でModbus通信をサポートするために、多くのモデムとゲートウェイには独自の設計が組み込まれています(図:Modbus通信用ネットワークのアーキテクチャを参照)。実装では、有線通信またはISM無線バンドなどの無線通信、さらにはショートメッセージサービス(SMS)や汎用パケット無線サービス(GPRS)が採用される場合があります。
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 バイトを返します。これは、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規格では、 OSI参照モデルのデータリンク層上のプロトコルであるModbus over Serial Lineも定義されており、 Modbusアプリケーション層プロトコルをシリアルバス上で通信するためのものです。[19] Modbusシリアルラインプロトコルは、シリアルバス上で1つのマスターと複数のスレーブをサポートするマスタースレーブプロトコルです。[20]アプリケーション層のModbusプロトコルでは、通信チャネル上のデバイスにクライアント/サーバーモデルが使用されます。Modbus over Serial Lineでは、クライアントの役割はマスターによって実装され、サーバーの役割はスレーブによって実装されます。[20] [21]
この組織の命名規則は、複数のクライアントと1つのサーバーという一般的な用法を逆転させています。この混乱を避けるため、RS-485トランスポート層では「サーバー」ではなく「ノード」または「デバイス」という用語が使用されており、「クライアント」は「ノード」ではありません。[21]
Modbus 組織は、通信を開始してサーバー デバイスに要求を行い、サーバー デバイスが要求を処理して適切な応答 (またはエラー メッセージ) を返すクライアント デバイス間の通信を特徴とする Modbus 通信を説明するために「クライアント サーバー」を使用しています。
Modbus over Serial Lineのシリアルバスでは、1つのマスターと最大247台のスレーブが通信できます。これらのスレーブは、1から247(10進数)までの一意のアドレスを持ちます。[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として広く知られており、その多項式はx16+x15+x2+1です(通常の16進代数多項式は逆になります)。[26]8005A001
16 進数の Modbus RTU フレームの例: (から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.750msの固定値を使用することを推奨しています。[25]
Modbus ASCIIは、プロトコル通信にASCII文字(chars)を使用します。ASCII形式では、水平冗長検査(LRCC)チェックサムが使用されます。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 1655 )は、2つのASCII文字「7」と「A」としてエンコードされ、2つのバイト(「7」のASCII値である「37 16」)と65(「A」のASCII値である「41 16 」)として送信されます。
LRCは、開始文字と終了文字を除く8ビット値の合計を反転(2の補数)し、8ビット値としてエンコードして計算されます。たとえば、アドレス、機能、データがそれぞれ247、3、19、137、0、10の場合、それらの合計(416)の2の補数は-416です。これを8ビットにトリミングすると96(256 × 2 - 416 = 60 16)となり、次の17 ASCII文字フレームが生成されます:F7031389000A60␍␊。LRCはチェックサムとしてのみ使用されます。LRCは伝送された文字ではなくエンコードされたデータに基づいて計算されるため、その「縦方向」特性はパリティビットと組み合わせて単一ビットエラーの検出には使用できません。
Modbus TCPまたはModbus TCP/IPは、 TCP/IPネットワーク上の通信に使用されるModbusの変種であり、ポート502を介して接続されます。[28]下位層ですでにチェックサム保護が提供されているため、チェックサム計算は必要ありません。
Modbus TCPの命名法は、Modbus over Serial Line Protocolの場合と同じです。Modbusコマンドを送信するデバイスは「クライアント」であり、応答は「サーバー」から送信されます。[29]
Modbus TCPのADUは、Modbus協会では正式にModbus TCP/IP ADUと呼ばれています[30]。また、他の団体ではModbus TCPフレームとも呼ばれています[3] 。
MODBUS TCP/IP ADU = MBAPヘッダー + 機能コード + データ
MBAP (MODBUS アプリケーション プロトコル ヘッダー) は、TCP/IP 上で MODBUS アプリケーション データ ユニットを識別するために使用される専用ヘッダーです。
MBAPヘッダーには以下のフィールドが含まれています: [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 :トランザクションID = 0x1234(2バイト)をModbus TCPクライアント/サーバー間で識別される「一意の番号」として使用し、トランザクションIDの上位バイトは0x12、トランザクションIDの下位バイトは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に密接に関連する事実上のプロトコルとして、後に登場した別のプロトコル、JBUSがPLCメーカーのApril Automatesによって1985年に定義されました。これはフランスのRenault AutomationとMerlin Gerin et Cieの共同開発の成果です。当時のModbusとJBUSの違い(エンティティ数、サーバーステーション数)は、April PLCシリーズでほぼ消滅したため、現在では重要ではありません。April PLCシリーズは1994年にAEG Schneider Automationに買収され、その後廃止されました。しかし、JBUSという名称はある程度残っています。
JBUS は機能コード 1、2、3、4、5、6、15、および 16 をサポートしており、番号付けは異なりますが、上記のすべてのエンティティをサポートします。
{{cite web}}: CS1 メンテナンス: 追記 (リンク)