Main Content

Stateflow チャート内のメッセージ アクティビティの制御

メッセージは、ローカルで、または Simulink® モデルのチャート間でデータを通信する Stateflow® オブジェクトです。送信側チャートから、メッセージを送信または転送できます。受信側チャートでは、キューでメッセージが受信され、チャートによる評価が可能になるまで保持されます。

Simulink model with two Stateflow charts that communicate using a message.

Stateflow 演算子を使用すると、メッセージ データにアクセスし、メッセージを送信、受信、廃棄または転送することができます。また、メッセージが有効かどうかを判断することや、キュー内のメッセージ数を確認することもできます。詳細については、メッセージ送信による Stateflow チャートとの通信を参照してください。

メッセージ データへのアクセス

Stateflow メッセージにはデータ フィールドがあります。有効なメッセージのメッセージ データ フィールドの読み取りまたは書き込みを行うには、ドット表記構文を使用します。

message_name.data
メッセージ データに最初に値を割り当てずにメッセージを送信した場合、数値データの既定値は 0 になります。列挙データの場合は、定義の methods セクションで別の値を指定する場合を除き、定義の enumeration セクションで最初にリストされている値が既定となります。

まだキュー内にあるメッセージや、既に廃棄されているメッセージのメッセージ データにはアクセスできません。

メッセージの送信

出力メッセージまたはローカル メッセージを送信するには、send 演算子を使用します。

send(message_name)
たとえば、次のチャートでは、ステート A の entry アクションが、データ値 3 のメッセージ M を送信します。メッセージ スコープが Local の場合、メッセージはローカルの受信側キューに登録されます。メッセージ スコープが Output の場合、チャートは出力端子から Simulink モデル内の別のブロックへメッセージを送信します。

Stateflow chart that uses the send operator in a state.

1 つのタイム ステップで、1 つの出力端子から、または 1 つのローカル受信側キューに対して、複数のメッセージを送信できます。

チャートが受信側キューの容量を超えるメッセージを送信した場合、キューのオーバーフローが発生します。キューのオーバーフローによる結果は受信側キューのタイプによって異なります。

  • 内部キューでオーバーフローが発生した場合、Stateflow チャートは新しいメッセージを除外します。メッセージの [キュー オーバーフローの診断] プロパティを設定することで、診断アクションのレベルを制御できます。キュー オーバーフローの診断を参照してください。

  • 外部キューでオーバーフローが発生した場合、Queue (Simulink) ブロックは、ブロックの構成に応じて、新しいメッセージを除外するか、キューの一番古いメッセージを上書きします。Overwrite the oldest element if queue is full (Simulink)を参照してください。外部キューのオーバーフローでは、常に警告が発行されます。

遷移とアクションのガード

メッセージでは、遷移またはタイプが on のステート アクションをガードできます。タイム ステップ中に、ガード メッセージが初めて評価されると、チャートはそのメッセージをキューから削除し、メッセージを有効にします。メッセージが有効な間は、他の遷移やアクションからそのメッセージ データにアクセスできますが、別のメッセージがキューから削除されることはありません。

メッセージによる遷移のガード

次のチャートでは、メッセージ M が、ステート A からステート B への遷移をガードします。遷移は、以下の両方の条件が満たされている場合に行われます。

  • キュー内にメッセージが存在する。

  • メッセージのデータ値が 3 に等しい。

メッセージが存在しない場合や、データ値が 3 に等しくない場合は、遷移は行われません。メッセージが存在する場合は、遷移が行われるかどうかにかかわらず、メッセージはキューから削除されます。

Stateflow chart with two states called A and B. The message M guards the transition between the states.

メッセージによるステート on のアクションのガード

次のチャートでは、メッセージ M が、ステート Aon アクションをガードします。ステート A がアクティブになると、以下の両方の条件が満たされている場合に x の値が増分されます。

  • キュー内にメッセージが存在する。

  • メッセージのデータ値が 3 に等しい。

