Modbus接続。 単一の値を記録する

22.04.2019 アンドロイド

Modbus はオープンなシリアル通信プロトコルです。 プログラム可能なデバイスで使用するために 1979 年に開発されました ロジックコントローラー現在、さまざまなネットワークに接続されたさまざまな産業用電子機器を接続するために、PLC(PLC)が広く使用されています。

産業オートメーションで最も広く使用されているプロトコル (例外は 地元企業)。 Modbusは非常に人気があります。 これは、標準のシリアル通信を備えた非常にシンプルで使いやすいデバイスです。 Modbus ネットワークでは、各デバイスはネットワークをコイル (ビット) とレジスタの集合として見ます。 マスターは、非常に単純で簡潔な一連の命令を使用して、これらのコイルとレジスタの読み取りと書き込みを行います。 コミュニケーションは一度に一方向にのみ進みます。

Modbus プロトコルの実際の実装は非常に簡単です。 基本的なコマンドは 20 個ありますが、実際に実装されているのはそのうちのわずか数個だけです。 最も一般的なコマンドは、コイル読み取り、コイル書き込み、レジスタ読み取り、レジスタ設定です。 小セットコマンドがプロトコルの人気のもう 1 つの理由です。

Modbus - 高度なプロトコル

プロトコル コンバータは、次のようなさまざまな理由で広く使用されています。

  • Modbus はオープンなプロトコルです ソースコード。 これは、あらゆるハードウェア サプライヤーの幅広いデバイス タイプに組み込むことができることを意味します。
  • シンプルなメッセージ構造を使用しているため、展開がそれほど複雑ではありません。 導入には数日しかかからない場合があります。 これは明らかです 競争上の優位性学習と展開に数か月かかる他のプロトコルと比較して。
  • シリアルまたはイーサネット接続をサポートします。
  • RS-232 と RS-485 の 2 種類のシリアル接続で使用されます。 Modbus tcp プロトコルの一部のバージョンは、イーサネットまたは TCP/IP 経由で送信することもできます。 これらの Modbus メッセージは、シングル ビットまたは 16 ビットのワード パケットとしてパッケージ化されます。

Modbus はネットワークの物理層の一部ではありません。 通信は経由で送信されます 身体レベル、多くの用途で使用できます。 さまざまな種類ネットワーク。 非物理層のこの特性により、Modbus がアプリケーション プロトコルになります。

Modbus通信プロトコルは、 一般的な方法複数のソースからデータを収集し、中央の遠隔地からトランザクションのレビュー、アーカイブ、トラブルシューティングを行います。 これは広く使用されており、非常にシンプルなテクノロジーです。 アプリケーションに応じて、さらに 新しいプロトコルもっとメリットがあるかもしれません。

通常、PC は Wonderware、Intellution、LabVIEW などのプログラムを 1 か所で実行してデータを収集するように構成されています。 さまざまなプロセス企業全体で。 別のアプリケーションは、リモート プロセス コントローラー (PLC、Allen-Bradley、Siemens、PLCDirect など) を構成するように設計されています。 デバイスから送信されるさまざまなレベルまたはモードに応答するため。

2 つのプロトコル オプション

通過するプロトコル オプションは 2 つあります シリアル接続。 そのうちの 1 つはプロトコルです Modbus RTU。 このオプションの説明: よりコンパクトで、バイナリ通信を使用します。 で この形式データ送信には常に巡回冗長チェックサムが伴います。これは、送信の問題を検出するために使用されます。

2 番目のオプションは Modbus ASCII です。 このバージョンはより冗長であり、オペレータが読み取ることができるデータの 16 進 ASCII エンコードを使用しています。 Modbus ASCII は安全性の低いプロトコルです。 Modbus RTU よりも効率が低いため、オペレータは RTU 形式をサポートしていないデバイスにデータを転送する場合にのみ ASCII を使用する必要があります。 ASCII は、RTU メッセージを正しく適用できない場合にも役立ちます。

ダミー用の Modbus プロトコル

Modbus は、シリアル回線を介して情報を転送するために使用されるシリアル通信プロトコルです。 電子デバイス。 情報を要求する側をマスター、デバイスの供給に関する情報をスレーブと呼びます。 標準の Modbus ネットワークには 1 つのマスターと最大 247 のスレーブがあり、それぞれに 1 ~ 247 の一意のスレーブ アドレスが割り当てられます。マスターはスレーブに情報を書き込むこともできます。

何に使われますか?

Modbus はオープンなプロトコルです。 これは、メーカーが無料で自社の機器に組み込むことができることを意味します。 彼はなった 標準プロトコル産業における通信に使用されており、現在、産業用電子デバイスを接続する最も一般的な手段です。 多くの業界の多くのメーカーによって広く使用されています。

