出力端子がバーチャルであることを確認
条件付きサブシステムの Outport ブロックの前やモデルの最上位の Outport ブロックの前に、非表示の信号バッファーが追加されることがあります。このバッファーはキャンバスには表示されませんが、実質的には Signal Copy ブロックです。このバッファーは、Outport ブロック信号の一貫した初期化を必ず行います。
Merge ブロックが条件付き出力信号や部分書き込み信号を入力として受け取る場合、非表示の信号バッファーがシミュレーションの結果に影響することがあります。バッファーが追加されないようにするには、関連する Outport ブロックの [出力端子がバーチャルであることを確認] ブロック パラメーターを選択します。
マージされた条件付き出力信号
この例では、Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターがオフの場合に条件付きサブシステムと Outport ブロックの間に追加される可能性がある非表示バッファーの影響について説明します。
モデル例 ex_conditional_write
を開きます。
Merge ブロックは、そのブロックの入力を任意時間における値が直前に計算された駆動側ブロックの出力に等しい信号に結合します。
Enabled Subsystem A
という名前の条件付きサブシステムに、Outport ブロックに接続された Enabled Subsystem C
という名前の条件付きサブシステムが含まれています。
既定では、Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターはオフです。Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターがオフの場合、次のようになります。
Outport ブロックは非バーチャル セマンティクスに従います。
Outport ブロック信号の一貫した初期化を維持するために非表示バッファーが挿入されることがあります。
条件付きサブシステムに接続されたほとんどの Outport ブロックについては、[出力端子がバーチャルであることを確認] パラメーターをオフのままにします。
非表示バッファーがある場合のシミュレーション
モデル例で、Enabled Subsystem C
に接続された Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターがオフになっていることを確認します。
Enabled Subsystem A
で Enabled Subsystem C
と Outport ブロックの間に非表示バッファーが挿入されます。
固定ステップ ソルバーを使用したシミュレーションの結果は次のようになります。
時間 0:
Enabled Subsystem A
が実行されますが、Enabled Subsystem C
は実行されません。Enabled Subsystem A
でバッファーが実行され、初期値である 0 が Outport ブロックにコピーされます。Enabled Subsystem B
は実行されません。マージされた信号はEnabled Subsystem A
の出力である 0 になります。時間 0.5:
Enabled Subsystem A
は実行されません。Enabled Subsystem B
が実行され、正弦波が出力されます。マージされた信号はEnabled Subsystem B
の正弦波になります。時間 1:
Enabled Subsystem A
が実行されますが、Enabled Subsystem C
は実行されません。ここでも、Enabled Subsystem A
でバッファーが実行され、初期値である 0 が Outport ブロックにコピーされます。Enabled Subsystem B
は実行されません。マージされた信号は、Enabled Subsystem B
の最終値ではなく、Enabled Subsystem A
の初期値になります。
非表示バッファーがない場合のシミュレーション
Enabled Subsystem C
に接続された Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターを選択します。
[出力端子がバーチャルであることを確認] パラメーターを選択すると、次のようになります。
Outport ブロックはバーチャル セマンティクスに従います。
非表示バッファーは挿入されません。シミュレーションで Outport ブロックの前にバッファーが必要な場合はエラーを受け取ります。
固定ステップ ソルバーを使用したシミュレーションの結果は次のようになります。
時間 0:
Enabled Subsystem A
が実行されますが、Enabled Subsystem C
は実行されません。Enabled Subsystem B
は実行されません。マージされた信号は信号の初期値になります。時間 0.5:
Enabled Subsystem A
は実行されません。Enabled Subsystem B
が実行され、正弦波が出力されます。マージされた信号はEnabled Subsystem B
の正弦波の値になります。時間 1:
Enabled Subsystem A
が実行されますが、Enabled Subsystem C
は実行されません。Enabled Subsystem B
は実行されません。マージされた信号は最後に計算された出力となり、Enabled Subsystem B
の正弦波になります。
マージされた部分書き込み信号
ベクトルを初期化した後、特定の条件や入力に基づいて信号の部分的な要素を定期的に更新するとします。2 つの Function-Call Subsystem ブロックから入力を受け取る Merge ブロックを使用できます。一方のサブシステムで初期化タスクを提供し、もう一方のサブシステムで定期的な書き込みタスクを提供します。
モデル例 ex_partial_write_single_merge
を開きます。
Initialize_Process_Subsystem
という名前の Function-Call Subsystem は、シミュレーションの開始時にベクトルを初期化するために 1 回呼び出されます。
Run_Process_Subsystem
という名前の Function-Call Subsystem は、ベクトルの要素への部分的な書き込みを行うために呼び出されます。
Run_Process_Subsystem
では、Assignment ブロックからの出力で、非表示バッファーによってベクトルのコピーが作成されないパスが必要になります。非表示バッファーを削除するには、Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターを選択します。バッファーが必要であると判定された場合はエラーを受け取ります。
Initialize_Process_SubSystem
:
2 要素ベクトルの各要素の値を 7 に初期化します。
ベクトル [7 7] を出力します。
Run_Process_Subsystem
:
インデックス値 1 を入力します。Selector ブロックの [インデックス モード] パラメーターが
[Zero-based]
に設定されているため、Selector ブロックでは入力ベクトルの 2 番目の要素が選択されます。Selector ブロックからの出力スカラー値を加算します。結果は 4 です。
Assignment ブロックの [インデックス モード] パラメーターが
[Zero-based]
に設定されており、入力インデックスIdx1
が 1 であるため、長さが 2 のベクトルの出力信号が必要です。[出力サイズ] パラメーターを2
に設定すると、Assignment ブロックで 2 番目の要素への書き込みが可能になります。Outport ブロックの [出力端子がバーチャルであることを確認] パラメーターを選択して非表示バッファーを削除します。
Merge ブロックはベクトル [7 4] を出力します。
このモデルから生成されるコードには、Init_Proc
と Run_Proc
の 2 つの関数が含まれます。
/* Model step function */ void Init_Proc(void) { int32_T s3_iter;
/* Initialize signal vector elements with 7.0 */ for (s3_iter = 0; s3_iter < 2; s3_iter++) { PartialWriteSingleMerge_DW.Assignment[s3_iter] = 7.0; }
for (s3_iter = 0; s3_iter < 2; s3_iter++) { PartialWriteSingleMerge_Y.Out4[s3_iter] = PartialWriteSingleMerge_DW.Assignment[s3_iter]; } }
/* Model step function */ void Run_Proc(void) { /* Write to element 1 of the output signal vector */ PartialWriteSingleMerge_Y.Out4[1] = 4.0; }