非バーチャル バスのバス配列へのグループ化
"バス配列" とは、要素が同じ 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 ブロックの [ブロック パラメーター] ダイアログ ボックスで、[入力数] を、バス配列に含めるバスの数に設定します。指定した入力端子の数がブロック アイコンに表示されます。
非バーチャル バスをブロックの入力に接続します。
ブロックの出力はバス配列です。
ArrayOfBuses
という名前のモデル例を開いてシミュレートします。
非バーチャル バスからバス配列を作成する方法を示すため、次のようになっています。
2 つのBus Creatorブロックで、同じ
Bus
オブジェクト データ型 (Bus: BusObject
) をもつ非バーチャル バスを作成。[入力数] が
2
に設定されたVector Concatenateブロックで、2 つの非バーチャル バスをバス配列にグループ化。
バス配列から要素を選択する方法を示すため、次のようになっています。
Selectorブロックで、ダイアログ ボックスで指定された [インデックス] に基づいてバス配列から 1 つのバスを抽出。バス配列はその要素にインデックスベースのアクセスを提供する連結された信号なので、Selector ブロックは
Index vector (dialog)
を [インデックス オプション] で使用します。Bus Selectorブロックで、名前ベースのアクセスを使用して非バーチャル バスの要素を抽出。
[信号の次元] 情報のオーバーレイは、バス配列に 2 つのバスが含まれていることを示しています。[信号の次元] のオーバーレイを有効にするには、Simulink のツールストリップの [デバッグ] タブで [情報のオーバーレイ]、[信号の次元] を選択します。
MATLAB 構造体からのバス配列の作成
Constant ブロックを使用して、定数値のバス要素をもつバス配列を簡潔に表すことができます。この手法によって、特にモデルがさまざまなパラメーター値でアルゴリズムを繰り返す場合に、モデル内のラインの数およびモデルで使用される変数の数を削減できます。
バス配列を作成するには、Constant ブロックで以下を行います。
[定数値] を MATLAB® 構造体の配列、または MATLAB 構造体の配列を指定する
Simulink.Parameter
オブジェクトに設定する。[出力データ型] を
Simulink.Bus
オブジェクトに設定する。
Constant ブロックで MATLAB 構造体がサポートされるのは、出力データ型がバス オブジェクトの場合のみです。
非バーチャル バスを作成する Constant ブロックを含むモデル例を開いてコンパイルします。モデルをコンパイルするとライン スタイルが更新されます。ライン スタイルを使用してバス配列を視覚的に識別できます。モデルをコンパイルするには、Simulink ツールストリップの [モデル化] タブで、[モデルの更新] または [実行] をクリックします。あるいは、MATLAB コマンド ウィンドウで次のコマンドを入力します。
mdl = "ArrayOfBusesFromStructure"; open_system(mdl) set_param(mdl,SimulationCommand="Update");
PreLoadFcn
モデル コールバックにより、busval
という名前の構造体配列が定義されます。各構造体は、offset
、gain
、および threshold
という名前の要素で構成されています。その後、モデル コールバックで、Simulink.Bus.createObject
関数を使用して構造体から Simulink.Bus
オブジェクトが作成されます。バス オブジェクトの名前には既定の slBus1
が使用されます。
モデル コールバックを確認するには、Simulink ツールストリップの [モデル化] タブの [設計] ギャラリーで [プロパティ インスペクター] を選択します。モデルの最上位レベルで何も選択されていないとき、モデル コールバックがプロパティ インスペクターに表示されます。あるいは、モデル コールバックをプログラムで取得するには get_param
関数を使用します。
cb = get_param(mdl,"PreLoadFcn")
cb = '% Define an array of structures named busval. Compose each % structure of elements named offset, gain, and threshold. busval(1).offset = 197; busval(1).gain = 4.32; busval(1).threshold = 795.68; busval(2).offset = 158; busval(2).gain = 3.83; busval(2).threshold = 1039.77; % Define the corresponding Simulink.Bus object. Simulink.Bus.createObject(busval)'
多くの要素をもつバス階層用の構造体の配列を作成する場合は、関数Simulink.Bus.createMATLABStruct
の使用を検討してください。
バス配列を作成するために、Constant ブロックで [定数値] を busval
、[出力データ型] を Bus: slBus1
に設定しています。
For Each Subsystem ブロックは、配列内の各非バーチャル バスについて、定数値を反復して処理します。サブシステムの内容は、端子に接続するバス配列ではなく、非バーチャル バスを表示します。