Modbus は通常、機器や制御デバイスからの信号をホスト コントローラーやデータ収集システム (温度と湿度を測定し、結果をコンピューターに報告するシステムなど) に送信するために使用されます。 Modbus は、監視制御およびデータ収集 (SCADA) システムで制御コンピュータをリモート端末装置 (RTU) に接続するためによく使用されます。 Modbus プロトコルのバージョンは、シリアル ライン (RTU および ASCII) 用とイーサネット (TCP) 用に存在します。

使い方?

Modbus はデバイス間でシリアル回線を介して送信されます。 最も簡単なセットアップは、1 本のシリアル ケーブルで接続することです。 シリアルポートマスターとスレーブの 2 つのデバイス上で。

データは、ビットと呼ばれる一連の 1 と 0 として送信されます。 各ビットは電圧として送信され、0 は正の電圧、1 は負の電圧です。 ビットは非常に迅速に送信されます。 一般的なボーレートは 9600 ボー (ビット/秒) です。

マスター/スレーブプロトコル

Modbus RTU プロトコルを記述する場合、通信は 1 つのネットワーク内で集中管理されたマスター機器と 247 台の電子デバイス間で実行されます。 この設計は通常、マスター/スレーブ プロトコルと呼ばれます。 マスターシステム「スレーブ」と呼ばれる接続されたデバイスから情報を要求します。 スレーブはこれらの要求に応じてマスターに情報を送信するだけであり、自律的に動作することはありません。 マスターはスレーブ デバイスに情報を書き込むこともできますが、スレーブ デバイスはマスター デバイスに情報を書き込むことはできません。

スレーブが Modbus メッセージを送信すると、次のようなメッセージの生成が開始されます。 一意の識別子アドレス。 これは 1 ~ 247 の数値であり、技術者はこれにより、どの特定のデバイスが要求された情報を満たすかを判断できます。

通信とデバイス

Modbus を使用して通信するように設計された各デバイスには、一意のアドレスが割り当てられます。 シリアル ネットワークでは、マスターとして指定されたノードのみがコマンドを開始できます。 イーサネットでは、どのデバイスも Modbus コマンドを送信できますが、通常は 1 つのマスターだけが Modbus コマンドを送信します。 コマンドには、対象となるデバイスのアドレス (1 ~ 247) が含まれます。 すべてのコマンドには情報が含まれます チェックサム受信者が送信エラーを検出できるようにします。 基本コマンド Modbus は、レジスタの 1 つの値を変更するように RTU に指示し、I/O ポートを制御または読み取り、レジスタに含まれる 1 つ以上の値を送り返すようにデバイスに命令します。

Modbus は非常に単純なプロトコルであり、コピーされることが多いため、Modbus をサポートするモデムやゲートウェイが多数あります。 それらのいくつかは彼のために特別に設計されました。 さまざまな実装では有線が使用されますが、 無線通信たとえば、ISM 帯域やサービスでも ショートメッセージ(SMS)、および汎用パケット無線サービス (GPRS)。 設計者が対処しなければならない一般的な問題には、高いレイテンシと時間の問題が含まれます。

Modbus レジスタ タイプの概要

デバイスによって参照されるレジスタの種類には次のものがあります。

コイル (ディスクリート出力); 。 ディスクリート入力。 。 入力レジスタ。 。 登録を保持しています。

機能コード

  • コード 一般的な機能- 1 ~ 127。Modbus コミュニティによって検証されたカスタム コードを除き、公的に文書化され、一意であることが保証されています。
  • ユーザー機能コード - 65 ~ 72、100 ~ 110 の 2 つの範囲があります。
  • コード 予約された関数- 一部の企業がレガシー製品に使用しており、一般には使用できません。

利点

Modbus プロトコルを使用する利点は次のとおりです。

  • ドライバーがすでにインストールされており、ユーザーがイーサネットと TCP/IP ソケットに精通している場合は、数時間でドライバーが実行され、PC と通信できるようになります。 開発コストは低いと考えられます。 必要最小限の設備。 ドライバーはあらゆるオペレーティング システムと互換性があります。
  • 「特殊な」チップセットは必要ないため、システムは標準の PC イーサネット カードを使用して新たに通信できます。 実装されたデバイス。 イーサネットのコストが下がるにつれて、 ハードウェア。 ユーザーはサポートを受けるために 1 つのサービス プロバイダーに縛られることなく、最新の開発を活用できます。
  • この仕様は無料でダウンロードでき、Modbus プロトコルの使用に追加のライセンス料は必要ありません。
  • デバイス間の通信 さまざまなメーカー互換性のあるデバイスのインストールベースとの互換性。

Modbus プロトコル コンバータは高価です。 産業用ゲートウェイの価格は 1000 ドルです。

制限

Modbus は 1970 年代後半に、当時 PLC が理解できるデータ タイプに限定されたデータ タイプと通信するために開発されました。 BLOB はサポートされていません。

いいえ 標準的な方法ノードがデータ オブジェクトの記述を検索するため、たとえばレジスタ値が 30 ~ 175 度の温度値を表しているかどうかを判断します。

