通信プロトコルModbus TCP(マスター)
テンプレート説明
TC-3000がModbus TCPマスターとしてLANに接続し、要求定義テーブルの各トランザクションをEthernet上のスレーブ機器へ順に送信して、応答(MBAPヘッダ・ファンクションコード・データ)を検証します。
なお、Modbus TCPでは、要求するマスターが接続を開始する側(TCPクライアント)、応答するスレーブが接続を待ち受ける側(TCPサーバー)に対応します。本書では原則として「マスター/スレーブ」で表記します。
-
1
要求(トランザクション)順次送信
要求定義テーブルの先頭エントリから順に、MBAPヘッダ(トランザクションID・プロトコルID・長さ・ユニットID)+ファンクションコード+データで構成した要求を、確立済みのTCP接続経由でスレーブ機器へ送信します。 -
2
応答受信・検証
スレーブ機器からの応答を受信し、MBAP(トランザクションID・ユニットID)とファンクションコードを検証します。読出し系は受信データを期待値配列と照合、書込み系は応答エコーの一致を確認します。タイムアウト・例外応答はFAILとして記録します。 -
3
全トランザクションを繰り返し
①②を要求定義テーブルの全エントリ分繰り返し、最後にPASS/FAIL件数をログ出力して自動終了します。
・スロット1:LANユニット(TC-IFLAN) ※1
ETH1(TCPクライアント)/接続先ポート 502(Modbus TCP標準)
・接続モード:TCPクライアント(マスターとして能動的に接続します)。※2
・ETH1 IPアドレス/サブネットマスク:TC-3000側のアドレス。
・接続先IPアドレス:対象スレーブ機器のIP。
・接続先ポート番号:Modbus TCP標準は502。
※1 ユニットを別スロットへ変更する場合、ユニット設定のスロット割り付け変更を行うことで、設定値などを引き継ぎ可能です。
※2 スロットにユニットを取り付け・配線し、スクリプトの SLOT / CH 設定を変更してください。IPアドレス・ポート番号等はユニット設定と実機に合わせてください。TCP接続はテスト開始時にユニット設定に従って自動確立されます。
接続図
TC-3000(LANユニット)のETH1ポートと、対象スレーブ機器をEthernet(LAN)で接続します。両者を同一ネットワークに配置し、TC-3000がマスター(TCPクライアント)として接続先IP・ポート502へ接続します。
※ TC-3000と対象機器を同一ネットワークに接続し、IPアドレス・サブネットマスクを整合させてください。ハブ/スイッチを経由する接続にも対応します。
※ 対象機器のポート番号(Modbus TCP標準は502)に合わせて、ユニット設定の接続先ポートを設定してください。
※ TCP接続はテスト開始時にユニット設定に従って自動確立されます。テンプレートは接続確認(CheckConnection)に失敗した場合、テストを中断します(接続先IP/ポートの設定ミス検出)。
設定変数
全設定変数を記載しています。実機の仕様に合わせて変更してください。
|
変数名 |
内容 |
初期値 |
||||||||||||||||||
|
|
使用するLANユニットのスロット番号。使用するユニットに応じて変更。 |
|
||||||||||||||||||
|
|
LANユニットのポート番号( |
|
||||||||||||||||||
|
|
要求を送信する対象のユニットID(MBAPヘッダのUnit Identifier)。Modbus TCPでは通常 |
|
||||||||||||||||||
|
|
応答受信タイムアウト (ms) |
|
||||||||||||||||||
|
|
各トランザクション送信前の待機時間 (ms)。0で待機なし |
|
||||||||||||||||||
|
|
実行するトランザクション(要求)の定義テーブル。各エントリは
|
サンプル有 |
※ IPアドレス・サブネットマスク・接続先IP・接続先ポートは、ユニット設定で設定します。対象スレーブ機器と整合させてください。
グローバル変数の設定
以下の変数はグローバル変数に定義され、全テストスクリプトから共通で参照されます。Modbus関数の既定動作を決めます。
|
変数名 |
内容 |
初期値 |
|
|
Modbus関数でタイムアウト引数を省略した場合に使用する既定のタイムアウト (ms)。本テンプレートでは各トランザクションで |
|
|
|
Modbus TCPのMBAPヘッダに付与するトランザクションID(TID)の次回値。要求ごとにライブラリが自動採番・更新するため、通常ユーザーが変更する必要はありません(初期値 |
|
op一覧(対応ファンクションコード)
request_table の op に指定できる操作と、対応するModbusファンクションコード(FC)です。
|
op |
FC |
内容 |
|
0x01 |
コイル読出し |
|
0x02 |
離散入力(入力ステータス)読出し |
|
0x03 |
保持レジスタ読出し |
|
0x04 |
入力レジスタ読出し |
|
0x05 |
コイル1点書込み |
|
0x06 |
保持レジスタ1点書込み |
|
0x0F |
コイル複数書込み |
|
0x10 |
保持レジスタ複数書込み |
判定条件
各トランザクションの応答が以下の条件を満たす場合にPASSと判定します。いずれかを満たさない場合、およびタイムアウト・MBAP不一致・例外応答を受信した場合はFAILとして記録します。
|
判定項目 |
合格条件 |
|
応答受信 |
タイムアウト時間内にスレーブ機器から応答を受信できること |
|
フレーム整合性 |
応答のMBAP(トランザクションID・ユニットID)が要求と一致し、ファンクションコードが要求と一致すること(例外応答でないこと) |
|
読出し系( |
受信データの点数が要求点数と一致し、全要素が |
|
書込み系( |
応答が要求のエコー(アドレス・値/数量)と一致し、正常完了すること |
※ 本テンプレートはテスト実行ボタンで開始し、全トランザクション完了後に自動終了します。
※ 共通のModbus関数(PDU組立・MBAP・トランザクション処理)はグローバル関数(スクリプト)に定義されています。同ライブラリはModbus RTU(DIFユニット)にも対応しています。
他のプロジェクトでModbusを扱う方法
本テンプレートは、Modbusプロトコルの処理をグローバル関数に実装しています。
・別のプロジェクトでModbusプロトコルを扱いたい場合は、このテンプレートのグローバル関数(スクリプト)の内容を、対象のプロジェクトのグローバル関数(スクリプト)にコピーすることで、同じModbus関数群(
ModbusTcp* / ModbusRtu* など)をそのまま利用できます。・Modbus関数は
MODBUS_TIMEOUT_MS / MODBUS_TCP_NEXT_TID などのグローバル変数を参照します。あわせて、これらのグローバル変数も対象プロジェクトのグローバル変数に設定してください(「グローバル変数の設定」の項を参照)。・同ライブラリはModbus TCP(LAN)とModbus RTU(RS-485/RS-422)の両方に対応しています。