通信プロトコルModbus RTU(スレーブエミュレーター)
テンプレート説明
TC-3000がModbus RTUスレーブとして動作し、デバイスモデル(レジスタ/コイルマップ)に基づいてマスター機器からの要求に応答します。自局アドレス宛かつCRC一致の要求のみ処理し、未対応ファンクションコードや範囲外アドレスには例外応答を返します。
-
1
要求フレーム受信
シリアル回線上のマスター機器からの要求フレームを待機します。スレーブID・ファンクションコードからフレーム全長を判定して1件受信し、CRCを検証します。 -
2
デバイスモデル参照・応答
自局宛の要求をデバイスモデルで処理し、応答PDUを組み立てて返送します。マップに存在しないアドレスや未対応FCには例外応答を返します。他局宛の要求は無視します。 -
3
テスト停止まで継続
上記①②をテスト停止まで繰り返します。応答方針はbuild_response()を編集することで、読取専用レジスタや意図的な異常応答などDUT固有の挙動を自由に再現できます。
・スロット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 スロットにユニットを取り付け・配線し、スクリプトの SLOT / CH 設定を変更してください。
接続図
TC-3000(DIFユニット)のRS-485端子(A/B)とマスター機器のRS-485端子(A/B)を接続します。TC-3000はデバイスモデルを参照して要求に応答します。
※ 必ずIGNDを接続してください。
※ RS-485バスの両端には終端抵抗が必要です。TC-3000側の終端抵抗はユニット設定で有効にできます。
※ 受信エラー(CRC不一致・未対応FC等)の際は t3.5(フレーム間無音)相当の残留バイトを読み捨てて次フレーム境界へ再同期します。この無音時間は MODBUS_RTU_BAUDRATE / MODBUS_RTU_BITS_PER_CHAR から自動算出されます。
設定変数
全設定変数を記載しています。実機の仕様に合わせて変更してください。
|
変数名 |
内容 |
初期値 |
||||||||||
|
|
ボーレート (bps)。t3.5(フレーム間無音)の算出に使用。ユニット設定のボーレートと一致させる。この変数は全てのテストスクリプトから共通で参照されます。 |
|
||||||||||
|
|
1文字あたりのビット数。Modbus RTUは通常11(1start+8data+1parity+1stop)。この変数は全てのテストスクリプトから共通で参照されます。 |
|
||||||||||
|
|
使用するDIFユニットのスロット番号。使用するユニットに応じて変更。 |
|
||||||||||
|
|
DIFユニットのUARTチャンネル番号 |
|
||||||||||
|
|
自局スレーブアドレス (ID)。この宛先の要求のみ応答する。1〜247 |
|
||||||||||
|
|
要求受信タイムアウト (ms)。この時間受信が無ければ再度受信待機に入る。 |
|
||||||||||
|
|
スレーブが保持するデバイスモデル(メモリマップ)。マスターからのアクセスはこのマップを参照して処理します。各マップに存在しないアドレスへのアクセスには例外応答(0x02)を返します。
|
サンプル有 |
グローバル変数の設定
以下の変数はグローバル変数に定義され、全テストスクリプトから共通で参照されます。
|
変数名 |
内容 |
初期値 |
|
|
受信・応答関数でタイムアウト引数を省略した場合に使用する既定のタイムアウト (ms)。本テンプレートでは要求受信で |
|
※ MODBUS_RTU_BAUDRATE / MODBUS_RTU_BITS_PER_CHAR もグローバル変数に定義されていますが、本テンプレートではテストスクリプト冒頭で値を設定するため「設定変数」の項に記載しています。グローバル変数側の初期値は 0(未設定)で、未設定のまま実行するとエラーになります。
対応ファンクションコード
初期の build_response() が処理するファンクションコード(FC)です。未対応FCには例外応答(0x01 ILLEGAL FUNCTION)、範囲外アドレスには例外応答(0x02 ILLEGAL DATA ADDRESS)を返します。
|
FC |
内容 |
対象マップ |
0x01 |
コイル読出し |
|
0x02 |
離散入力(入力ステータス)読出し |
|
0x03 |
保持レジスタ読出し |
|
0x04 |
入力レジスタ読出し |
|
0x05 |
コイル1点書込み(0xFF00=ON/0x0000=OFF) |
|
0x06 |
保持レジスタ1点書込み |
|
0x0F |
コイル複数書込み |
|
0x10 |
保持レジスタ複数書込み |
|
※ 本テンプレートはテスト実行ボタンで開始し、テスト停止ボタンで終了します。
※ 要求受信・解析・応答PDU組立・CRC・送信の共通処理はグローバル関数(スクリプト)に定義されています。「どう応答するか」の方針のみ本スクリプトの build_response() で実装します。
他のプロジェクトでModbusを扱う方法
本テンプレートは、Modbusプロトコルの処理をグローバル関数に実装しています。
・別のプロジェクトでModbusプロトコルを扱いたい場合は、このテンプレートのグローバル関数(スクリプト)の内容を、対象のプロジェクトのグローバル関数(スクリプト)にコピーすることで、同じModbus関数群(
ModbusRtu* / ModbusTcp* など)をそのまま利用できます。・Modbus関数は
MODBUS_TIMEOUT_MS / MODBUS_RTU_BAUDRATE / MODBUS_RTU_BITS_PER_CHAR などのグローバル変数を参照します。あわせて、これらのグローバル変数も対象プロジェクトのグローバル変数に設定してください(「グローバル変数の設定」の項を参照)。・同ライブラリはModbus RTU(RS-485/RS-422)とModbus TCP(LAN)の両方に対応しています。