Modbus はマスター/スレーブ プロトコルであるため、デバイスが「例外を報告」する方法はありません (open-mbus と呼ばれるイーサネット TCP/IP を除く)。 マスター ノードは、子デバイスからデータを定期的に受信し、データの変更も探す必要があります。 これにより帯域幅が消費され、アプリケーションのネットワーク接続時間が増加します。 スループットたとえば、低データ レートのリンクではコストがかかる可能性があります。

Modbus は、単一のデータ リンク上で 254 台のデバイスをアドレス指定できるように制限されているため、マスター ステーションに接続できるデバイスの数が制限されます (イーサネット TCP/IP は例外です)。 送信は連続的に行う必要があるため、リモート通信デバイスの種類は、送信のギャップを避けるためにデータをバッファできるものに限定されます。 Modbus プロトコル自体は、不正なコマンドやデータ傍受に対する保護を提供しません。 情報を送信するプロセスでは、交換中の歪みに関連する論理エラーだけでなく、論理エラーも発生することを理解することが重要です。

ModBus プロトコルは、ここ数十年で多くの特殊なプロトコルが登場したにもかかわらず、建物や技術プロセスの自動化とディスパッチングのタスクにおいて依然として主導的な地位を占めています。 明らかに古風な性質にもかかわらず、多くの専門家はすでにその使用に慣れています。 しかし、検索クエリの統計や ModBus に関する記事の人気から判断すると、専門家層がいることは明らかです。これが若い世代であることを願っています。ModBus とは何かをもう一度簡単な言葉で説明するのが役立つと思います。 。

ロシア語の Wikipedia にはかなり広範囲にわたるものがあり、プロトコルの歴史、主な利点と欠点、用語、データ モデル、機能について説明しています。 完璧なふりをすることなく、同時に繰り返しを恐れずに、「2 バイトを送信する」だけでよい人のために、いくつかの基本的なことを考えてみましょう。

まず、ModBus をサポートするデバイスでデータがどのように表示されるかです。 これらはデータを含む 4 つのテーブルです。

テーブル アイテムの種類 アクセスタイプ
ディスクリート入力 1ビット 読むだけ
フラグレジスタ(コイル) 1ビット 読み書き
入力レジスタ 16ビットワード 読むだけ
所蔵レジスター 16ビットワード 読み書き

実際には、ほとんどの場合、保持レジスタ テーブルのみを備えたデバイスがあり、場合によっては入力レジスタ テーブルと組み合わせられます。

これらのテーブルにアクセスするには、いくつかの標準 ModBus 関数があります。

  • 1 (0x01) - いくつかのフラグ レジスタから値を読み取ります (コイル ステータスの読み取り)。
  • 2 (0x02) - 複数の離散入力から値を読み取ります (離散入力の読み取り)。
  • 3 (0x03) - 複数の保持レジスタから値を読み取ります (保持レジスタの読み取り)。
  • 4 (0x04) - 複数の入力レジスタから値を読み取ります (読み取り入力レジスタ)。

単一の値を書き込む場合:

  • 5 (0x05) - 1 つのフラグ (強制シングルコイル) の値を記録します。
  • 6 (0x06) - 1 つのストレージ レジスタ (プリセット単一レジスタ) に値を書き込みます。

複数の値を記録する:

  • 15 (0x0F) - 複数のフラグ レジスタに値を書き込む (強制複数コイル)
  • 16 (0x10) - 複数のストレージ レジスタへの値の書き込み (プリセット複数レジスタ)

上記のことから、最も頻繁に使用される ModBus 機能は 3、6、16 (それぞれ「読み取り保持レジスタ」、「プリセット単一レジスタ」、「プリセット複数レジスタ」) であることがわかります。

ModBus デバイスに対してレジスタを読み書きするとどうなりますか? まず、ModBus RTU プロトコルについて考えてみましょう。 RS-232 や RS-485 などのシリアル インターフェイス経由でデータを送信するために使用されます。 過半数 最新のデバイス RS-485 は通常 2 線式であり、次に複数のデバイスを 1 つのループに接続できるため、RS-485 が使用されます。

このようなトポロジでは、1 つのループ上に存在できる ModBus マスターは 1 つだけであることが重要です。つまり、デバイスは相互に自由に「通信」できません。 各ループには、明確なマスター - スレーブ階層 (「リーダー」 - 「スレーブ」) が編成されています。 すでに述べたように、フォロワーは複数存在できますが、リーダーは 1 人だけです。

ModBus アドレス モデルでは、1 から 247 までのデバイス アドレスを使用できますが、これは一部の「プロジェクト サイエンティスト」を誤解させることがあります。 RS-485 では、アンプやリピータを使用せずに、1 つのバスに 32 台のデバイスのみを接続できます。 実際に私がお勧めするのは、 安定した動作許容可能な繰り返しリクエスト数が、RS-485 バスあたり 20 デバイスの値を超えないようにしてください。

