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) ブロックは、ブロックの構成に応じて、新しいメッセージを除外するか、キューの一番古いメッセージを上書きします。キューが満杯の場合は最も古い要素を上書き (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)