排他的ステート間の遷移
ステート間の遷移に対するラベル形式
以下の例は、ステートに入力する遷移に対する一般的なラベル形式を示しています。
チャートは、この遷移を以下のように実行します。
イベントが発生すると、ステート
S1
は一致するイベントが指定された出力遷移をチェックします。一致するイベントを含む遷移が検出された場合は、その遷移の条件 (
[condition]
) が評価されます。condition
が真の場合は、condition_action
が実行されます。遷移先ステートへの有効な遷移が存在する場合は、遷移が実行されます。
ステート
S1
からの出力が発生します。遷移が実行されると、遷移アクション
transition_action
が実行されます。ステート
S2
への入力が発生します。
イベントによるステート間の遷移
以下の例は、ステートがアクティブになるか非アクティブになるかどうかの結果に注目して、簡単な遷移の動作を示しています。
最初のイベントの処理
最初は、チャートはスリープ状態です。ステート On
とステート Off
は、OR ステートです。ステート On
がアクティブです。イベント E_one
が発生して、チャートを起動します。このイベントは、チャートのルートからチャートの階層の下方向に処理されます。
チャートのルートは、
E_one
の結果、有効な遷移が存在するかどうかをチェックします。ステートOn
からステートOff
で、有効な遷移が検出されます。ステート
On
の exit アクション (exitOn()
) が実行されて完了します。ステート
On
が非アクティブとしてマークされます。イベント
E_one
が遷移アクションとしてブロードキャストされます。この 2 番目のイベント
E_one
が処理されますが、どちらのステートもアクティブにならないため、影響はありません。E_one
の 2 番目のブロードキャストが原因で有効な遷移が発生した場合は、E_one
の最初のブロードキャストの処理よりも優先されます。早期リターン ロジック を参照してください。ステート
Off
がアクティブとしてマークされます。ステート
Off
の entry アクション (entOff()
) が実行されて完了します。チャートはスリープ状態に戻ります。
このシーケンスは、ステート On
が最初にアクティブな場合に、イベント E_one
に関連する Stateflow® チャートの実行を完了します。
2 番目のイベントの処理
同じ例を使用して、ステート Off
がアクティブなときに、次のイベント E_one
が発生した場合の影響を考えます。
最初は、チャートはスリープ状態です。ステート Off
がアクティブです。イベント E_one
が発生して、チャートを起動します。このイベントは、チャートのルートからチャートの階層の下方向に処理されます。
チャートのルートは、
E_one
の結果、有効な遷移が存在するかどうかをチェックします。ステート
Off
からステートOn
で、有効な遷移が検出されます。ステート
Off
の exit アクション (exitOff()
) が実行されて完了します。ステート
Off
が非アクティブとしてマークされます。ステート
On
がアクティブとしてマークされます。ステート
On
の entry アクション (entOn()
) が実行されて完了します。チャートはスリープ状態に戻ります。
このシーケンスは、ステート Off
が最初にアクティブな場合に、2 番目のイベント E_one
に関連する Stateflow チャートの実行を完了します。
3 番目のイベントの処理
同じ例を使用して、3 番目のイベント E_two
が発生した場合の影響を考えます。
上記の例では、イベント E_two
は明示的に使用されていないことに注意してください。ただし、このイベントが発生 (または何らかのイベントが発生) すると、動作に影響します。最初はチャートはスリープ状態であり、ステート On
がアクティブです。
イベント
E_two
が発生して、チャートを起動します。イベント
E_two
は、チャートのルートからチャートの階層の下方向に処理されます。チャートのルートは、
E_two
の結果、有効な遷移が存在するかどうかをチェックします。該当するものは存在しません。ステート
On
の during アクション (durOn()
) が実行されて完了します。チャートはスリープ状態に戻ります。
このシーケンスは、ステート On
が最初にアクティブな場合に、イベント E_two
に関連する Stateflow チャートの実行を完了します。
ヒント
指示のないローカル イベント ブロードキャストは使用しないでください。指示のないローカル イベント ブロードキャストを使用すると、チャート内で不要な再帰的動作が発生する場合があります。代わりに、指示のあるブロードキャストを使用してローカル イベントを送信してください。詳細については、ローカル イベントをブロードキャストしてパラレル ステートを同期を参照してください。
シミュレーション時に Stateflow チャートは指示のないローカル イベント ブロードキャストを検出できます。診断アクションのレベルを制御するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断] 、 [Stateflow] ペインで、[指示のないイベント ブロードキャスト] パラメーターを [なし]
、[警告]
、または [エラー]
に設定します。既定の設定は [警告]
です。詳細については、指示のないイベント ブロードキャスト (Simulink)を参照してください。
イベントによるサブステート間の遷移
以下の例は、OR サブステート間の遷移の動作を示しています。
最初は、チャートはスリープ状態です。ステート A.A1
がアクティブです。条件 C_one
は真です。イベント E_one
が発生して、チャートを起動します。このイベントは、チャートのルートからチャートの階層の下方向に処理されます。
チャートのルートは、
E_one
の結果、有効な遷移が存在するかどうかをチェックします。ステートA
.A1
からステートB
.B1
への有効な遷移が存在します (条件C_one
は真です)。ステート
A
の during アクション (durA()
) が実行されて完了します。ステート
A
.A1
の exit アクション (exitA1()
) が実行されて完了します。ステート
A
.A1
が非アクティブとしてマークされます。ステート
A
の exit アクション (exitA()
) が実行されて完了します。ステート
A
が非アクティブとしてマークされます。遷移アクション
A
が実行されて完了します。ステート
B
がアクティブとしてマークされます。ステート
B
の entry アクション (entB()
) が実行されて完了します。ステート
B
.B1
がアクティブとしてマークされます。ステート
B
.B1
の entry アクション (entB1()
) が実行されて完了します。チャートはスリープ状態に戻ります。
このシーケンスは、イベント E_one
に関連する Stateflow チャートの実行を完了します。