Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

イベントを使用してチャートを実行

"イベント" とは、Stateflow® チャートでアクションの起動やトリガーを行うことができる非グラフィカル オブジェクトです。詳細については、イベントのブロードキャストによるモデル コンポーネントの同期を参照してください。

イベントに対する Stateflow チャートの対応

Stateflow チャートは周期的にイベントに応答します。

  1. イベントは非アクティブなチャートを起動します。

  2. チャートは、チャート階層の最上位から下位に向かって遷移とステート アクションを実行して、イベントに応答します。最初に、チャート レベルで次の処理が行われます。

    1. チャートはステート間の有効な遷移を確認します。

    2. チャートはアクティブ ステートに対して during および on アクションを実行します。

    3. チャートは階層の 1 つ下のレベルに進みます。

  3. チャートは次のイベントを受け取るまで非アクティブになります。

詳細については、Stateflow チャートの実行を参照してください。

Simulink モデルのイベント

Simulink® モデルでは、Stateflow チャートはモデル内の他のブロックから入力イベントを受け取ります。

イベントの処理中に、ステートまたは遷移アクションが、追加のステップをトリガーする明示的または暗黙的イベントを生成できます。以下に例を示します。

  • 演算子 send はローカルまたは出力イベントをブロードキャストできます。

  • 演算子 enter および exit は、チャートの実行がステートに入るか、ステートを出た時点で、暗黙的ローカル イベントを生成できます。

  • 演算子 change は、チャートが変数の値を設定した時点で、暗黙的ローカル イベントを生成できます。

どの場合でも、チャートは現在のアクティビティを中断して、新しいイベントを処理します。新しいイベントにより発生したアクティビティの実行が完了すると、チャートは中断前に実行中だったアクティビティに戻ります。

メモ

Simulink モデルでは、出力エッジ トリガー イベントの実行は出力データの値を 0 と 1 の間で切り替える処理と同等です。このような種類のイベントは、チャートの現在のアクティビティを中断しません。代わりに、受信ブロックはモデルが次にブロックを実行する時点でイベントを処理します。詳細については、出力イベントの送信による Simulink ブロックのアクティブ化を参照してください。

早期リターン ロジック

ローカル イベントの処理結果は、イベントの生成前に実行中だったアクションと競合する場合があります。アクションの種類に応じて、チャートは早期リターン ロジックを使用してこれらの競合を解決します。

アクション タイプ

早期リターン ロジック

ステートの entry アクションローカル イベントの処理後にステートがアクティブでなくなる場合、チャートはステートに入るための処理を停止します。チャートは entry アクションの残りのステートメントを実行しません。
ステートの during アクションローカル イベントの処理後にステートがアクティブでなくなる場合、チャートはステートの実行を停止します。チャートは during アクションの残りのステートメントを実行しません。
ステートの exit アクションローカル イベントの処理後にステートがアクティブでなくなる場合、チャートはステートから出るための処理を停止します。チャートは exit アクションの残りのステートメントを実行しません。また、遷移アクションと、ステートを出た結果発生するステート entry アクションも実行されません。
条件アクション内部または外部遷移パス、またはデフォルト遷移パスの親ステートが、ローカル イベントの処理後にアクティブでなくなる場合、チャートは遷移処理を停止します。チャートは遷移パスの残りのアクション、および遷移の結果発生する exit および entry アクションを実行しません。
遷移アクション遷移パスの親がアクティブでない場合、または親にアクティブなサブステートがある場合、チャートは遷移処理を停止します。チャートは遷移パスの残りのアクション、および遷移の結果発生する entry アクションを実行しません。

たとえば、次のチャートでは、入力イベント E とローカル イベント F がステート間の遷移をトリガーしています。

チャートがイベント E を受け取った時点でステート A がアクティブであるとします。チャートは次の手順でこのイベントに応答します。

  1. チャートは、アクティブ ステート A からステート B への遷移がイベント E の結果として有効であると判定します。

  2. チャートは有効な遷移の条件アクションを実行し、イベント F をブロードキャストします。

  3. チャートはステート A からステート B への遷移を中断し、イベント F を処理します。

  4. チャートは、アクティブ ステート A からステート C への遷移がイベント F の結果として有効であると判定します。

  5. ステート Aexit アクションが実行されます。

  6. ステート A が非アクティブになります。

  7. ステート C がアクティブになります。

  8. ステート Centry アクションが実行されます。

チャートがイベント F を処理した後、ステート C がチャートのアクティブ ステートとなります。ステート A はアクティブでなくなるため、チャートは早期リターン ロジックを使用し、ステート A からステート B への遷移を停止します。

ヒント

指示のないローカル イベント ブロードキャストは使用しないでください。指示のないローカル イベント ブロードキャストを使用すると、チャート内で不要な再帰的動作が発生する場合があります。代わりに、指示のあるブロードキャストを使用してローカル イベントを送信してください。詳細については、ローカル イベントをブロードキャストしてパラレル ステートを同期を参照してください。

指示のないローカル イベント ブロードキャストを検出する診断レベルを設定できます。[コンフィギュレーション パラメーター] ダイアログ ボックスで、[診断][Stateflow] ペインを開き、[指示のないイベント ブロードキャスト] パラメーターを [なし][警告] または [エラー] に設定します。既定の設定は [警告] です。

スタンドアロン チャートのイベント

スタンドアロンの Stateflow チャートは、関数 step、または MATLAB® の入力イベント関数を呼び出した時点で、イベント入力を受け取ります。

スタンドアロン チャートは、絶対時間時相論理演算子 afteratevery に関連付けられた MATLAB timer オブジェクトからの暗黙的イベントも受け取ります。これらの演算子は時相論理を時計時間で定義します。時相論理演算子に関連付けられたステートが、チャートによる暗黙的イベントの処理より前に非アクティブになった場合、このイベントはチャートを起動しません。

イベントのキュー

チャートがイベントを受け取った時点で他の演算の処理中である場合、チャートはイベントをキューに入れ、現在のステップが完了した時点で実行できるようにします。チャート オブジェクトの作成時に構成オプション -eventQueueSize を設定することにより、イベント キューのサイズを指定できます。詳細については、チャート オブジェクトの構成オプションを参照してください。

たとえば、次のチャートでは、入力イベント E および F がステート間の遷移をトリガーしています。SendF が MATLAB パスの関数で、入力イベント関数 F を呼び出していると仮定します。

チャートがイベント E を受け取った時点でステート A がアクティブであるとします。チャートは次の手順でこのイベントに応答します。

  1. チャートは、アクティブ ステート A からステート B への遷移がイベント E の結果として有効であると判定します。

  2. チャートは有効な遷移の条件アクションを実行し、関数 SendF を呼び出します。

  3. SendF は入力イベント関数 F を呼び出します。チャートは条件アクションの処理でビジー状態のため、イベント F はキューに入れられます。

  4. チャートが条件アクションの実行を完了します。

  5. ステート Aexit アクションが実行されます。

  6. ステート A が非アクティブになります。

  7. ステート B がアクティブになります。

  8. ステート Bentry アクションが実行されます。

  9. チャートがキュー内のイベント F の処理を開始します。

  10. チャートは、アクティブ ステート B からステート D への遷移がイベント F の結果として有効であると判定します。

  11. ステート Bexit アクションが実行されます。

  12. ステート B が非アクティブになります。

  13. ステート D がアクティブになります。

  14. ステート Dentry アクションが実行されます。

チャートがイベント F を処理した後、ステート D がチャートのアクティブ ステートとなります。

参考

| | | | | | |

関連するトピック