Main Content

Stateflow のセマンティクス

Stateflow® では、Stateflow チャートの実行動作がセマンティクスにより記述されます。チャートがどのように実行されるかには、次を含むさまざまな要因が影響します。

  • ステートの明示的または暗黙的な順序付け

  • ステート間の遷移順序

  • パラレル ステートまたはスーパーステートにより送信されるイベント

チャートを作成する際には、特定の動作が想定されます。これらの要因がチャートにどう影響するのかを理解することにより、グラフィカルおよび非グラフィカルオブジェクトの意図された相互作用によって動作するチャートを作成することができます。グラフィカルおよび非グラフィカルオブジェクトは、すべての Stateflow チャートの基本ブロックです。

Stateflow オブジェクト

Stateflow オブジェクトは Stateflow チャートの基本ブロックです。これらのオブジェクトは、グラフィカルまたは非グラフィカルとして分類できます。グラフィカル オブジェクトは、チャート内にグラフィカルに表示されるオブジェクトで構成されます。非グラフィカル オブジェクトはチャート内にテキストで表示され、多くの場合、データ、イベントおよびメッセージを参照します。次のチャートは、グラフィカルと非グラフィカル両方のさまざまなオブジェクトを示しています。

Stateflow objects in a chart.

この例の詳細については、実行時の Stateflow オブジェクトの相互作用を参照してください。

グラフィカル オブジェクト

グラフィカル オブジェクトを作成するには、Stateflow エディターのオブジェクト パレットを使用します (Stateflow エディターの操作を参照)。

グラフィカル オブジェクトタイプ参照

フロー チャート

判定ロジック パターンStateflow でのフロー チャートの作成
ループ ロジック パターン

関数

グラフィカル関数グラフィカル関数の定義によるロジック パターンの再利用
MATLAB® 関数MATLAB 関数の定義による MATLAB コードの再利用
真理値表関数真理値表を使用して組み合わせ論理をモデル化
Simulink® 関数Stateflow チャートでの Simulink 関数の再利用

ジャンクション

コネクティブ ジャンクション遷移とジャンクションを結合して分岐パスを作成
ヒストリ ジャンクションヒストリ ジャンクションを使用した前のサブステート アクティビティの再開

ステート

排他的 (OR) 構造が設定されたステート排他的 (OR) ステート構造
パラレル (AND) 構造が設定されたステートパラレル (AND) ステート構造
サブステートとスーパーステートサブステートとスーパーステートの作成

遷移

オブジェクト間の遷移動作モード間の遷移
デフォルト遷移デフォルト遷移を使用した最初のサブステート アクティビティの指定
内部遷移内部遷移を使用したチャートの実行の制御
自己ループ遷移自己ループ遷移

非グラフィカル オブジェクト

非グラフィカル オブジェクトはチャート内でテキストを使って作成します。詳細については、Stateflow データの追加チャートでのイベントの定義チャートでのメッセージの定義を参照してください。非グラフィカル オブジェクトの例には次のようなものがあります。

非グラフィカル オブジェクト説明参照
条件真である場合に遷移パスが有効であることを指定する論理式であり、遷移ラベルの一部

遷移のアクションの定義条件

条件アクション条件が真であると評価されるとすぐに実行されるアクションであり、遷移ラベルの一部

遷移のアクションの定義条件アクション

ステート アクションステートがアクティブであるときに実行されるアクション (データの初期化や更新など) を指定する式であり、ステートのラベルの一部

ステートのアクションの定義

関数の呼び出しチャート内の特定の関数をアクティブにするために使用する式MATLAB 関数の定義による MATLAB コードの再利用Stateflow チャートでの Simulink 関数の再利用
時相論理ステートメントチャート アクションを制御するために使用する演算子時相論理を使用したチャート実行の制御

チャートの入力

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

既定のフロー パスの実行によってステート 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 アクションは実行されません。

関連するトピック