チャートまたはステートに入る
チャートとステートの entry は次の場合に発生します。
チャートがはじめてアクティブになる場合。これは、チャートの初期化と呼ばれます。
ステートへの有効な遷移が存在する場合。遷移の評価を参照してください。
チャートまたはステートに入るためのワークフロー
次のフロー チャートは、Stateflow® がチャートまたはステートに入るために行われるイベントの進行を示しています。このフロー チャートでは、現在のステートが、決定またはプロセスの実行されているステートを参照します。
チャート Entry
Stateflow チャートがはじめてアクティブになることを初期化と呼びます。チャートの初期化が発生すると、チャートに入り、Stateflow が排他的 (OR) ステートのデフォルト遷移をすべて実行します。チャートの最上位のステートがパラレル (AND) である場合、それらは順序番号に基づいてアクティブになります。
チャートで時間 t = 0
の前にいずれかのデフォルト遷移を実行するには、[チャート プロパティ] ダイアログ ボックスで [初期化時に指定されたチャートを実行 (入力)] チェック ボックスをオンにします。このオプションを使用すると、Simulink® の初期化と同時に Stateflow チャートが初期化されます。その後、モデルの初期化フェーズでチャートのデフォルト遷移のパスが実行されます。
ステート Entry
ステートが entry 対象としてマークされている場合は、ステートの entry アクションが実行されます。チャートがアクティブになり初期化が済むと、最上位ステートがアクティブになります。ステートは、以下のいずれかの方法で entry 対象としてマークされます。
入力遷移がステートの境界線に交差する。
入力遷移がステートの境界線で終了する。
ステートがアクティブ ステートのパラレル ステートの子である。
entry アクション
entry アクションの前には接頭辞 entry
または en
(省略形) が追加され、その後に必須のコロン (:
)、さらに 1 つ以上のアクションが続きます。複数のアクションを区切るには、キャリッジ リターン、セミコロン (;
)、またはコンマ (,
) を使用します。ステートメントに対しステート アクション タイプを明示的に指定しない場合、チャートではそのステートメントを entry
,during
アクションとして扱います。
Stateflow チャートに入る
この例では、チャートがはじめてアクティブになるときにチャートの初期化が発生します。
チャートがスリープするまでチャートまたはステートに入るためのワークフローに従うと、チャート初期化のステップは次のような順序になります。
デフォルト遷移のアクションが実行され、
x = 0
、y = 0
、z = 0
になります。StateA
が entry 対象としてマークされます。StateA
は非アクティブな親のサブステートではありません。StateA
に対してentry
アクションを実行します。ここでx = 1
になります。StateA
は、最初に entry 対象としてマークされたステートです。StateA
にはヒストリ ジャンクションが含まれません。サブステート
StateA1
へのデフォルト遷移があります。遷移の評価のフロー チャートに移動します。遷移の評価のフロー チャートに従い、
StateA1
をentry
対象としてマークします。exit アクションのフロー チャートに移動します。現在のステート
StateA
は、遷移先ステートStateA1
のスーパーステートです。entry アクションのフロー チャートに戻ります。StateA1
は非アクティブな親のサブステートではありません。StateA1
に対してentry
アクションを実行します。ここでx = 3
になります。StateA1
は、最初に entry 対象としてマークされたステートです。StateA1
にはヒストリ ジャンクションが含まれません。StateA1
にはデフォルト遷移が含まれません。StateA1
にはサブステートがひとつも含まれません。チャートはスリープします。
ステップ 1 ~ 14 は初期のタイム ステップで発生します。これでチャートの初期化プロセスが完了します。
ヒストリ ジャンクションを使用してステートに入る
Stateflow チャートで、デフォルト遷移に関係なく、以前にアクティブだったサブステートを記憶してそこに戻るには、ヒストリ ジャンクションを使用します。ヒストリ ジャンクションをステート内に配置すると、排他的 (OR) サブステートに通じるデフォルト遷移がオーバーライドされます。ヒストリ ジャンクションをステート内に配置した後は、entry に際して Stateflow チャートは以前にアクティブだったサブステートを記憶しており、そこに入ることになります。ヒストリ ジャンクションは、配置された階層のレベルに対してのみ適用されます。
この例では、ライトはオンかオフのどちらかとなります。これらのオプションは、ステート Power_on
および Power_off
によって示されます。オプションは入力イベント switch_on
および switch_off
によって制御されます。ライトがオンの場合、これはほの暗いか明るいかのいずれかになります。これらのオプションは、ステート Low
および High
によって示され、入力イベント switch_low
および switch_high
によって制御されます。
最初は、チャートはスリープ状態です。ステート Power_off
がアクティブです。ステート Power_on
が前回アクティブであったとき、その際アクティブだったサブステートは High
でした。イベント switch_on
が発生して、ステート Power_on
が entry 対象としてマークされます。この時点で p = 0
です。
チャートがスリープするまでチャートまたはステートに入るためのワークフローに従うと、ステート Power_on
に入るための実行ステップは次のような順序になります。
Power_on
は非アクティブな親の子ではありません。Power_on
に対する entry アクションはありません。Power_on
は、最初に entry 対象としてマークされたステートです。Power_on
にはヒストリ ジャンクションがあります。High
は、前にアクティブだったサブステートです。ここでp = 2
になります。High
にはヒストリ ジャンクションが含まれません。High
にはデフォルト遷移が含まれません。High
にはサブステートがひとつも含まれません。チャートはスリープします。
これで Power_on
および High
に対する entry
アクションが完了します。
スーパートランジションを使用してステートに入る
スーパートランジションは、チャート内の異なるレベル間での遷移です。スーパートランジションが行われるのは、最上位のチャート内のステートといずれかのサブチャート内のステートの間か、チャート内の同一のレベルまたは異なるレベルで、別のサブチャートに属するステートの間です。チャート内の任意数のレベルにまたがるスーパートランジションを作成できます。
スーパートランジションを通じてステートに入る場合、最終的な遷移先への entry アクションを実行する前に、そのスーパーステートをアクティブとしてマークし、そこへの entry アクションを実行しなければなりません。この例では、StateB1
が StateA2
からの entry 対象としてマークされています。この時点で、x = 5
、y = 5
、z = 1
です。
チャートがスリープするまでチャートまたはステートに入るためのワークフローに従うと、ステート StateB1
に入るための実行ステップは次のような順序になります。
StateB1
は非アクティブな親 (StateB
) のサブステートです。StateB
がアクティブとしてマークされます。StateB
は非アクティブな親のサブステートではありません。StateB
に対して entry アクションを実行します。ここでx = 4
になります。StateB
は、最初に entry 対象としてマークされたステートではありません。StateB1
に対して entry アクションを実行します。ここでx = 3
になります。StateB1
は、最初に entry 対象としてマークされたステートです。StateB1
にはヒストリ ジャンクションがありません。StateB1
にはデフォルト遷移が含まれません。StateB1
にはサブステートがひとつも含まれません。チャートはスリープします。
これで StateB
および StateB1
に対する entry
アクションが完了します。