Main Content

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

アクティブ ステート データを使用したチャート アクティビティの監視

Stateflow® チャートにチャート階層と相関性をもつデータが含まれている場合は、アクティブ ステート データを用いて設計を簡略化できます。アクティブ ステート データを有効にすることで、以下が可能になります。

  • チャート アクティビティを反映させる手動のデータ更新を回避する。

  • シミュレーション データ インスペクターでチャート アクティビティのログを取り監視を行う。

  • チャート アクティビティ データを使用して他のサブシステムを制御する。

  • チャート アクティビティ データを他の Simulink ブロックにエクスポートする。

たとえば、次の信号機のモデルでは、アクティブなステートによって出力信号 color の値が決まります。アクティブ ステート データを有効にすることで、チャートの設計を簡略化できます。この場合、Stateflow チャートはステート アクティビティを追跡することにより信号機の色を提示できるため、color の値を明示的に更新する必要はありません。

アクティブ ステート データを有効にするには、監視するステートを選択します。その後、[プロパティ インスペクター] で次を行います。

1. [監視する出力の作成] を選択します。

2.以下のアクティビティ タイプのいずれかを選択します。

  • Self activity — ステートがアクティブかどうかを示すブール値

  • Child activity — アクティブな子ステートを示す列挙値

  • Leaf state activity — アクティブなリーフ ステートを示す列挙値

3. アクティブ ステート データ シンボルの [データ名] を入力します。

4. オプションで、[Child activity] または [Leaf state activity] に対し、アクティブ ステートのデータ型として [Enum 名] を入力します。

既定では、Stateflow チャートはステート アクティビティを出力データとして Simulink モデルに報告します。アクティブ ステート データ シンボルのスコープをローカル データに変更するには、[シンボル] ペインを使用します。

信号機コントローラーのモデル化

この例では、アクティブ ステート データを使用して 1 組の信号機用のコントローラー システムをモデル化します。

この Traffic Controller チャートでは、2 つのパラレル サブチャートにより、信号機を制御するロジックを管理しています。各サブチャートには 3 つの子ステート RedYellowGreen で構成される同一の階層があります。出力データの Light1Light2 は、サブチャート内のアクティブな子ステートに対応します。これらの信号は以下を行います。

  • アニメーション化された信号機のフェーズを判定する。

  • 各信号機で待機する自動車の台数を報告する。

  • 2 つの信号機が同時に青になることが決してないように、Safety Assertion サブシステムを操作する。

Traffic Controller チャート内でサブチャートを表示するには、チャートの左下隅にある矢印をクリックします。

各トラフィック コントローラーは、その子ステートを、Red から Green、さらに Yellow を経て、Red に戻るという順序で繰り返します。各ステートは信号機のサイクルにおける 1 フェーズに対応します。出力信号の Light1Light2 は、特定の時点でどのステートがアクティブかを示します。

赤信号

Red ステートがアクティブになると、信号機のサイクルが開始されます。短い遅延の後、コントローラーは交差点で待っている自動車がないか確認します。少なくとも 1 台の自動車が検知されるか、または一定の時間が経過すると、コントローラーは greenLightRequesttrue に設定して青信号をリクエストします。リクエストを行った後、コントローラーはもう一方の信号機が赤であることを検出するまで Red ステートを短時間維持します。その後、コントローラーは Green へ遷移します。

青信号

Green ステートがアクティブになると、コントローラーは greenLightRequestfalse に設定してその青信号のリクエストをキャンセルします。コントローラーは greenLightLockedtrue に設定し、もう一方の信号機が青に変わらないようにします。短い遅延の後、コントローラーはもう一方の信号機から青信号のリクエストがないか確認します。リクエストを受け取るか、または一定の時間が経過すると、コントローラーは Yellow ステートへ遷移します。

黄色信号

Yellow ステートが非アクティブになると、コントローラーは greenLightLocked を false に設定し、もう一方の信号機が青になっても安全であることを示します。Red ステートへ遷移する前に、コントローラーは一定の時間 Yellow ステートを維持します。その後、信号機のサイクルが再開されます。

信号機のタイミング

