このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
複数の送信側および受信側をもつ共有通信チャネルのビルド
この例では、複数の送信側および受信側をもつ共有チャネルを介した通信を、Simulink® のメッセージ、SimEvents®、および Stateflow® を使用してモデル化する方法を説明します。
メッセージの概要については、Simulink メッセージの概要を参照してください。
このモデルには、メッセージを送信する 2 つのソフトウェア コンポーネントとメッセージを受信する 2 つのコンポーネントがあります。共有チャネルは遅延を加えてメッセージを送信します。SimEvents® ブロックは、メッセージ ラインをマージし、メッセージをコピーして遅延させることにより、カスタム通信動作の作成に使用されます。Stateflow チャートは、判定ロジックに基づく Send コンポーネントでのメッセージの送信に使用されます。
メッセージを送信するコンポーネントの作成
モデルには、メッセージを出力する 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 を使用したメッセージ、イベント、エンティティの可視化を参照してください。
参考
Sine Wave | Send | Receive | Queue | Entity Input Switch (SimEvents) | Entity Server (SimEvents) | Entity Replicator (SimEvents) | Entity Terminator (SimEvents)