オートメーション
オートメーションは、「トリガー × 送信データ × 繰り返し」を1つにまとめた自動送信の単位です。受信データに反応して応答を返す、定期的にパケットを送信する、接続時にあいさつを送る、手動でパケット列を流す、といったさまざまな自動送信をひとつの設定画面で管理できます。
セッション画面の「オートメーション」タブで設定・操作します。
オートメーションの構成要素
オートメーションは次の3要素で構成されます。
- トリガー … 何をきっかけに実行を開始するか
- 送信データ … 実行するパケット列(1〜複数ステップ)
- 繰り返し … 何回実行するか
トリガーの種別
| 種別 | 説明 |
|---|---|
| 手動 | 「操作」列の ▶ を押したときに起動 |
| パケット一致 | 受信データが指定条件に一致したときに起動 |
| 接続時 | 接続が確立した瞬間に起動(TCP のみ) |
| 周期 | 指定間隔(ミリ秒)で定期起動 |
パケット一致トリガーが発動すると、同じ受信データに対するバイナリ構造応答(構造体ルール)の評価は抑止されます。受信時の評価順序は ①パケット一致オートメーション → ②バイナリ構造応答(構造体ルール)の順で、①が先勝ちした場合は②を行いません(二重応答防止)。
パケット一致オートメーション同士の先勝ち:1 つの受信データに複数のパケット一致オートメーションが一致した場合も、優先度(数値)が小さいものから評価され、最初に一致した 1 件だけが実行されます。残りの候補は起動されません(ログにも実行記録は出ません)。「同じコマンドに対する詳細応答と汎用応答」のように候補が重なるときは、優先度で勝たせたい方を小さくします。
繰り返し
| 方式 | 説明 |
|---|---|
| なし | 1回だけ実行 |
| 回数指定 | 指定した回数だけ繰り返す |
| 無限 | 停止操作まで繰り返し続ける(周期トリガーでは選べません。下記参照) |
繰り返し間隔(1周ごとの待ち時間)を指定できます。最小 50ms 未満は自動的に 50ms に丸められます(送信ストーム防止)。
周期トリガーでは「無限」を使いません。周期トリガーは一定間隔で発火を繰り返すこと自体が仕事なので、その内側にさらに無限ループを置くと送信間隔が 2 か所に分かれてしまいます。そのため、トリガー種別に「周期」を選ぶと繰り返しの選択肢から「無限」が外れ、送信間隔はトリガーの「間隔(ms)」だけで決まります。
「回数指定」は周期でも選べます。1 回の発火でまとめて何回か送りたいとき(例: 3 秒ごとに 3 連続で送る)に使います。
以前のバージョンで作った定義に「周期 + 無限」が残っている場合、一覧の「繰り返し」列には実際に使われる値(なし)が表示され、送信間隔が変わるものには ⚠ が付きます。その定義を編集して「OK」を押すと保存値もそろい、印が消えます。
「自動応答」タブを開く
- セッションを選択します。
- 「自動応答」タブをクリックします。オートメーションは左側の ①オートメーション です(右側は②バイナリ構造応答、下に③既定転送)。
オートメーションが1件もない場合、一覧の代わりに案内テキストと「追加」ボタンが表示されます。セッション起動中かつオートメーションが0件のときは、ヘッダの下にヒントバーも表示されます。
オートメーションを追加する
- 「追加」ボタン(ツールバーまたは空状態の中央ボタン)をクリックします。起動中はタブ上部のヒントバーの「今すぐ追加」からも追加できます。
- オートメーション編集ウィンドウが開きます。
編集ウィンドウは開いたままセッション画面を操作できます。受信ログを見ながら一致条件や送信データを組み立て、そのまま編集に戻れます(閉じて開き直す必要はありません)。同じオートメーションのウィンドウは 1 つだけ開き、別のオートメーションなら並べて開けます。詳しくは オートメーション編集 を参照してください。
用途プリセット(カード)を選ぶ
新規追加時はダイアログ上部に並ぶ「用途プリセット」カードから用途に近いものを選ぶと、トリガー・繰り返し・初期ステップが自動入力され、詳細設定が展開されます。
| プリセット | 設定される内容 |
|---|---|
| 受信して返す | トリガー: パケット一致 / 繰り返し: なし / ステップ 1 件 |
| 多段応答 | トリガー: パケット一致 / 繰り返し: なし / ステップ 2 件 |
| 定期送信 | トリガー: 周期(1000ms)/ 繰り返し: なし / ステップ 1 件 |
| 接続時あいさつ | トリガー: 接続時 / 繰り返し: なし / ステップ 1 件 |
| カスタム(空白から設定) | トリガー: 手動 / 繰り返し: なし / ステップなし |
プリセットを選んだ後、詳細を自由に変更できます。既存オートメーションの編集時はカードは表示されず、最初から詳細設定が展開されます。
すぐ試せるサンプル: 「多段応答」の動く例として
samples/automation-multistep/automation-multistep.commsim(同梱サンプル、ポート 9600)を用意しています。クライアントからSTARTを1通送ると、ACK→BOOT 25/50/75/100%→READYを約0.3秒間隔で多段送信します。開き方・試し方は 多段応答 を参照してください。
設定項目の詳細
基本
| 項目 | 説明 |
|---|---|
| 名前 | オートメーションの表示名 |
| 有効 | チェックを外すと、トリガー待機・実行の対象から除外されます。セッションを起動したままでも切り替えられます(セッションの停止・再起動は不要) |
| 優先度 | 数値が小さいほど先に評価されます(パケット一致トリガーの先勝ち順に使用) |
トリガー設定
| 項目 | 説明 | 使うトリガー |
|---|---|---|
| トリガー種別 | 手動 / パケット一致 / 接続時 / 周期 | 全て |
| 一致方式 | Exact(完全一致)/ Contains(部分一致)/ StartsWith(前方一致)/ Regex(正規表現)/ HexPattern(HEX バイト列) | パケット一致 |
| 一致値 | 判定に用いる文字列または HEX バイト列 | パケット一致 |
| エンコーディング | 受信データのテキスト化に使用(Utf8 / Ascii / RawHex) | パケット一致 |
| 周期間隔(ms) | 定期起動の間隔(ミリ秒) | 周期 |
繰り返し設定
| 項目 | 説明 |
|---|---|
| 繰り返し方式 | なし / 回数指定 / 無限(周期トリガーでは「無限」は表示されません) |
| 繰り返し回数 | 指定回数(「回数指定」のとき) |
| 1周ごと(ms) | 1 周終わってから次の周を始めるまでの待ち時間(最小 50ms)。トリガーの「間隔(ms)」とは別物です |
送信ステップ(送信データ)
送信データは1〜N 個のステップで構成されます。
| 種別 | 説明 |
|---|---|
| Send | 指定データを送信する |
| WaitReceive | 期待するデータを受信するまで待つ。タイムアウトまたは不一致で中断できる |
| Delay | 指定ミリ秒だけ待機する |
| Forward | 転送先(上流)へ転送する。転送先が有効なセッションのみ有効 |
| Script | C# コードで応答バイト列を動的生成する。計算・分岐・状態保持(カウンタ等)が必要な場合に使用(→スクリプト応答) |
各ステップの設定列:
| 列 | 説明 | 使うステップ |
|---|---|---|
| 種別 | Send / WaitReceive / Delay / Forward | 全て |
| データ / 期待値 | 送信データ(Send)または受信を待つ文字列・バイト列(WaitReceive) | Send / WaitReceive |
| エンコード | データの解釈(Utf8 / Ascii / RawHex) | Send / WaitReceive |
| 遅延ms | このステップ後の追加待ち時間 | Send / Delay |
| TO ms | 受信待機のタイムアウト(ミリ秒) | WaitReceive |
| 中断 | 不一致・タイムアウト時に以降のステップを中断するか | WaitReceive |
Forward ステップは、転送先(上流)が設定されたセッションでのみ機能します。未接続の場合は警告ログを出してスキップします。「パケット一致」トリガーと組み合わせると「特定の受信を上流へ明示的に転送する」細かい制御に使えます。なお、転送先があるセッションでどのオートメーション・バイナリ構造応答にもマッチしない受信は、上流へ自動的に転送されます(暗黙の転送)。Forward ステップは「明示的に転送したい」用途向けです。
外部ファイルから取り込む
「ファイル取り込み」ボタンを使うと、テキストファイルに記述したパケット列を送信ステップとして一括取り込みできます。
ファイル形式
1行=1パケット(送信ステップ)の行指向テキストです。
# コメント行(# で始まる行は無視)
# 形式: データ[, 遅延ms[, 種別]]
AA 01 00 FF, 100, hex
LOGIN user\r\n, 0, text
48 42 0D 0A
| 列 | 説明 | 省略時 |
|---|---|---|
| データ | 送信するデータ(テキスト文字列または HEX バイト列) | — |
| 遅延ms | このステップ後の追加待ち時間(ミリ秒) | 0 |
| 種別 | text / hex(utf8/ascii/rawhex も可) | セッションのデータ形式 |
Wireshark の「Copy as Hex Stream」でコピーしたスペース区切り HEX(
AA 01 00 FFなど)はそのままhex種別として取り込めます。
テンプレート変数
送信ステップのデータ文字列に {..} 形式のプレースホルダを埋め込むと、送信時に実値へ展開されます。ステップの「テンプレート使用」を有効にすることで利用できます。
| プレースホルダ | 展開される値 | 制約・備考 |
|---|---|---|
{len:N} | 総バイト長を N バイトで埋める(プロジェクトのエンディアン) | — |
{crc:KIND} | それ以前のバイト列のチェックサム(KIND は Crc16Ccitt / Crc16Modbus / Sum8 / Sum16 / Xor8 など) | — |
{echo:OFF:LEN} | 受信バイト列のオフセット OFF から LEN バイトをそのまま埋め込む | パケット一致トリガー時のみ |
{field:NAME} | 受信構造体パース結果のフィールド(NAME)の生バイト | 構造体パース文脈が必要 |
{seq} | 繰り返し周回カウンタ(0 起算)。テキストは 10 進文字列 | — |
{time:FMT} | 現在時刻(FMT 省略時は ISO 8601 形式) | テキストエンコードのみ(RawHex 非対応) |
{rand:N} | N バイトの乱数 | 最大 65536 バイト |
入力例(UTF-8 テキスト):
Hello {time:HH:mm:ss}\r\n
入力例(RawHex + テンプレート):
AA {len:2} 01 {crc:Crc16Ccitt}
テンプレートの構文エラーは送信時にログへ通知されます(当該ステップを飛ばして次のステップへ続行)。「Validate」で保存前にエラーを確認してください。
オートメーションを実行する(手動トリガー)
- セッションを「起動」しておきます。
- 一覧の対象行の「操作」列にある ▶(実行) をクリックします。
- 一覧の「状態」列に 「実行中 N/M(K周)」 と進捗が表示され、▶ が ■(停止) に変わります。
- 実行中に ■(停止) をクリックすると、その行だけ中断できます(他の行・セッションには影響しません)。
▶ は「その行の送信ステップを今すぐ実行する(手動発火)」ボタンです。すべてのトリガー種別で使えます(パケット一致・周期・接続時の行でも、受信や周期を待たずに単発でテスト発火できます)。本来のトリガーは、手動発火とは別に、セッション起動中は変わらず有効です。なお手動発火では受信データが無いため、受信を参照する応答(
{echo}など)は空入力になります。
セッション停止中は ▶ は押せません(淡色表示)。
セッション起動時の自動開始
| トリガー | セッション起動時の挙動 |
|---|---|
| 手動 | 自動起動しない(「操作」列の ▶ で起動) |
| パケット一致 | 待機状態になり、受信を監視し始める |
| 接続時 | 待機状態になり、次の接続確立で発動する |
| 周期 | 即座に周期タイマーが動き出す |
有効(チェックあり)のオートメーションは、セッション起動と同時に上記の状態になります(明示的な「監視開始」操作は不要です)。
起動したまま設定を変えたとき
オートメーションの設定変更は、セッションを起動したままでも反映されます(停止・再起動は不要)。反映は次のタイミングで行われます。
| 変更内容 | 反映されるタイミング |
|---|---|
| 有効 → 無効 | 周期は次回の発火予定時刻に送信を見送ります。パケット一致・接続時は次の受信・接続から対象外になります |
| 無効 → 有効 | 周期は次回の発火予定時刻から送信を始めます(起動時に無効だった場合も同じ) |
| 周期間隔(ms) の変更 | 次回の発火時に新しい間隔へ切り替わります(変更前の間隔で 1 回発火してから切り替わります) |
| オートメーションの追加・削除 | その場で反映されます(追加した周期オートメーションはすぐ動き出し、削除したものはそれ以降送信しません) |
多機器タイミング試験の実行中は、試験がタイムラインから呼び出したオートメーションだけが動きます。試験結果がぶれないよう、周期などの自動トリガーは試験の間だけ止まります(試験は各機器をいったん停止してから起動するため、この抑止はラン全体に効きます)。
複数オートメーションの並列実行
複数のオートメーションを同時に実行できます。各オートメーションは独立した受信キューを持ち、受信データは全実行中オートメーションに同時に届きます(WaitReceive ステップと、パケット一致トリガーの評価が混線しません)。
同一オートメーションは実行中に再トリガーされても無視されます(多重起動防止)。ログに「実行中のため無視」と表示されます。
リプレイ中はオートメーションが止まります
受信に応答を返す仕組みは「オートメーション+バイナリ構造応答」か「リプレイ」のどちらか片方だけが動きます。リプレイを再生している間、オートメーションは有効のままでもトリガーで発火しません(二重応答を防ぐためです)。
再生中は「自動応答」タブのヘッダに「停止中」バッジが付き、タブを開くと案内バーが出ます。「オートメーションが有効なのに動かない」ときは、まずここを確認し、必要ならバー内の「リプレイを停止」(またはヘッダの「リプレイを停止」)で通常動作へ戻してください。止まるのは実行だけで、追加・編集・削除は通常どおり行えます。
オートメーションを編集・削除する
- 編集: 一覧で行を選択し「編集」をクリックするか、行をダブルクリックします(実行/停止ボタンの上を除く)。実行中のオートメーションを編集した場合、変更は次回起動時から反映されます。
- 削除: 一覧で行を選択し「削除」をクリックします。
一覧の行を右クリックしても同じ操作ができます。メニューには「編集」「削除」のほか、「実行/停止」(セッション起動中のみ)と「有効/無効」の切り替えが並びます。右クリックした行が選択対象になるので、選び直してからメニューを開く必要はありません。Shift+F10(またはメニューキー)でも、選択中の行に対してメニューを開けます。
設定例
ケース 1: 受信した PING に PONG を返す
テキストで PING\r\n を受け取ったら PONG\r\n を即時返信するシンプルな応答です。
| 項目 | 設定値 |
|---|---|
| トリガー種別 | パケット一致 |
| 一致方式 | Contains |
| 一致値 | PING |
| エンコーディング | Utf8 |
| 繰り返し方式 | なし |
送信ステップ:
| 種別 | データ | エンコード | 遅延ms |
|---|---|---|---|
| Send | PONG\r\n | Utf8 | 0 |
ケース 2: 1 秒ごとにステータス要求を送り続ける
サーバやセンサーに対して定期ポーリングを送る場合です。
| 項目 | 設定値 |
|---|---|
| トリガー種別 | 周期 |
| 間隔(ms) | 1000 |
| 繰り返し方式 | なし(周期トリガー自身が 1 秒ごとに発火します) |
送信ステップ:
| 種別 | データ | エンコード | 遅延ms |
|---|---|---|---|
| Send | STATUS\r\n | Utf8 | 0 |
停止するには一覧の対象行の「操作」列の ■ をクリックします。セッションを停止すると周期タイマーも自動停止します。
ケース 3: 接続したらあいさつを送る
TCP クライアントが接続してきた瞬間に、あいさつメッセージを送ります。
| 項目 | 設定値 |
|---|---|
| トリガー種別 | 接続時 |
| 繰り返し方式 | なし |
送信ステップ:
| 種別 | データ | エンコード | 遅延ms |
|---|---|---|---|
| Send | HELLO CommSim\r\n | Utf8 | 0 |
「接続時」トリガーは TCP サーバ・TCP クライアントの両方で使えます。接続が切れて再接続された場合も再び発動します。
ケース 4: 受信後に ACK → 本応答を多段で返す
REQUEST\r\n を受け取ったら、まず ACK\r\n を即時返し、相手がさらに確認を返してきたあと DATA 12345\r\n を送る 3 段構えの応答です。
| 項目 | 設定値 |
|---|---|
| トリガー種別 | パケット一致 |
| 一致方式 | Exact |
| 一致値 | REQUEST\r\n |
| エンコーディング | Utf8 |
| 繰り返し方式 | なし |
送信ステップ:
| # | 種別 | データ / 期待値 | エンコード | 遅延ms | TO ms | 中断 |
|---|---|---|---|---|---|---|
| 1 | Send | ACK\r\n | Utf8 | 0 | — | — |
| 2 | WaitReceive | READY\r\n | Utf8 | — | 2000 | オン |
| 3 | Delay | — | — | 100 | — | — |
| 4 | Send | DATA 12345\r\n | Utf8 | 0 | — | — |
ステップ 2 で READY\r\n が 2 秒以内に届かない場合、「中断」がオンのためステップ 3・4 はスキップされます。
ケース 5: バイナリで受信バイトの一部をエコーした応答を返す(テンプレート使用)
HEX プロトコルで AA 01 XX YY という形式を受信し、BB XX YY {len:1} {crc:Xor8} を返す例です。先頭 2 バイトが AA 01 に一致するものを対象にします。
| 項目 | 設定値 |
|---|---|
| トリガー種別 | パケット一致 |
| 一致方式 | HexPattern |
| 一致値 | AA 01 |
| エンコーディング | RawHex |
| 繰り返し方式 | なし |
送信ステップ(テンプレート使用をオンにする):
| 種別 | データ | エンコード | 遅延ms |
|---|---|---|---|
| Send | BB {echo:2:2} {len:1} {crc:Xor8} | RawHex | 0 |
{echo:2:2}… 受信バイト列のオフセット 2 から 2 バイト(XX YY)をそのまま埋め込む{len:1}… 応答全体の長さ(この例では len・crc 込みで 5 バイト)を 1 バイトで埋める{crc:Xor8}… 直前までのバイト列の XOR チェックサムを付加する