Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

メッセージの概要については、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 に送信します。

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

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

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

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

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

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

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

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

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

  • [Number of input ports] はマージするメッセージ ラインの数を指定します。2 つのメッセージ パスのパラメーター値は 2 です。

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

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

  • [Capacity]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 action] フィールドで、計算を実行する 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 ブロックを使用したメッセージ、イベント、エンティティの可視化を参照してください。

参考

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

関連するトピック