通信プロトコルModbus RTU(マスター)

テンプレート説明

TC-3000がModbus RTUマスターとして動作し、要求定義テーブルの各トランザクションをシリアル回線上のスレーブ機器へ順に送信して、応答(CRC・ファンクションコード・データ)を検証します。

 

  • 1 要求(トランザクション)順次送信
    要求定義テーブルの先頭エントリから順に、スレーブID・ファンクションコード・データ・CRCで構成した要求フレームをTC-3000のDIFユニットからスレーブ機器へ送信します。
  • 2 応答受信・検証
    スレーブからの応答フレームを受信し、CRC・スレーブID・ファンクションコードを検証します。読出し系は受信データを期待値配列と照合、書込み系は応答エコーの一致を確認します。タイムアウト・CRC不一致・例外応答はFAILとして記録します。
  • 3 全トランザクションを繰り返し
    ①②を要求定義テーブルの全エントリ分繰り返し、最後にPASS/FAIL件数をログ出力して自動終了します。
初期ユニット配置
 ・スロット1:DIFユニット(TC-IFDIF) ※1
  RS-485(半二重2線)/19200bps/8bit/偶数パリティ/ストップ1bit
ユニットの選択肢

 ・RS-422/RS-485通信:DIFユニット(TC-IFDIF)を使用します。※2

 ・RS-232C(1対1)通信:COMユニット(TC-IFCOM)でも利用できます。※2

※1 ユニットを別スロットへ変更する場合、ユニット設定のスロット割り付け変更を行うことで、設定値などを引き継ぎ可能です。
※2 スロットにユニットを取り付け・配線し、スクリプトの SLOTCH 設定を変更してください。

接続図

TC-3000(DIFユニット)のRS-485端子(A/B)とスレーブ機器のRS-485端子(A/B)を接続します。1本のバスに複数のスレーブをぶら下げるマルチドロップ接続にも対応します。

 

TC-3000(Modbus RTU マスター) 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 ①要求 ④検証 DIFユニット(TC-IFDIF) Modbus RTU マスター RS-485 A / B(UART1) 終端抵抗(ユニット設定) RS-485 バス A / B(2線・半二重) ②要求フレーム送信 ③応答フレーム受信 スレーブ機器 Modbus スレーブ スレーブID = 1 RS-485 A / B 終端抵抗(バス終端)

※ 必ずIGNDを接続してください。

※ RS-485バスの両端には終端抵抗が必要です。TC-3000側の終端抵抗はユニット設定で有効にできます。

設定変数

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

変数名

内容

初期値

SLOT

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

DIF1

CH

DIFユニットのUARTチャンネル番号

UART1

SLAVE_ID

要求を送信する対象スレーブのアドレス (ID)。1〜247

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 このトランザクションの説明ラベル(ログ表示用)

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

グローバル変数の設定

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

変数名

内容

初期値

MODBUS_TIMEOUT_MS

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

1000

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と判定します。いずれかを満たさない場合、およびタイムアウト・CRC不一致・例外応答を受信した場合はFAILとして記録します。

判定項目

合格条件

応答受信

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

フレーム整合性

CRCが一致し、応答のスレーブIDおよびファンクションコードが要求と一致すること(例外応答でないこと)

読出し系(read_*

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

書込み系(write_*

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

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

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

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

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