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
オートメーション
「トリガー × 送信データ × 繰り返し」を 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 段構え。
- Send
"ACK\r\n" - WaitReceive
"READY\r\n"<TO 2000ms・中断オン> - Delay100ms
- 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)は、次のようなフレーム構造です。定義しておくと受信ログが各フィールドに色分け分解されます。
型・役割・フレーミング
型は u8〜u64 / 符号付き i8〜i64 / 浮動小数 f32・f64 / 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}中継とキャプチャ
セッションに転送先(上流=実機)を設定すると、アプリと実機の間に入り、通信を記録しながら中継します。実機でしか起きない不具合の調査・再現に。
受信パケットの処理順序
オートメーション(パケット一致)を評価
マッチすれば CommSim が応答し、実機へは転送しない。フック=差し替え
バイナリ構造応答を評価
マッチすれば CommSim が応答(実機へ転送しない)。
いずれもマッチなし → 実機へ転送
そのまま上流へ流し、往復をキャプチャに記録。素通し
フック(狙った 1% だけ差し替える)
中継中もルールが有効です。マッチした受信だけ実機へ通さず CommSim が応答を返します(=フォールト/値の注入)。キャプチャの「注入」列で区別できます。実機 99% +狙った 1% だけ偽装が、ルールを 1 つ足すだけで実現します。
キャプチャした通信は、転送先なしの別セッションでオートメーション・バイナリ構造応答として組み直せば、実機なしで同じ通信パターンを再現できます。
スクリプト応答
テンプレートだけでは表しにくい計算・分岐・状態保持が必要なとき、オートメーションの Script ステップで C# を書いて応答バイト列を動的生成できます。
動的な長さ
要求の数量に応じて応答バイト長を変える
状態保持
カウンタやセンサ値をシミュレートして毎回違う値を返す
複雑な分岐
条件ロジックで応答を組み立てる
同梱の modbus-tcp-script.commsim(ポート 503)は、FC03 の要求 Quantity に応じて動的長の応答を返すスクリプト応答の実例です。
使える変数・ヘルパ、対応範囲、状態保持・動的長などの実例は専用ページへ。
スクリプト応答を詳しく見る複数セッション・プロジェクト
複数のポートを同時に扱い、まとめて 1 ファイルで保存・復元できます。
複数セッション
1 ポート=1 セッションを必要なだけ。対象アプリの複数相手を一度に用意
ポップアウト
別ウィンドウで複数ログを同時監視(Ctrl+Shift+P)
プロジェクト保存
全セッション+構造体定義を .commsim に。起動時に自動復元
ログ出力
通信ログを CSV / JSONL で記録
言語・テーマ
日本語/英語、ライト/ダーク
実際に手を動かして試したいなら、レシピとサンプルをまとめた使い方ガイドへ。
使い方ガイドを見る