変数の作成によるブロック パラメーター値の共有と再利用
Gain ブロックの [ゲイン] パラメーターなどのブロック パラメーター値を設定するには、作成後にベース ワークスペース、モデル ワークスペース、Simulink® データ ディクショナリなどのワークスペースに格納した数値変数を使用できます。この変数を使用すると、複数のブロック (異なるモデル内のブロックを含む) で複数のパラメーター値を設定できます。ブロック パラメーターの値を変更するには、ワークスペース内の変数の値を変更します。
変数を使用してブロック パラメーター値を設定すると、次のようなこともできます。
モデル ファイルを変更せずにパラメーター値を変更する (変数をモデル ワークスペース以外に格納する場合)。
値のスイープまたは調整時にパラメーターを特定のわかりやすい名前で識別する。
ブロック パラメーター値の設定の基本的な情報については、ブロック パラメーター値の設定を参照してください。
複数のブロックとモデルにおけるパラメーター値の再利用
MATLAB® 数値変数をベース ワークスペースやデータ ディクショナリなどのワークスペースに作成し、この変数を使用して 1 つ以上のブロック パラメーター値を指定することができます。
ブロック パラメーター値が簡単な数値式に設定される場合、モデル データ エディター ([モデル化] タブで [モデル データ エディター] をクリック) でその式の変数を作成できます。値に対応するセルの右側で
をクリックしてから、[変数を作成] を選択します。[新規データの作成] ダイアログ ボックスで、新しい変数の名前と場所を設定し、次に [作成] をクリックします。これにより、セルに新しい変数が表示されます。
複数の式で使用される定数を表す変数を作成することもできます。モデル例 sldemo_fuelsys は、ガソリン エンジンの燃料供給システムを表しています。モデル内のサブシステム feedforward_fuel_rate は、エンジンで消費される燃料と空気の理想的 (化学量論的) な混合比を表す定数 14.6 を使用して、エンジンの燃料需要を計算します。サブシステム内の 2 つのブロックは、この数値を使用してパラメーターの値を設定します。この例では、ブロック間で数値を共有するために、myParam という名前の変数を作成します。
フォールトトレラント燃料制御システムのモデル化のモデル例
sldemo_fuelsysを開きます。openExample('simulink_automotive/ModelingAFaultTolerantFuelControlSystemExample') sldemo_fuelsysモデルの [モデル化] タブで [モデル データ エディター] をクリックします。モデル データ エディターで、[パラメーター] タブを確認します。
モデルで、サブシステム内に移動します。
open_system(... 'sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate')
モデル データ エディターで、[コンテンツのフィルター] ボックスに
14.6と入力します。データ テーブルには 2 つの行が含まれ、サブシステムに存在する Constant ブロックのうちの 2 つの [Constant value] パラメーターに対応します。
[Value] 列を使用して、数値リテラル
14.6をmyParamで置換します。両方のパラメーターの置換を実行します。[コンテンツのフィルター] ボックスに
myParamと入力します。パラメーターのうちの 1 つの値を編集している間に、アクション ボタン
をクリックし、[作成] を選択します。[新規データの作成] ダイアログ ボックスで、[値] を
14.6に設定して [作成] をクリックします。変数
myParamがベース ワークスペースに表示されます。
変数はベース ワークスペース内に存在するため、その変数を複数のモデルで使用できます。ただし、MATLAB セッションを終了すると、ベース ワークスペースの内容は失われます。変数をモデル ワークスペースまたはデータ ディクショナリに恒久的に保存することを検討してください。
システム定数の定義
地球の半径を表す変数などのシステム定数を定義するには、MATLAB 数値変数ではなく Simulink.Parameter オブジェクトを作成することを検討してください。パラメーター オブジェクトを使用すると、その他の特性に加えて物理単位やカスタム ドキュメンテーションを指定できます。
パラメーター オブジェクトを作成してモデルで使用するには、データ オブジェクトを参照してください。
一般に、システム定数の値は、数学的関係を通して、他のパラメーターおよび信号の値に影響を与えます。これらの関係性を明示的にモデル化するには、式を利用して依存データの値を設定します。数式を使用した変数値の設定を参照してください。
数式を使用した変数値の設定
変数の値は、数値リテラルやその他の変数を含む式として設定することができます。式を利用すると、以下が可能です。
値を特定不可能な数値リテラルとして表現する代わりに、既知の物理定数間の関係として表現する。
パラメーター データ間の代数的依存関係を明示的にモデル化する。独立したデータの値を変更するとき、依存データの値を調整することを忘れないようにする必要がない。
一般的な手法
変数を Simulink.Parameter オブジェクトに変換します。次に、式を利用して、オブジェクトの Value プロパティを設定します。
対話形式 — たとえば、モデル データ エディターやモデル エクスプローラーで、先頭に等号 (
=) を置いて式を記述します。次の図は式myVar + myOtherVarを指定する方法を示しています。
プログラム形式 — 関数
slexprを使用して、文字ベクトルまたは文字列で式を指定します。たとえば、myParamという名前のパラメーター オブジェクトの値を式myVar + myOtherVarに設定するには、以下のようにします。myParam.Value = slexpr('myVar + myOtherVar')
変数間の代数的関係の明示的モデル化
例 sldemo_metro (モデルのソルバー ヤコビ行列構造の探索参照) は、移動ベースから吊り下げられた 3 つの同一の点状メトロノームから成るシステムをモデル化します。このモデルのブロックには、ベース ワークスペースの以下の MATLAB 変数が使用されています。
m— 各メトロノームの質量、初期値 0.1 kgr— 各メトロノームの長さ、初期値 1.0 mJ— 各メトロノームの慣性モーメント、初期値 0.1 kg/m2
これらの変数は、代数的関係を共有しています。つまり、各メトロノームの慣性モーメントは、質量に長さの平方を乗算した値に等しくなります。この例では、この関係を J の値に記録してみます。
モデルを開きます。
sldemo_metro
ブロック線図を更新します。モデルのコールバックにより、ベース ワークスペースにこれらの変数が作成されます。
コールバックによって変数に行った変更が上書きされるのを防ぐため、この例では、コールバック コードを削除します。
set_param('sldemo_metro','InitFcn','')
モデルの [モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターの [パラメーター] タブで、[スコープの変更] ボタンを有効にします。
変数を使用するブロックはサブシステム内にあるため、モデル データ エディターにサブシステム内のデータが表示されるよう設定しなければなりません。
[追加情報の表示/更新] ボタンをクリックします。
データ テーブルには、ベース ワークスペース内の変数に対応する行があります。
[コンテンツのフィルター] ボックスに
Jと入力します。データ テーブルで、
Jに対応する行を確認します。[Value] 列で、変数の値をSimulink.Parameter(J)に設定します。Simulink が
JをSimulink.Parameterオブジェクトに変換します。[Value] 列で、パラメーター オブジェクトの値を
=m*r^2に設定します。オプションで、メトロノームの質量や長さを変えてモデルをシミュレートします。
mとrの値を変更しても、Jの値を忘れずに変更する必要はありません。
その他のモデル化の目的に関する制限と考慮事項
式が固定小数点データまたは列挙型のデータを含む場合、式は 1 つの変数またはオブジェクトのみに対して動作できます。
式を利用するパラメーター オブジェクトのデータ型 (
DataTypeプロパティ) をauto(既定値) に設定して、その式の中に出現するパラメーター オブジェクトのデータ型をauto以外に設定することはできません。たとえば、式J = m*r^2において、Jのデータ型をautoに設定して、mおよびrのデータ型をsingleに設定することはできません。autoのメリット (状況依存データ型指定で説明) を式を利用したオブジェクトでも引き続き活用するためには、式に含まれるオブジェクトのデータ型をautoに設定します。つまり、関連するすべてのオブジェクトでautoを使用します。式に含まれるオブジェクトは、式を利用するオブジェクトと同じデータ型を取得します。式に出現するオブジェクトに
auto以外の値を使用するには、依存するすべてのパラメーター オブジェクトのデータ型をauto以外の値に設定します。つまり、関連するすべてのオブジェクトで、autoを使用してはなりません。式に利用されるすべてのオブジェクトで同一のデータ型を使用する必要があります。
Simulink Coder™ および Embedded Coder® のライセンスがある場合、式を利用してグローバル変数を初期化するコードを生成できます。しかし、コード ジェネレーターは、その式が特定の要件に適合している場合のみ、式を保持することができます。式の保持 (Simulink Coder)を参照してください。
パラメーター値のスコープの制御
変数の "スコープ" とは、その変数を使用できるモデルとブロックのセットです。たとえば、ベース ワークスペースに作成した変数は、開いているすべてのモデル内のすべてのブロックで使用できるため、グローバル スコープをもちます。モデル ワークスペースに格納した変数は、ホスト モデル内のブロックでのみ使用できるため、スコープが制限されています。
同じ名前をもつ 2 つの変数を同じスコープ内に作成することはできません。変数のスコープを制御すると、名前の競合を回避して変数の所有権を明確にするのに役立ちます。
次の表は、再利用可能なパラメーター値のスコープを制御するさまざまな方法を示しています。
| スコープ | 手法 |
|---|---|
| 開いているすべてのモデル | 変数をベース ワークスペースに作成します。 |
| 1 つ以上のターゲット モデル | 変数をデータ ディクショナリに作成します。変数を複数のモデルで再利用するには、参照ディクショナリを作成します。データ ディクショナリとはを参照してください。 |
| 1 つのモデル (モデル内のすべてのサブシステムを含む) | 変数をモデル ワークスペースに作成します。モデル ワークスペースを参照してください。 |
| サブシステム内の複数のブロック (入れ子にされたサブシステム内のブロックを含む) | サブシステムをマスクし、ワークスペース変数ではなくマスク パラメーターを作成します。 サブシステム内のブロックでワークスペース変数が使用されないようにするには、Subsystem ブロックのダイアログ ボックスで、[階層の関連付けを許可] を サブシステムの詳細については、Subsystem を参照してください。マスクの詳細については、マスクの基礎を参照してください。 |
同じスコープ内に多数の変数を含む大規模モデルがある場合に名前の競合を回避するには、変数を単一の構造体にパッケージ化することを検討してください。詳細については、関連するブロック パラメーター定義を構造体に整理を参照してください。
指定した変数名がブロックでどのように使用されるかの基本的な情報については、記号の解釈を参照してください。
ワークスペース変数の永続的な保存
ベース ワークスペースに作成した変数は、MATLAB セッション間で保持されません。ただし、変数を MAT ファイルまたはスクリプト ファイルに保存し、モデル コールバックを使用してモデルを開くたびにそのファイルを読み込むことができます。モデル "コールバック" とは、モデルを開くなどのモデルの特定の操作を行ったときに Simulink で実行される一連のコマンドです。コールバックを使用して、モデルを開くときに変数を読み込むことができます。Simulink について学んでモデルを試す間、この手法を使用して変数を保存してください。
Gain ブロックを含むモデルでは、[ゲイン] パラメーターの値を
Kに設定します。コマンド プロンプトで、変数
Kをベース ワークスペースに作成します。K = 27;
ワークスペース パネルで変数を右クリックして、[名前を付けて保存] を選択します。
複数の変数を 1 つのファイルに保存するには、ワークスペース パネルでターゲットのすべての変数を選択し、選択したいずれかの変数を右クリックします。
ダイアログ ボックスで、[ファイルの種類] を
[MATLAB スクリプト]に設定します。[ファイル名] をloadvarに設定して [保存] をクリックします。現在のフォルダーにスクリプト ファイル
loadvar.mが表示されます。このファイルを開くと、変数Kを作成するコマンドを確認できます。モデルの [モデル化] タブで [モデル設定] 、 [モデル プロパティ] を選択します。
[モデル プロパティ] ダイアログ ボックスの [コールバック] タブで、定義するコールバックとして
PreLoadFcnを選択します。[モデル プリロード関数] ペインで、loadvarと入力し、[OK] をクリックします。モデルを保存します。
モデルを次回開いたときは、変数 K が PreloadFcn コールバックによってベース ワークスペースに読み込まれます。変数を loadvar.mat などの MAT ファイルに保存して、モデル コールバックを load loadvar に設定することもできます。
コールバックの詳細については、コールバックを使用したモデル動作のカスタマイズを参照してください。変数を読み込むコールバックをプログラムで定義するには、プログラムでのモデルのワークスペース変数の保存を参照してください。
変数をファイルに保存する際は、MATLAB セッション中に変数に加えた変更を保存しなければなりません。モデルの変数を永続的に保存するには、MAT ファイルまたはスクリプト ファイルではなくモデル ワークスペースまたはデータ ディクショナリを使用することを検討してください。変数の永続的な保存の詳細については、Simulink モデルの変数とオブジェクトの保存場所の決定を参照してください。
プログラムでのモデルのワークスペース変数の保存
上記の例では、モデルを開くときに変数を作成するモデル コールバックを定義しています。プログラムで変数を保存してモデル コールバックを設定することができます。
コマンド プロンプトで、変数
Kをベース ワークスペースに作成します。K = 27;
loadvar.mという名前の新しいスクリプト ファイルに変数を保存します。matlab.io.saveVariablesToScript('loadvar.m','K')
スクリプト ファイルを読み込むモデル コールバックを設定します。
set_param('mymodel','PreloadFcn','loadvar')
モデルを保存します。
save_system('myModel')
関数 matlab.io.saveVariablesToScript では、変数はスクリプト ファイルに保存されます。変数を MAT ファイルに保存するには、関数 save を使用します。コールバックなどのモデル プロパティをプログラムで設定するには、関数 set_param を使用します。
ワークスペース変数の管理と編集
変数を使用してブロック パラメーター値を設定する際に、変数をワークスペースまたはデータ ディクショナリに格納します。コマンド プロンプト、モデル エクスプローラー、およびモデル データ エディターを使用して、変数の作成、移動、コピーおよび編集を実行できます。また、変数がモデル内のどこで使用されているかを判別したり、モデルで使用されるすべての変数を一覧表示したり、モデルで使用されないすべての変数を一覧表示したりすることもできます。詳細については、ワークスペース変数の作成、編集、管理を参照してください。
ルックアップ テーブルの共有ブレークポイントとテーブル データのパッケージ化
複数の n-D Lookup Table、Prelookup、および Interpolation Using Prelookup ブロック間でブレークポイントのベクトルまたはテーブル データを共有するには、MATLAB 変数または Simulink.Parameter オブジェクトではなく、Simulink.LookupTable オブジェクトと Simulink.Breakpoint オブジェクトにデータを格納することを検討してください。この手法により、データをルックアップ テーブルの一部として明確に特定し、ブレークポイント データをテーブル データに明示的に関連付けることで、モデルの可読性が向上します。
Simulink.LookupTable オブジェクトへのスタンドアロン ルックアップ テーブルの格納
スタンドアロン ルックアップ テーブルは、一連のテーブル データと 1 つ以上のブレークポイントのベクトルで構成されます。テーブル データまたはいずれかのブレークポイントのベクトルを他のルックアップ テーブルと共有しません。
スタンドアロン ルックアップ テーブルを共有する場合は、テーブルとブレークポイントのすべてのデータを一緒に複数の n-D Lookup Table ブロックで使用します。このデータを Simulink.LookupTable オブジェクトに保存するには、次の手順に従います。
オブジェクトをワークスペースまたはデータ ディクショナリに作成します。たとえば、コマンド プロンプトで、次のように入力します。
myLUTObj = Simulink.LookupTable;
オブジェクトのプロパティを使用して、テーブル データとブレークポイント データの値を格納します。
オブジェクトのプロパティを使用して、生成されたコードの構造体型の一意の名前を構成します。プロパティ ダイアログ ボックスの [構造体の型定義] で [名前] を指定します。
n-D Lookup Table ブロックで、[データの仕様] を
[ルックアップ テーブル オブジェクト]に設定します。[データの仕様] の右側で、[名前] を
Simulink.LookupTableオブジェクトの名前に設定します。
Simulink.LookupTable オブジェクトの作成および構成方法については、Simulink.LookupTable を参照してください。
Simulink.LookupTable および Simulink.Breakpoint オブジェクトへの共有データの格納
Prelookup ブロックと Interpolation Using Prelookup ブロックを使用して、ルックアップ アルゴリズムをより細かく制御する場合は、ブレークポイントのベクトルとテーブル データのセットを共有できます。たとえば、2 組のテーブル データ間でブレークポイントのベクトルを共有できます。このようにテーブル データからブレークポイント データを分離することで、ルックアップ テーブル全体を共有するのではなく、ルックアップ テーブルの各部分を共有できます。
ブレークポイントとテーブル データを保存するには、次の手順に従います。
一連の一意のテーブル データごとに
Simulink.LookupTableオブジェクトを 1 つ作成します。一意のブレークポイントのベクトルごとにSimulink.Breakpointオブジェクトを 1 つ作成し、共有しないブレークポイントのベクトルを含めます。オブジェクトのプロパティを使用して、テーブル データとブレークポイント データの値を格納します。
ブレークポイント データの
Simulink.Breakpointオブジェクトを参照するようにSimulink.LookupTableオブジェクトを構成します。Simulink.LookupTableオブジェクトで、[仕様] を[参照]に設定します。Simulink.Breakpointオブジェクトの名前を指定します。Interpolation Using Prelookup ブロックで、[仕様] を
[ルックアップ テーブル オブジェクト]に設定します。[名前] をSimulink.LookupTableオブジェクトの名前に設定します。Prelookup ブロックで、[仕様] を
[ブレークポイント オブジェクト]に設定します。[名前] をSimulink.Breakpointオブジェクトの名前に設定します。
モデル例 fxpdemo_lookup_shared_param には 2 つの Prelookup ブロックと 2 つの Interpolation Using Prelookup ブロックが含まれます。Prelookup ブロックと Interpolation Using Prelookup ブロックの各組み合わせが一意のルックアップ テーブルを表すようにブロックを設定します。2 つのルックアップ テーブル間でブレークポイントのベクトルを共有します。この例では、各ルックアップ テーブルのテーブル データは一意ですが、ブレークポイント データは共有です。
モデル例を開きます。
Prelookup ブロックのダイアログ ボックスで、[仕様] を
[ブレークポイント オブジェクト]に設定します。[名前] をsharedBkptsに設定します。[名前] パラメーターの値の横にあるボタン
をクリックします。[変数を作成] を選択します。[新規データの作成] ダイアログ ボックスで、[値] を
Simulink.Breakpointに設定して [作成] をクリックします。Simulink.Breakpointオブジェクトがベース ワークスペースに表示されます。sharedBkptsのプロパティ ダイアログ ボックスで、[値] を[1 2 3 4 5 6 7 8 9 10]のようにベクトルとして指定します。[OK] をクリックします。Prelookup ブロックのダイアログ ボックスで、[OK] をクリックします。
Prelookup1 ブロックのダイアログ ボックスで、[仕様] を
[ブレークポイント オブジェクト]に設定します。[名前] をsharedBkptsに設定します。Interpolation Using Prelookup ブロックのダイアログ ボックスで、[仕様] を
[ルックアップ テーブル オブジェクト]に設定します。[名前] をdataForFirstTableに設定します。[名前] パラメーターの値の横にあるボタン
をクリックします。[変数を作成] を選択します。[新規データの作成] ダイアログ ボックスで、[値] を
Simulink.LookupTableに設定して [作成] をクリックします。Simulink.LookupTableオブジェクトがベース ワークスペースに表示されます。dataForFirstTableのプロパティ ダイアログ ボックスで、[値] を[10 9 8 7 6 5 4 3 2 1]のようにベクトルとして指定します。[仕様] を
[参照]に設定します。[仕様] の下にあるテーブルで、[名前] を
sharedBkptsに設定し、[OK] をクリックします。Interpolation Using Prelookup ブロックのダイアログ ボックスで、[OK] をクリックします。
dataForSecondTableという名前のSimulink.LookupTableオブジェクトを使用するように Interpolation Using Prelookup1 ブロックを設定します。オブジェクトのプロパティ ダイアログ ボックスで、[0 0.5 1 1.5 2 2.5 3 3.5 4 4.5]のように [値] をベクトルとして指定します。ブレークポイント データのsharedBkptsを参照するようにオブジェクトを設定します。
これで、モデルは次の 2 つの一意のルックアップ テーブルを表すようになります。
sharedBkptsとdataForFirstTableの組み合わせ。sharedBkptsとdataForSecondTableの組み合わせ。
これらのルックアップ テーブルは、sharedBkpts を通じて同じブレークポイント データを共有します。