メッセージは、ローカルで、または 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 ブロックは、ブロックの構成に応じて、新しいメッセージを除外するか、キューの一番古いメッセージを上書きします。Overwrite the oldest element if queue is full, Overwrite the oldest element if queue is fullOverwrite the oldest element if queue is fullOverwrite the oldest element if queue is fullを参照してください。外部キューのオーバーフローでは、常に警告が発行されます。
メッセージでは、遷移またはタイプが 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 ブロックによって管理される外部の受信側キューを使用する入力メッセージではサポートされません。
discard | forward | isvalid | length | Queue | receive | send