Main Content

内部遷移を含むステート内のイベントの処理

排他的 (OR) ステートの内部遷移によるイベント処理

以下の例は、排他的 (OR) ステートの内部遷移を使用して 3 つのイベントを処理した場合に発生する現象を示しています。

排他的 (OR) ステートの最初のイベントの処理

以下の例は、内部遷移の動作を示しています。チャートでは、出力遷移の暗黙的な順序付けが使用されます (暗黙的な順序付けを参照)。

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

  1. チャートのルートは、E_one の結果、有効な遷移が存在するかどうかをチェックします。ステート A からステート B で、有効な可能性のある遷移が検出されます。ただし、[C_one]] は偽であるため、遷移は無効です。

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

  3. ステート A の子の有効な遷移がチェックされ、有効な内部遷移が検出されます。

  4. ステート A はアクティブなままです。内部遷移アクション A_two が実行されて完了します。内部遷移であるため、ステート Aexit アクションと entry アクションはチャートで実行されません。

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

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

排他的 (OR) ステートの 2 番目のイベントの処理

前の例に基づいて、以下の例は 2 番目のイベント E_one が発生した場合に発生する現象を示しています。チャートでは、出力遷移の暗黙的な順序付けが使用されます (暗黙的な順序付けを参照)。

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

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

    [C_one] が真であるため、ステート A からステート B への遷移は有効になります。

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

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

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

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

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

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

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

排他的 (OR) ステートの 3 番目のイベントの処理

前の例に基づいて、以下の例は 3 番目のイベント E_two が発生した場合に発生する現象を示しています。チャートでは、出力遷移の暗黙的な順序付けが使用されます (暗黙的な順序付けを参照)。

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

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

    ステート B からステート A で、有効な可能性のある遷移が検出されます。[C_two] が偽であるため、遷移は無効です。ただし、アクティブなステート B には有効な自己ループ遷移が含まれています。

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

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

  4. 自己ループ遷移アクション A_four が実行されて完了します。

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

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

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

このシーケンスは、イベント E_two に関連する Stateflow チャートの実行を完了します。この例は、内部遷移と自己ループ遷移の違いを示しています。

コネクティブ ジャンクションへの内部遷移によるイベント処理

以下の例は、コネクティブ ジャンクションへの内部遷移による反復イベント処理の動作を示しています。

コネクティブ ジャンクションへの内部遷移による最初のイベント処理

以下の例は、最初のイベントに対するコネクティブ ジャンクションへの内部遷移の動作を示しています。チャートでは、出力遷移の暗黙的な順序付けが使用されます (暗黙的な順序付けを参照)。

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

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

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

  3. ステート A は自身の有効な遷移をチェックして、コネクティブ ジャンクションへの有効な内部遷移が存在することを検出します。

    条件が評価されて、いずれかの遷移が有効であるかどうかの判定が行われます。暗黙的な順序付けが適用されるため、条件を含むラベルが追加されたセグメントは、ラベルが追加されていないセグメントよりも前に評価されます。評価はジャンクションの 12 時の位置から始まり、時計回りの順序で処理されます。[C_two] は真であるため、ジャンクションへの内部遷移に続いて、ステート A.A2 への内部遷移が有効になります。

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

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

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

  7. ステート A.A2 の entry アクション (entA2()) が実行されて完了します。

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

このシーケンスは、ステート A1 がアクティブで条件 [C_two] が真の場合に、イベント E_one に関連する Stateflow チャートの実行を完了します。

コネクティブ ジャンクションへの内部遷移による 2 番目のイベント処理

前の例に続いて、以下の例は 2 番目のイベント E_one が発生した場合のジャンクションへの内部遷移の動作を示しています。チャートでは、出力遷移の暗黙的な順序付けが使用されます (暗黙的な順序付けを参照)。

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

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

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

  3. ステート A は自身の有効な遷移をチェックして、コネクティブ ジャンクションへの有効な内部遷移が存在することを検出します。

    条件が評価されて、いずれかの遷移が有効であるかどうかの判定が行われます。暗黙的な順序付けが適用されるため、条件を含むラベルが追加されたセグメントは、ラベルが追加されていないセグメントよりも前に評価されます。評価はジャンクションの 12 時の位置から始まり、時計回りの順序で処理されます。[C_two] は真であるため、ジャンクションへの内部遷移に続いて、ステート A.A2 への内部遷移が有効になります。

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

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

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

  7. ステート A.A2 の entry アクション (entA2()) が実行されて完了します。

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

このシーケンスは、ステート A2 がアクティブで条件 [C_two] が真の場合に、イベント E_one に関連する Stateflow チャートの実行を完了します。有効な内部遷移をもつステートの場合、アクティブなサブステートをいったん終了してからすぐに再入できます。

ヒストリ ジャンクションへの内部遷移

以下の例は、ヒストリ ジャンクションへの内部遷移の動作を示しています。

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

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

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

  3. ステート A は自身の有効な遷移をチェックして、ヒストリ ジャンクションへの有効な内部遷移が存在することを検出します。履歴情報に基づくと、最後にアクティブなステート、A.A1 が遷移先ステートになります。

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

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

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

  7. ステート A.A1 の entry アクションが実行されて完了します。

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

このシーケンスは、ヒストリ ジャンクションへの内部遷移が存在し、ステート A.A1 がアクティブな場合に、イベント E_one に関連する Stateflow チャートの実行を完了します。有効な内部遷移をもつステートの場合、アクティブなサブステートをいったん終了してからすぐに再入できます。