概要
Modbus/TCP のファンクションコード FC03・FC04・FC06 の通信相手として振る舞うサンプルです。
MBAP ヘッダの長さ前置フレーミング、複数の構造体定義をファンクションコード(判別フィールド)で振り分ける仕組み、アドレス(フィールド条件)に応じた応答値の切り替えを試せます。スクリプト版(ポート 503)は、要求の Quantity に応じた動的長応答の実装例です。
機器構成
単一の TCP サーバセッション。Modbus マスタ(CommSim.Sample のシナリオ「Modbus」等)が接続します。
Modbus マスタテスト対象アプリ
⇄
CommSimModbus スレーブ(502 / 503)
通信フロー
FC03 はアドレスで値を出し分け、FC06 は要求をエコーします。
- Master →FC03 読出 @addr0 qty2
- ← CommSimレジスタ 100, 200
- Master →FC03 読出 @addr10 qty2
- ← CommSim
0x1234, 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 02 | Txn=1 / FC=3 / StartAddr=0 / Quantity=2 |
応答 00 01 00 00 00 07 01 03 04 00 64 00 C8 | 2 レジスタ(100, 200) |
使用する機能
設定内容
プロジェクト設定
| 既定データ形式 | RawHex(バイナリ HEX) |
| エンディアン | Big |
| フレーミング方式 | 長さ前置(LengthPrefixed) |
| 共通ヘッダ長 / 長さ ofs / size | 7B / 4 / 2 |
| 長さ基準 / 補正 | 長さフィールド以降 / 0 |
構造体定義(FC で判別)
| 定義 | 判別値 | 主なフィールド |
|---|---|---|
| FC03 ReadHoldingRegisters | FunctionCode = 3 | StartAddress / Quantity |
| FC04 ReadInputRegisters | FunctionCode = 4 | StartAddress / Quantity |
| FC06 WriteSingleRegister | FunctionCode = 6 | Address / 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)。スクリプト版は初回に有効化バナーから許可が必要です(→ 有効化)。他のサンプルも構成・フロー付きで解説しています。
サンプル集へ戻る