したがって、1 つの保持レジスタを読み取るために、マスターは、対象のレジスタのアドレスと読み取るレジスタの数を示す機能コード 3 (保持レジスタの読み取り) を使用してスレーブ デバイスのアドレスにリクエストを送信します。 この場合= 1. スレーブはこれを繰り返すパケットで応答します。 自分の住所、処理されている関数の番号、データ フィールドに要求されたレジスタの値を置きます。 リクエスト内の複数の連続するレジスタを読み取るには、リーダーは最初のレジスタのアドレスとその番号を指定するだけです。

一般的な見解、ModBus プロトコルの関数 3 (保持レジスタの読み取り) の動作は次のように表すことができます。

次に、ModBus TCP が ModBus RTU とどのように異なるかを見てみましょう。 まず、ネットワーク内の 1 つのリーダーに制限はなく、すべてのデバイスがほぼ自由に相互に「通信」できます。 次に、異なるパケット形式が使用され、ヘッダーが追加されています。これは、この伝送媒体ではより一般的です。

送信用のトランスポートは TCP プロトコルであるため、デバイスにアドレス指定するには、マスターはスレーブ デバイスの IP アドレスと、スレーブがリクエストをリッスンするポートを知る必要があります。 標準ポート ModBus TCP プロトコル 502 の場合はこれを変更できますが、CODESYS などの一部のコントローラー プログラミング環境ではこれを変更できます。 同じ CODESYS、またはこの環境または CODESYS から派生した環境でプログラムされたコントローラは、ModBus TCP プロトコルを介して動作する場合、エラー メッセージを表示するのではなく、「ユニット ID」フィールドを無視し、任意の「ユニット ID」の要求に応答します。 つまり、コントローラーの IP アドレスとポートがわかれば十分な場合もあります。

自動プロセス制御システムや産業用制御システムのエンジニアや設計者の間で、OSI モデルについての誤解があることがよくあります。 したがって、ModBus TCP パケットがイーサネット ネットワーク上でどのように送信されるかを説明する別の図を次に示します。

UPD (2016/09/26): このトピックに関する非常に優れたロシア語のビデオ:


Modbus プロトコルのメッセージ構造は次のとおりです。

  1. スレーブ アドレスは、この Modbus プロトコル メッセージの宛先となるデバイスのアドレスです。 デバイスは、特にそのデバイスに宛てられたメッセージにのみ応答します。 応答はスレーブアドレスで始まります。 アドレスは 1 ~ 247 の範囲で変化します。 Modbus プロトコル メッセージのアドレス 0 は、次のために予約されています。 ブロードキャストメッセージ、248..255 – 予約されたアドレス。
  2. 関数番号 – 1 バイトのデータ。
  3. データ – このフィールドには、実行される機能に関する情報、またはスレーブが Modbus プロトコル マスターに送信するデータが含まれます。
  4. エラー検出ブロック (CRC) - ラウンドロビンおよびビット除去アルゴリズムを使用して、以前のすべてのバイトから計算されるチェックサム。

Modbus プロトコル経由で読み取る場合、離散または アナログ入力出力は行に配置されます。つまり、最初の値のアドレスとその番号を設定します。

主要な標準関数をコード (10 進数および 16 進数形式) で見てみましょう。
1 (0x01) – 複数の個別出力の読み取り
2 (0x02) - 複数の個別入力の読み取り
3 (0x03) - いくつかの中間レジスタまたはアナログ出力の読み取り
4 (0x04) – 複数のアナログ入力の読み取り
たとえば、リクエストで生成される離散入力の数が 8 の倍数ではない場合、値のバイト数は次のように丸められます。 大きな側面したがって、たとえば 15 個の離散入力の値を取得するには、この数は 2 バイトに等しくなります。
Modbus メッセージ データの前に 1 バイトが送信され、その値がデータのバイト数になります。
5 (0x05) - 1 つの離散出力の値を記録します。
6 (0x06) - 1 つのアナログ出力またはレジスタの値を書き込みます
Modbus コマンドは、アドレスと実際の値 (2 バイト) で構成されます。 通常の応答は、Modbus プロトコル要求の繰り返しです。
15 (0x0F) - 複数の個別出力への値の書き込み
16 (0x10) - 複数のアナログ出力またはレジスタの値を書き込みます
応答は、レジスタの開始アドレスと変更された値の数で構成されます。
Modbus プロトコルのリクエスト/レスポンスの例:

伝送エラーは、伝送歪みと論理エラーの 2 種類に分類されます。 歪みは「無音」時間によって監視されます。 通常のメッセージ間の時間は、3.5 文字の送信に必要な時間です。 Modbus プロトコル メッセージの送信中に 1.5 文字を超える一時停止が発生すると、パケットは破棄されます。

Modbus プロトコルの論理エラーは、スレーブがメッセージをまったく受信できない場合、または受信してもエラーが発生した場合に発生します。 この場合、エラーはタイムアウトによって診断されます。 スレーブはリクエストを受け入れますが、それを処理できません (たとえば、存在しないアドレスにアクセスするなど)。この場合、エラー メッセージが送信されます。

リクエストに対する Modbus エラー メッセージの例:

