イベントを使用してチャートを実行
"イベント" とは、Stateflow® チャートでアクションの起動やトリガーを行うことができる非グラフィカル オブジェクトです。詳細については、イベントのブロードキャストによるモデル コンポーネントの同期を参照してください。
イベントに対する Stateflow チャートの対応
Stateflow チャートは周期的にイベントに応答します。
イベントは非アクティブなチャートを起動します。
チャートは、チャート階層の最上位から下位に向かって遷移とステート アクションを実行して、イベントに応答します。最初に、チャート レベルで次の処理が行われます。
チャートはステート間の有効な遷移を確認します。
チャートはアクティブ ステートに対して
during
およびon
アクションを実行します。チャートは階層の 1 つ下のレベルに進みます。
チャートは次のイベントを受け取るまで非アクティブになります。
詳細については、Stateflow チャートの実行を参照してください。
Simulink モデルのイベント
Simulink® モデルでは、Stateflow チャートはモデル内の他のブロックから入力イベントを受け取ります。
イベントの処理中に、ステートまたは遷移アクションが、追加のステップをトリガーする明示的または暗黙的イベントを生成できます。以下に例を示します。
どの場合でも、チャートは現在のアクティビティを中断して、新しいイベントを処理します。新しいイベントにより発生したアクティビティの実行が完了すると、チャートは中断前に実行中だったアクティビティに戻ります。
メモ
Simulink モデルでは、出力エッジ トリガー イベントの実行は出力データの値を 0 と 1 の間で切り替える処理と同等です。このような種類のイベントは、チャートの現在のアクティビティを中断しません。代わりに、受信ブロックはモデルが次にブロックを実行する時点でイベントを処理します。詳細については、出力イベントの送信による Simulink ブロックのアクティブ化を参照してください。
早期リターン ロジック
ローカル イベントの処理結果は、イベントの生成前に実行中だったアクションと競合する場合があります。アクションの種類に応じて、チャートは早期リターン ロジックを使用してこれらの競合を解決します。
アクション タイプ | 早期リターン ロジック |
---|---|
ステートの entry アクション | ローカル イベントの処理後にステートがアクティブでなくなる場合、チャートはステートに入るための処理を停止します。チャートは entry アクションの残りのステートメントを実行しません。 |
ステートの during アクション | ローカル イベントの処理後にステートがアクティブでなくなる場合、チャートはステートの実行を停止します。チャートは during アクションの残りのステートメントを実行しません。 |
ステートの exit アクション | ローカル イベントの処理後にステートがアクティブでなくなる場合、チャートはステートから出るための処理を停止します。チャートは exit アクションの残りのステートメントを実行しません。また、遷移アクションと、ステートを出た結果発生するステート entry アクションも実行されません。 |
条件アクション | 内部または外部遷移パス、またはデフォルト遷移パスの親ステートが、ローカル イベントの処理後にアクティブでなくなる場合、チャートは遷移処理を停止します。チャートは遷移パスの残りのアクション、および遷移の結果発生する exit および entry アクションを実行しません。 |
遷移アクション | 遷移パスの親がアクティブでない場合、または親にアクティブなサブステートがある場合、チャートは遷移処理を停止します。チャートは遷移パスの残りのアクション、および遷移の結果発生する entry アクションを実行しません。 |
たとえば、次のチャートでは、入力イベント E
とローカル イベント F
がステート間の遷移をトリガーしています。
チャートがイベント E
を受け取った時点でステート A
がアクティブであるとします。チャートは次の手順でこのイベントに応答します。
チャートは、アクティブ ステート
A
からステートB
への遷移がイベントE
の結果として有効であると判定します。チャートは有効な遷移の条件アクションを実行し、イベント
F
をブロードキャストします。チャートはステート
A
からステートB
への遷移を中断し、イベントF
を処理します。チャートは、アクティブ ステート
A
からステートC
への遷移がイベントF
の結果として有効であると判定します。ステート
A
でexit
アクションが実行されます。ステート
A
が非アクティブになります。ステート
C
がアクティブになります。ステート
C
でentry
アクションが実行されます。
チャートがイベント F
を処理した後、ステート C
がチャートのアクティブ ステートとなります。ステート A
はアクティブでなくなるため、チャートは早期リターン ロジックを使用し、ステート A
からステート B
への遷移を停止します。
ヒント
指示のないローカル イベント ブロードキャストは使用しないでください。指示のないローカル イベント ブロードキャストを使用すると、チャート内で不要な再帰的動作が発生する場合があります。代わりに、指示のあるブロードキャストを使用してローカル イベントを送信してください。詳細については、ローカル イベントをブロードキャストしてパラレル ステートを同期を参照してください。
シミュレーション時に Stateflow チャートは指示のないローカル イベント ブロードキャストを検出できます。診断アクションのレベルを制御するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断] 、 [Stateflow] ペインで、[指示のないイベント ブロードキャスト] パラメーターを [なし]
、[警告]
、または [エラー]
に設定します。既定の設定は [警告]
です。詳細については、指示のないイベント ブロードキャスト (Simulink)を参照してください。
スタンドアロン チャートのイベント
スタンドアロンの Stateflow チャートは、関数 step
、または MATLAB® の入力イベント関数を呼び出した時点で、イベント入力を受け取ります。
スタンドアロン チャートは、絶対時間の時相論理演算子 after
、at
、every
に関連付けられた MATLAB timer
オブジェクトからの暗黙的イベントも受け取ります。これらの演算子は時相論理を時計時間で定義します。時相論理演算子に関連付けられたステートが、チャートによる暗黙的イベントの処理より前に非アクティブになった場合、このイベントはチャートを起動しません。
イベントのキュー
チャートがイベントを受け取った時点で他の演算の処理中である場合、チャートはイベントをキューに入れ、現在のステップが完了した時点で実行できるようにします。チャート オブジェクトの作成時に構成オプション -eventQueueSize
を設定することにより、イベント キューのサイズを指定できます。詳細については、チャート オブジェクトの構成オプションを参照してください。
たとえば、次のチャートでは、入力イベント E
および F
がステート間の遷移をトリガーしています。SendF
が MATLAB パスの関数で、入力イベント関数 F
を呼び出していると仮定します。
チャートがイベント E
を受け取った時点でステート A
がアクティブであるとします。チャートは次の手順でこのイベントに応答します。
チャートは、アクティブ ステート
A
からステートB
への遷移がイベントE
の結果として有効であると判定します。チャートは有効な遷移の条件アクションを実行し、関数
SendF
を呼び出します。SendF
は入力イベント関数F
を呼び出します。チャートは条件アクションの処理でビジー状態のため、イベントF
はキューに入れられます。チャートが条件アクションの実行を完了します。
ステート
A
でexit
アクションが実行されます。ステート
A
が非アクティブになります。ステート
B
がアクティブになります。ステート
B
でentry
アクションが実行されます。チャートがキュー内のイベント
F
の処理を開始します。チャートは、アクティブ ステート
B
からステートD
への遷移がイベントF
の結果として有効であると判定します。ステート
B
でexit
アクションが実行されます。ステート
B
が非アクティブになります。ステート
D
がアクティブになります。ステート
D
でentry
アクションが実行されます。
チャートがイベント F
を処理した後、ステート D
がチャートのアクティブ ステートとなります。
参考
after
| at
| change
| enter
| every
| exit
| send
| timer