機能詳細

「なんとなくできそう」を「具体的にこう使える」へ。各機能を設定例つきで解説します。テキストプロトコルも、CRC 付きの独自バイナリプロトコルも、実機の代わりとして自在に再現できます。

TCP / UDP 通信とセッション

CommSim の基本単位は「1 ポート=1 セッション」。サーバにもクライアントにもなり、手動送信と色分けログで通信を確認できます。

サーバにもクライアントにもなる

TCP サーバ

ポートで待ち受け。接続で「接続済み」、切断で自動的に「待受中」へ戻り再待ち受け。

TCP クライアント

指定ホスト・ポートへ自分から接続しに行く。

UDP

コネクションレス。サーバ時は受信相手を送信先として記憶。

手動送信(テキスト / HEX バイトエディタ)

画面下部の送信バーから任意のデータを 1 回送信。HEX をオンにすると専用バイトエディタに切り替わり、2 桁ごとに自動でバイト区切り・ASCII プレビュー・バイト数表示が出ます。Wireshark やログの HEX ダンプ(01 02 / 0102 / 0x01,0x02 など)をそのまま貼り付けても自動整形されます。

色分けされた通信ログ

送受信・システム・エラーをリアルタイム表示。種別で色分けし、最新行に自動追従、最大 1000 件保持。構造体パース表示をオンにすると、受信バイトをフィールド単位に分解して表示します。

RX 受信 TX 送信 SYS ERR PROXY

メインウィンドウの通信ログ
メインウィンドウ — 左にセッション一覧、右にリアルタイム通信ログ(構造体パース表示・CSV 記録中)

オートメーション

トリガー × 送信データ × 繰り返し」を 1 つにまとめた自動送信の仕組み。自動応答・接続あいさつ・定期送信・多段シーケンスを、すべて同じ画面で作れます。

何をきっかけに送るか — 4 つのトリガー

手動

「実行」ボタンを押したとき

パケット一致

受信が条件に一致したとき(自動応答)

接続時

接続が確立した瞬間(TCP)

周期

指定間隔(ms)で定期的に

「パケット一致」の判定方式: ExactContainsStartsWithRegexHexPattern

何を送るか — 送信ステップ

Send

指定データを送信する

WaitReceive

期待データの受信を待つ(TO・中断可)

Delay

指定 ms 待機する

Forward

上流(実機)へ転送する

{ }

Script

C# で動的に応答を生成

繰り返しは「なし / 回数指定 / 無限」、間隔は最小 50ms(送信ストーム防止)。複数オートメーションは独立した受信キューで並列実行できます。

テンプレート変数で動的に組み立てる

送信データに {..} を埋め込むと送信時に実値へ展開。長さや CRC を手計算する必要はありません。

プレースホルダ展開される値
{len:N}総バイト長を N バイトで埋める(プロジェクトのエンディアン)
{crc:KIND}直前までのチェックサム(Crc16Ccitt / Crc16Modbus / Sum8 / Sum16 / Xor8 ほか)
{echo:OFF:LEN}受信バイト列の OFF から LEN バイトをそのまま埋め込む
{field:NAME}受信構造体のフィールド NAME の生バイト
{seq} / {time:FMT} / {rand:N}周回カウンタ / 現在時刻 / N バイトの乱数
オートメーション一覧
オートメーションタブ — トリガー・繰り返し・ステップ数・実行状態を一覧表示

具体例(タブで切り替え)

テキストで PING を含む受信に PONG\r\n を即時返信する、最も基本的な自動応答。

トリガー : パケット一致 / Contains / "PING" (Utf8)
ステップ : Send  "PONG\r\n"

サーバやセンサーへ定期ポーリングを送り続ける。停止するまで無限に繰り返します。

トリガー : 周期 1000ms / 繰り返し 無限
ステップ : Send  "STATUS\r\n"

REQUEST を受けたら ACK を返し、相手の READY を待ってから本応答を送る 3 段構え。

  1. Send"ACK\r\n"
  2. WaitReceive"READY\r\n" <TO 2000ms・中断オン>
  3. Delay100ms
  4. Send"DATA 12345\r\n"

AA 01 XX YY を受信し、XX YY をエコー+長さ+XOR を付けて返す(テンプレート使用)。

トリガー : パケット一致 / HexPattern / "AA 01" (RawHex)
ステップ : Send  "BB {echo:2:2} {len:1} {crc:Xor8}"

  {echo:2:2} … 受信の 2 バイト目から 2 バイト (XX YY) を埋め込む
  {len:1}    … 直前まで (BB XX YY) の長さ 3 を 1 バイトで
  {crc:Xor8} … 直前までの XOR チェックサムを付加

メッセージ構造定義

独自バイナリの構造をフィールド単位で定義しておくと、受信ログを項目ごとに分解表示でき、フィールド値での応答出し分け(次節)も可能になります。

フレームをフィールドに分解する

たとえば同梱の設備ライン制御サンプル(LCP)は、次のようなフレーム構造です。定義しておくと受信ログが各フィールドに色分け分解されます。

A5 5ASync 2B Unit1B Cmd1B 判別 Length2B 長さ Payload可変 CRC162B

型・役割・フレーミング