標準 Modbus プロトコルのエラー コード:
01 - この関数はスレーブでは処理できません。
02 - 存在しないデータアドレス。
03 - リクエストのデータ フィールドの値は保存には無効です。
04 - スレーブがアクションを実行しようとしたときに致命的なエラーが発生しました。
05 - スレーブはリクエストを受け入れ、処理を開始しましたが、これには時間がかかります。 このコードにより、マスターがタイムアウト エラーをスローするのを防ぎます。
06 - スレーブはコマンドの処理でビジーです。マスターは、後でスレーブが空になったときにメッセージを再送信する必要があります。
07 - スレーブはリクエストからの機能を実行できません。 マスターは診断情報の要求を送信するか、スレーブからエラー情報を受信する必要があります。
08 - スレーブがメモリ領域を読み取ろうとしましたが、パリティ エラーが検出されました。 船長は要求を繰り返すことができますが、通常、そのような場合には修理が必要になります。

Modbus TCP フレーム構造:

どこ:
トランザクション ID - 2 バイト
プロトコル ID - 2 バイト (4 つのゼロ)
パケット長 - 2 バイト、後続のメッセージ フィールドのサイズ
スレーブ アドレス - Modbus プロトコル要求の宛先となるスレーブのアドレス。
Modbus TCP プロトコルの特徴は、トランスポート レベルでチェックサムが存在しないことです。 TCPプロトコル CRCチェックが発生します。 したがって、RTU 形式でチェックサムをチェックすることは意味がありません。

私たちは、ModBus プロトコルの一般的な構造を分析しました。 今日は、このプロトコルのバリエーションである ModBus TCP について見ていきます。ModBus TCP は、イーサネット ネットワークで ModBus を実装するために使用されます。

ModBus TCP は常に TCP/IP スタックの最上位で動作するため、古典的な形式では本格的な ModBus プロトコルとは言えません。

TCP/IP が ModBus に課す主な違いは、 共有直結特定の住所。 TCP/IP プロトコルは、クライアント/サーバーの原理に基づいています。 データを交換するために、クライアントはサーバーとの通信セッションを開き、そのアドレスを指定します。

ModBus プロトコルの用語に戻ると、TCP ネットワーク内のマスター デバイス (マスター) はクライアントになり (クライアントはデータ交換の開始者であるため)、スレーブ デバイス (スレーブ) はサーバーになります。

したがって、TCP ネットワーク上のスレーブ デバイスにリクエストを送信するには、マスターはまずスレーブ デバイスとの通信セッションを開く必要があります。 さらに、セッションの開始は ModBus プロトコル レベルではなく、TCP/IP レベルで実装されます。 したがって、マスターデバイスはModBusを使用してリクエストを送信できません。 さまざまなデバイス、ModBus RTU または ASCII で起こるのと同じです。

同じ理由で、ModBus TCP には (すべてのスレーブ デバイスに一度に) ブロードキャスト メッセージはありません。

ただし、マスター デバイスは、TCP/IP プロトコルを使用して必要なノード (スレーブ) に接続し、ModBus 言語を使用して通信できます。

この図では、SCADA システムの制御下にあるディスパッチャのワークプレイスはデータ収集サーバーであると同時に、ModBus TCP ネットワークのマスターでもあります。 各リモート コントローラーに順次接続し、TCP/IP ネットワーク上で通信セッションを開き、ModBus パケットを交換します。

もちろん、このような交換には ModBus RTU の場合よりも時間がかかります。 延長時間 TCP/IP セッションの開始と終了に進みます。 ただし、これにより、ツイストペアまたは WiFi を使用して、かなりの距離にあるデバイスを接続することが可能になります。

さらに、ModBus TCP プロトコルは、ゲートウェイを備えたネットワークでも使用できます。 スマートデバイスそしてメッセージを ModBus ネットワーク上の他のデバイスにルーティングします。

この構成では、TCP ネットワーク クライアント (ModBus ネットワーク マスターとも呼ばれる) はゲートウェイ (サーバー) に接続し、ゲートウェイ (サーバー) とのみ通信します。 ゲートウェイは、ModBus バス (RTU または ASCII) 内のメッセージを、ModBus パケットで指定されたアドレスを持つデバイスに転送します。

ModBus TCP パケット構造

まず、古典的な ModBus パッケージ (RTU または ASCII) の構造を思い出してください。

スレーブアドレス、ファンクション番号、データブロック、パリティブロックの 4 つのブロックで構成されます。

ModBus TCP パケットの構造は次のようになります。

ご覧のとおり、ModBus TCP パッケージでは、ModBus RTU と比較して、交換およびプロトコル識別子のブロックが追加されており、パッケージ認証ブロックもありません。 後者は、パケット整合性制御が TCP/IP プロトコルによって提供されるため、ModBus 実装が必要ないという事実によって説明されます。

