Modbusクライアント
回路図エディタの Modbus クライアント コンポーネントの説明。
Modbusプロトコルの概要
Modbusは、長年使用されている産業用シリアル通信プロトコル規格です。このプロトコルは、主にシングルポイント(1ビット)または16ビットデータレジスタとしてデータ転送を行うための機能コードとエンコード方式を定義します。Typhoon HIL Modbusクライアントは、基本的な16ビットレジスタに加えて、32ビットと64ビットの両方のレジスタの読み書きをサポートしています。この基本データパケットは、Modbus ASCII、RTU、またはTCPのプロトコル仕様に従ってカプセル化されます。Modbus/TCPプロトコルは、Typhoon HILツールチェーンに実装されています。
Modbusはマスター/スレーブプロトコルとして定義されており、マスターとして動作するデバイスは、スレーブとして動作する1つ以上のデバイスをポーリングします。つまり、スレーブデバイスは自発的に情報を送信することができず、要求されるまで待機する必要があります。マスターはスレーブデバイスのレジスタにデータの書き込みと読み取りを行います。
Modbus/TCPでは、イーサネットがピアツーピア通信を可能にするため、マスターとスレーブの定義が曖昧になります。クライアントとサーバーの定義は、イーサネットベースのネットワークではよりよく知られています。この文脈では、スレーブがサーバー、マスターがクライアントになります。
Modbus プロトコルでは 4 種類のレジスタが定義されており、表 1にリストされています。
レジスタータイプ | アクセス | サイズ |
---|---|---|
コイル(ディスクリート出力) | 読み書き | 1ビット |
離散入力 | 読み取り専用 | 1ビット |
入力レジスタ | 読み取り専用 | 16ビット |
保有レジスター | 読み書き | 16ビット |
Modbusプロトコルは、レジスタに対して実行できる一連の関数を定義します。Typhoon HILツールチェーンでサポートされている関数は、表2に示されています。
関数型 | 関数名 | |
---|---|---|
データアクセス | 1ビットアクセス | 離散入力の読み取り |
コイルを読む | ||
シングルコイルを書く | ||
複数のコイルを書く | ||
16ビットアクセス | 入力レジスタの読み取り | |
保持レジスタの読み取り | ||
単一保持レジスタへの書き込み | ||
複数の保持レジスタへの書き込み | ||
複数のレジスタの読み取り/書き込み | ||
16~64ビットアクセス | 入力レジスタの読み取り(詳細) | |
保持レジスタの読み取り(詳細) | ||
レジスタ書き込みアドバンス |
Modbus プロトコルは、Typhoon HIL デバイス ( HIL402、HIL101、HIL404、HIL602+、HIL604、HIL506、HIL606)でサポートされています。
Modbusクライアントコンポーネント
「通信」タブにあるModbusクライアントコンポーネントは、Modbus TCPクライアント(マスター)機能を実装します。コンポーネントダイアログウィンドウでは、表3に示すように、様々なプロパティが定義されています。
Modbus クライアント コンポーネントは、Modbus プロトコルに従って定義された 1 ビットから 64 ビット (符号付き、符号なし、浮動小数点、倍精度) のレジスタで動作します。
成分 | コンポーネントダイアログウィンドウ | コンポーネントパラメータ |
---|---|---|
Modbusクライアント |
|
|
クライアント設定グループでは、必要に応じてクライアントのIPアドレス、ネットマスク、ゲートウェイを設定できます。定義されたIPアドレスはHILデバイスに適用され、HILデバイスは指定されたアドレスを使用してModbusサーバーに接続します。
サーバーのセットアップ「サーバー設定」グループでは、Modbusサーバーのネットワークパラメータを定義できます。Modbusクライアントは、指定されたサーバーのIPアドレスとポート番号に接続しようとします。Modbus TCPではスレーブIDは255と定義されていますが、特定のIDが必要な場合(通常はModbus TCP-RTUコンバータを使用する場合)は、この値を定義できます。
リクエストタイムアウト要求タイムアウトは、クライアントがサーバーの応答を待機する時間を指定します。
実行率実行速度は信号処理の実行速度であり、回路図の残りの部分と互換性がある必要があります。
情報をリクエストするリクエスト情報テーブルは、クライアントがサーバーに送信するすべてのリクエストを定義するために使用されます。機能コード、レジスタアドレス、レジスタ番号、リクエスト送信イベントなどのパラメータを指定できます。クライアントリクエストに関する詳細は、リクエスト定義に記載されています。
リクエスト定義
- 名前 - リクエストの一意の名前。この名前は、クライアントコンポーネントの入出力端末名を定義するために使用されます。
- 機能コード - リクエストが実行する機能を定義します。機能には以下が含まれます。
- コイルを読む
- 離散入力を読み取る
- 保持レジスタを読み取る
- 入力レジスタの読み取り
- シングルコイルを書く
- 単一レジスタへの書き込み
- 複数のコイルを書き込む
- 複数のレジスタに書き込む
- 複数のレジスタの読み取り書き込み
- 入力レジスタの高度な読み取り
- 保持レジスタの高度な読み取り
- レジスタ書き込みアドバンス
- 読み取りアドレス - レジスタ値の読み取りに使用されるアドレス値
- 読み取る数 - 読み取るレジスタの数
- 書き込みアドレス - レジスタ値を書き込むために使用されるアドレス値
- 書き込む数 - 書き込むレジスタの数
- 「アドバンス」型関数コードのレジスタ定義では、括弧内の数字はすべて、その変数用に予約された16ビットレジスタのグループ(最大4桁、つまり64ビット)を表し、その横の文字は変数の型(i:int、u:unsigned int、f:32ビットレジスタグループの場合はfloat、64ビットレジスタグループの場合はdouble)を表します。例えば、[0,1,2,3]fは、0、1、2、3の16ビットレジスタに格納されるdouble型の変数を表します。レジスタは昇順に定義することが重要です。詳細については、 Modbusデバイスドキュメントの「保持レジスタと入力レジスタのアドレスの定義」を参照してください。
- 送信タイプ - 各リクエストが送信される際のイベントを定義します。送信タイプは以下のいずれかになります。
- イベント時 - 選択すると、コンポーネント上にイベント信号を接続できる追加の端子が作成されます。
- タイマーで
- イベント時およびタイマー時 - 選択すると、コンポーネント上にイベント信号を接続できる追加の端子が作成されます。
- 送信期間 - リクエストの送信期間(ミリ秒単位)を定義します。
以下に、図 2に示すコンポーネント接続を作成する要求定義の例を示します。
リクエスト定義に従って、コンポーネントに追加のターミナルが作成されます。読み取り機能を実行する機能コードごとに出力端子が作成され、書き込み機能を実行する機能コードごとに入力端子が作成されます。このロジックは、読み取り機能がModbusサーバーから値を取得し、その値をモデルで制御に使用するというものです。書き込み機能は、モデルから取得した値をサーバーに送信します。
イベントで送信されるリクエストについては、コンポーネント上に追加のターミナルが作成され、シグナルを接続できるようになります。このターミナルの値の変化はすべてイベントとして扱われます。
状態および例外コード端末
状態および例外コード端末は、Modbus クライアント コンポーネントに常に存在します。
状態ポートは、クライアントとサーバーの接続状態を反映します。クライアントがサーバーに接続している場合、この信号の値は1、そうでない場合は0になります。
- 0x01 - 不正な関数
- 0x02 - 不正なデータアドレス
- 0x03 - 不正なデータ値
- 0x04 - サーバーデバイスの障害
- 0x05 - 確認応答
- 0x06 - サーバーデバイスがビジー状態
- 0x08 - メモリパリティエラー
- 0x0A - ゲートウェイパスが利用できません
- 0x0B - ゲートウェイターゲットデバイスが応答に失敗しました
特定の例外コードの意味については、Modbus プロトコル仕様を参照してください。
Modbusクライアントステートマシン
Modbusクライアントは、DISCONNECTED(切断)とCONNECTED(接続)の2つの状態を持つシンプルなステートマシンを実装しています。以下のブロック図は、このステートマシンを定義しています。
シミュレーション開始時、クライアントはDISCONNECTED状態にあります。サーバーへの接続を試み、成功するとCONNECTED状態に移行します。接続に失敗した場合、クライアントはRequest timeout値で定義された間隔で再接続を試行し続けます。クライアントが接続すると、State値は0から1に変化します。
CONNECTED状態では、クライアントはサーバーにリクエストを送信し続けます。無効なリクエストの場合、サーバーは例外コードを返します。例外コードの値が0x0A未満の場合、クライアントはCONNECTED状態のままリクエストを送信し続けます。例外コードの値が0x0A以上の場合、クライアントはDISCONNECTED状態に移行し、サーバーへの再接続を試みます。
Schematic API を使用して Modbus クライアントのプロパティ値を変更する
カスタムコンポーネントダイアログは、Modbusクライアントの接続パラメータとリクエストを簡単に定義できるように設計されています。これらの値の変更は、標準のSchematic API関数を使用しても可能ですが、変更された方法となります。つまり、リクエスト情報を除くすべてのプロパティは標準的な方法で変更されます。リクエスト情報は、Python辞書型のリストとして指定する必要があります。
フィールド名 | 許容値 |
---|---|
"名前" | ASCII文字列 |
「関数コード」 | 0x1、0x2、0x3、0x4、0x5、0x6、0xF、0x10、0x17、「コイルの読み取り」、「個別入力の読み取り」、「保持レジスタの読み取り」、「入力レジスタの読み取り」、「単一コイルの書き込み」、「単一レジスタの書き込み」、「複数コイルの書き込み」、「複数レジスタの書き込み」、「複数レジスタの読み取り/書き込み」、「高度なレジスタの書き込み」、「高度な入力レジスタの読み取り」、「高度な保持レジスタの読み取り」 |
「読み取りアドレス」 | 0 - 65535 |
「読み取るレジスタの数」 | 値は指定された機能コードによって異なります。
|
「書き込みアドレス」 | 0 - 65535 |
「書き込むレジスタの数」 | 値は指定された機能コードによって異なります。
|
「レジスタ仕様」 | この値は、「レジスタ書き込みアドバンス」、「入力レジスタ読み取りアドバンス」、「保持レジスタ読み取りアドバンス」の各ファンクションコードで使用され、アクセスするレジスタのリストを定義します。この値はリクエスト定義セクションで定義されます。 |
「送信タイプ」 | 「イベント時」、「期間」、「イベント時および期間」 |
「送信期間」 | 1 - 1800000 |
requests = [
{"name": "request0", "function_code": "read holding registers", "read_address": 0, "number_of_registers_to_read": 5, "transmit_type": "on timer", "transmit_period": 1000},
{"name": "request1", "function_code": "write multiple registers", "write_address": 100, "number_of_registers_to_write": 1, "transmit_type": "on timer", "transmit_period": 1000},
{"name": "request2", "function_code": "read write multiple registers", "read_address": 0, "number_of_registers_to_read": 5, "write_address": 100, "number_of_registers_to_write": 1, "transmit_type": "on event", "transmit_period": 1000},
{"name": "request3", "function_code": "write registers advanced", "register_specification": "[5]i, [6,7]u, [8,9,10,11]f", "transmit_type": "on timer", "transmit_period": 1000},
{"name": "request4", "function_code": "read holding registers advanced", "register_specification": "[5]i, [6,7]u, [8,9,10,11]f", "transmit_type": "on timer", "transmit_period": 1000}
]
mdl.set_property_value(mdl.prop(modbus_client, "requests"), requests)
仮想HILサポート
Virtual HILは現在このプロトコルをサポートしていません。非リアルタイム環境(例:ローカルコンピュータでモデルを実行する場合)を使用する場合、このコンポーネントへの入力は破棄され、このコンポーネントからの出力はゼロになります。