型は u8u64 / 符号付き i8i64 / 浮動小数 f32f64 / ascii / hex / bcd / array / nested。役割に Length / Checksum / Discriminator(判別)を割り当て、可変長は「長さ元」フィールドを参照します。TCP の区切り方(フレーミング)は次から選びます。

None

区切らない(UDP / データグラム的)

LengthPrefixed

ヘッダの長さフィールドで判定(最も一般的)

FixedLength

毎メッセージ固定長

Delimiter

区切りバイト列(例 0D 0A)で分割

判別フィールドとプレビュー

コマンドごとに構造が違うプロトコルでも、判別フィールドでコマンド値に応じた定義を選んで分解できます。編集ウィンドウにサンプル HEX を入れて「パース」を押せば、その場で分解結果を検証可能。構造体定義は .commsim-struct ファイルで他プロジェクトと共有できます。

受信例 01 00 00 05 48 65 6C 6C 6F が、Command=01 / BodyLen=5 / Body="Hello" のように分解されます。

バイナリ構造応答

構造体定義に基づき、フィールドの値で応答を出し分ける機能。コマンド種別やアドレスごとに異なるバイナリ応答を返せます。

フィールド条件(AND)+ 応答テンプレート

条件は「フィールド名・演算子(= > < )・値」で指定し、すべて満たすとマッチ。応答は {field:NAME} / {len:N} / {crc:KIND} / {echo:OFF:LEN} で組み立てます。優先度の小さい順に評価し、最初にマッチしたルールが先勝ち。どれにもマッチしなければ無応答です。

バイナリ構造応答の構造体ルール一覧
バイナリ構造応答タブ — フィールド条件と計算フィールド応答のルールを優先度順に管理(設備ラインサンプル)

Modbus の FunctionCode で応答を切り替える例。

ルール1 (優先10)  FunctionCode = 0x03  → FC03 応答テンプレート
ルール2 (優先20)  FunctionCode = 0x04  → FC04 応答テンプレート

アドレスが 0〜255 の範囲のときだけ、受信アドレスをエコーして応答。

条件 : Address ≥ 0  かつ  Address ≤ 255   (≥ と ≤ を AND)
応答 : B0 {echo:1:2} 01 {crc:Xor8}
テキスト/HEX の単純な条件応答は、構造体定義なしでオートメーションの「受信して返す」で十分です。バイナリ構造応答は「フィールド値で分岐したい」ときに使います。

中継とキャプチャ

セッションに転送先(上流=実機)を設定すると、アプリと実機の間に入り、通信を記録しながら中継します。実機でしか起きない不具合の調査・再現に。

テスト対象アプリ
CommSim記録しながら中継
実機上流ホスト:ポート

受信パケットの処理順序

  1. オートメーション(パケット一致)を評価

    マッチすれば CommSim が応答し、実機へは転送しない。フック=差し替え

  2. バイナリ構造応答を評価

    マッチすれば CommSim が応答(実機へ転送しない)。

  3. いずれもマッチなし → 実機へ転送

    そのまま上流へ流し、往復をキャプチャに記録。素通し

フック(狙った 1% だけ差し替える)

中継中もルールが有効です。マッチした受信だけ実機へ通さず CommSim が応答を返します(=フォールト/値の注入)。キャプチャの「注入」列で区別できます。実機 99% +狙った 1% だけ偽装が、ルールを 1 つ足すだけで実現します。

状態遷移コマンド(START / STOP / SET など)の差し替えは注意。 差し替えるとそのリクエストは実機へ届かず、クライアントの認識と実機の実状態がズレます。差し替えは読み取り系の値注入・短時間のフォールト試験を主目的に。
キャプチャタブ
キャプチャタブ — 時刻・方向(AppToDevice / DeviceToApp)・注入・HEX を時系列で記録。全行コピーで Excel へ貼り付け可

キャプチャした通信は、転送先なしの別セッションでオートメーション・バイナリ構造応答として組み直せば、実機なしで同じ通信パターンを再現できます。

スクリプト応答

テンプレートだけでは表しにくい計算・分岐・状態保持が必要なとき、オートメーションの Script ステップで C# を書いて応答バイト列を動的生成できます。

動的な長さ

要求の数量に応じて応答バイト長を変える

#

状態保持

カウンタやセンサ値をシミュレートして毎回違う値を返す

複雑な分岐

条件ロジックで応答を組み立てる

同梱の modbus-tcp-script.commsim(ポート 503)は、FC03 の要求 Quantity に応じて動的長の応答を返すスクリプト応答の実例です。

使える変数・ヘルパ、対応範囲、状態保持・動的長などの実例は専用ページへ。

スクリプト応答を詳しく見る

複数セッション・プロジェクト

複数のポートを同時に扱い、まとめて 1 ファイルで保存・復元できます。

複数セッション

1 ポート=1 セッションを必要なだけ。対象アプリの複数相手を一度に用意

ポップアウト

別ウィンドウで複数ログを同時監視(Ctrl+Shift+P)

💾

プロジェクト保存

全セッション+構造体定義を .commsim に。起動時に自動復元

ログ出力

通信ログを CSV / JSONL で記録

🌐

言語・テーマ

日本語/英語、ライト/ダーク

実際に手を動かして試したいなら、レシピとサンプルをまとめた使い方ガイドへ。

使い方ガイドを見る