メインコンテンツ

非バーチャル バスの作成

非バーチャル バスは C コードの構造体に似ています。非バーチャル バスは次の目的で使用します。

  • バス配列の構成。

  • バス データが MATLAB Function ブロックまたは Stateflow® チャートの境界を越えるように設定。

  • バス データを生成された C コードの構造体としてパッケージ化。

  • S-Function を介した外部コードとのインターフェイス接続。

  • 生成コードのサブコンポーネントに渡される関数の引数の数を削減。

Simulink.Bus オブジェクト データ型では、非バーチャルにするバスを定義しなければなりません。[非バーチャル バスとして出力] などのブロック パラメーターを選択すると、バスは非バーチャルになります。バスを非バーチャルにすると、シミュレーションとコード生成でバス オブジェクトによって定義された構造体が適用されます。バスがバーチャルな場合、バス オブジェクトはバスのプロパティのみを検証します。

非バーチャル バスを含むモデルをシミュレーションするには、参照バス オブジェクトがベース ワークスペースまたはモデルで使用されるデータ ディクショナリになければなりません。詳細については、バス オブジェクトでのバス プロパティの指定を参照してください。

非バーチャル バスでは、バスの要素がすべて同じサンプル時間をもつことも必要です。詳細については、非バーチャル バスのサンプル時間の変更を参照してください。

非バーチャル バスを作成する方法は、バスの場所と、バスを作成するブロックによって異なります。

基本ステップに集中するために、例はシンプルです。ただし、バスは、多くの信号を結合する場合に最も役立ちます。

非バーチャル バスのコンポーネント内での作成

Bus Creator ブロックを使用して、非バーチャル バスをコンポーネント内に作成できます。

BusHierarchy という名前のモデルを開いてコンパイルします。このモデルでは Bus Creator ブロックを使用してバーチャル バスの階層を作成します。モデルをコンパイルするには、Simulink® ツールストリップの [モデル化] タブで、[モデルの更新] または [実行] をクリックします。モデルをコンパイルするとライン スタイルが更新されます。このライン スタイルは、バスを視覚的に識別するのに使用できます。

あるいは、MATLAB® コマンド ウィンドウで次のコマンドを入力します。

mdl = "BusHierarchy";
open_system(mdl)
set_param(mdl, SimulationCommand="Update")

A Bus Creator block groups signals named Chirp and Sine into a virtual bus named NestedBus. Another Bus Creator block groups NestedBus and a signal named Step into a virtual bus named TopBus.

このモデルのバーチャル バスは Simulink.Bus オブジェクトで定義されていません。非バーチャル バスを作成するには、バス階層と一致するバス オブジェクトを指定する必要があります。

対話形式でバス オブジェクトを作成するには、次を行います。

  1. 型エディターを開きます。Bus Creator ブロックをダブルクリックします。その後、[出力データ型] ボックスの横にある Open Type Editor をクリックします。

  2. 型エディターで、Create types をクリックしてバス オブジェクトを 2 つ作成します。

  3. それぞれのバス オブジェクトで、Create elements をクリックして要素を 2 つ作成します。

  4. 必要に応じて、オブジェクトをダブルクリックして名前を変更します。この例では、信号とバスの名前を使用します。

  5. NestedBus 要素のデータ型を NestedBus に設定します。

Bus objects in the base workspace in the Type Editor

または、Simulink.Bus.createObject関数を使用します。

bctop = "BusHierarchy/Bus Creator1";
Simulink.Bus.createObject(mdl,bctop);

関数は対応するバス TopBusNestedBus の名前が付いた 2 つのバス オブジェクトを作成します。

作成する非バーチャル バスに対応するバス オブジェクトができたので、対応する Bus Creator ブロックのパラメーターを更新して一番上のバスを非バーチャル バスに変換します。

  1. プロパティ インスペクターを開きます。Simulink ツールストリップの [シミュレーション] タブにある [準備] ギャラリーで [プロパティ インスペクター] を選択します。

  2. Bus Creator1 という名前の Bus Creator ブロックを選択します。

  3. プロパティ インスペクターで、[出力データ型]Bus: TopBus に設定します。

  4. プロパティ インスペクターで、[非バーチャル バスとして出力] を選択します。

  5. ライン スタイルで非バーチャル バスを特定するには、モデルを再コンパイルします。

あるいは、次のコマンドを入力します。

set_param(bctop, OutDataTypeStr="Bus: TopBus")
set_param(bctop, NonVirtualBus="on")
set_param(mdl, SimulationCommand="Update")

The line style of TopBus indicates a nonvirtual bus.

