Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

イベントのブロードキャストによるパラレル ステートの同期

ローカル イベントでは、1 つのステートが同じ Stateflow® チャートにある別のステート内での遷移またはアクションをトリガーできるようにすることで、パラレル ステートを連携させることができます。ステート間でイベントをブロードキャストするには、send演算子をイベントの名前およびアクティブ ステートの名前と共に使用します。

send(eventName,stateName)

イベントをブロードキャストすると、受け取り側のステートとそのステートの階層内にあるすべてのサブステートでイベントが有効になります。

ホーム セキュリティ システムのモデル化

この例では、ホーム セキュリティ システムの設計の一部としてローカル イベントを使用します。

セキュリティ システムは 1 つのアラームと 3 つの侵入防止センサー (ドア センサー、窓センサー、および動作検知器) で構成されています。システムで侵入が検知されてから、少しの時間はアラームを無効にできます。そうしない場合は、システムが警察に通報します。

チャートは、次のいずれかのパラレル ステートを使用して各センサーをモデル化します。

  • パラレル ステート Door はドア センサーをモデル化します。入力信号 D_mode によって、このセンサーの Active モードまたは Disabled モードが選択されます。センサーがアクティブになると、入力信号 Door_sens は侵入の可能性を示します。

  • パラレル ステート Win は窓センサーをモデル化します。入力信号 W_mode によって、このセンサーの Active モードまたは Disabled モードが選択されます。センサーがアクティブになると、入力信号 Win_sens は侵入の可能性を示します。

  • パラレル ステート Motion は動作検知器をモデル化します。入力信号 M_mode によって、このセンサーの Active モードまたは Disabled モードが選択されます。センサーがアクティブになると、入力信号 Mot_sens は侵入の可能性を示します。

散発的な誤検知の影響を緩和するため、動作検知器は、持続的な正のトリガー信号だけがアラートを生成するようにデバウンス設計を取り入れています。その一方、ドアと窓のセンサーは単一の正のトリガー信号を侵入として解釈し、直ちにアラートを発します。

Alarm という 4 番目のパラレル ステートは、アラーム システムの動作モードをモデル化します。入力信号 Alarm_active によって、アラームの On モードまたは Off モードが選択されます。センサーは、アラーム サブシステムがオンの間に侵入を検知すると、ローカル イベント AlertAlarm ステートにブロードキャストします。ステート AlarmOn サブステートで、このイベントは Idle サブステートから Pending サブステートへの遷移をトリガーします。Pending がアクティブになると、侵入の可能性があることが警告音によって居住者に知らされます。アラームが誤って発せられた場合、居住者は短時間でセキュリティ システムを無効にします。時間内に無効にされない場合、システムは警察に通報して支援を求めてから、Idle モードに戻ります。

他の Simulink ブロックとの連携

Stateflow チャートはイベントを使って Simulink® モデル内の他のブロックとも通信できます。

出力イベント

出力イベントは、Stateflow チャート内で発生するイベントですが、チャート外部の Simulink ブロックで認識されます。このタイプのイベントにより、チャートは、モデル内の他のブロックに対して、チャートで発生したイベントについて通知することが可能になります。たとえば、この例では、出力イベント Sound および call_police は、警告音と警察への通報を扱う外部ブロックを操作します。ローカル イベント Alert がステート AlarmPending サブステートへの遷移をトリガーすると、チャートはこれらのイベントをブロードキャストします。具体的には、Pending サブステートで、entry アクションによって Sound イベントがブロードキャストされます。同様に、Pending から Idle への遷移の条件アクションによって call_police イベントがブロードキャストされます。各ケースで、出力イベントをブロードキャストするアクションで、send演算子がイベントの名前と共に使用されます。

send(eventName)

