オートメーションを使いこなす(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}
COPEN 多段応答パケット一致
(Contains OPEN)
10なしACKUNLOCKINGOPENED(遅延付き)パケット一致+多段+ステップ遅延(旧シーケンス)
DSTATUS 詳細応答パケット一致
(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 つの読みどころ
周期 ≠ 繰り返し無限。「周期」は一定間隔で新しい実行を起こすので {seq} は毎回 0(B のハートビート)。「繰り返し」は1 つの実行が同じステップをループするので {seq} が増える(F のアラーム)。
優先度で先勝ち。同じ STATUS 受信に D(優先度 10)と E(優先度 50)の両方が一致しますが、優先度が小さい D だけが発動し E は起動されません(後段抑止)。
一致方式の選び分け。C は Contains(引数付きでも拾う)、D は Exact(厳密一致)。Contains は REOPEN のような部分文字列にも反応しうるので、誤反応を避けたいコマンドは Exact を使います。

用意するもの

ファイル内容
automation-deep/automation-deep.commsimGateCtrl 機器スタブのプロジェクト(TCP 9610・6 オートメーション A〜F が設定済み)

これは CommSim.Sample の実行フォルダ内 samples/automation-deep/ に同梱されています。必要なのは CommSim 本体と CommSim.Sample の 2 本だけで、上流の実機は不要です(CommSim.Sample のクライアント役がアプリ役を演じます)。

ステップ1:起動して接続あいさつとハートビートを見る(まず動かす)

① CommSim.Sampleテスト対象アプリ役:接続して受信
CommSim 本体機器役(スタブ):6 オートメーションで応答
⇠ 実機不要
実機使わない
  1. CommSim 本体で samples/automation-deep/automation-deep.commsim を開く(「ファイル」→「ファイルから開く…」/Ctrl+O)。
  2. オートメーション」タブを開き、6 件(A〜F)のトリガー種別・優先度・繰り返しを一望する。
  3. セッション「ゲート制御装置(GateCtrl)TCP 9610」を「起動」する。
  4. CommSim.Sample を起動し、「動かすサンプル」で「オートメーション(ゲート制御・4トリガー)」を選ぶ。① ペインを「接続」(9610 へ接続)する。
「自動応答」タブ ①オートメーション:A〜F の 6 件が、トリガー(接続時/周期2000ms/一致 OPEN/一致 STATUS/手動)・繰り返し・ステップ数・状態の列で一覧表示される
「オートメーション」タブ。4 トリガー種別が 1 台に同居している:A=接続時、B=周期 2000ms、C/D/E=パケット一致、F=手動。C はステップ数 3(多段応答)、F は繰り返し 3 回。各行の「操作」列の が手動発火ボタン(F を今すぐ起動できる)。

観察できること

  • 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(接続あいさつ)が出て、続いて HB ..03/05/07 seq=0 が 2 秒ごとに並ぶ
接続直後のログ。A:接続あいさつ[AUTO] 送信: HELLO GATE-01 ready を出し、続いて B:ハートビートが 2 秒ごとに HB 05.52.03 seq=005.52.05 seq=0… を送る。時刻は変わるのに seq は 0 のまま=周期トリガーが毎回「新しい実行」を起こしているサイン。
ここがステップ 1(まず動かす)の到達点です。ハートビートの time が毎回変わるのに seq が 0 のままなのは、周期トリガーが2 秒ごとに新しい実行を起こしているからです(後のステップ 3 で、繰り返しの seq 増加と対比します)。
※ ハートビートが 1 ステップを送り終える前に次のティックが来た場合、その回は再入抑止でスキップされます(通常は即完了するので問題ありません)。

ステップ2:OPEN に多段応答、STATUS で先勝ちを見る

クライアント役からコマンドを送って、パケット一致トリガーの応答を観察します。

  1. CommSim.Sample ① の「デモ送信」を押す(OPENSTATUS が順に送られます)。手で送る場合は ① の送信欄に OPEN、続けて STATUS を入力します。

観察できること

  • OPEN① が送信
  • ACKC 多段:即時
  • UNLOCKING0.2 秒後
  • OPENEDさらに 0.4 秒後
  • STATUS① が送信
  • STATE locked hb=onD(優先度 10)が先勝ち。これ 1 通だけ
ログ:OPEN 受信に C が ACK→UNLOCKING→OPENED を多段送信し、STATUS 受信には D の STATE locked hb=on が 1 通だけ返る(E の汎用 ack は出ない)
OPEN 受信に C:OPEN 多段応答ACKUNLOCKING(0.2 秒後)→OPENED(さらに 0.4 秒後)を遅延付きで多段送信。続く STATUS 受信には D(先勝ち)の STATE locked hb=on が 1 通だけ返り、E の (generic) ack は出ない(優先度の小さい D が先勝ちし、E は起動されない)。
先勝ち=後段抑止の観察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 ですが、一致する電文が異なるので衝突しません。
TCP の分割について:TCP はストリームなので、理屈上は STATUS\r\n が分割して届くと Exact 一致が外れることがあります。ローカル(127.0.0.1)では通常 1 まとまりで届くため問題ありませんが、フレーム境界を厳密に扱いたい場合はプロジェクトのフレーミング(区切り文字 \n 等)を設定します(→ オートメーションメッセージ構造定義)。

ステップ3:手動アラームを 3 回ブロードキャストする

最後に、操作者がその場で起動する「手動トリガー」と「繰り返し」を見ます。

  1. CommSim 本体の「オートメーション」タブで F:手動アラーム の行を見つける。
  2. その行の「操作」列の を押す。
  3. 一覧の「状態」列に「実行中 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 周目
ログ:F 手動アラームを実行すると ALARM forced-lock seq=0 → seq=1 → seq=2 が 0.5 秒間隔で送られ、近くの HB は seq=0 のまま
「操作」列の ▶ で F:手動アラームを起動したログ。ALARM forced-lock seq=0seq=1seq=2 が 0.5 秒間隔で送られ、seq が 0→1→2 と増える。すぐ上下の HB … seq=0 と見比べると、「繰り返し(1 実行がループ=seq 増加)」と「周期(毎回新実行=seq 0 固定)」の違いが同じログ上で分かる。
周期 vs 繰り返しの核心:ステップ 1 のハートビートは seq=0 固定でしたが、ここでは seq0→1→2 と増えます。アラームは「1 つの実行が回数 3 でループ」しているので、{seq}(周回カウンタ)が進みます。
やってみよう:F の繰り返しを「無限」に変えると、停止するまで seq が増え続けます(一覧「操作」列の ■ で止める)。ハートビート B の周期間隔を変えると、通知の頻度が変わります。

自分のケースへの当てはめ方

自分の機器の「必要な自動送信」を、どのトリガーで組むかの判断の糸口です。

やりたいこと選ぶトリガー/設定
接続した瞬間に機器が先に名乗る接続時トリガー(旧グリーティング)
一定間隔で生存通知・ポーリングを送る周期トリガー。連番など増分が要るなら「手動/パケット一致+繰り返し無限{seq}」を使う
受信コマンドに応答するパケット一致。多段なら複数ステップ+遅延。厳密に当てたいなら Exact、引数付きでも拾うなら Contains/StartsWith
同じ受信に応答候補が複数ある優先度で先勝ちを制御(優先度の小さい 1 件だけが発動)
操作者がその場で一斉送信する手動トリガー+繰り返し(回数/無限)
特定の受信を上流(実機)へ明示転送する(中継)ステップ種別 Forward(下表)。ライブで中継往復を見るなら → プロキシ(中継)を実機なしで試す

(補足)Forward ステップの最小設定例

Forward は、受信を上流(転送先)へ明示的に転送するステップです。転送先が設定されたセッションでのみ機能します。「特定の受信だけを転送し、それ以外はスタブ応答する」といった細かい制御に使います。

項目設定例
トリガー種別パケット一致
一致方式 / 一致値StartsWith / FWD
ステップ 1種別 Forward(受信を上流へ転送)
中継(プロキシ)の立て方・記録・偽装フック・シナリオ化を通しで試せるチュートリアルは プロキシ(中継)を実機なしで試す です。本ページでは「Forward というステップがある」ことだけ押さえれば十分です。

次に読む