TopBus は非バーチャル バスになりますが、NestedBus はバーチャル バスのままです。

入れ子のバスを非バーチャル バスに変換するには、対応する Bus Creator ブロックのパラメーターを更新します。

  1. Bus Creator という名前の Bus Creator ブロックを選択します。

  2. プロパティ インスペクターで、[出力データ型]Bus: NestedBus に設定します。

  3. プロパティ インスペクターで、[非バーチャル バスとして出力] を選択します。

  4. ライン スタイルで非バーチャル バスを特定するには、モデルを再コンパイルします。

あるいは、次のコマンドを入力します。

bcnested = "BusHierarchy/Bus Creator";
set_param(bcnested, OutDataTypeStr="Bus: NestedBus")
set_param(bcnested, NonVirtualBus="on")
set_param(mdl, SimulationCommand="Update")

The line style of NestedBus indicates a nonvirtual bus.

NestedBus が非バーチャル バスになります。

バス オブジェクトを保存しない場合、そのモデルを再度開くときに、バス オブジェクトを再作成しなければなりません。バス オブジェクトを保存する方法の詳細については、バス オブジェクトでのバス プロパティの指定を参照してください。

インターフェイスでの非バーチャル バスの作成

インターフェイスで非バーチャル バスを作成するには、バスの要素を Out Bus Element ブロックに接続し、出力バスが非バーチャルであると指定します。

BusOutput という名前のモデルを開きます。このモデルでは 3 つのOut Bus Elementブロックを使用して、出力端子でバーチャル バスを作成します。

Model with three source blocks that connect to three Out Bus Element blocks

このモデルの作成については、複数の出力信号を 1 つの端子に接続を参照してください。

非バーチャル バスはSimulink.Busオブジェクト データ型でなければなりません。出力バスに対応するバス オブジェクトを作成します。

  1. Simulink® ツールストリップの [モデル化] タブの [設計] ギャラリーで、[型エディター] を選択します。

  2. Type Editorで、Interface および Sinusoidal という名前のバス オブジェクトを作成します。

  3. それぞれのバス オブジェクトについて、バスの要素に対応するSimulink.BusElementオブジェクトを作成します。Sinusoidal で、Chirp および Sine という名前の要素を作成します。Interface で、NestedBus および Step という名前の要素を作成します。

  4. 任意の入れ子にされたバスに対してバス オブジェクト データ型を指定します。NestedBus で、[データ型]Bus: Sinusoidal に設定します。

Type Editor with bus object hierarchy in base workspace

非バーチャル バスを出力するには、バス オブジェクト データ型とバスの仮想性を指定します。

  1. Out Bus Element ブロックの 1 つをダブルクリックして、端子のダイアログ ボックスを開きます。

  2. ダイアログ ボックスのツリー階層で、OutBus を選択します。

  3. 対応する属性を表示するには、Show attributes をクリックします。

  4. [データ型]Bus: Interface に設定します。

  5. [バスの仮想性]nonvirtual に設定します。

Out Bus Element block dialog box with bus object specification

モデルの出力は非バーチャル バスです。非バーチャル バスを確認するには、別のモデル内のモデルを参照するか、Out Bus Element ブロックをサブシステムに移動します。モデルをコンパイルするとライン スタイルが更新されます。モデルをコンパイルするには、Simulink ツールストリップの [モデル化] タブで、[モデルの更新] または [実行] をクリックします。

Model block with nonvirtual bus output

バス オブジェクトを保存しない場合、そのモデルを再度開くときに、バス オブジェクトを再作成しなければなりません。バス オブジェクトを保存する方法の詳細については、バス オブジェクトでのバス プロパティの指定を参照してください。

In Bus Elementブロックは [バスの仮想性] パラメーターを使用して、ブロックがバスの仮想性を継承するか、または定義するかを決定します。ブロックがバスの仮想性を定義し、入力バスの仮想性が一致しない場合、モデルをコンパイルするとエラーが発生します。

ルートのInportブロックとOutportブロックでも、インターフェイスに非バーチャル バスを作成できます。バスの仮想性を指定するには次のようにします。

  • ルートの Inport ブロックについて、ダイアログ ボックスの [信号属性] タブで [非バーチャル バスとして出力] を選択します。

  • ルートの Outport ブロックについて、ダイアログ ボックスの [信号属性] タブで [親モデル内の非バーチャル バスとして出力] を選択します。

バーチャル バスの非バーチャル バスへの変換

Signal Conversionブロックを使用して、モデル内の任意の場所でバーチャル バスを非バーチャル バスに変換できます。