ModBus TCP パッケージの各ブロックの意味を見てみましょう。

  • IDを交換する- ほとんどの場合、2 つのゼロ。 マスターが応答を待たずに複数のリクエストを連続してスレーブに送信した場合にのみ適用されます。 この場合、ID を使用すると、どのリクエストがどのレスポンスに対応するかを理解できます。
  • プロトコルID— 常にゼロ、適用されません。 このフィールドは将来の使用に備えて予備として残されます。
  • パケット長— 「アドレス」、「関数番号」、および「データ」ブロックの合計長。 パケット長は 2 バイトで送信され、最も重要なバイトが最初になります。
  • スレーブアドレス- ModBus RTU パッケージの構造における同じブロックの類似物ですが、通常は使用されません。 すでに述べたように、ModBus TCP では、マスターはすでに 1 つのスレーブ (もちろん、TCP/IP ネットワーク上の IP アドレスも持っています) との交換セッションを開始しています。 このフィールドは、ゲートウェイを備えた ModBus TCP ネットワーク バージョンでのみ使用されます。 次に、ゲートウェイ自体がパケットを指定されたアドレスにリダイレクトします。
  • 田畑 ファンクションコードそして データは、クラシック ModBus パッケージの対応するフィールドに似ています。

) プログラマブル ロジック コントローラーで使用されます。 プロトコル仕様は 1979 年に初めて発行されました。 これは、メッセージの形式と、さまざまな電子デバイスで構成されるネットワーク上でメッセージがどのように送信されるかを説明したオープン標準でした。

当初はMODICONコントローラーを使用 シリアルインターフェース RS-232。 その後、信頼性が高く、より長い通信回線を使用でき、複数のデバイスを 1 つの回線に接続できる RS-485 インターフェイスが使用され始めました。

多くの電子機器メーカーがこの規格をサポートしており、これを使用した数百の製品が市場に登場しています。 現在、Modbus の開発はメーカーとユーザーによって設立された非営利団体 Modbus-IDA によって行われています。 電子デバイス.

導入

Modbus はプロトコルを指します アプリケーションレベル OSIネットワークモデル。 Modbus バス上のコントローラは、リクエストとレスポンスのトランザクションに基づいたクライアント/サーバー モデルを使用して通信します。

通常、ネットワーク上には、いわゆる「メイン」クライアントと呼ばれるクライアントが 1 つだけ存在します。 マスター) デバイス、および複数のサーバー - 「スレーブ」( 奴隷) デバイス。 マスターデバイスはトランザクションを開始します(リクエストを送信します)。 スレーブ デバイスは、マスター デバイスによって要求されたデータを送信するか、要求されたアクションを実行します。 マスターはスレーブを個別にアドレス指定したり、すべてのスレーブにブロードキャスト メッセージを開始したりできます。 スレーブ デバイスはメッセージを生成し、特に自分宛てのリクエストに応答してそれを返します。 ブロードキャストリクエストを受信した場合、応答メッセージは生成されません。

Modbus 仕様では、リクエストとレスポンスの構造が説明されています。 それらの基礎は基本プロトコル パッケージ、いわゆる PDU (プロトコル データ ユニット) です。 PDU 構造はリンク タイプには依存せず、機能コードとデータ フィールドが含まれます。 関数コードは 1 バイトのフィールドとしてエンコードされ、1 ~ 127 の範囲の値を取ることができます。 値範囲 128 ~ 255 はエラー コード用に予約されています。 データフィールドは可変長にすることができます。 PDU パケット サイズは 253 バイトに制限されています。

Modbus PDU
機能番号 データ
1バイト N< 253 (байт)

物理リンクを介してパケットを送信するには、PDU は次の内容を含む別のパケット内に配置されます。 追加フィールド。 このパッケージは ADU と呼ばれます ( アプリケーションデータユニット)。 ADUのフォーマットは通信回線の種類によって異なります。

Modbus プロトコルには 3 つの主な実装があり、そのうち 2 つはシリアル通信回線を介してデータを送信するためのもので、両方とも銅線の EIA/TIA-232-E (RS-232)、EIA-422、EIA/TIA-485-A (RS-485) です。 、光および無線:

  • Modbus ASCII、

データ転送の場合 イーサネットネットワーク TCP/IP 経由:

  • Modbus TCP。

ADU の一般的な構造は次のとおりです (実装によっては、一部のフィールドが欠落している場合があります)。

  • スレーブアドレス- リクエストの宛先となるスレーブデバイスのアドレス。 スレーブ デバイスは、送信されたリクエストにのみ応答します。 応答も、応答するスレーブのアドレスで始まります。アドレスの範囲は 1 ~ 247 です。アドレス 0 は、 放送、すべてのデバイスによって認識され、248 ~ 255 の範囲のアドレスは予約されています。
  • 機能番号フレームの次の 1 バイトのフィールドです。 これは、マスターが実行してほしいデータまたはアクションをスレーブに伝えます。
  • データ- このフィールドには、スレーブデバイスがマスターによって指定された機能を実行するために必要な情報が含まれるか、またはマスターからの要求に応じてスレーブデバイスによって送信されるデータが含まれます。 フィールドの長さと形式は関数番号によって異なります。
  • エラー検出ブロック- フレーム内にエラーがないことを確認するためのチェックサム。

