Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

バス配列の操作

バス配列を使用するようにモデルを設定するには、通常、以下の基本的なタスクを実行しなければなりません。

  1. バス配列を定義します (非バーチャル バスからのバス配列の作成を参照)。

  2. バス配列の各要素に対して反復処理を実行するためにサブシステムを追加します。たとえば、For Each Subsystem ブロックまたは Iterator ブロックを使用します。バスの配列を Concatenate ブロックから反復処理サブシステムに接続します。反復処理の実行を参照してください。

  3. 反復処理サブシステム内で、スカラー アルゴリズムをモデル化します (たとえば、For Each サブシステムなど)。

    1. バス配列を操作します (Selector ブロックおよび Assignment ブロックを使用)。

    2. Bus Selector ブロックおよび Bus Assignment ブロックを使用して、サブシステム内の非バーチャル バスから要素を選択するか、非バーチャル バスに要素を割り当てます。

    バス配列への値の割り当ておよびバス配列からのバス要素の選択を参照してください。

  4. オプションで、バス配列のデータをインポートまたはログ作成します。バス配列のデータのインポートおよびバス配列のログ記録を参照してください。

結果として得られるモデルには、次のコンポーネントが含まれています。

反復処理の実行

For Each SubsystemWhile Iterator SubsystemFor Iterator Subsystem などのブロックを使用して、バス配列のバス データで反復処理を実行することができます。これらのブロックを 1 つ使用して、以下に対して同じ種類の処理を実行できます。

  • バス配列内の各バス

  • バス配列内の選択されたバスのサブセット

バス配列への値の割り当て

バス配列内の信号に値を代入するには、以下を使用します。

  1. Bus Assignment ブロックを使用して、値をバス要素に代入します。

  2. Assignment ブロックを使用して、バスをバス配列に代入します。

バス配列内の指定された要素に値を割り当てるには、Assignment ブロックを使用します。

たとえば、sldemo_bus_arrays のモデルでは、Assignment ブロックはバス配列の最初の要素に値を割り当てます。

バス内でバス要素を割り当てるには、Bus Assignment を使用します。Bus Assignment ブロックの入力は、バスでなければなりません。

バス配列への割り当て

Bus Assignment ブロックを使用して、バス配列である入れ子にされたバスを割り当てたり、完全に置き換えたりすることができます。バス配列内に入れ子されたバスにデータを割り当てるか、バス配列を含む特定の要素に部分的な割り当てを行うには、MATLAB Function ブロックを使用できます。

たとえば、次のバス構造があるとします。

バスには、サブバス配列である children 要素があります。この例では、要素 c および要素 a に割り当てる方法を示します。Inport ブロックと Outport ブロックは、Parent Bus オブジェクトを使用します。割り当てを定義するために、この例では MATLAB Function ブロックを使用しています。Bus Assignment ブロックまたは Assignment ブロックを使用して要素 a に割り当てることはできないためです。

MATLAB Function ブロックは、割り当てを行うためにこの関数コードを使用します。

function y = fcn(u)

y = u;
y.c = false;
for idx = 1:length(y.children)
    y.children(idx).a = int32(zeros(5, 1));
end

バス配列からのバス要素の選択

バス配列からバス要素を選択するには、以下を使用します。

  1. バス配列内の適切なバスを選択する Selector ブロック。

  2. バス内でバス要素を選択する Bus Selector ブロック。

バス配列の要素を選択するには、Selector ブロックを使用します。バスの入力配列は、どの次元でもかまいません。Selector ブロックの出力バスは、バスの入力配列から選択されたまたは並べ替えられた要素のセットです。

たとえば、sldemo_bus_arrays のモデルでは、Selector ブロックを使用して、Assignment ブロックおよび For Each Subsystem ブロックが出力するバスの配列から要素を選択します。この例で以下に示すのは、最初の要素を選択する Selector ブロックの [ブロック パラメーター] ダイアログ ボックスです。

バス内でバス要素を選択するには、Bus Selector を使用します。Bus Selector ブロックの入力は、バスでなければなりません。

バス配列のデータのインポート

ルート Inport ブロックを使用して、バス配列に対する MATLAB® timeseries オブジェクトの構造体の配列をインポート (読み込み) します。部分データをバス配列にインポートできます。

詳細については、バス配列のデータのインポートを参照してください。

From Workspace ブロックまたは From File ブロックを使用して、バス データの配列をインポートすることはできません。

バス配列のログ記録

バスの配列をエクスポートするには、信号のログ用に信号をマークします。詳細については、シミュレーションのランタイム データの保存を参照してください。

メモ

Simulink® は、ラピッド アクセラレータ モードでは参照モデル内の信号を記録しません。