各出力イベントはチャートの出力端子にマッピングされます。構成に応じて、対応する信号は Triggered Subsystem または Function-Call Subsystem を制御できます。出力イベントを構成するには次を行います。

  1. [モデル化] タブの [データの設計] で、[[シンボル] ペイン] および [プロパティ インスペクター] を選択します。

  2. [シンボル] ペインで、出力イベントを選択します。

  3. [プロパティ インスペクター] で、[トリガー] を次のいずれかのオプションに設定します。

  • Either edge — 出力イベントのブロードキャストによって出力信号が 0 と 1 の間で切り替わります。

  • Function call — 出力イベントのブロードキャストによって Simulink 関数呼び出しイベントが生じます。

この例では、出力イベントがエッジ トリガーを使用して Simulink モデル内の 1 組のラッチ サブシステムを有効にします。各ラッチがその入力信号の値の変更を検出すると、一時的に 1 の値を出力してから、0 の出力に戻ります。

入力イベント

入力イベントは、Simulink ブロック内で発生するイベントですが、Stateflow チャートで認識されます。このタイプのイベントにより、他の Stateflow チャートを含めた他の Simulink ブロックは、特定のチャートに対してその外部で発生したイベントを通知できるようになります。たとえば、この例では、入力イベント sl_call は、動作検知器のデバウンサーのタイミングと、警察に通報する前の短い遅延を制御します。各インスタンスにおいて、イベントは時相演算子 after への呼び出し内で発生し、チャートがイベントを何回か受け取った後に遷移をトリガーします。

外部の Simulink ブロックは、Stateflow チャートのトリガー端子に接続されている信号を通して入力イベントを送信します。構成に応じて、入力イベントは信号値の変化から生じるか、あるいは Simulink ブロックからの関数呼び出しを通して発生します。入力イベントを構成するには次を行います。

  1. [モデル化] タブの [データの設計] で、[[シンボル] ペイン] および [プロパティ インスペクター] を選択します。

  2. [シンボル] ペインで、入力イベントを選択します。

  3. [プロパティ インスペクター] で、[トリガー] を次のいずれかのオプションに設定します。

  • Rising — 入力信号が 0 または負の値から正の値に変化すると、チャートがアクティブになります。

  • Falling — 入力信号が正の値から 0 または負の値に変化すると、チャートがアクティブになります。

  • Either — 入力信号がどちらかの方向に変化して 0 を横切ると、チャートがアクティブになります。

  • Function call — Simulink ブロックからの関数呼び出しによってチャートがアクティブになります。

この例では、Simulink Function-Call Generator ブロックが周期的な関数呼び出しを通じて入力イベント sl_call をトリガーすることにより、セキュリティ システムのタイミングを制御します。

例の確認

この例では、Stateflow チャートには、いくつかの Manual Switch ブロックからの入力と、Display ブロックに接続する 1 組のラッチ サブシステムへの出力があります。シミュレーション時には、以下が可能です。

  • Switch ブロックをクリックすることにより、アラーム サブシステムとセンサー サブシステムを有効にして侵入検知をトリガーする。

  • チャート アニメーションでチャート内のさまざまなアクティブ ステートが強調表示されるのを確認する。

  • Scope ブロックとシミュレーション データ インスペクターで出力信号を表示する。

たとえば、アラーム サブシステムとセンサー サブシステムをオンにし、センサー トリガーをオフにして、シミュレーションを開始するとします。シミュレーション中、以下のアクションを実行します。

  1. 時間 $t = 250$ 秒に、ドア センサーをトリガーします。アラームが鳴り始めるので (Sound = 1)、アラーム システムを直ちに無効にします。ドア センサーのトリガーをオフに切り替えてアラームをオンに戻します。

  2. 時間 $t = 520$ 秒に、窓センサーをトリガーし、アラームが鳴り始めます (Sound = 0)。今回はアラームを無効にしません。時間 $t = 600$ 頃に、セキュリティ システムが警察への通報を行います (call_police = 1)。Sound 信号と call_police 信号は、80 秒ごとに 0 と 1 の切り替えを続けます。

  3. 時間 $t = 1400$ 秒に、アラームを無効にします。Sound 信号と call_police 信号の切り替えが停止します。

シミュレーション データ インスペクターに、アクションに対する Sound 信号と call_police 信号の応答が表示されます。

参考

関連するトピック