通信プロトコル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 スロットにユニットを取り付け・配線し、スクリプトの SLOTCH 設定を変更してください。IPアドレス・ポート番号等はユニット設定と実機に合わせてください。TCP接続はテスト開始時にユニット設定に従って自動確立されます。

接続図

TC-3000(LANユニット)のETH1ポートと、対象スレーブ機器をEthernet(LAN)で接続します。両者を同一ネットワークに配置し、TC-3000がマスター(TCPクライアント)として接続先IP・ポート502へ接続します。

 

TC-3000(Modbus TCP マスター) Luaスクリプト request_table 参照・応答検証 op / addr 期待値 結果 read_holding 0012 0034 OK read_input 00FF OK read_coils 1 0 1 0 OK read_discrete 1 1 0 0 OK write_single_reg (echo) OK write_single_coil (echo) OK write_multi_reg (echo) OK write_multi_coil (echo) OK ①要求 ④検証 LANユニット(TC-IFLAN) Modbus TCP マスター TCPクライアント ETH1(RJ45) 接続先ポート 502 Ethernet(LAN) TCP/IP ・ Port 502 ②要求フレーム送信 ③応答フレーム受信 スレーブ機器 Modbus TCP サーバー UnitID = 1 / Port 502 ETH(RJ45) 同一ネットワーク

※ TC-3000と対象機器を同一ネットワークに接続し、IPアドレス・サブネットマスクを整合させてください。ハブ/スイッチを経由する接続にも対応します。
※ 対象機器のポート番号(Modbus TCP標準は502)に合わせて、ユニット設定の接続先ポートを設定してください。
※ TCP接続はテスト開始時にユニット設定に従って自動確立されます。テンプレートは接続確認(CheckConnection)に失敗した場合、テストを中断します(接続先IP/ポートの設定ミス検出)。

設定変数

全設定変数を記載しています。実機の仕様に合わせて変更してください。

変数名

内容

初期値

SLOT

使用するLANユニットのスロット番号。使用するユニットに応じて変更。

LAN1

CH

LANユニットのポート番号(ETH1=LanPort1/ETH2=LanPort2)

ETH1

UNIT_ID

要求を送信する対象のユニットID(MBAPヘッダのUnit Identifier)。Modbus TCPでは通常 1。ゲートウェイ経由でシリアル機器へ中継する場合は対象スレーブのアドレスを指定。

1

TIMEOUT

応答受信タイムアウト (ms)

1000

SEND_DELAY

各トランザクション送信前の待機時間 (ms)。0で待機なし

0

request_table

実行するトランザクション(要求)の定義テーブル。各エントリは op に応じて必要なフィールドを指定します。

フィールド 内容
op 実行する操作。下表「op一覧」のいずれかを指定
addr 開始アドレス(例 0x0000
count 点数(読出し系のみ)
value 書込み値。write_single_reg=16bit値/write_single_coil=true/false
values 書込みワード配列(write_multi_reg
bits 書込みビット配列 0/1(write_multi_coil
expected 期待値配列(読出し系のみ。書込み系は成功可否のみ確認)
desc このトランザクションの説明ラベル(ログ表示用)

サンプル有
使用例は接続図参照

※ IPアドレス・サブネットマスク・接続先IP・接続先ポートは、ユニット設定で設定します。対象スレーブ機器と整合させてください。

グローバル変数の設定

以下の変数はグローバル変数に定義され、全テストスクリプトから共通で参照されます。Modbus関数の既定動作を決めます。

変数名

内容

初期値

MODBUS_TIMEOUT_MS

Modbus関数でタイムアウト引数を省略した場合に使用する既定のタイムアウト (ms)。本テンプレートでは各トランザクションで TIMEOUT を明示指定するため、通常この値は使用されません。

1000

MODBUS_TCP_NEXT_TID

Modbus TCPのMBAPヘッダに付与するトランザクションID(TID)の次回値。要求ごとにライブラリが自動採番・更新するため、通常ユーザーが変更する必要はありません(初期値 0 のままで動作します)。

0

op一覧(対応ファンクションコード)

request_tableop に指定できる操作と、対応するModbusファンクションコード(FC)です。

op

FC

内容

read_coils

0x01

コイル読出し

read_discrete

0x02

離散入力(入力ステータス)読出し

read_holding

0x03

保持レジスタ読出し

read_input

0x04

入力レジスタ読出し

write_single_coil

0x05

コイル1点書込み

write_single_reg

0x06

保持レジスタ1点書込み

write_multi_coil

0x0F

コイル複数書込み

write_multi_reg

0x10

保持レジスタ複数書込み

判定条件

各トランザクションの応答が以下の条件を満たす場合にPASSと判定します。いずれかを満たさない場合、およびタイムアウト・MBAP不一致・例外応答を受信した場合はFAILとして記録します。

判定項目

合格条件

応答受信

タイムアウト時間内にスレーブ機器から応答を受信できること

フレーム整合性

応答のMBAP(トランザクションID・ユニットID)が要求と一致し、ファンクションコードが要求と一致すること(例外応答でないこと)

読出し系(read_*

受信データの点数が要求点数と一致し、全要素が expected 配列と一致すること

書込み系(write_*

応答が要求のエコー(アドレス・値/数量)と一致し、正常完了すること

※ 本テンプレートはテスト実行ボタンで開始し、全トランザクション完了後に自動終了します。
※ 共通のModbus関数(PDU組立・MBAP・トランザクション処理)はグローバル関数(スクリプト)に定義されています。同ライブラリはModbus RTU(DIFユニット)にも対応しています。

他のプロジェクトでModbusを扱う方法

本テンプレートは、Modbusプロトコルの処理をグローバル関数に実装しています。

・PDU(要求/応答)の組立・解析、MBAPヘッダの生成・検証、TCPトランザクション処理、スレーブ応答生成など、Modbusプロトコルの実装はすべてグローバル関数(スクリプト)に含まれます
・別のプロジェクトでModbusプロトコルを扱いたい場合は、このテンプレートのグローバル関数(スクリプト)の内容を、対象のプロジェクトのグローバル関数(スクリプト)にコピーすることで、同じModbus関数群(ModbusTcp*ModbusRtu* など)をそのまま利用できます。
・Modbus関数は MODBUS_TIMEOUT_MSMODBUS_TCP_NEXT_TID などのグローバル変数を参照します。あわせて、これらのグローバル変数も対象プロジェクトのグローバル変数に設定してください(「グローバル変数の設定」の項を参照)。
・同ライブラリはModbus TCP(LAN)とModbus RTU(RS-485/RS-422)の両方に対応しています。