信号機サイクルのタイミングはいくつかのパラメーターによって定義されます。信号機のタイミングを変更するには、Traffic Controller チャートをダブルクリックして、ダイアログ ボックスに次のパラメーターの新しい値を入力します。

  • REDDELAY — コントローラーが交差点に自動車がないか確認するまでの時間。この値は、コントローラーが青信号をリクエストした後に信号機が青に切り替わるまでの最短時間でもあります。既定値は 6 秒です。

  • MAXREDDELAY — 青信号をリクエストする前にコントローラーが自動車を確認する最長時間。既定値は 360 秒です。

  • GREENDELAY — 信号機が青を維持する最長時間。既定値は 180 秒です。

  • MINGREENDELAY — 信号機が青を維持する最短時間。既定値は 120 秒です。

  • YELLOWDELAY — 信号機が黄色を維持する時間。既定値は 15 秒です。

例の確認

  1. 左下隅にある矢印をクリックしてチャートを開きます。

  2. [シンボル] ペインで、greenLightRequested を選択します。次に、[プロパティ インスペクター][ログ][信号データのログ] を選択します。

  3. greenLightLockedLight1、および Light2 について前の手順を繰り返します。

  4. [シミュレーション] タブで、[実行] をクリックします。

  5. [シミュレーション] タブで、[結果の確認] にある [データ インスペクター] をクリックします。

  6. シミュレーション データ インスペクターで、ログに記録された信号を個別の座標軸に表示します。boolean 信号の greenLightRequestedgreenLightLocked は、0 または 1 の数値として表示されます。ステート アクティビティ信号の Light1Light2 は、値が GreenYellowRed、および None の列挙データです。

シミュレーション時のチャート アクティビティを追跡するには、シミュレーション データ インスペクターのズーム ボタンとカーソル ボタンを使用できます。たとえば、シミュレーションの最初の 300 秒間における主要な瞬間は次のとおりです。

  • $t = 0$ — シミュレーションの開始時は両方の信号機が赤です。Light1Light2RedgreenLightRequestedfalsegreenLightLockedfalse です。

  • $t = 6$ — 6 秒後 (REDDELAY の既定値)、両方の通りで自動車が待機しているため、両方の信号機が青信号をリクエストします。Light1Light2 は引き続き RedgreenLightRequestedtruegreenLightLockedfalse です。

  • $t = 12$ — さらに 6 秒後 (REDDELAY の既定値)、Light 1 が青になり、青信号のリクエストをキャンセルして、greenLightLockedtrue に設定します。次に、Light 2 が青信号をリクエストします。Light1GreenLight2RedgreenLightRequestedfalse になってから true になり、greenLightLockedtrue です。

  • $t = 132$ — 120 秒後 (MINGREENDELAY の既定値)、Light 1 が黄色に変わります。Light1YellowLight2RedgreenLightRequestedtruegreenLightLockedtrue です。

  • $t = 147$ — 15 秒後 (YELLOWDELAY の既定値)、Light 1 が赤に変わり、greenLightLockedfalse に設定します。次に、Light 2 が青に変わり、青信号のリクエストをキャンセルして、greenLightLockedtrue に設定します。Light1RedLight2GreengreenLightRequestedfalsegreenLightLockedfalse になってから true になります。

  • $t = 153$ — 6 秒後 (REDDELAY の既定値)、Light 1 が青信号をリクエストします。Light1RedLight2GreengreenLightRequestedtruegreenLightLockedtrue です。

  • $t = 267$ — Light 2 が青になってから 120 秒後 (MINGREENDELAY の既定値)、Light 2 が黄色に変わります。Light1RedLight2YellowgreenLightRequestedtruegreenLightLockedtrue です。

  • $t = 282$ — 15 秒後 (YELLOWDELAY の既定値)、Light 2 が赤に変わり、greenLightLockedfalse に設定します。次に、Light 1 が青に変わり、青信号のリクエストをキャンセルして、greenLightLockedtrue に設定します。Light1GreenLight2RedgreenLightRequestedfalsegreenLightLockedfalse になってから true になります。

  • $t = 288$ — 6 秒後 (REDDELAY の既定値)、Light 2 が青信号をリクエストします。Light1GreenLight2RedgreenLightRequestedtruegreenLightLockedtrue です。

シミュレーションが $t = 1000$ 秒で終了するまでサイクルが繰り返されます。

関連するトピック