Main Content

Queue ブロックを使用したメッセージの管理

この例では Queue ブロックを使用してメッセージを格納し、キューに入れる方法を説明します。Queue ブロックを使用すると、メッセージ遷移中のメッセージのストレージ容量、上書きポリシー、および並べ替えポリシーを指定できます。

キュー並べ替えポリシーを使用したメッセージ遷移の操作

Queueブロックは、以下の 3 つのメッセージ並べ替えポリシーをサポートしています。

  • 後入れ先出し (LIFO) — ストレージ内の最も新しいメッセージが最初に出ていく。

  • 先入れ先出し (FIFO) — ストレージ内の最も古いメッセージが最初に出ていく。

  • 優先順位 — メッセージは優先順位に従って並べ替えられる。優先順位キューは、[Overwrite the oldest element if queue is full] チェック ボックスがオフであるときのみ使用できます。

この例では、メッセージの送受信のアニメーション化および理解で紹介したシンプルなメッセージベースの通信を使用します。このモデルには、Message Flow 1 と Message Flow 2 が含まれます。前者では Sine Wave1 から Scope1 へ、後者では Sine Wave2 から Scope2 へとメッセージが流れます。

モデルの説明

Message Flow 1 と Message Flow 2 において以下とします。

  • Sine Wave1 と Sine Wave2 の [サンプル時間] パラメーターは 0.1 に設定されています。これらは同一の正弦波ソースです。

  • Receive1 と Receive2 の [サンプル時間] パラメーターは 0.5 に設定されています。これらは同一の Receive ブロックです。

  • Queue1 と Queue2 の容量は 100 です。両方のキューが同じ容量を持ちます。

  • ブロック ラベルの下に表示されているように、Queue1 の並べ替えポリシーは LIFO で、Queue2 は FIFO です。2 つのメッセージ フロー シナリオの唯一の違いが、このキュー並べ替えポリシーです。

  • Sine Wave1、Receive1、Receive2 間の信号はログに記録されます。

モデルのシミュレーションと結果の確認

モデルのシミュレーションを実行して、その結果をシミュレーション データ インスペクターで確認します。

Sine Wave1 からの出力を観察します。SineWave2 からの出力は SineWave1 と同一のため、表示されません。Receive1 からの信号が、その正弦波をサンプル間の間隔を長くして表現したものになっていることを観察します。しかし、Receive2 からの信号は、正のピーク値に達する正弦波の最初の部分になっています。これは、Queue ブロックの並べ替えポリシーが FIFO に設定されており、その容量がメッセージを格納するのに十分であるためです。

Queue ブロック メッセージの上書きポリシー

キューが一杯になったときの Queue ブロック メッセージの上書きポリシーを指定することもできます。

  • 既定では、[Overwrite the oldest element if queue is full] チェック ボックスはオンになっています。ブロックは、ストレージ内の最も古いメッセージを上書きしながら、常に受信メッセージを受け入れるように設定されています。この場合、最も古いメッセージがブロックにより上書きされますが、ブロックから出ていくメッセージはキュー並べ替えポリシーによって決定されます。

以下のキュー動作例では、容量 8 の FIFO キューおよび LIFO キューへの到着時間に基づいて、メッセージに番号が振られています。番号 9 の新しいメッセージが到着します。キュー内で最も古い要素はメッセージ 1 であるため、FIFO のケースと LIFO のケースにおいて、メッセージ 9 によってメッセージ 1 が置き換えられます。しかし、このプロセスにおけるキューの Head (先頭) と Tail (末尾) の変化を観察してください。FIFO キューでは、メッセージ 2 が最初に出ていきます。メッセージ 1 が置き換えられた後、それが最も古いメッセージだからです。LIFO キューでは、メッセージ 9 が最初に出ていきます。それがストレージに最も新しく到着したメッセージだからです。メッセージが出ていった後、新しいメッセージ 10 が到着します。キューは、この新しいメッセージを空のストレージ ビンに受け入れます。

  • [Overwrite the oldest element if queue is full] チェック ボックスがオフの場合、Queue ブロックのアイコンが変わり、キューが満杯のときは新しいメッセージを受け入れなくなります。これは、ブロッキング キュー動作です。

上書きポリシー有効時の Queue ブロック

QueueSortingPoliciesModelSequenceViewer モデルにおいて、Message Flow 1 および Message Flow 2 の Queue ブロックの容量を 15 に変更します。容量を小さくすると、受信メッセージによってストレージの既存メッセージが上書きされるようになります。

モデルのシミュレーションを実行し、Sequence Viewer ブロックを開きます。Sequence Viewer ブロックで上にスクロールするか、左側にある [最初のイベントに移動] アイコンをクリックします。FIFO ポリシーと LIFO ポリシーに従ってブロックを出ていくメッセージを観察します。

どちらの Queue ブロックにも容量制限があります。容量がいっぱいになると、新しい受信メッセージによってキュー内の最も古い既存のメッセージが上書きされます。下にスクロールして、Sequence Viewer ブロックに既存のメッセージを上書きするメッセージが表示されるのを観察します。

ブロッキング キュー動作の例

QueueOverWritingPolicyModel を開き、ブロッキング キュー動作を確認します。

Receive ブロックで、[サンプル時間] パラメーターを 0.5 に設定します。

Queue ブロックで以下を観察します。

  • [Overwrite the oldest element if queue is full] チェック ボックスがオフである。ブロック アイコンの変化を観察します。

  • [Capacity] パラメーターが 16 に設定されている。

  • [Statistics] タブの [Number of entities departed, d] チェック ボックスと [Number of entities in block, n] チェック ボックスがオンである。

モデルのシミュレーションと結果の確認

モデルのシミュレーションを実行します。診断ビューアーに表示される警告を観察します。Send ブロックによって送信されたメッセージがシミュレーション中に破棄されました。

[Overwrite the oldest element if queue is full] チェック ボックスがオフのとき、Queue ブロックはメッセージをブロックします。Queue ブロックの容量を増やすことでメッセージの破棄を防止できます。

統計を使用したキュー動作の解析

[Overwrite the oldest element if queue is full] チェック ボックスがオフのとき、[Statistics] タブが有効になります。[Statistics] タブを使用して、出力端子を有効にし、Queue ブロックの統計を観察します。統計はコード生成ではサポートされません。

[Number of Messages in Block] と [Number of Messages Departed] のラベルが付いた信号を観察します。シミュレーション時間 2 までに、ストレージ内はキューの容量である 16 のメッセージになります。以降、[Number of Messages in Block] は 1516 の値を取ります。これは、0.5 シミュレーション時間ごとにメッセージが出ていき、新しいメッセージが到着するためです。

シミュレーション時間 10 では、ブロックを出ていったメッセージの合計数は 21 になります。

イベント アクションの使用

[Overwrite the oldest element if queue is full] チェック ボックスがオフのとき、[Event actions] を使用することもできます。イベント アクションは、コード生成ではサポートされません。詳細については、Events and Event Actions (SimEvents)を参照してください。

[Event actions] を使用して、特定のイベントにおけるメッセージの動作を指定します。たとえば、[Entry] アクションはメッセージが入ってきた直後に呼び出され、[End] アクションはメッセージが出ていく直前に呼び出されます。[Blocked] アクションはメッセージがブロックされた後に呼び出されます。

詳細については、Simulink 関数によるメッセージ受信インターフェイスの接続を参照してください。

また、SimEvents® ライブラリからブロックを使用することで、より複雑な通信ポリシーをモデル化することもできます。これには SimEvents® のライセンスが必要になります。

参考

| | | | |

関連するトピック