BusConversion という名前のモデルを開いてコンパイルします。このモデルには、Bus Creator ブロックによって作成されたバーチャル バス階層が含まれています。モデルをコンパイルするには、Simulink ツールストリップの [モデル化] タブで、[モデルの更新] または [実行] をクリックします。モデルをコンパイルするとライン スタイルが更新されます。このライン スタイルは、バスを視覚的に識別するのに使用できます。

Block diagram with Bus Creator blocks that create a virtual bus hierarchy

バスを定義して非バーチャル バスへの変換をサポートするため、Bus Creator ブロックは Simulink.Bus オブジェクト データ型を指定します。モデルが読み込まれるときにベース ワークスペースでバス オブジェクトを作成するために、モデルは PreLoadFcn コールバックを使用します。

コールバックを表示するには、Simulink ツールストリップの [モデル化] タブで [モデル設定]、[モデル プロパティ] をクリックします。[モデル プロパティ] ダイアログ ボックスで [コールバック] タブを開き、PreLoadFcn モデル コールバックを選択します。

バス オブジェクトを表示するには、[型エディター] を開きます。

Type Editor with two bus objects in the base workspace

バーチャル バスを非バーチャル バスに変換するには Nonvirtual Bus ブロックを使用します。このブロックは、[出力]Nonvirtual bus に設定されている、事前構成されたバージョンの Signal Conversion ブロックです。

モデル例で次のようにします。

  1. モデルに To Nonvirtual Bus ブロックを追加します。

  2. Bus Creator1 という名前の Bus Creator ブロックと Scope ブロックの間のライン上に To Nonvirtual Bus ブロックをドラッグします。ライン上にブロックをドラッグすると、ブロックの両端がラインに接続されます。

変換するバスのデータ型がバス オブジェクトによって指定されていないとします。次の追加のアクションを実行する必要が生じます。

  1. 対応するバス オブジェクトを作成します。

  2. バスのバス オブジェクト データ型を指定します。たとえば、To Nonvirtual Bus ブロックの [データ型] パラメーターを、入力バスに対応するバス オブジェクトに設定します。

To Nonvirtual Bus ブロックへの入力はバーチャル バスであり、出力は非バーチャル バスです。非バーチャル バスのライン スタイルを確認するには、モデルをコンパイルします。

Block diagram with a To Nonvirtual Bus block that converts a virtual bus to a nonvirtual bus

MATLAB 構造体からの非バーチャル バスの作成

Constant ブロックを使用して、定数値の要素をもつ非バーチャル バスを簡潔に表すことができます。

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

  • [定数値] を MATLAB 構造体に設定する。

  • [出力データ型]Simulink.Bus オブジェクトに設定する。

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

非バーチャル バスを作成する Constant ブロックを含むモデル例を開いてコンパイルします。モデルをコンパイルするとライン スタイルが更新されます。このライン スタイルは、バスを視覚的に識別するのに使用できます。モデルをコンパイルするには、Simulink ツールストリップの [モデル化] タブで、[モデルの更新] または [実行] をクリックします。あるいは、MATLAB コマンド ウィンドウで次のコマンドを入力します。

mdl = "NonvirtualBusFromStructure";
open_system(mdl)
set_param(mdl,SimulationCommand="Update");

NonvirtualBusFromStructure model

PreLoadFcn モデル コールバックは、offsetgain、および threshold という名前の要素をもつ busval という名前の MATLAB 構造体を定義します。その後、モデル コールバックで、Simulink.Bus.createObject 関数を使用して構造体から Simulink.Bus オブジェクトが作成されます。バス オブジェクトの名前には既定の slBus1 が使用されます。

モデル コールバックを確認するには、Simulink ツールストリップの [モデル化] タブの [設計] ギャラリーで [プロパティ インスペクター] を選択します。モデルの最上位レベルで何も選択されていないとき、モデル コールバックがプロパティ インスペクターに表示されます。あるいは、モデル コールバックをプログラムで取得するには get_param 関数を使用します。

cb = get_param(mdl,"PreLoadFcn")
cb = 
    '% Define a MATLAB structure named busval with elements named
     % offset, gain, and threshold.
     
     busval.offset = 197;
     busval.gain = 4.32;
     busval.threshold = 795.68;
     
     % Define the corresponding Simulink.Bus object.
     
     clear slBus1
     Simulink.Bus.createObject(busval)'

非バーチャル バスを作成するために、Constant ブロックで [定数値]busval[出力データ型]Bus: slBus1 に設定しています。

参考

ブロック

オブジェクト

トピック