このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
複数の Model ブロックを使用して同じモデルを参照すると、モデルの各インスタンスで同じ値または異なる値を使用するようブロック パラメーターを設定できます。たとえば、Gain ブロックの [ゲイン] パラメーターを設定できます。異なる値を使用する場合、モデル引数を作成して使用し、ブロック パラメーターの値を設定します。場合によっては、使用するブロック パラメーター (コントローラーの設定点やフィルター係数など) の値をインスタンスごとに個別に設定できないと参照モデルを再利用できないことがあります。
再利用可能な参照モデルのブロック パラメーターについて、モデルのインスタンスごとに異なる値を指定するには、次を行います。
参照モデルのモデル ワークスペースで MATLAB® 変数または Simulink.Parameter
オブジェクトを作成します。
保守をしやすくするには MATLAB 変数を使用します。
最小値と最大値、データ型などのモデル引数のプロパティをより詳細に制御するには Simulink.Parameter
オブジェクトを使用します。
変数またはパラメーター オブジェクトを使用してモデルのブロック パラメーター値を設定します。必要に応じて同じ変数またはオブジェクトを使用して他のブロック パラメーター値を設定します。
変数またはオブジェクトをモデル引数として設定します。
このモデルのシミュレーションを直接実行する場合、変数またはオブジェクトによってモデル ワークスペース内に保存された値がブロック パラメーターとして使用されます。このモデルが参照モデルとしてシミュレートされると、モデル引数として構成されたパラメーターはその値を親モデルから取得します。
再利用可能なモデルを参照するそれぞれの Model ブロックで、ブロック パラメーターにインスタンス固有の値を指定します。値を指定しない場合、モデル階層構造内のその下に指定された最後の値が、引数によって使用されます。最上位モデルに診断コンフィギュレーション パラメーター [モデル引数に明示的な最終値がない] を設定することで、モデル引数の値を設定できる一番上の Model ブロックに、明示的な値が指定されずに既定値が使用される時点のエラーや警告を生成できます。
中間モデルでは、ブロック パラメーターにインスタンス固有の値を指定するのに加え、階層の次のレベルでパラメーターをオーバーライド可能かどうかを指定できます。
複数のモデル引数を使用するようにモデルを構成する場合、モデル ワークスペースの個別の変数の代わりに構造体を使用することを検討します。この手法により、引数の追加、名前の変更、または削除を行うときに保守の作業を減らすことができます。モデル ワークスペースの引数を Model ブロックの引数の値と手動で同期する代わりに、変数エディターまたはコマンド プロンプトを使用して構造体を変更します。
Simulink® Coder™ ライセンスがある場合は、この手法によって出力関数 (step
) などの参照モデルの関数の仮パラメーターが使用する ROM を減らすこともできます。
構造体を作成および使用してブロック パラメーター値を設定するには、関連するブロック パラメーター定義を構造体に整理を参照してください。
この例では、同じブロック パラメーターに違う値を使用するように参照モデルの複数のインスタンスを対話的に設定する方法について説明します。コマンド プロンプトのみを使用して参照モデルをパラメーター化する例については、参照モデルのプログラムによるパラメーター化を参照してください。コード生成を含む例については、Specify Instance-Specific Parameter Values for Reusable Referenced Model (Simulink Coder)を参照してください。
参照モデル自体のシミュレーションを実行すると、モデル ワークスペースのパラメーター オブジェクトは Simulink.Parameter
オブジェクトまたは MATLAB 変数で指定した値を使用します。ブロック パラメーターでもこれらの値を使用します。
Gain ブロックの [ゲイン] パラメーターと Discrete Filter ブロックの [分子係数] パラメーターをモデル引数として設定するには、以下の手順に従います。
Gain ブロックと Discrete Filter ブロックを含むモデル ex_model_arg_ref
を作成します。
モデルの [モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターで、[パラメーター] タブを選択します。
[値] 列を使用して、[ゲイン] パラメーターの値を gainArg
に設定します。
gainArg
の横にあるアクション ボタン をクリックし、[作成] を選択します。
[新規データの作成] ダイアログ ボックスで、[値] を Simulink.Parameter
に設定し、[場所] を [モデル ワークスペース]
に設定します。[作成] をクリックします。
Simulink.Parameter
プロパティ ダイアログ ボックスで、[値] を 3.17
のような数値に設定します。[OK] をクリックします。
モデル データ エディターを使用して、Discrete Filter ブロックの [分子] パラメーターを設定します。
coeffArg
という名前の Simulink.Parameter
オブジェクトを作成します。
coeffArg
をモデル ワークスペースに保存します。
1.05
の値を coeffArg
に代入します。
モデル データ エディターで [追加情報の表示/更新] ボタンをクリックします。
それぞれのオブジェクトについて、[Argument] 列のチェック ボックスをオンにします。
多くのパラメーターを使用するモデルの場合は、[コンテンツのフィルター] ボックスを使用すると、特定のパラメーターをすばやく検索できます。
親モデルをシミュレートする場合、再利用可能な参照モデルの各インスタンスでは、親モデルで指定したパラメーターの値が使用されます。この例では、モデルの階層構造の各レベルにおいて、Model ブロック上で調整可能なパラメーターとしてモデル引数を提示する方法を説明します。
前の例から再利用可能なモデル ex_model_arg_ref
の複数のインスタンスを使用するモデル ex_model_arg
を作成します。
モデルの [モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターで、[パラメーター] タブを選択します。モデル データ エディターに、2 つの Model ブロックに対して指定できるインスタンス固有パラメーターに対応する 4 つの行が表示されます。
モデル データ エディターを使用して、Model
のパラメーターの値を設定します。たとえば、次の図の値を使用します。Model1
について、モデル引数の値を指定しないでください。既定では、モデル引数はモデルの階層構造 (値 <from
below>
によって示される) 内で、その下で指定された最後の値を使用します。
モデルの階層構造の次のレベルにおいて、これらのパラメーター値をオーバーライドするには、[Argument] 列のチェック ボックスをオンにします。既定では、チェック ボックスはオフになっています。
各 Model ブロックでインスタンス固有パラメーターを設定することもできます。ブロックのダイアログ ボックスで、[インスタンス パラメーター] タブを選択します。
Model1
では、[引数] チェック ボックスをオンにしてパラメーターを親モデルに公開するときに、[値] が <inherited>
として表示され、実行時の値が親から取得されるようになったことを示します。
ex_model_arg
を参照する Model ブロックを含むモデル ex_model_arg_top
を作成します。
Model ブロックの [ブロック パラメーター] ダイアログ ボックスを開き、[インスタンス パラメーター] タブを選択します。このタブで、参照モデルで調整可能なパラメーターとして提示された各インスタンス固有パラメーターを確認できます。ここから、モデルの階層構造の coeffArg
および gainArg
パラメーターのすべてのインスタンスについてパラメーター値セットを作成できます。
構造体を使用して、引数の追加、名前の変更、または削除を行うときに保守の作業を減らすことができます。構造体を使用しても、モデルの数学的な機能は同じです。
パラメーター値を ex_model_arg_ref
および ex_model_arg
の構造体で置き換えるには、以下の手順に従います。
コマンド プロンプトで、構造体を作成します。ex_model_arg_ref
ワークスペースのそれぞれのパラメーター オブジェクトについてフィールドを 1 つ追加します。
structForInst1.gain = 3.17; structForInst1.coeff = 1.05;
構造体を Simulink.Parameter
オブジェクトに格納します。
structForInst1 = Simulink.Parameter(structForInst1);
モデル エクスプローラーを開きます。参照モデル ex_model_arg_ref
で、[モデル化] タブで [モデル エクスプローラー] をクリックします。
モデル エクスプローラーを使用して、パラメーター オブジェクトをベース ワークスペースから ex_model_arg_ref
モデル ワークスペースにコピーします。
モデル ワークスペースで structForInst1
の名前を structArg
に変更します。
[コンテンツ] ペインで、structArg
を唯一のモデル引数として設定します。
ex_model_arg_ref
モデルで、モデル データ エディターの [パラメーター] タブを使用して、[ゲイン] パラメーターの値を structArg.gain
に設定し、[分子] パラメーターの値を structArg.coeff
に設定します。
モデルを保存します。
コマンド プロンプトで、ベース ワークスペースの既存の構造体を structForInst2
としてコピーします。
structForInst2 = copy(structForInst1);
Model ブロックでモデル引数の値の設定に使用したのと同じ数値を使用して 2 つの構造体のフィールドの値を設定します。
structForInst1.Value.gain = 2.98; structForInst1.Value.coeff = 0.98; structForInst2.Value.gain = 3.34; structForInst2.Value.coeff = 1.11;
最上位モデル ex_model_arg
で、モデル データ エディターを使用して、次の図のように引数の値を設定します。
Simulink.Bus
オブジェクトを構造体のデータ型として使用できます。このオブジェクトを使用すると、インスタンス固有の構造体の特性 (名前やフィールドの順序など) をモデル ワークスペース内の構造体の特性と一致させることができます。
Simulink.Bus
オブジェクトを作成するには、コマンド プロンプトで関数 Simulink.Bus.createObject
を使用します。オブジェクト内の要素の階層は、構造体フィールドの階層と一致します。オブジェクトの既定の名前は slBus1
です。
Simulink.Bus.createObject(structForInst1.Value);
バス オブジェクトをコピーして名前を myParamStructType
に変更します。
myParamStructType = copy(slBus1);
ex_model_arg
のモデル データ エディターで、[追加情報の表示/更新] ボタンをクリックします。モデル データ エディターに、ベース ワークスペース内のパラメーター オブジェクトである structForInst1
と structForInst2
に対応する行が表示されます。
[Data Type] 列を使用して、structForInst1
と structForInst2
のデータ型を Bus: myParamStructType
に設定します。
ex_model_arg_ref
のモデル データ エディターで、structArg
のデータ型を Bus: myParamStructType
に設定します。
参照モデルのコンテキストでモデル引数の名前を変更するには次を行います。
モデルを参照するすべての Model ブロックを見つけ、各ブロックで指定されているインスタンス固有パラメーターの値を保存する。関数 get_param
を使用して、各ブロックの InstanceParameters
パラメーターをクエリします。これは構造体配列です。この構造体には、Name
、Value
、Path
、Argument
の 4 つのフィールドが含まれます。
名前の変更の操作によって Model ブロックの値が破棄されるため、インスタンス固有パラメーターの値を保存しなければなりません。
モデル データ エディターで、参照モデルのモデル ワークスペース内の変数またはオブジェクトを右クリックし、[すべての名前の変更] を選択する。名前の変更の操作は、変数またはオブジェクトの名前を変更し、その参照をモデル全体で変更します。詳細については、ワークスペース変数の作成、編集、管理を参照してください。
引数の新しい名前を使用して引数の値を Model ブロックに再度適用する。Model ブロックで引数の値をプログラムにより設定するには、インスタンス パラメーター, Instance parametersインスタンス パラメーターInstance parametersを参照してください。
チームの他のメンバーが使用する再利用可能な参照モデルを設計する場合、参照モデル全体にマスクを適用できます。そしてインスタンス固有の値の設定などの、ユーザーによる Model ブロックの操作方法をカスタマイズできます。
この手法を使用すると、プログラムによるインスタンス固有の値の指定も容易に行うことができます。gainMask
という名前のマスク パラメーターを作成して使用する場合、myModelBlock
という名前のモデルのインスタンスに対してプログラムによって値を 0.98
に設定するために、ユーザーはコマンド プロンプトで次のコマンドを使用できます。
set_param('myModelBlock','gainMask','0.98')
参照モデルにマスクを適用すると、モデル マスクには、直接の子モデルからのインスタンス固有パラメーターのみが表示されます。子孫のモデルからプロモートされたインスタンス固有パラメーターは表示されません。
モデルをマスクしない場合、インスタンス固有の値を設定するには、ブロックの InstanceParameters
パラメーターを使用します。詳細については、参照モデルのプログラムによるパラメーター化を参照してください。
モデルのマスクの詳細については、システム マスクの概要を参照してください。
Simulink.LookupTable
オブジェクトを使用して ASAP2 または AUTOSAR のコード生成 (STD_AXIS や CURVE など) 用のルックアップ テーブル データを保存および設定する場合、そのオブジェクトをモデルの引数として設定できます。そして、コンポーネントのインスタンスごとに一意のテーブル データおよびブレークポイント データを指定できます。
Simulink.Breakpoint
オブジェクトをモデルの引数として使用することはできません。
Simulink.LookupTable
引数のインスタンス固有の値を、親モデルの新しい Simulink.LookupTable
として、または単純な MATLAB 構造体または配列として指定できます。
[指定] を Explicit value
または Even spacing
に設定する場合、値は次のいずれかになります。
Model1_LUT2
など、有効な MATLAB 構造体変数の名前
struct(‘Table’, …, ‘BP1’, …,
‘BP2’, …)
など、リテラル構造体の式
Params.Model1.LUT2
または MATLAB 関数への呼び出しなど、有効な構造体を返すその他の式
[指定] を Reference
に設定する場合、値は次のいずれかになります。
[1 5 7; 2 8
13]
など、リテラル数値配列値
Model1_LUT2
など、数値配列変数の名前
Params.Model1.LUT2
または MATLAB 関数への呼び出しなど、有効な数値配列を返すその他の式
Simulink.LookupTable
引数のインスタンス固有値を構造体として指定する場合は、以下のルールが適用されます。
モデル引数定義の各フィールドは構造体で指定しなければならず、フィールドの数とフィールドの名前が一致しなければならない。
テーブルの次元と構造体のブレークポイント データはモデル引数定義のテーブルの次元と構造体のブレークポイント データと一致しなければならない。
構造体フィールドのデータ型が double
の場合、値は対応するモデル引数フィールドのデータ型にキャストされる。それ以外の場合、値は対応するモデル引数フィールドのデータ型と一致しなければならない。
任意のシミュレーション モードおよびコード生成に対して、単純な数値として値を指定できます。コード生成の場合、モデル引数を Auto
引数のストレージ クラスで設定すると、構造体または数値配列変数は生成されたコードで維持されません。ストレージ クラスを他の任意の値に設定する場合、その値が生成されるコードで調整可能な引数を初期化するために使用される点において、構造体または数値配列は他のモデル引数に類似します。
以下の例は、Simulink.LookupTable
引数のインスタンス固有の値を新しい Simulink.LookupTable
および MATLAB 構造体として指定する方法を示します。
ルックアップ テーブルとコマンド プロンプトを使用して参照モデルをパラメーター化する例については、インスタンス固有のデータをプログラムでルックアップ テーブルに設定するを参照してください。
再利用可能なアルゴリズムを表すモデル ex_arg_LUT_ref
を作成します。
モデル エクスプローラーを使用して、モデル ワークスペースに Simulink.LookupTable
オブジェクトを追加します。[Simulink Lookup Table の追加] ボタン を使用できます。このオブジェクトに
LUTArg
という名前を付けます。
[テーブルの次元数] を 2
に設定します。表形式の領域 [テーブル] および [ブレークポイント] で、[テーブル]
、[BP1]
、[BP2]
データの値を指定します。たとえば、以下の値を MATLAB 式のボックスに入力することで、テーブルとブレークポイント データを設定します。
テーブル
— [3 4;1
2]
BP1
— [1 2]
BP2
— [3 4]
ex_arg_LUT_ref
から直接シミュレーションやコード生成を行う場合、モデルではこれらの値が使用されます。
[構造体の型定義] の下で [名前] を LUTArg_Type
に設定します。
[適用] をクリックします。
[コンテンツ] ペインで、LUTArg
について、[引数] 列のチェック ボックスをオンにします。
参照モデルの n-D Lookup Table ブロックで、[データの仕様] を [ルックアップ テーブル オブジェクト]
に設定します。[名前] を LUTArg
に設定します。
モデルを保存します。
再利用可能なアルゴリズムを 2 回使用するモデル ex_arg_LUT
を作成します。
コマンド プロンプトで、Simulink.LookupTable
オブジェクトをベース ワークスペースに作成します。または、データ ディクショナリで Simulink.LookupTable
オブジェクトを作成できます。
LUTForInst1 = Simulink.LookupTable;
オブジェクトのブレークポイント データとテーブル データを指定します。
LUTForInst1.Table.Value = [8 7; 6 5]; LUTForInst1.Breakpoints(1).Value = [5 6]; LUTForInst1.Breakpoints(2).Value = [3 4];
構造体型名を指定します。この名前は、参照モデル ワークスペース内のオブジェクトによって指定されている名前と一致させます。
LUTForInst1.StructTypeInfo.Name = 'LUTArg_Type';
構造体を使用して 2 番目の Model ブロックに対してインスタンス固有の引数値を作成します。構造体のブレークポイント データとテーブル データを指定します。
StructForInst2.Table = [9 8; 7 7]; StructForInst2.BP1 = [3 4]; StructForInst2.BP2 = [5 6];
ex_arg_LUT
モデルで、モデル インスタンス Model
に対し、[インスタンス パラメーター] タブで [LUTArg] の値を LUTForInst1
に設定します。
モデル インスタンス Model1
について、[LUTArg] を StructForInst2
に設定します。
ex_arg_LUT_ref
の 1 つのインスタンスはベース ワークスペースの Simulink.LookupTable
オブジェクトに保存されたテーブル データとブレークポイント データを使用し、他のインスタンスは構造体に保存されたテーブル データとブレークポイント データを使用します。
Simulink.Breakpoint
| Simulink.LookupTable
| Simulink.Parameter