非バーチャル バスのバス配列へのグループ化
"バス配列" とは、要素が同じ Simulink.Bus
オブジェクトによって定義された非バーチャル バスである配列です。バス配列は構造体の MATLAB® 配列と同等です。
バス配列を使用すると、以下を実現できます。
複数のバスの処理に使用するアルゴリズムを集中管理することで保守作業を軽減する。
バス配列と共に For Each Subsystem を使用するなどにより、同じタイプである複数のバスの反復処理を効率化する。
バス配列を使用するモデルの部分を再構成することなく、処理されるバスの数を変更する。
Assignment ブロックや Selector ブロックなどの組み込みブロックを使用して、その他の型の配列のようにバス配列を操作する。バス配列を使用すると、構造体信号のパックおよびアンパックを管理するカスタム S-Function を作成する必要がなくなります。
C 構造体の配列をもつコードが生成され、構造体の配列を使用するレガシ C コードと統合できる。このアプローチによって、インデックス構造体で
for
ループを使用することで、Simulink® 計算のための配列へのインデックス付けが簡略化されます。
たとえば、多チャネルのシステム (通信システムなど) をバス配列としてモデル化できます。すべてのチャネルは同じプロパティをもちますが、各チャネルの値は異なる場合があります。
ヒント
バス配列用の再利用可能な仕様を作成するには、DataType
を Simulink.Bus
オブジェクトに設定し、Dimensions
を配列の次元に設定して Simulink.ValueType
オブジェクトを定義します。
バス配列を使用する複数の方法を示すモデルについては、バス配列のモデル化を参照してください。
可変サイズの信号をもつバス配列はサポートされていますが、一定の制限があります。可変サイズ信号の制限を参照してください。
バス配列の要件
バス配列に統合されているバスはすべて、以下でなければなりません。
非バーチャルである
同じ
Simulink.Bus
オブジェクト データ型 (つまり、同一の名前、階層、およびバス要素の属性) を指定する
非バーチャル バスの作成の詳細については、非バーチャル バスの作成を参照してください。
どのブロックがバス配列をサポートするかの詳細については、バス対応ブロックを参照してください。
非バーチャル バスからのバス配列の作成
Vector Concatenate ブロックまたは Matrix Concatenate ブロックを使用して、非バーチャル バスをバス配列にグループ化できます。Simulink では、非バーチャル バスはスカラーとして取り扱われます。したがって、バス要素のデータ型にかかわらず、次のブロックのいずれかを使用できます。
次のブロックのいずれかを使用してバス配列を作成するには、次のようにします。
バス配列にグループ化するすべての非バーチャル バスのための
Simulink.Bus
オブジェクト データ型を 1 つ定義します。Vector Concatenate ブロックまたは Matrix Concatenate ブロックの [ブロック パラメーター] ダイアログ ボックスで、[入力数] を、バス配列に含めるバスの数に設定します。指定した入力端子の数がブロック アイコンに表示されます。
非バーチャル バスをブロックの入力に接続します。
ブロックの出力はバス配列です。
モデル例を開いてコンパイルします。モデルをコンパイルするには、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
という名前の構造体の配列を定義します。それぞれの構造体を、Offset
、Gain
、および 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 ブロックは、配列内の各非バーチャル バスについて、定数値を反復して処理します。サブシステムの内容は、端子に接続するバス配列ではなく、非バーチャル バスを表示します。