オートメーションを使いこなす(4トリガー×繰り返し×先勝ち)
このサンプルは オートメーション(トリガー×送信×繰り返しの統一モデル)を、1 台の機器スタブに全トリガー種別ぶん同居させて観察するためのものです。題材は入退室ゲートの制御装置 GateCtrl。同梱プロジェクトを開いて起動すると、接続あいさつ・周期ハートビート・コマンド多段応答・優先度の先勝ち・手動アラームを一連で試せて、そこから「自分の機器の自動送信をどのトリガーで組むか」を掴めます。
ゲート制御 GateCtrlTCP 9610接続時・周期・パケット一致・手動優先度で先勝ち繰り返し実機不要
このページでできること
- 4 つのトリガー種別(接続時・周期・パケット一致・手動)を 1 台の機器に同居させ、それぞれがいつ・何を送るかを実トラフィックで観察する。
- 多段応答(受信 1 通に複数パケットを遅延付きで返す)と、優先度の先勝ち(同じ受信に一致する候補が複数あっても 1 件だけ発動する)を見る。
- 手動トリガー+繰り返しでアラームを 3 回一斉送信し、
{seq}周回カウンタが増える様子を見る。 - 「周期」と「繰り返し無限」の違い(似て非なるもの)を、ログ上で直接対比して理解する。
- 最後に「自分の機器ではどのトリガーを選ぶか」を判断フローで掴む。
トリガー設定・一致方式・テンプレート変数・ステップ種別などの網羅的な説明は オートメーション を参照してください。このページは手順と全体像の観察に絞っています。
入口は 1 つ:このチュートリアルは、6 つのオートメーションが設定済みの同梱
automation-deep.commsim を開いて観察するものです(白紙から組み立てる練習は 用途プリセット を使ってください)。題材プロトコル GateCtrl と 6 つのオートメーション
GateCtrl は、本チュートリアル用の入退室ゲート制御プロトコルです。テキスト行(UTF-8・\r\n 区切り)で、機器が自分から名乗り・定期通知し、コマンドに応答します。この 1 台に、4 トリガー全種を使った 6 つのオートメーションが同居しています。
| # | 名前 | トリガー | 優先度 | 繰り返し | 送るもの | 教える概念 |
|---|---|---|---|---|---|---|
| A | 接続あいさつ | 接続時 | 5 | なし | HELLO GATE-01 ready | 接続時トリガー(旧グリーティング) |
| B | ハートビート | 周期 2 秒 | なし | HB hh.mm.ss seq=0 | 周期トリガー(旧ハートビート)+{time} | |
| C | OPEN 多段応答 | パケット一致 (Contains OPEN) | 10 | なし | ACK→UNLOCKING→OPENED(遅延付き) | パケット一致+多段+ステップ遅延(旧シーケンス) |
| D | STATUS 詳細応答 | パケット一致 (Exact STATUS\r\n) | 10 | なし | STATE locked hb=on | パケット一致・先勝ちで勝つ側 |
| E | 汎用 ack | パケット一致 (Contains STATUS) | 50 | なし | (generic) ack: STATUS | 先勝ちで抑止される側 |
| F | 手動アラーム | 手動 | 100 | 回数 3・間隔 0.5 秒 | ALARM forced-lock seq=0/1/2 | 手動トリガー+繰り返し+{seq} 周回 |
3 つの読みどころ:
① 周期 ≠ 繰り返し無限。「周期」は一定間隔で新しい実行を起こすので
② 優先度で先勝ち。同じ
③ 一致方式の選び分け。C は
① 周期 ≠ 繰り返し無限。「周期」は一定間隔で新しい実行を起こすので
{seq} は毎回 0(B のハートビート)。「繰り返し」は1 つの実行が同じステップをループするので {seq} が増える(F のアラーム)。② 優先度で先勝ち。同じ
STATUS 受信に D(優先度 10)と E(優先度 50)の両方が一致しますが、優先度が小さい D だけが発動し E は起動されません(後段抑止)。③ 一致方式の選び分け。C は
Contains(引数付きでも拾う)、D は Exact(厳密一致)。Contains は REOPEN のような部分文字列にも反応しうるので、誤反応を避けたいコマンドは Exact を使います。用意するもの
| ファイル | 内容 |
|---|---|
automation-deep/automation-deep.commsim | GateCtrl 機器スタブのプロジェクト(TCP 9610・6 オートメーション A〜F が設定済み) |
これは CommSim.Sample の実行フォルダ内 samples/automation-deep/ に同梱されています。必要なのは CommSim 本体と CommSim.Sample の 2 本だけで、上流の実機は不要です(CommSim.Sample のクライアント役がアプリ役を演じます)。
ステップ1:起動して接続あいさつとハートビートを見る(まず動かす)
① CommSim.Sampleテスト対象アプリ役:接続して受信
⇄
CommSim 本体機器役(スタブ):6 オートメーションで応答
⇠ 実機不要
実機使わない
- CommSim 本体で
samples/automation-deep/automation-deep.commsimを開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。 - 「オートメーション」タブを開き、6 件(A〜F)のトリガー種別・優先度・繰り返しを一望する。
- セッション「ゲート制御装置(GateCtrl)TCP 9610」を「起動」する。
- CommSim.Sample を起動し、「動かすサンプル」で「オートメーション(ゲート制御・4トリガー)」を選ぶ。① ペインを「接続」(9610 へ接続)する。
観察できること
- ▶HELLO GATE-01 readyA=接続時:つないだ瞬間に機器が名乗る
- ▶HB 22.34.10 seq=0B=周期:2 秒ごと
- ▶HB 22.34.12 seq=0time は変わるが seq は 0 のまま
- ▶HB 22.34.14 seq=0=周期は「毎回 新しい実行」のサイン
[AUTO] 送信: HELLO GATE-01 ready を出し、続いて B:ハートビートが 2 秒ごとに HB 05.52.03 seq=0・05.52.05 seq=0… を送る。時刻は変わるのに seq は 0 のまま=周期トリガーが毎回「新しい実行」を起こしているサイン。ここがステップ 1(まず動かす)の到達点です。ハートビートの
※ ハートビートが 1 ステップを送り終える前に次のティックが来た場合、その回は再入抑止でスキップされます(通常は即完了するので問題ありません)。
time が毎回変わるのに seq が 0 のままなのは、周期トリガーが2 秒ごとに新しい実行を起こしているからです(後のステップ 3 で、繰り返しの seq 増加と対比します)。※ ハートビートが 1 ステップを送り終える前に次のティックが来た場合、その回は再入抑止でスキップされます(通常は即完了するので問題ありません)。
ステップ2:OPEN に多段応答、STATUS で先勝ちを見る
クライアント役からコマンドを送って、パケット一致トリガーの応答を観察します。
- CommSim.Sample ① の「デモ送信」を押す(
OPENとSTATUSが順に送られます)。手で送る場合は ① の送信欄にOPEN、続けてSTATUSを入力します。
観察できること
- ◀OPEN① が送信
- ▶ACKC 多段:即時
- ▶UNLOCKING0.2 秒後
- ▶OPENEDさらに 0.4 秒後
- ◀STATUS① が送信
- ▶STATE locked hb=onD(優先度 10)が先勝ち。これ 1 通だけ
OPEN 受信に C:OPEN 多段応答が ACK→UNLOCKING(0.2 秒後)→OPENED(さらに 0.4 秒後)を遅延付きで多段送信。続く STATUS 受信には D(先勝ち)の STATE locked hb=on が 1 通だけ返り、E の (generic) ack は出ない(優先度の小さい D が先勝ちし、E は起動されない)。先勝ち=後段抑止の観察:
やってみよう:「自動応答」タブで E の優先度を
なお C(OPEN)と D(STATUS)は同じ優先度 10 ですが、一致する電文が異なるので衝突しません。
STATUS には D(Exact・優先度 10)と E(Contains・優先度 50)の両方が一致しますが、返ってくるのは STATE locked hb=on の 1 通だけで、(generic) ack: STATUS(E)は来ません。CommSim は受信に対してパケット一致オートメーションを優先度の小さい順に評価し、最初に一致した 1 件だけを実行します(残りは起動されません)。やってみよう:「自動応答」タブで E の優先度を
5 に変えてセッションを起動し直すと、今度は (generic) ack: STATUS が返るようになります(先勝ちが入れ替わる)。なお C(OPEN)と D(STATUS)は同じ優先度 10 ですが、一致する電文が異なるので衝突しません。
ステップ3:手動アラームを 3 回ブロードキャストする
最後に、操作者がその場で起動する「手動トリガー」と「繰り返し」を見ます。
- CommSim 本体の「オートメーション」タブで F:手動アラーム の行を見つける。
- その行の「操作」列の ▶ を押す。
- 一覧の「状態」列に「実行中 N/M(K周)」の進捗が表示され、▶ が ■(停止)に変わる。
観察できること(CommSim.Sample 側)
- ▶ALARM forced-lock seq=01 周目
- ▶ALARM forced-lock seq=10.5 秒後・2 周目
- ▶ALARM forced-lock seq=2さらに 0.5 秒後・3 周目
ALARM forced-lock seq=0→seq=1→seq=2 が 0.5 秒間隔で送られ、seq が 0→1→2 と増える。すぐ上下の HB … seq=0 と見比べると、「繰り返し(1 実行がループ=seq 増加)」と「周期(毎回新実行=seq 0 固定)」の違いが同じログ上で分かる。周期 vs 繰り返しの核心:ステップ 1 のハートビートは
やってみよう:F の繰り返しを「無限」に変えると、停止するまで
seq=0 固定でしたが、ここでは seq が 0→1→2 と増えます。アラームは「1 つの実行が回数 3 でループ」しているので、{seq}(周回カウンタ)が進みます。やってみよう:F の繰り返しを「無限」に変えると、停止するまで
seq が増え続けます(一覧「操作」列の ■ で止める)。ハートビート B の周期間隔を変えると、通知の頻度が変わります。自分のケースへの当てはめ方
自分の機器の「必要な自動送信」を、どのトリガーで組むかの判断の糸口です。
| やりたいこと | 選ぶトリガー/設定 |
|---|---|
| 接続した瞬間に機器が先に名乗る | 接続時トリガー(旧グリーティング) |
| 一定間隔で生存通知・ポーリングを送る | 周期トリガー。連番など増分が要るなら「手動/パケット一致+繰り返し無限+{seq}」を使う |
| 受信コマンドに応答する | パケット一致。多段なら複数ステップ+遅延。厳密に当てたいなら Exact、引数付きでも拾うなら Contains/StartsWith |
| 同じ受信に応答候補が複数ある | 優先度で先勝ちを制御(優先度の小さい 1 件だけが発動) |
| 操作者がその場で一斉送信する | 手動トリガー+繰り返し(回数/無限) |
| 特定の受信を上流(実機)へ明示転送する(中継) | ステップ種別 Forward(下表)。ライブで中継往復を見るなら → プロキシ(中継)を実機なしで試す |
(補足)Forward ステップの最小設定例
Forward は、受信を上流(転送先)へ明示的に転送するステップです。転送先が設定されたセッションでのみ機能します。「特定の受信だけを転送し、それ以外はスタブ応答する」といった細かい制御に使います。
| 項目 | 設定例 |
|---|---|
| トリガー種別 | パケット一致 |
| 一致方式 / 一致値 | StartsWith / FWD |
| ステップ 1 | 種別 Forward(受信を上流へ転送) |
中継(プロキシ)の立て方・記録・偽装フック・シナリオ化を通しで試せるチュートリアルは プロキシ(中継)を実機なしで試す です。本ページでは「Forward というステップがある」ことだけ押さえれば十分です。
次に読む
- オートメーション — トリガー・ステップ・繰り返し・テンプレート変数の詳細(設定の正)
- プロキシ(中継)を実機なしで試す — Forward を使った中継と記録
- スクリプト応答 — C# で動的に応答を組み立てる(計算・分岐・状態保持)
- ← チュートリアル一覧に戻る