Modbus/TCP スレーブ

FC03 / FC04 / FC06 に応答する Modbus スレーブを再現。Modbus マスタ(クライアント)アプリの開発・試験を実機なしで行えます。テンプレート版とスクリプト版(動的長)を比較できます。

TCP 502スクリプト版 503MBAP 長さ前置ビッグエンディアン

概要

Modbus/TCP のファンクションコード FC03・FC04・FC06 の通信相手として振る舞うサンプルです。

MBAP ヘッダの長さ前置フレーミング、複数の構造体定義をファンクションコード(判別フィールド)で振り分ける仕組み、アドレス(フィールド条件)に応じた応答値の切り替えを試せます。スクリプト版(ポート 503)は、要求の Quantity に応じた動的長応答の実装例です。

Modbus サンプルの構造体ルール一覧
バイナリ構造応答タブ:FC03(アドレス別)・FC04・FC06 のルールを優先度順に管理

機器構成

単一の TCP サーバセッション。Modbus マスタ(CommSim.Sample のシナリオ「Modbus」等)が接続します。

Modbus マスタテスト対象アプリ
CommSimModbus スレーブ(502 / 503)

通信フロー

FC03 はアドレスで値を出し分け、FC06 は要求をエコーします。

  • Master →FC03 読出 @addr0 qty2
  • ← CommSimレジスタ 100, 200
  • Master →FC03 読出 @addr10 qty2
  • ← CommSim0x1234, 0x5678
  • Master →FC04 入力レジスタ読出
  • ← CommSim250
  • Master →FC06 単一レジスタ書込
  • ← CommSim要求をエコー(同一内容)

想定プロトコル(MBAP)

Modbus/TCP の共通ヘッダ(MBAP)。Length 以降のバイト数が Length フィールドに入ります。

Txn2B Proto2B Length2B Unit1B FC1B 判別 Data可変
受信例(FC03)分解
00 01 00 00 00 06 01 03 00 00 00 02Txn=1 / FC=3 / StartAddr=0 / Quantity=2
応答 00 01 00 00 00 07 01 03 04 00 64 00 C82 レジスタ(100, 200)

使用する機能

メッセージ構造定義

FunctionCode を判別フィールドにして FC ごとに定義

バイナリ構造応答

FC で出し分け・アドレス(フィールド条件)で応答値切替

{ }

スクリプト応答

503 版:Quantity に応じた動的バイト長の FC03 応答

設定内容

プロジェクト設定

既定データ形式RawHex(バイナリ HEX)
エンディアンBig
フレーミング方式長さ前置(LengthPrefixed)
共通ヘッダ長 / 長さ ofs / size7B / 4 / 2
長さ基準 / 補正長さフィールド以降 / 0

構造体定義(FC で判別)

定義判別値主なフィールド
FC03 ReadHoldingRegistersFunctionCode = 3StartAddress / Quantity
FC04 ReadInputRegistersFunctionCode = 4StartAddress / Quantity
FC06 WriteSingleRegisterFunctionCode = 6Address / Value

スクリプト版(503)の動的長応答

テンプレート版は返すレジスタ本数が固定ですが、スクリプト版は受信から Quantity を読み取り、その本数分のレジスタ値を生成し、MBAP 長さフィールドも正しく計算して返します。

FC03 @addr0 qty2 → 00 01 00 00 00 07 01 03 04 00 64 00 C8
FC03 @addr0 qty4 → 00 03 00 00 00 0B 01 03 08 00 64 00 C8 00 02 00 03
                                    ↑ Quantity に応じてバイト数・MBAP長が変化

既知アドレスの応答値:addr0→100 / addr1→200 / addr10→0x1234 / addr11→0x5678 / その他→アドレス値そのまま。実装は スクリプト応答を参照。

開き方:samples/modbus-tcp/modbus-tcp.commsim(502)と modbus-tcp-script.commsim(503)。スクリプト版は初回に有効化バナーから許可が必要です(→ 有効化)。

他のサンプルも構成・フロー付きで解説しています。

サンプル集へ戻る