パケット損失およびチャネル エラーを伴うワイヤレス メッセージ通信のモデル化
この例では、Simulink® のメッセージ、Stateflow®、および SimEvents® を使用してパケット損失およびチャネル エラーを伴うワイヤレス メッセージ通信をモデル化する方法を説明します。
このモデルには、メッセージを送信する 2 つのコンポーネントとメッセージを受信する 2 つのコンポーネントがあります。メッセージは伝送遅延を伴う共有ワイヤレスチャネルを使用して伝送されます。Stateflow® チャートはワイヤレス コンポーネントのメッセージ送信ロジックをモデル化し、SimEvents® ブロックはワイヤレス メッセージ送信、チャネル エラー、およびパケット損失をモデル化します。
メッセージの概要については、Simulink メッセージの概要を参照してください。
メッセージを送受信するコンポーネントの作成
モデルには、メッセージを出力する WirelessSend と WirelessStateflowSend という 2 つのソフトウェア コンポーネントがあります。
WirelessSend コンポーネントでは、Sine Wave ブロックは信号ソースです。Sine Wave ブロックは振幅が 1
の正弦波を生成します。このブロックでは、[サンプル時間] は 0.1
に設定されています。Send ブロックは信号値のデータを搬送するメッセージに信号を変換します。WirelessSendComponent は Send Buffer 1 に接続されます。
WirelessStateflowSend コンポーネントで、別の Sine Wave ブロックは正弦波信号を生成し、Noise ブロックは信号へのノイズの挿入に使用されます。Noise ブロックは、平均が 0
で分散が 1
のガウス分布から値が生成される信号を出力します。Stateflow® チャートは信号をフィルター処理し、メッセージを送信するかどうかを決定する単純なロジックを表します。StateflowSend コンポーネントはメッセージを Send Buffer 2 に送信します。
モデルには、メッセージを受信する WirelessReceive と WirelessListener という 2 つのソフトウェア コンポーネントがあります。
WirelessReceive コンポーネントで、Receive ブロックはメッセージを受信してそのメッセージ データを信号値に変換します。コンポーネントは Receive Buffer 1 に接続されます。
WirelessListener コンポーネントには、関数 onOneMessage(data)
を実行する Simulink Function ブロックがあります。メッセージが Receive Buffer 3 に到着すると、Simulink Function ブロックはメッセージ データからの値である引数 data
を入力信号として取ります。このブロックでは、data
の値が 2
で乗算されます。ブロックは新しいデータ値を出力します。
これらのコンポーネントの作成の詳細については、複数の送信側および受信側をもつ共有通信チャネルのビルドを参照してください。
マルチキャストを使用したワイヤレス メッセージ通信のモデル化
WirelessSend コンポーネントと WirelessStateflowSend コンポーネントは Send Buffer 1 と Send Buffer 2 にメッセージを送信します。これらは、ワイヤレスでメッセージを送信できる SimEvents® Entity Multicast ブロックです。Transmission Buffer ブロックは、Send Buffer 1 と Send Buffer 2 によって送信されるメッセージを受信できる SimEvents® マルチキャスト受信キューです。
Send Buffer 1、Send Buffer 2、および Wireless Channel ブロック内の Transmission Buffer ブロック間でこのワイヤレス通信を実現するには、次のようにします。
Send Buffer 1 ブロックと Send Buffer 2 ブロックで、[Multicast tag] パラメーターを
A
に設定します。Transmission Buffer ブロックで、[Multicast tag] パラメーターを
A
に設定します。
[Multicast tag] パラメーターはメッセージがどの Entity Multicast ブロックから受信されるのかを定義します。
チャネル エラーのモデル化
SimEvents® Entity Gate ブロックはチャネル エラーのモデル化に使用されます。ブロックには入力端子が 2 つあります。1 つの入力端子は Transmission Buffer からの受信メッセージ用です。2 番目の入力端子はゲートを開くタイミングを決定する制御端子です。
Gate ブロックの [Operating mode] パラメーターを Enable gate
に設定します。このモードでは以下が行われます。
その制御端子から
0
より大きい値を搬送するエンティティを受信すると、ブロックはゲートを開いてメッセージが進むことを許可します。これは操作可能チャネルを表します。
エンティティが
0
以下の値のデータを搬送すると、ブロックはゲートを閉じてメッセージの受け渡しをブロックします。これはチャネル エラーを表します。
Gate ブロックを制御するために、この例では Control Gate というラベルが付いた SimEvents® Entity Generator ブロックを使用して、さまざまなデータ値を搬送するエンティティを生成できます。
Control Gate ブロックでは、[Event actions] の [Generate action] フィールドで、下のコードを使用して Gate ブロックを開閉するエンティティを生成します。最初、エンティティ データは 1
であり、ゲートは開いていて、チャネルは操作可能状態です。新しいエンティティが生成されると、その値は 0
に変化し、これによってゲートが閉じられます。エンティティが生成されるたびに、ゲートのステータスは開いた状態から閉じた状態、または閉じた状態から開いた状態に変化します。
Control Gate ブロックでは、[Intergeneration time action] フィールドで下のコードを使用し、チャネルの操作可能状態とエラー状態を表します。このコードはチャネルを操作可能として初期化します。生成された各エンティティは Gate ブロックのステータスを変更するため、dt
はエンティティの生成間時間であり、チャネルのステータスを変更するために使用されます。
このコードでは、0
と 10
の間の値を取る一様分布から修復時間が生成されます。エラーの時間間隔は 0
と 50
間の値を取る別の一様分布から生成されます。
パケット損失のモデル化
パケット損失をモデル化するには、SimEvents® Entity Output Switch ブロックを使用します。
ブロックには入力端子が 2 つあります。1 つの入力端子はメッセージを受け入れます。もう 1 つの入力端子は出力端子の選択を決定するエンティティを受け入れます。エンティティが 1
に設定されている場合、ブロックは出力端子 1
を選択してメッセージを Wirelessly Share Messages ブロックに転送します。エンティティが 2
に設定されている場合、ブロックはパケット損失を表す Entity Terminator ブロックに接続されている出力端子 2
を選択します。
Output Switch ブロックでは次のようになります。
[Number of output ports] は
2
に設定されます。
選択されている出力を特定するために、[Switching criterion] は
From control port
に設定され、[Initial port selection] は1
に設定されます。
パケット損失の 0.1
の確率をモデル化するには、Probabilistic Packet Loss ブロックで [Event actions] タブを選択します。[Generate action] フィールドには次のコードが含まれます。
persistent rngInit; if isempty(rngInit) seed = 12345; rng(seed); rngInit = true; end
% Pattern: Uniform distribution % m: Minimum, M: Maximum m = 0; M = 1; x = m + (M - m) * rand;
% x is generated from uniform distribution and % takes values between |0| and |1|. if x > 0.1 % Entity carries data |1| and this forces Output switch to select % output |1| to forward entities to receive components. entity = 1; else % Entity carries data |2| and this forces Output switch to select % output |2| and this represents a packet loss. entity = 1; end
つまり、制御端子に入るエンティティには 1
に設定される 0.9
の確率があり、これによりブロックは Wirelessly Share Messages ブロックにメッセージを出力します。
モデルのシミュレーションと結果の確認
モデルをシミュレートします。
Transmission Buffer ブロック上部で接続されている Scope ブロックを開きます。ブロックには共有チャネルから送信されたメッセージの合計数が表示されます。
4255
メッセージがチャネルを介して送信されます。
プロットにはチャネル エラーも表示されます。たとえば、最初の 100
秒を拡大します。チャネル エラーはメッセージ送信がブロックされた 40
と 49
の間に発生していることを確認します。
データ インスペクターを開き、Gate を制御するエンティティを可視化します。生成されたエンティティごとにエンティティ データが 1
から 0
に変わります。
損失したメッセージの数を確認するには、Packet Loss ブロックに接続された Scope ブロックを開きます。
409
メッセージは送信中に失われます。これは、メッセージの 9.6
パーセントです。
参考
Sine Wave | Send | Receive | Queue | Entity Terminator (SimEvents) | Entity Output Switch (SimEvents) | Entity Gate (SimEvents) | Entity Multicast (SimEvents)