ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

バス配列の信号の操作

バス配列のモデルのセットアップ

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

  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 バス オブジェクトを使用します。割り当てを定義するために、この例では 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® は、ラピッド アクセラレータ モードでは参照モデル内の信号を記録しません。

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

バス配列の初期化

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

次の例では、バス配列を初期化する方法を示します。バス型 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. バス エディターで、バス オブジェクト 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;

コード生成

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

関連するトピック