Stateflow チャート内のメッセージ アクティビティの制御
メッセージは、ローカルで、または Simulink® モデルのチャート間でデータを通信する Stateflow® オブジェクトです。送信側チャートから、メッセージを送信または転送できます。受信側チャートでは、キューでメッセージが受信され、チャートによる評価が可能になるまで保持されます。
Stateflow 演算子を使用すると、メッセージ データにアクセスし、メッセージを送信、受信、廃棄または転送することができます。また、メッセージが有効かどうかを判断することや、キュー内のメッセージ数を確認することもできます。詳細については、メッセージ送信による Stateflow チャートとの通信を参照してください。
メッセージ データへのアクセス
Stateflow メッセージにはデータ フィールドがあります。有効なメッセージのメッセージ データ フィールドの読み取りまたは書き込みを行うには、ドット表記構文を使用します。
message_name.data
methods
セクションで別の値を指定する場合を除き、定義の enumeration
セクションで最初にリストされている値が既定となります。まだキュー内にあるメッセージや、既に廃棄されているメッセージのメッセージ データにはアクセスできません。
メッセージの送信
出力メッセージまたはローカル メッセージを送信するには、send
演算子を使用します。
send(message_name)
A
の entry アクションが、データ値 3
のメッセージ M
を送信します。メッセージ スコープが Local
の場合、メッセージはローカルの受信側キューに登録されます。メッセージ スコープが Output
の場合、チャートは出力端子から Simulink モデル内の別のブロックへメッセージを送信します。
1 つのタイム ステップで、1 つの出力端子から、または 1 つのローカル受信側キューに対して、複数のメッセージを送信できます。
チャートが受信側キューの容量を超えるメッセージを送信した場合、キューのオーバーフローが発生します。キューのオーバーフローによる結果は受信側キューのタイプによって異なります。
内部キューでオーバーフローが発生した場合、Stateflow チャートは新しいメッセージを除外します。メッセージの [キュー オーバーフローの診断] プロパティを設定することで、診断アクションのレベルを制御できます。キュー オーバーフローの診断を参照してください。
外部キューでオーバーフローが発生した場合、Queue (Simulink) ブロックは、ブロックの構成に応じて、新しいメッセージを除外するか、キューの一番古いメッセージを上書きします。Overwrite the oldest element if queue is full (Simulink)を参照してください。外部キューのオーバーフローでは、常に警告が発行されます。
遷移とアクションのガード
メッセージでは、遷移またはタイプが on
のステート アクションをガードできます。タイム ステップ中に、ガード メッセージが初めて評価されると、チャートはそのメッセージをキューから削除し、メッセージを有効にします。メッセージが有効な間は、他の遷移やアクションからそのメッセージ データにアクセスできますが、別のメッセージがキューから削除されることはありません。
メッセージによる遷移のガード
次のチャートでは、メッセージ M
が、ステート A
からステート B
への遷移をガードします。遷移は、以下の両方の条件が満たされている場合に行われます。
キュー内にメッセージが存在する。
メッセージのデータ値が 3 に等しい。
メッセージが存在しない場合や、データ値が 3 に等しくない場合は、遷移は行われません。メッセージが存在する場合は、遷移が行われるかどうかにかかわらず、メッセージはキューから削除されます。
メッセージによるステート on
のアクションのガード
次のチャートでは、メッセージ M
が、ステート A
の on
アクションをガードします。ステート A
がアクティブになると、以下の両方の条件が満たされている場合に x
の値が増分されます。
キュー内にメッセージが存在する。
メッセージのデータ値が 3 に等しい。
メッセージが存在しない場合や、データ値が 3 に等しくない場合は、x
の値は変わりません。メッセージが存在する場合は、x
が変更されるかどうかにかかわらず、メッセージはキューから削除されます。
メッセージの受信
入力メッセージまたはローカル メッセージをその受信側キューから抽出するには、receive
演算子を使用します。
receive(message_name)
M
が存在する場合、receive(M)
は true
を返します。有効なメッセージが存在しないものの、キュー内にメッセージがある場合、チャートはそのメッセージをキューから削除し、receive(M)
は true
を返します。有効なメッセージが存在せず、キュー内にメッセージがない場合は、receive(M)
は false
を返します。たとえば、次のチャートでは、ステート A
の during
アクションがキューでメッセージ M
の有無をチェックし、以下の両方の条件が満たされている場合は x
の値を増分します。
キュー内にメッセージが存在する。
メッセージのデータ値が 3 に等しい。
メッセージが存在しない場合や、データ値が 3 に等しくない場合は、x
の値は変わりません。メッセージが存在する場合、チャートはデータ値に関係なくそのメッセージをキューから削除します。
メッセージの廃棄
有効な入力メッセージまたはローカル メッセージを破棄するには、discard
演算子を使用します。
discard(message_name)
たとえば、次のチャートでは、ステート A
の during
アクションが、キューでメッセージ M
の有無をチェックします。メッセージが存在する場合、チャートはそのメッセージをキューから削除します。3 に等しいデータ値がメッセージに含まれている場合、チャートはそのメッセージを廃棄します。
メッセージの転送
有効な入力メッセージまたはローカル メッセージをローカル キューまたは出力端子に転送するには、forward
演算子を使用します。
forward(message_in_name,message_out_name)
入力メッセージの転送
次のチャートでは、ステート A
が、入力キューでメッセージ M_in
の有無をチェックします。メッセージが存在する場合、チャートはそのメッセージをキューから削除して、出力端子 M_out
に転送します。チャートから転送されると、そのメッセージはステート A
内で有効ではなくなります。
ローカル メッセージの転送
このチャートでは、ステート A
とステート B
の間の遷移で、メッセージ M_local
のローカル キューがチェックされます。メッセージが存在する場合、この遷移によりそのメッセージが M_local
から削除され、出力端子 M_out
に転送します。
メッセージが有効かどうかの判定
入力メッセージまたはローカル メッセージが有効かどうかをチェックするには、isvalid
演算子を使用します。
isvalid(message_name)
たとえば、次のチャートは、メッセージの廃棄で説明しているように最初にステート A
を実行します。チャートがステート B
を実行するとき、during
アクションは、メッセージ M
が有効かどうかをチェックします。メッセージが有効で、データ値が 6 に等しい場合、チャートはそのメッセージを廃棄します。
キューの長さの判定
入力メッセージまたはローカル メッセージを受信する内部のキューのメッセージ数をチェックするには、length
演算子を使用します。
length(message_name)
たとえば、次のチャートでは、ステート A
の during
アクションが、キューでメッセージ M
の有無をチェックします。メッセージが存在する場合、チャートはそのメッセージをキューから削除します。キュー内に残っているメッセージがちょうど 7 個の場合、チャートは x
の値を増分します。
length
演算子は、Queue (Simulink) ブロックによって管理される外部の受信側キューを使用する入力メッセージではサポートされません。
参考
discard
| forward
| isvalid
| length
| receive
| send
| Queue (Simulink)