Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

チャート セマンティク ルールの概要

チャートの入力

一連の既定のフロー パスが実行されます (一連のフロー チャートの実行 を参照)。このアクションによってステート Entry が発生せず、チャートにパラレル構造がある場合は、各パラレル ステートがアクティブになります (ステートの移行 を参照)。

既定のフロー パスの実行によってステートの移行が発生しなかった場合は、ステートの矛盾エラーが発生します。

アクティブ チャートの実行

チャートにステートが存在しない場合は、実行ごとにチャートが初期化されることになります。そうでない場合は、アクティブな子が実行されます。パラレル ステートは、アクティブになるのと同じ順序で実行されます。

ステートの移行

  1. ステートの親がアクティブでない場合、手順 1 ~ 4 を親について実行します。

  2. このステートがパラレルの場合は、移行の順序で優先される (先に処理される) 兄弟関係のステートがすべてアクティブになっていることをチェックします。そうでない場合は、これらのステートについて、手順 1 ~ 5 を最初に実行します。

    パラレル (AND) ステートは、明示的な順序付け (既定値) または暗黙的な順序付けのどちらを使用するかに基づいて、入る順序が設定されます。詳細は、パラレル ステートの明示的な順序付けパラレル ステートの暗黙的な順序付けを参照してください。

  3. ステートをアクティブとしてマークします。

  4. entry アクションを実行します。

  5. 必要な場合は、子に移行します。

    1. ステートにヒストリ ジャンクションが含まれており、直前のチャートの初期化後に、このステートのアクティブな子が同じ位置に存在している場合は、該当する子の entry アクションを実行します。そうでない場合は、ステートの既定のフロー パスを実行します。

    2. このステートにパラレル構造がある場合、すなわちパラレル ステートである子が存在する場合、ステートに入る手順 1 ~ 5 を各ステートについて、そのステートに入る順序に従って実行します。

    3. このステートが 1 つだけ子サブステートをもつ場合は、デフォルト遷移が存在するかどうかに関係なく、親がアクティブになるとサブステートもアクティブになります。親ステートを入力すると、自動的にサブステートがアクティブになります。内部遷移が存在しても、アクティブなサブステートの決定には影響ありません。

  6. このステートがパラレル ステートである場合は、移行の順序で次の兄弟関係のステート (存在する場合) の移行ステップをすべて実行します。

  7. 遷移パスの親が現在のステートの親と異なる場合は、直接の親の移行手順 6 と 7 を実行します。

アクティブ ステートの実行

  1. 一連の外部フロー チャートが実行されます (一連のフロー チャートの実行を参照)。このアクションが原因でステートの遷移が発生した場合は、実行は停止します (この手順は、パラレル ステートでは不要であることに注意してください)。

  2. during アクションと valid on-event アクションが実行されます。

  3. 一連の内部フロー チャートが実行されます。このアクションが原因でステートの遷移が発生しない場合は、アクティブな子が手順 1 から実行されます。パラレル ステートは、アクティブになるのと同じ順序で実行されます。

アクティブ ステートの終了

  1. これがパラレル ステートである場合は、このステートが非アクティブになった後に兄弟関係のステートがすべてアクティブになったことを確認します。そうでない場合は、各兄弟関係のステートで終了手順をすべて実行します。

  2. いずれかのアクティブな子が存在する場合は、移行時とは逆の順序で各ステートの終了手順を実行します。

  3. exit アクションを実行します。

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

一連のフロー チャートの実行

フロー チャートは、一連の開始遷移で以下の手順 1 から順に実行されます。内部フロー チャートの開始遷移は、各ステートを起点としてそのステート内に完全に存在するすべての遷移セグメントです。外部フロー チャートの開始遷移は、各ステートを起点としてその親の外部に少なくとも部分的に存在するすべての遷移セグメントです。既定のフロー チャートの開始遷移は、同じ親を始点とするすべてのデフォルト遷移セグメントです。

  1. 一連の遷移セグメントの順序付けが行われます。

  2. テスト対象のセグメントが残っている場合に、セグメントの妥当性がテストされます。セグメントが無効な場合は、次のセグメントがテストされます。セグメントが有効な場合は、遷移先に応じてテストが実行されます。

    ステート

    1. 遷移セグメントのテストが終了し、各先行ジャンクションから元の開始遷移への遷移セグメントをバックアップして含める形で、遷移パスが作成されます。

    2. 遷移パスで親の直下の子供に該当するステートが終了します (アクティブ ステートの終了を参照)。

    3. 最終遷移パスからの遷移アクションが実行されます。

    4. 遷移先ステートがアクティブになります (ステートの移行 を参照)。

    出力遷移セグメントをもたないジャンクション

    ステート Exit またはステート Entry を伴わずに、テストが停止します。

    出力遷移セグメントをもつジャンクション

    ジャンクションから一連の出力セグメントに対して手順 1 が繰り返されます。

  3. ジャンクションで出力遷移セグメントをすべてテストしてから、ジャンクションに至る入力遷移セグメントをバックトラックして、バックトラック セグメントに続く次の遷移セグメントから、手順 2 を続行します。すべての開始遷移のテストが完了すると、一連のフロー チャートの実行が終了します。

イベント ブロードキャストの実行

出力エッジ トリガー イベントの実行は、出力データ値の変更と同義です。その他のイベントはすべて、以下のように実行されます。

  1. イベントのレシーバーがアクティブな場合は、そのイベントが実行されます (アクティブ チャートの実行アクティブ ステートの実行 を参照)。send() 関数を使用して指示のあるイベント ブロードキャストが実行される場合を除き、イベントのレシーバーはイベントの親です。

    イベントのレシーバーがアクティブでない場合は、何も起こりません。

  2. イベントのブロードキャスト後に、ブロードキャスターは、イベントの原因になったアクション ステートメントのタイプに基づいて早期リターン ロジックを実行します。

    アクション タイプ

    早期リターン ロジック

    ステート Entry

    イベント ブロードキャストの終了時点でステートがアクティブでない場合は、ステートに移行する残りの手順は実行されません。

    ステート Exit

    イベント ブロードキャストの終了時点でステートがアクティブでない場合は、残りの exit アクションとステート遷移の手順は実行されません。

    ステート During

    イベント ブロードキャストの終了時点でステートがアクティブでない場合は、アクティブなステートを実行する残りの手順は実行されません。

    条件

    イベント ブロードキャストの終了時点で、内部フロー チャートまたは外部フロー チャートの起点のステートまたは既定のフロー チャートの親ステートがアクティブでない場合は、一連のフロー チャートを実行する残りの手順は実行されません。

    遷移

    遷移パスの親がアクティブでない場合または親にアクティブな子が存在しない場合は、残りの遷移アクションとステート entry アクションは実行されません。