バス配列に含まれる特定の信号のログ データにアクセスするには、構造体の階層を移動して、特定の信号に対するインデックスを指定します。詳細については、バス配列の信号ログ データへのアクセスを参照してください。

ルート レベルのバス出力は、[出力] コンフィギュレーション パラメーターを選択している場合はログに記録されません。代わりに、信号ログを使用して、信号データをエクスポートで説明されているように、標準の信号ログを使用してください。

バスまたはバス配列に対する信号ログを For Each Subsystem 内から直接使用しないでください。Bus Selector ブロックを使用して、ログを記録するバス要素信号を選択するか、Subsytem 外に Outport ブロックを追加してその信号のログを記録します。詳細については、For Each Subsystem における信号のログ記録を参照してください。

バス配列の初期化

バス配列内にある個々の信号それぞれに対して固有の初期値を指定するには、初期条件構造体の配列を使用することができます。配列内の各構造体は、バスのいずれかを初期化します。

次の例では、バス配列を初期化する方法を示します。バス型 MyDataPressureBus を定義するとします。

信号要素 temperature のデータ型を int16、要素 s1 および s2 のデータ型を double に設定するとします。

バス配列に対する初期条件を指定するには、初期条件構造体の配列を値としてもつ変数を作成することができます。

initValues(1).temperature = int16(5);
initValues(1).pressure.s1 = 9.87;
initValues(1).pressure.s2 = 8.71;

initValues(2).temperature = int16(20);
initValues(2).pressure.s1 = 10.21;
initValues(2).pressure.s2 = 9.56;

initValues(3).temperature = int16(35);
initValues(3).pressure.s1 = 8.98;
initValues(3).pressure.s2 = 9.17;

変数 initValues は、3 つのバス配列である信号に対する初期条件を提供します。initValues を使用すると、Unit Delay などのブロックの [初期条件] パラメーターを指定できます。

あるいは、単一のスカラー構造体を使用して、配列内のすべてのバスに対して同じ初期条件を指定することもできます。

initStruct.temperature = int16(15);
initStruct.pressure.s1 = 10.32;
initStruct.pressure.s2 = 9.46;

ブロックの [初期条件] パラメーターで initStruct を指定した場合、配列内の各バスは信号要素 temperature に対して同じ初期値 15 を使用します。同様に、バスは要素 pressure.s1 に対しては初期値 10.32、要素 pressure.s2 に対しては値 9.46 を使用します。

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

この例では、入れ子にされたバス配列を初期化する方法を示します。バスの入れ子配列を含む複雑な信号階層の初期条件構造体を作成します。

  1. バス エディターで、Bus オブジェクト MyDataPressureBus を作成します。

  2. [階層] ペインで、バス要素 pressure を選択します。[次元] プロパティを [1 3] に設定します。

  3. 関数 Simulink.Bus.createMATLABStruct を使用して、4 つの初期化構造体の配列を作成します。その配列を変数 initStruct に保存します。個々の信号をすべて初期化してグラウンド値 0 にします。

    initStruct=Simulink.Bus.createMATLABStruct('MyData',[],[1 4]);

  4. ベース ワークスペースで変数 initStruct をダブルクリックして変数エディターに表示します。

    配列内の 4 つの構造体にはそれぞれ、フィールド temperaturepressure があります。

  5. pressure を検証するには、フィールドのうちの 1 つをダブルクリックします。

    4 つの pressure フィールドそれぞれの値は 3 つのサブ構造体の配列です。各サブ構造体にはフィールド s1s2 があります。

  6. バス配列内の信号に対して固有の初期化値を提供するには、変数エディターを使用して手動で値を指定することができます。

    あるいは、スクリプトを記述することもできます。たとえば、initStruct の 3 番目の構造体にある 2 番目のサブ構造体 pressure のフィールド s1 にアクセスするには、次のコードを使用します。

    initStruct(3).pressure(2).s1 = 15.35;

構造体パラメーターの要件

構造体パラメーターを使用してバス配列を初期化するには、次のものを使用できます。

  • 数値 0。この場合、バス配列内にある個々の信号はすべて初期値 0 を使用します。

  • バス型と同じフィールド階層およびフィールド名を表すスカラー値 struct。この場合、スカラー構造体が拡張され、バス配列内にある個々の信号がそれぞれ初期化されます。

  • バス配列内にある個々の信号それぞれに対して初期値を指定する構造体の配列。

    構造体の配列を使用する場合、配列内の構造体はすべて同じフィールド階層をもっていなければなりません。また、階層内の各フィールドは、配列全体で次の特性が同一でなければなりません。

    • フィールド名

    • 数値データ型 (singleint32 など)

    • 実数/複素数

    • 次元

部分構造体は使用できません。

コード生成

バス配列のコード生成では、特定の形式をもつ構造体が作成されます。バス配列のコード生成を参照してください。

関連するトピック