Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

複数の送信側および受信側をもつ共有通信チャネルの作成

この例では、複数の送信側および受信側をもつ共有チャネルを介した通信を、Simulink® のメッセージ、SimEvents®、および Stateflow® を使用してモデル化する方法を説明します。

メッセージの概要については、Simulink メッセージの概要 (Simulink)を参照してください。

このモデルには、メッセージを送信する 2 つのソフトウェア コンポーネントと、メッセージを受信する 2 つのコンポーネントがあります。共有チャネルは遅延を加えてメッセージを送信します。SimEvents® ブロックは、メッセージ ラインのマージと、メッセージのコピーおよび遅延により、カスタム通信動作を作成する場合に使用されます。Stateflow チャートは、判定ロジックに基づく送信コンポーネントでのメッセージの送信に使用されます。

メッセージを送信するコンポーネントの作成

このモデルには、メッセージを出力する Send および StateflowSend という 2 つのソフトウェア コンポーネントがあります。

Send コンポーネントでは Sine Wave ブロックが信号ソースです。このブロックは振幅が 1 の正弦波信号を生成します。ブロックのサンプル時間は 0.1 です。Send ブロックは信号を、信号値をデータとして搬送するメッセージに変換します。Send コンポーネントはメッセージを Send Buffer 1 に送信します。

StateflowSend コンポーネントでは、別の Sine Wave ブロックが正弦波信号を生成し、Noise ブロックはノイズを信号に挿入します。Noise ブロックは、平均が 0 で分散が 1 のガウス分布から値が生成される信号を出力します。ブロックのサンプル時間は 0.1 です。

Stateflow チャートは、信号をフィルター処理し、メッセージを送信するかどうかを決定する単純なロジックを表します。0.1 より大きい期間に対する信号の値が 0.5 より大きい場合、チャートは信号値を搬送するメッセージを送信します。信号値が 0 を下回ると、チャートは ReceiveSignal ステートに遷移します。StateflowSend コンポーネントはメッセージを Send Buffer 2 に送信します。

メッセージ インターフェイスの作成の詳細については、ソフトウェア コンポーネント間におけるメッセージ送受信インターフェイスの確立 (Simulink)を参照してください。

メッセージを受信するコンポーネントの作成

このモデルには、メッセージを受信する Receive と Listener という 2 つのソフトウェア コンポーネントがあります。

Receive コンポーネントでは、Receive ブロックがメッセージを受信し、そのメッセージ データを信号値に変換します。

Listener コンポーネントには、Simulink Function ブロックがあります。このブロックには、関数 onOneMessage(data) がブロック上に表示されます。

メッセージが Receive Buffer 2 に到着すると、Listener ブロックは通知を受け取り、メッセージ データからの値である引数 data を入力信号として取ります。このブロックで、data の値が 2 で乗算されます。ブロックは新しいデータ値を出力します。

SimEvents® を使用したメッセージのルーティング

共有チャネルでは、2 つのメッセージ送信コンポーネントから発生するメッセージ パスがマージされ、共有通信チャネルを表します。

SimEvents® Entity Input Switch ブロックはメッセージ ラインをマージします。このブロックでは次のようになります。

  • [入力端子の数] は、マージするメッセージ ラインの数を指定します。メッセージ パスが 2 つの場合、このパラメーター値は 2 です。

  • [アクティブな端子の選択] は、出ていくメッセージにアクティブな端子を選択する方法を指定します。All を選択すると、ブロックに到着するすべてのメッセージは出力端子からブロックを出ていくことができます。Switch を選択すると、出ていくメッセージに対してアクティブな端子を選択するロジックを指定できます。この例では、パラメーターは All に設定しています。

SimEvents® Entity Server ブロックは、共有チャネルでメッセージ伝送遅延を表すために使用されます。このブロックでは次のようになります。

  • [容量]1 に設定され、これにより一度に処理できるメッセージの数が指定されます。

  • [Service time value]1 に設定され、これによりメッセージの処理にかかる時間が指定されます。

SimEvents® Entity Replicator ブロックは、メッセージの同一コピーの生成に使用されます。このブロックでは次のようになります。

  • [Replicas depart from] は、コピーが、個別の出力端子または元のメッセージと同じ出力端子のどちらからブロックを出るのかを指定します。このパラメーターは Separate output ports に設定されています。

  • [Number of replicas]1 に設定され、これにより各メッセージに対して生成されるコピーの数が指定されます。

  • [Hold original entity until all replicas depart] は、すべてのコピーがブロックを出るまで、ブロックの元のメッセージを保持します。

SimEvents® Entity Terminator ブロックは Receive Buffer 2 のモデル化に使用されます。このブロックでは次のようになります。

  • [Event actions] タブの [entry アクション] フィールドで、計算を実行する MATLAB コード、またはメッセージがブロックに入ると呼び出される Simulink® 関数呼び出しを指定できます。この例では、onOneMessage(entity) は Listener コンポーネントで Simulink Function ブロックの通知に使用されます。関数呼び出しを可視化するには、[デバッグ] タブで [情報のオーバーレイ] を選択してから [関数コネクタ] を選択します。

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

モデルのシミュレーションを実行します。モデルを流れるメッセージがアニメーションで強調表示されることを確認します。モデル キャンバスを右クリックして [アニメーション速度]None に設定することにより、アニメーションをオフにできます。

アニメーションを一時停止すると、メッセージを格納するブロックに拡大鏡が表示されます。拡大鏡にカーソルを合わせると、ブロックに格納されているメッセージの数が表示されます。

ブロックに格納されているメッセージを確認するには、拡大鏡をクリックして Storage Inspector を開きます。たとえば、以下の図は Send Buffer 1 に格納されているメッセージを示しています。

アニメーションをオフにして Sequence Viewer ブロックを開き、Simulink 関数の呼び出しとモデル内のメッセージの流れを確認します。

たとえば、シミュレーション時間 0 を確認します。この間、値 0 を搬送するメッセージは Send コンポーネントから Send Buffer 1 に送信されます。シミュレーション時間 0.1 から 0.5 の間、Send コンポーネントはさまざまなデータ値で Send Buffer 1 にメッセージを送信し続けます。時間 0.5 の時点で、StateflowSend コンポーネントはメッセージを Send Buffer 2 に送信します。Sequence Viewer ブロックの使用の詳細については、Sequence Viewer を使用したメッセージ、イベント、エンティティの可視化 (Simulink)を参照してください。

参考

(Simulink) | (Simulink) | (Simulink) | (Simulink) | (SimEvents) | (SimEvents) | (SimEvents) | (SimEvents)

関連するトピック