メッセージが存在しない場合や、データ値が 3 に等しくない場合は、x の値は変わりません。メッセージが存在する場合は、x が変更されるかどうかにかかわらず、メッセージはキューから削除されます。

Stateflow chart with a state called A. The message M guards the on action in the state.

メッセージの受信

入力メッセージまたはローカル メッセージをその受信側キューから抽出するには、receive 演算子を使用します。

receive(message_name)
有効なメッセージ M が存在する場合、receive(M)true を返します。有効なメッセージが存在しないものの、キュー内にメッセージがある場合、チャートはそのメッセージをキューから削除し、receive(M)true を返します。有効なメッセージが存在せず、キュー内にメッセージがない場合は、receive(M)false を返します。

たとえば、次のチャートでは、ステート Aduring アクションがキューでメッセージ M の有無をチェックし、以下の両方の条件が満たされている場合は x の値を増分します。

  • キュー内にメッセージが存在する。

  • メッセージのデータ値が 3 に等しい。

メッセージが存在しない場合や、データ値が 3 に等しくない場合は、x の値は変わりません。メッセージが存在する場合、チャートはデータ値に関係なくそのメッセージをキューから削除します。

Stateflow chart that uses the receive operator.

メッセージの廃棄

有効な入力メッセージまたはローカル メッセージを破棄するには、discard 演算子を使用します。

discard(message_name)
チャートでは、メッセージを廃棄した後に、同じタイム ステップ内でキューから別のメッセージを削除できます。チャートは、廃棄されたメッセージのデータにはアクセスできません。

たとえば、次のチャートでは、ステート Aduring アクションが、キューでメッセージ M の有無をチェックします。メッセージが存在する場合、チャートはそのメッセージをキューから削除します。3 に等しいデータ値がメッセージに含まれている場合、チャートはそのメッセージを廃棄します。

Stateflow chart that uses the discard operator.

メッセージの転送

有効な入力メッセージまたはローカル メッセージをローカル キューまたは出力端子に転送するには、forward 演算子を使用します。

forward(message_in_name,message_out_name)
チャートでは、メッセージを転送した後に、同じタイム ステップ内でキューから別のメッセージを削除できます。

入力メッセージの転送

次のチャートでは、ステート A が、入力キューでメッセージ M_in の有無をチェックします。メッセージが存在する場合、チャートはそのメッセージをキューから削除して、出力端子 M_out に転送します。チャートから転送されると、そのメッセージはステート A 内で有効ではなくなります。

Stateflow chart that uses the forward operator.

ローカル メッセージの転送

このチャートでは、ステート A とステート B の間の遷移で、メッセージ M_local のローカル キューがチェックされます。メッセージが存在する場合、この遷移によりそのメッセージが M_local から削除され、出力端子 M_out に転送します。

Stateflow chart that uses the forward operator.

メッセージが有効かどうかの判定

入力メッセージまたはローカル メッセージが有効かどうかをチェックするには、isvalid 演算子を使用します。

isvalid(message_name)
チャートがメッセージを受信側キューから削除し、転送や廃棄を行っていない場合、そのメッセージは有効です。

たとえば、次のチャートは、メッセージの廃棄で説明しているように最初にステート A を実行します。チャートがステート B を実行するとき、during アクションは、メッセージ M が有効かどうかをチェックします。メッセージが有効で、データ値が 6 に等しい場合、チャートはそのメッセージを廃棄します。

Stateflow chart that uses the isvalid operator.

キューの長さの判定

入力メッセージまたはローカル メッセージを受信する内部のキューのメッセージ数をチェックするには、length 演算子を使用します。

length(message_name)

たとえば、次のチャートでは、ステート Aduring アクションが、キューでメッセージ M の有無をチェックします。メッセージが存在する場合、チャートはそのメッセージをキューから削除します。キュー内に残っているメッセージがちょうど 7 個の場合、チャートは x の値を増分します。

Stateflow chart that uses the length operator.

length 演算子は、Queue (Simulink) ブロックによって管理される外部の受信側キューを使用する入力メッセージではサポートされません。

参考

| | | | | | (Simulink)

関連するトピック