Main Content

排他的ステート間の遷移

ステート間の遷移に対するラベル形式

以下の例は、ステートに入力する遷移に対する一般的なラベル形式を示しています。

Stateflow chart with states called S1 and S2.

チャートは、この遷移を以下のように実行します。

  1. イベントが発生すると、ステート S1 は一致するイベントが指定された出力遷移をチェックします。

  2. 一致するイベントを含む遷移が検出された場合は、その遷移の条件 ([condition]) が評価されます。

  3. condition が真の場合は、condition_action が実行されます。

  4. 遷移先ステートへの有効な遷移が存在する場合は、遷移が実行されます。

  5. ステート S1 からの出力が発生します。

  6. 遷移が実行されると、遷移アクション transition_action が実行されます。

  7. ステート S2 への入力が発生します。

イベントによるステート間の遷移

以下の例は、ステートがアクティブになるか非アクティブになるかどうかの結果に注目して、簡単な遷移の動作を示しています。

Stateflow chart with states called On and Off.

最初のイベントの処理

最初は、チャートはスリープ状態です。ステート On とステート Off は、OR ステートです。ステート On がアクティブです。イベント E_one が発生して、チャートを起動します。このイベントは、チャートのルートからチャートの階層の下方向に処理されます。

  1. チャートのルートは、E_one の結果、有効な遷移が存在するかどうかをチェックします。ステート On からステート Off で、有効な遷移が検出されます。

  2. ステート On の exit アクション (exitOn()) が実行されて完了します。

  3. ステート On が非アクティブとしてマークされます。

  4. イベント E_one が遷移アクションとしてブロードキャストされます。

    この 2 番目のイベント E_one が処理されますが、どちらのステートもアクティブにならないため、影響はありません。E_one の 2 番目のブロードキャストが原因で有効な遷移が発生した場合は、E_one の最初のブロードキャストの処理よりも優先されます。早期リターン ロジック を参照してください。

  5. ステート Off がアクティブとしてマークされます。

  6. ステート Off の entry アクション (entOff()) が実行されて完了します。

  7. チャートはスリープ状態に戻ります。

このシーケンスは、ステート On が最初にアクティブな場合に、イベント E_one に関連する Stateflow® チャートの実行を完了します。

2 番目のイベントの処理

同じ例を使用して、ステート Off がアクティブなときに、次のイベント E_one が発生した場合の影響を考えます。

Stateflow chart with states called On and Off.

最初は、チャートはスリープ状態です。ステート Off がアクティブです。イベント E_one が発生して、チャートを起動します。このイベントは、チャートのルートからチャートの階層の下方向に処理されます。

  1. チャートのルートは、E_one の結果、有効な遷移が存在するかどうかをチェックします。

    ステート Off からステート On で、有効な遷移が検出されます。

  2. ステート Off の exit アクション (exitOff()) が実行されて完了します。

  3. ステート Off が非アクティブとしてマークされます。

  4. ステート On がアクティブとしてマークされます。

  5. ステート On の entry アクション (entOn()) が実行されて完了します。

  6. チャートはスリープ状態に戻ります。

このシーケンスは、ステート Off が最初にアクティブな場合に、2 番目のイベント E_one に関連する Stateflow チャートの実行を完了します。

3 番目のイベントの処理

同じ例を使用して、3 番目のイベント E_two が発生した場合の影響を考えます。

Stateflow chart with states called On and Off.

上記の例では、イベント E_two は明示的に使用されていないことに注意してください。ただし、このイベントが発生 (または何らかのイベントが発生) すると、動作に影響します。最初はチャートはスリープ状態であり、ステート On がアクティブです。

  1. イベント E_two が発生して、チャートを起動します。

    イベント E_two は、チャートのルートからチャートの階層の下方向に処理されます。

  2. チャートのルートは、E_two の結果、有効な遷移が存在するかどうかをチェックします。該当するものは存在しません。

  3. ステート On の during アクション (durOn()) が実行されて完了します。

  4. チャートはスリープ状態に戻ります。

このシーケンスは、ステート On が最初にアクティブな場合に、イベント E_two に関連する Stateflow チャートの実行を完了します。

ヒント

指示のないローカル イベント ブロードキャストは使用しないでください。指示のないローカル イベント ブロードキャストを使用すると、チャート内で不要な再帰的動作が発生する場合があります。代わりに、指示のあるブロードキャストを使用してローカル イベントを送信してください。詳細については、ローカル イベントをブロードキャストしてパラレル ステートを同期を参照してください。

シミュレーション時に Stateflow チャートは指示のないローカル イベント ブロードキャストを検出できます。診断アクションのレベルを制御するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断][Stateflow] ペインで、[指示のないイベント ブロードキャスト] パラメーターを [なし][警告]、または [エラー] に設定します。既定の設定は [警告] です。詳細については、指示のないイベント ブロードキャスト (Simulink)を参照してください。

イベントによるサブステート間の遷移

以下の例は、OR サブステート間の遷移の動作を示しています。

Stateflow chart with top-level states called A and B. State A has substates A1 and A2. State B has substates B1 and B2.

最初は、チャートはスリープ状態です。ステート A.A1 がアクティブです。条件 C_one は真です。イベント E_one が発生して、チャートを起動します。このイベントは、チャートのルートからチャートの階層の下方向に処理されます。

  1. チャートのルートは、E_one の結果、有効な遷移が存在するかどうかをチェックします。ステート A.A1 からステート B.B1 への有効な遷移が存在します (条件 C_one は真です)。

  2. ステート A の during アクション (durA()) が実行されて完了します。

  3. ステート A.A1 の exit アクション (exitA1()) が実行されて完了します。

  4. ステート A.A1 が非アクティブとしてマークされます。

  5. ステート A の exit アクション (exitA()) が実行されて完了します。

  6. ステート A が非アクティブとしてマークされます。

  7. 遷移アクション A が実行されて完了します。

  8. ステート B がアクティブとしてマークされます。

  9. ステート B の entry アクション (entB()) が実行されて完了します。

  10. ステート B.B1 がアクティブとしてマークされます。

  11. ステート B.B1 の entry アクション (entB1()) が実行されて完了します。

  12. チャートはスリープ状態に戻ります。

このシーケンスは、イベント E_one に関連する Stateflow チャートの実行を完了します。