RS232/RS485 シリアル ネットワークの最大 ADU サイズは 256 バイトです。 TCPネットワーク- 260バイト。

Modbus TCP の場合、ADU は次のようになります。

  • トランザクションID- 2 バイト、通常はゼロ
  • プロトコルID- 2 バイト、ゼロ
  • パケット長- 2 バイト(上位、下位)、このフィールドの後のパケットの次の部分の長さ
  • スレーブアドレス- リクエストの宛先となるスレーブデバイスのアドレス。 接続が確立されている場合、通常は無視されます。 特定のデバイス。 RS485 ネットワークなどに接続するブリッジで接続が確立されている場合に使用できます。

Modbus TCP にはチェックサム フィールドはありません。

機能コードのカテゴリ

現在のプロトコル仕様では、次の 3 つのカテゴリの機能コードが定義されています。

標準コマンド その説明は Modbus-IDA によって公開および承認される必要があります。 このカテゴリには、すでに定義されているコードと現在無料のコードの両方が含まれます。 カスタムコマンドユーザーが任意の機能を実装できる 2 つのコード範囲 (65 ~ 72 および 100 ~ 110)。 ただし、他のデバイスが同じコードを使用して異なる機能を実行しないという保証はありません。 予約 このカテゴリには、標準ではないが、さまざまな企業が製造したデバイスですでに使用されている機能コードが含まれます。 これらはコード 9、10、13、14、41、42、90、91、125、126、127 です。

データ・モデル

このプロトコルの一般的な用途の 1 つは、コントローラー レジスターへのデータの読み取りおよび書き込みです。 プロトコル仕様では、次の 4 つのデータ テーブルが定義されています。

各テーブルの要素は 16 ビット アドレスを使用してアクセスされ、最初のセルはアドレス 0 に対応します。したがって、各テーブルには最大 65536 個の要素を含めることができます。 この仕様では、どのテーブル要素が物理的に表現されるべきか、またどの内部デバイス アドレスでそれらの要素にアクセスできるべきかは定義されていません。 たとえば、この場合、個別のデータと 16 ビット レジスタを扱う命令が実際には同じデータにアクセスすることになります。

データのアドレス指定方法に関連して多少の混乱があることに注意してください。 Modbus はもともと Modicon コントローラ用に開発されました。 これらのコントローラーでは、各テーブルに特別な番号が使用されていました。 たとえば、最初の入力レジスタはセル番号 30001 に対応し、最初の保持レジスタは 40001 に対応します。したがって、Modbus コマンドのアドレス 107 の保持レジスタはコントローラ レジスタ番号 40108 に対応します。 このようなアドレス照合は標準の一部ではなくなりましたが、一部のソフトウェア パッケージは、たとえば保持レジスタ アドレスから 40001 を減算することによって、ユーザーが入力したアドレスを自動的に「修正」できます。

標準 Modbus プロトコル機能

標準機能の要求および応答 PDU
番号
機能
リクエスト/レスポンス
1 (0x01) A1 あ0 Q1 Q0
N D (N バイト)
2 (0x02) A1 あ0 Q1 Q0
N D (N バイト)
3 (0x03) A1 あ0 Q1 Q0
N D (N バイト)
4 (0x04) A1 あ0 Q1 Q0
N D (N バイト)
5 (0x05) A1 あ0 D1 D0
A1 あ0 D1 D0
6 (0x06) A1 あ0 D1 D0
A1 あ0 D1 D0
15 (0x0F) A1 あ0 Q1 Q0 N D (N バイト)
A1 あ0 Q1 Q0
16 (0x10) A1 あ0 Q1 Q0 N D (N バイト)
A1 あ0 Q1 Q0
  • A1そして あ0- 要素アドレス、
  • Q1そして Q0- 要素の量、
  • N- データのバイト数
  • D- データ

データの読み取り

上記のデータ テーブルから値を読み取るには、コード 1 ~ 4 (16 進値 0x01 ~ 0x04) の関数を使用します。

  • 1 (0x01)- 複数のフラグレジスタから値を読み取る (コイルステータスの読み取り)
  • 2 (0x02)- 複数の個別のレジスタから値を読み取る (離散入力の読み取り)
  • 3 (0x03)- 複数のストレージレジスタから値を読み取る (保持レジスタの読み取り)
  • 4 (0x04)- 複数の入力レジスタから値を読み取る (入力レジスタの読み取り)

リクエストは、値を読み取る最初のテーブル要素のアドレスと、読み取る要素の数で構成されます。 アドレスとデータ量は 16 ビットの数値として指定され、それぞれの最上位バイトが最初に送信されます。

応答には要求されたデータが含まれます。 データのバイト数は、要求された項目の数によって異なります。 データの前に、データのバイト数に等しい値の 1 バイトが送信されます。

