In Bus Element ブロックを使用したバスの入力データの読み込み
この例では、In Bus Element ブロックを使用してバス要素の外部入力データを読み込む方法を示します。In Bus Element ブロックを使用すると、バスの外部インターフェイスの柔軟な設計と実装が可能になります。
In Bus Element ブロックは、バスの要素に対するデータを読み込むことも、バス全体に対するデータを読み込むこともできます。
ブロックがバス全体のデータを読み込む場合を除き、
Simulink.Bus
オブジェクトを使用して In Bus Element ブロックのデータ型を指定する必要はありません。複数の In Bus Element ブロックで同じバス要素を選択できます。
モデルで必要なバスの要素のみを読み込むことができます。未使用の要素を選択するためにブロックを追加する必要はありません。
指定する外部入力データには、バスのすべての要素のデータ、またはバスの一部の要素のみのデータを含めることができます。
モデルを開いて検査
モデル LoadInBusElement
を開きます。モデルには、3 つの In Bus Element ブロックを使用して定義されている InBus
という名前の 1 つの端子があります。各 In Bus Element ブロックは Display ブロックに接続されます。In Bus Element ブロックと Display ブロックの各ペアの下にある Dashboard Scope ブロックは、In Bus Element ブロックが読み込まれたデータから作成した信号をプロットします。
mdl = "LoadInBusElement";
open_system(mdl)
各 In Bus Element ブロックのラベルは、ブロックが選択した端子とバス要素の名前を示しています。モデル内の In Bus Element ブロックには、左から右に次のラベルが付いています。
InBus.a.x
— このブロックは、InBus
という名前の端子に関連付けられたバス内に入れ子にされたa
という名前のバスから、x
という名前のリーフ要素を選択します。InBus.a.y
— このブロックは、InBus
という名前の端子に関連付けられたバス内に入れ子にされたa
という名前のバスから、y
という名前のリーフ要素を選択します。InBus.b
— このブロックは、InBus
という名前の端子に関連付けられたバス内のb
という名前のリーフ要素を選択します。
モデルの [入力] パラメーターは、シミュレーション中に読み込む最上位の入力端子用の外部入力データを指定します。モデル ex_load_inbuselement
の [入力] パラメーターの現在の値を確認するには、以下のようにします。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。Simulink® ツールストリップの [モデル化] タブで [モデル設定] をクリックします。
[データのインポート/エクスポート] ペインで、[入力] パラメーターが選択されていて、
inbusdata
という名前の変数からデータを読み込むように構成されていることを確認します。
変数 inbusdata
は、[In Bus Element] ダイアログ ボックスで定義された [端子番号] に従って、InBus
という名前の端子にマッピングされます。
あるいは、関数 get_param
を使用して、LoadExternalInput
および ExternalInputData
パラメーターの値を確認することにより、プログラムによってモデル コンフィギュレーションを確認します。
get_param(mdl,"LoadExternalInput")
ans = 'on'
get_param(mdl,"ExternalInput")
ans = 'inbusdata'
バス用の外部入力データの作成
バスの階層および要素名に一致する階層およびフィールド名をもつ構造体としてバスの外部入力データを指定します。各リーフ要素のデータを timeseries
オブジェクト、1 列のみにデータを含む timetable
、または matlab.io.datastore.SimulationDatastore
オブジェクトとして指定します。この例では、バス要素ごとに timetable
を使用して構造体を作成します。
ステップ サイズ 1 で、0 から始まり 10 で終わる時間値の列ベクトルを作成します。
t = (0:10)';
時間ベクトルを使用して、正弦波、定数、および直線を表すデータを作成します。
sinedata = sin(t); constdata = 3*ones(11,1); linedata = linspace(0,10,11)';
timetable
を作成するには、指定する入力値が duration
ベクトルでなければなりません。関数 seconds
を使用して、時間ベクトルを秒単位の duration
ベクトルに変換します。
t = seconds(t);
各信号タイプのデータを格納する timetable
オブジェクトを作成します。
sine = timetable(t,sinedata); const = timetable(t,constdata); line = timetable(t,linedata);
モデルの端子に入力データを提供する構造体 inbusdata
を作成します。構造体フィールドの名前はバス要素の名前と一致していなければなりません。
inbusdata.a.x = const; inbusdata.a.y = line; inbusdata.b = sine;
入力データの完全指定
構造体 inbusdata
のデータは、モデルの In Bus Element ブロックで選択された信号のデータを完全に指定します。この構造体には次のデータが含まれます。
バスの既知のすべての要素
モデル内の In Bus Element ブロックによって選択されたすべての要素
モデルをシミュレートし、Dashboard Scope ブロックで信号を観察します。Simulink ツールストリップの [シミュレーション] タブで [実行] をクリックします。
あるいは、関数 sim
を使用してシミュレーションを実行します。
out = sim(mdl);
Dashboard Scope ブロックのプロットは、各 In Bus Element ブロックが構造体 inbusdata
で指定されたデータと一致する信号をモデルで生成していることを示しています。
一番左の In Bus Element ブロックは、
x
という名前の要素を選択し、値 3 の定数信号を生成しています。中央の In Bus Element ブロックは、
y
という名前の要素を選択し、直線を形成する値をもつ信号を生成しています。一番右の In Bus Element ブロックは、
b
という名前の要素を選択し、正弦波信号を生成しています。
入力データの部分指定
In Bus Element ブロックを使用してバス要素を選択する際に、バスの外部入力データを "部分的に指定" できます。構造体に次の信号が含まれていない場合、構造体はバスの入力データを部分的に指定します。
バス内のすべての要素
モデル内の In Bus Element ブロックによって選択されたすべての要素
In Bus Element ブロックは、構造内にデータをもたない、シミュレーションで選択された要素全体を通じてグラウンド値を生成します。
たとえば、要素 a.y
を選択する In Bus Element ブロックのラベルを編集し、そのブロックで要素 a.z
が選択されるようにします。あるいは、関数 set_param
を使用して、選択する要素を指定します。
blkpth = mdl + "/Bus Element In1"; set_param(blkpth,Element="a.z")
構造体を変更せずにモデルをシミュレーションします。InBus
という名前の端子にマッピングされる構造体には、a
という名前の入れ子にされたバス内の z
という名前の要素のデータが含まれていないため、この構造体はモデルのデータを部分的に指定します。
out = sim(mdl);
Dashboard Scope ブロックのプロットは以下を示しています。
一番左の In Bus Element ブロックは、
x
という名前の要素を選択し、値 3 の定数信号を生成しています。中央の In Bus Element ブロックは、
z
という名前の要素を選択し、グラウンド値 (この場合は値 0 の定数信号) を生成しています。一番右の In Bus Element ブロックは、
b
という名前の要素を選択し、正弦波信号を生成しています。
要素 a.z
を選択する In Bus Element ブロックへの変更を元に戻し、そのブロックで要素 a.y
が選択されるようにします。
set_param(blkpth,Element="a.y")
入力データの過剰指定
In Bus Element ブロックを使用してバス要素を選択する際に、バスの外部入力データを "過剰指定" できます。最上位の入力端子に関連付けられた In Bus Element ブロックが選択しないバス要素のデータが構造体に含まれている場合、構造体はバスの入力データを過剰指定します。
たとえば、要素 a.y
を選択する In Bus Element ブロックのラベルを編集し、そのブロックで要素 b
が選択されるようにします。あるいは、関数 set_param
を使用して、選択する要素を指定します。
set_param(blkpth,Element="b")
構造体を変更せずにモデルをシミュレーションします。InBus
という名前の端子にマッピングされる構造体は、どの In Bus Element ブロックも要素 a.y
を選択しないため、端子の入力データを過剰に指定します。シミュレーションは診断を発行せずに実行されます。
out = sim(mdl);
Dashboard Scope ブロックのプロットは以下を示しています。
一番左の In Bus Element ブロックは、
x
という名前のリーフ要素を選択し、値 3 の定数信号を生成しています。中央と一番右の In Bus Element ブロックは両方とも要素
b
を選択し、それぞれ正弦波信号を生成しています。