Main Content

非バーチャル バスのバス配列へのグループ化

"バス配列" とは、要素が同じ Simulink.Bus オブジェクトによって定義された非バーチャル バスである配列です。バス配列は構造体の MATLAB® 配列と同等です。

バス配列を使用すると、以下を実現できます。

  • 複数のバスの処理に使用するアルゴリズムを集中管理することで保守作業を軽減する。

  • バス配列と共に For Each Subsystem を使用するなどにより、同じタイプである複数のバスの反復処理を効率化する。

  • バス配列を使用するモデルの部分を再構成することなく、処理されるバスの数を変更する。

  • Assignment ブロックや Selector ブロックなどの組み込みブロックを使用して、その他の型の配列のようにバス配列を操作する。バス配列を使用すると、構造体信号のパックおよびアンパックを管理するカスタム S-Function を作成する必要がなくなります。

  • C 構造体の配列をもつコードが生成され、構造体の配列を使用するレガシ C コードと統合できる。このアプローチによって、インデックス構造体で for ループを使用することで、Simulink® 計算のための配列へのインデックス付けが簡略化されます。

たとえば、多チャネルのシステム (通信システムなど) をバス配列としてモデル化できます。すべてのチャネルは同じプロパティをもちますが、各チャネルの値は異なる場合があります。

ヒント

バス配列用の再利用可能な仕様を作成するには、DataTypeSimulink.Bus オブジェクトに設定し、Dimensions を配列の次元に設定して Simulink.ValueType オブジェクトを定義します。

バス配列を使用する複数の方法を示すモデルについては、バス配列のモデル化を参照してください。

可変サイズの信号をもつバス配列はサポートされていますが、一定の制限があります。可変サイズ信号の制限を参照してください。

バス配列の要件

バス配列に統合されているバスはすべて、以下でなければなりません。

  • 非バーチャルである

  • 同じ Simulink.Bus オブジェクト データ型 (つまり、同一の名前、階層、およびバス要素の属性) を指定する

非バーチャル バスの作成の詳細については、非バーチャル バスの作成を参照してください。

どのブロックがバス配列をサポートするかの詳細については、バス対応ブロックを参照してください。

非バーチャル バスからのバス配列の作成

Vector Concatenate ブロックまたは Matrix Concatenate ブロックを使用して、非バーチャル バスをバス配列にグループ化できます。Simulink では、非バーチャル バスはスカラーとして取り扱われます。したがって、バス要素のデータ型にかかわらず、次のブロックのいずれかを使用できます。

次のブロックのいずれかを使用してバス配列を作成するには、次のようにします。

  1. バス配列にグループ化するすべての非バーチャル バスのための Simulink.Bus オブジェクト データ型を 1 つ定義します。

  2. Vector Concatenate ブロックまたは Matrix Concatenate ブロックの [ブロック パラメーター] ダイアログ ボックスで、[入力数] を、バス配列に含めるバスの数に設定します。指定した入力端子の数がブロック アイコンに表示されます。

  3. 非バーチャル バスをブロックの入力に接続します。

ブロックの出力はバス配列です。

モデル例を開いてコンパイルします。モデルをコンパイルするには、Simulink ツールストリップの [モデル化] タブで、[モデルの更新] または [実行] をクリックします。モデルをコンパイルするとライン スタイルが更新されます。ライン スタイルを使用してバス配列を視覚的に識別できます。

非バーチャル バスからバス配列を作成する方法を示すため、モデルでは次のものが使用されます。

  • 同じ Bus オブジェクト データ型 (Bus: BusObject) をもつ 2 つの非バーチャル バスを作成するための 2 つのBus Creatorブロック。

  • 2 つの非バーチャル バスを 1 つのバス配列にグループ化するための、[入力数]2 に設定されたVector Concatenateブロック。

バス配列から要素を選択する方法を示すため、モデルでは次のものが使用されます。

  • ダイアログ ボックスで指定された [インデックス] に基づいてバス配列から 1 つのバスを抽出するためのSelectorブロック。バス配列はその要素にインデックスベースのアクセスを提供する連結された信号なので、Selector ブロックは Index vector (dialog)[インデックス オプション] で使用します。

  • 名前ベースのアクセスを使用して非バーチャル バスの要素を抽出するBus Selectorブロック。

[信号の次元] 情報のオーバーレイは、バス配列に 2 つのバスが含まれていることを示しています。[信号の次元] のオーバーレイを有効にするには、Simulink のツールストリップの [デバッグ] タブで [情報のオーバーレイ]、[信号の次元] を選択します。

MATLAB 構造体からのバス配列の作成

Constant ブロックを使用して、定数値のバス要素をもつバス配列を簡潔に表すことができます。この手法によって、特にモデルがさまざまなパラメーター値でアルゴリズムを繰り返す場合に、モデル内のラインの数およびモデルで使用される変数の数を削減できます。

Constant ブロックで次のように指定します。

  • [定数値] を MATLAB 構造体の配列、または MATLAB 構造体の配列を指定する Simulink.Parameter オブジェクトとして

  • [出力データ型]Simulink.Bus オブジェクトとして

出力データ型が Bus オブジェクトの場合にのみ、Constant ブロックで MATLAB® 構造体がサポートされます。

const_struct_array という名前の構造体の配列を定義します。それぞれの構造体を、OffsetGain、および Threshold の同じ要素で構成します。

const_struct_array(1).Offset = 197;
const_struct_array(1).Gain = 4.32;
const_struct_array(1).Threshold = 795.68;

const_struct_array(2).Offset = 158;
const_struct_array(2).Gain = 3.83;
const_struct_array(2).Threshold = 1039.77;

多くの要素をもつバス階層用の構造体の配列を作成する場合は、関数Simulink.Bus.createMATLABStructの使用を検討してください。

対応する Bus オブジェクト データ型を定義します。

Simulink.Bus.createObject(const_struct_array)

新しい Bus オブジェクトは既定の名前 slBus1 を使用します。

[定数値]const_struct_array に、[出力データ型]Bus: slBus1 に設定された Constant ブロックを含むモデル例を開いてシミュレーションします。

open_system('ArrayOfBusesFromStructModel')
sim('ArrayOfBusesFromStructModel');

Constant ブロックの出力はバス配列です。

For Each Subsystem ブロックは、配列内の各非バーチャル バスについて、定数値を反復して処理します。サブシステムの内容は、端子に接続するバス配列ではなく、非バーチャル バスを表示します。

参考

ブロック

関連するトピック