保持レジスタと入力レジスタの値は、指定されたアドレスから転送され、レジスタごとに 2 バイトずつ転送されます。各レジスタの最上位バイトが最初に転送されます。

バイト1 バイト2 バイト3 バイト4 ... バイトN-1 バイトN
R A,1 R A,0 R A+1,1 R A+1.0 ... R A+Q-1,1 R A+Q-1.0

フラグと離散入力の値は、パック形式 (フラグごとに 1 ビット) で送信されます。 1 はオン、0 はオフを意味します。 要求されたフラグの値は、まず最初のバイトを最下位ビットから埋め、次に次のバイトを最下位ビットから最上位ビットまで埋めます。 最初のデータ バイトの最下位ビットには、「アドレス」フィールドで指定されたフラグの値が含まれます。 要求されたフラグの数が 8 の倍数ではない場合、追加ビットの値はゼロで埋められます。

バイト1 ... バイトN
F A+7 F A+6 F A+5 F A+4 F A+3 F A+2 F A+1 FA ... 0 ... 0 F A+Q-1 F A+Q-2 ...

単一の値を記録する

  • 5 (0x05)- 1 つのフラグの値を記録する (フォースシングルコイル)
  • 6 (0x06)- 1 つのストレージ レジスタに値を書き込む (プリセットシングルレジスター)

コマンドは要素アドレス(2バイト)と設定する値(2バイト)で構成されます。

保持レジスタの場合、値は単純な 16 ビット ワードです。

フラグの場合、値 0xFF00 は有効を意味し、0x0000 は無効を意味します。その他の値は無効です。

コマンドが成功すると、スレーブはリクエストのコピーを返します。

複数の値の記録

  • 15 (0x0F)- 複数のフラグレジスタに値を書き込む (複数のコイルを強制する)
  • 16 (0x10)- 複数のストレージレジスタへの値の書き込み (複数のレジスタをプリセット)

コマンドは要素のアドレス、変更する要素の数、送信する設定値のバイト数、および設定値そのもので構成されます。 データは、データ読み取りコマンドと同じ方法でパックされます。

応答は、開始アドレスと変更された要素の数で構成されます。

以下はマスターコマンドとスレーブ応答の例です (Modbus RTU の場合)。

Modbus RTUプロトコルでのエラー監視

データ交換中に次の 2 種類のエラーが発生する可能性があります。

  • データ伝送中の歪みに関連するエラー。
  • 論理的なエラー。

タイプ 1 エラーは、文字フレーム、パリティ、および CRC-16-IBM 巡回チェックサム (多項式番号 = 0xA001 を使用) を使用して検出されます。

RTUフレーム

RTU モードでは、メッセージは沈黙の間隔で始まり、終わる必要があります。沈黙の間隔は、特定のネットワーク速度で少なくとも 3.5 文字の送信時間です。 最初のフィールドはデバイス アドレスを送信します。

送信される最後の文字の後には、少なくとも 3.5 文字の沈黙の間隔が続きます。 この間隔の後に新しいメッセージが開始される場合があります。

メッセージフレームは継続的に送信されます。 フレームの送信中に 1.5 時間の沈黙間隔が発生した場合、受信デバイスはそのフレームを不完全なものとして無視しなければなりません (MUST)。

したがって、新しいメッセージは 3.5 間隔より早く開始する必要があります。 この場合、エラーが設定されます。

間隔について少し説明します (シリアル Modbus RTU について話しています): 速度 9600、フレームあたり 11 ビット (スタート ビット + 8 データ ビット + パリティ ビット + ストップ ビット): 3.5 * 11 / 9600 = 0.00401041(6)、それらの。 4ミリ秒以上。 1.5 * 11 / 9600 = 0.00171875、つまり 1ms以上。 19200 ボーを超える速度の場合は、それぞれ 1.75 ミリ秒と 0.75 ミリ秒の間隔を使用できます。

論理エラー

タイプ 2 エラー メッセージの場合、Modbus RTU プロトコルでは、デバイスが次のような応答を送信できるように規定されています。 間違った状況。 応答にエラー メッセージが含まれていることは、コマンド コードの最上位ビットが設定されていることを示します。 リクエストに対してスレーブデバイスがエラーを検出した場合のフレーム例を(表 2-1)に示します。

1. スレーブが有効なリクエストを受信し、それを正常に処理できる場合は、通常の応答を返します。

2. スレーブが値を受け入れない場合、応答は送信されません。 マスターはタイムアウトによりエラーを診断します。

3. スレーブが要求を受け入れても、エラー (パリティ、LRC、または CRC) が発生した場合、応答は送信されません。 マスターはタイムアウトによりエラーを診断します。

4. スレーブがリクエストを受け入れたが、それを処理できない場合 (存在しないレジスタへのアクセスなど)、エラー データを含む応答が送信されます。

表 2-1. Modbus RTUエラー発生時の応答フレーム(スレーブ→マスター)
送信方向 スレーブアドレス 機能番号 データ(またはエラーコード) CRC