Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

再利用可能な参照モデルのインスタンスのパラメーター化

複数の Model ブロックを使用して同じモデルを参照すると、モデルの各インスタンスで同じ値または異なる値を使用するようブロック パラメーターを設定できます。たとえば、Gain ブロックの [ゲイン] パラメーターを設定できます。異なる値を使用する場合、モデル引数を作成して使用し、ブロック パラメーターの値を設定します。場合によっては、使用するブロック パラメーター (コントローラーの設定点やフィルター係数など) の値をインスタンスごとに個別に設定できないと参照モデルを再利用できないことがあります。

再利用可能なモデルの各インスタンスに異なる値を指定

再利用可能な参照モデルのブロック パラメーターについて、モデルのインスタンスごとに異なる値を指定するには、次を行います。

  1. 参照モデルのモデル ワークスペースで MATLAB® 変数または Simulink.Parameter オブジェクトを作成します。

    • 保守をしやすくするには MATLAB 変数を使用します。

    • 最小値と最大値、データ型などのモデル引数のプロパティをより詳細に制御するには Simulink.Parameter オブジェクトを使用します。

  2. 変数またはパラメーター オブジェクトを使用してブロック パラメーター値を設定します。必要に応じて同じ変数またはオブジェクトを使用して他のブロック パラメーター値を設定します。

  3. [引数] プロパティを選択し、変数またはオブジェクトをモデル引数として設定します。

    このモデルのシミュレーションを直接実行する場合、変数またはオブジェクトによってモデル ワークスペース内に保存された値がブロック パラメーターとして使用されます。このモデルが参照モデルとしてシミュレートされると、モデル引数として設定されたパラメーターはその値を親モデルから取得します。

    Simulink.Parameter オブジェクトを使用してブロック パラメーター値を設定する場合、親モデル参照階層のどこかで明示的な値を提供する限り、([値] を '[]' に設定) 空のままにしたオブジェクトの値を使用し、モデルを参照モデルとしてコンパイルおよびシミュレートできます。この場合、モデルを直接シミュレートできません。値が空の場合、オブジェクトの [データ型] および [次元] を指定しなければなりません。オブジェクトの [最小値][最大値] の指定はオプションです。空の値を指定した場合でも、Simulink® は引き続き [値] を合成します (Simulink.Parameter を参照)。

  4. 再利用可能なモデルを参照するそれぞれの Model ブロックで、ブロック パラメーターにインスタンス固有の値を指定します。値を指定しない場合、モデル階層構造内のその下に指定された最後の値が、引数によって使用されます。最上位モデルに診断コンフィギュレーション パラメーター [モデル引数に明示的な最終値はありません] を設定することで、モデル引数の値を設定できる一番上の Model ブロックに、明示的な値が指定されずに既定値が使用される時点のエラーや警告を生成できます。

  5. 中間モデルでは、ブロック パラメーターにインスタンス固有の値を指定するのに加え、階層の次のレベルでパラメーターをオーバーライド可能かどうかを指定できます。

複数の引数を構造体にまとめる

複数のモデル引数を使用するようにモデルを構成する場合、モデル ワークスペースの個別の変数の代わりに構造体を使用することを検討します。この手法により、引数の追加、名前の変更、または削除を行うときに保守の作業を減らすことができます。モデル ワークスペースの引数を Model ブロックの引数の値と手動で同期する代わりに、変数エディターまたはコマンド プロンプトを使用して構造体を変更します。

Simulink Coder™ ライセンスがある場合は、この手法によって出力関数 (step) などの参照モデルの関数の仮パラメーターが使用する ROM を減らすこともできます。

構造体を作成および使用してブロック パラメーター値を設定するには、関連するブロック パラメーター定義を構造体に整理を参照してください。

参照モデルのパラメーター化

この例では、同じブロック パラメーターに違う値を使用するように参照モデルの複数のインスタンスを対話的に設定する方法について説明します。コマンド プロンプトのみを使用して参照モデルをパラメーター化する例については、参照モデルのプログラムによるパラメーター化を参照してください。コード生成を含む例については、再利用可能な参照モデルへのインスタンス固有パラメーター値の指定 (Simulink Coder)を参照してください。

モデル引数を使用するように参照モデルを構成する

参照モデルのモデル引数を設定するには、モデル ワークスペースで MATLAB 変数または Simulink.Parameter オブジェクトを作成しなければなりません。この例では、既定値をオブジェクトに保存しないで、代わりに親モデル参照階層を使用して明示的な値を指定し、Simulink.Parameter オブジェクトをモデル引数として設定します。既定値がないと、モデルを直接シミュレートできないため、参照モデルとしてシミュレートしなければなりません。

Gain ブロックと Discrete Filter ブロックを含むモデル ex_model_arg_ref を作成します。

Gain ブロックの [ゲイン] パラメーターと Discrete Filter ブロックの [分子係数] パラメーターをモデル引数として設定するには、次のようにします。

  1. モデルの [モデル化] タブで [モデル データ エディター] をクリックします。

  2. モデル データ エディターで、[パラメーター] タブを選択します。

  3. [値] 列を使用して、[ゲイン] パラメーターの値を gainArg に設定します。

  4. gainArg の横にあるアクション ボタン をクリックし、[作成] を選択します。

  5. [新規データの作成] ダイアログ ボックスで、[値]Simulink.Parameter に設定し、[場所][モデル ワークスペース] に設定します。[作成] をクリックします。

  6. Simulink.Parameter プロパティ ダイアログ ボックスで、[データ型][double] および [次元]1 に設定します。値を空のままにします ([値] を '[]' に設定)。オブジェクトの [最小値][最大値] の指定はオプションです。

  7. オブジェクトをモデル引数として設定するには、[引数] を選択します。

  8. [OK] をクリックします。

  9. Discrete Filter ブロックの [分子係数] パラメーターについて、手順 4 ~ 9 を繰り返します。この場合、coeffArg という名前の Simulink.Parameter オブジェクトを作成します。

パラメーター オブジェクトに設定された値がないと、モデル自体は正常にコンパイルされないことに注意してください。

モデル引数の値を親モデルで設定する

親モデルをシミュレートする場合、再利用可能な参照モデルの各インスタンスでは、親モデルで指定したパラメーターの値が使用されます。この例では、モデルの階層構造の各レベルにおいて、Model ブロック上で調整可能なパラメーターとしてモデル引数を提示する方法を説明します。

前の例から再利用可能なモデル ex_model_arg_ref の複数のインスタンスを使用するモデル ex_model_arg を作成します。

モデル参照階層でモデル引数にインスタンス固有の値を設定するには、次のようにします。

  1. モデルの [モデル化] タブで [モデル データ エディター] をクリックします。

  2. モデル データ エディターで、[パラメーター] タブを選択します。モデル データ エディターに、2 つの Model ブロックに対して指定できるインスタンス固有パラメーターに対応する 4 つの行が表示されます。

  3. モデル データ エディターを使用して、Model および Model1 のパラメーターの値を設定します。既定では、モデル引数はモデルの階層構造 (値 <from below> によって示される) 内で、その下で指定された最後の値を使用します。既定値を次の図の値に置き換えます。

  4. モデルの階層構造の次のレベルにおいて、これらのパラメーター値をオーバーライドするには、[Argument] 列のチェック ボックスをオンにします。既定では、チェック ボックスはオフになっています。

    Model ブロックでインスタンス固有パラメーターを設定することもできます。ブロックのダイアログ ボックスで、[インスタンス パラメーター] タブを選択します。

  5. ex_model_arg を参照する Model ブロックを含むモデル ex_model_arg_top を作成します。

  6. モデル データ エディターで [追加情報の表示/更新] ボタンをクリックします。[パラメーター] タブで、参照モデルで調整可能なパラメーターとして提示された各インスタンス固有のパラメーターを確認できます。ここから、モデルの階層構造の coeffArg および gainArg パラメーターのすべてのインスタンスについてパラメーター値セットを作成できます。

    既定では、各インスタンスはモデルの階層構造の下で指定された最後の値を使用します。この場合、モデル データ エディターに <from_below> が表示されます。[引数] チェック ボックスをオンにしてパラメーターを親モデルに公開すると、[値]<inherited> として表示され、実行時の値がその親から取得されるようになったことを示します。

    モデル ブロック線図を更新すると、エディターにインスタンスのコンパイルされた値も表示されます。この既定値に移動するには、コンパイルされた値の横にある 3 つの垂直のドット付きボタンをクリックし、[以下の既定値に移動] を選択します。値が最後に指定された参照モデルがモデル キャンバスの新しいタブで開き、モデル データ エディターでブロック パラメーターを含む行が強調表示されます。

複数のモデル引数を単一の構造体にグループ化

構造体を使用して、引数の追加、名前の変更、または削除を行うときに保守の作業を減らすことができます。構造体を使用しても、モデルの数学的な機能は同じです。

パラメーター値を ex_model_arg_ref および ex_model_arg の構造体で置き換えるには、以下の手順に従います。

  1. コマンド プロンプトで、構造体を作成します。ex_model_arg_ref ワークスペースのそれぞれのパラメーター オブジェクトについてフィールドを 1 つ追加します。

    structForInst1.gain = 3.17;
    structForInst1.coeff = 1.05;
    
  2. 構造体を Simulink.Parameter オブジェクトに格納します。

    structForInst1 = Simulink.Parameter(structForInst1);
    
  3. モデル エクスプローラーを開きます。参照モデル ex_model_arg_ref で、[モデル化] タブで [モデル エクスプローラー] をクリックします。

  4. モデル エクスプローラーを使用して、パラメーター オブジェクトをベース ワークスペースから ex_model_arg_ref モデル ワークスペースにコピーします。

  5. モデル ワークスペースで structForInst1 の名前を structArg に変更します。

  6. [コンテンツ] ペインで、structArg を唯一のモデル引数として設定します。

  7. ex_model_arg_ref モデルで、モデル データ エディターの [パラメーター] タブを使用して、[ゲイン] パラメーターの値を structArg.gain に設定し、[分子] パラメーターの値を structArg.coeff に設定します。

  8. モデルを保存します。

  9. コマンド プロンプトで、ベース ワークスペースの既存の構造体を structForInst2 としてコピーします。

    structForInst2 = copy(structForInst1);
    
  10. Model ブロックでモデル引数の値の設定に使用したのと同じ数値を使用して 2 つの構造体のフィールドの値を設定します。

    structForInst1.Value.gain = 2.98;
    structForInst1.Value.coeff = 0.98;
    
    structForInst2.Value.gain = 3.34;
    structForInst2.Value.coeff = 1.11;
    
  11. 最上位モデル ex_model_arg で、モデル データ エディターを使用して、次の図のように引数の値を設定します。

バス オブジェクトを構造体のデータ型として使用する

Simulink.Bus オブジェクトを構造体のデータ型として使用できます。このオブジェクトを使用すると、インスタンス固有の構造体の特性 (名前やフィールドの順序など) をモデル ワークスペース内の構造体の特性と一致させることができます。

  1. Simulink.Bus オブジェクトを作成するには、コマンド プロンプトで関数 Simulink.Bus.createObject を使用します。オブジェクト内の要素の階層は、構造体フィールドの階層と一致します。オブジェクトの既定の名前は slBus1 です。

    Simulink.Bus.createObject(structForInst1.Value);
    
  2. バス オブジェクトをコピーして名前を myParamStructType に変更します。

    myParamStructType = copy(slBus1);
    
  3. ex_model_arg のモデル データ エディターで、[追加情報の表示/更新] ボタンをクリックします。モデル データ エディターに、ベース ワークスペース内のパラメーター オブジェクトである structForInst1structForInst2 に対応する行が表示されます。

  4. [Data Type] 列を使用して、structForInst1structForInst2 のデータ型を Bus: myParamStructType に設定します。

  5. ex_model_arg_ref のモデル データ エディターで、structArg のデータ型を Bus: myParamStructType に設定します。

モデルの引数名または値の変更

参照モデルのコンテキストでモデル引数の名前を変更するには次を行います。

  • モデルを参照するすべての Model ブロックを見つけ、各ブロックで指定されているインスタンス固有パラメーターの値を保存する。関数 get_param を使用して、各ブロックの InstanceParameters パラメーターをクエリします。これは構造体配列です。この構造体には、NameValuePathArgument の 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 構造体として指定する方法を示します。

ルックアップ テーブルとコマンド プロンプトを使用して参照モデルをパラメーター化する例については、インスタンス固有のデータをプログラムでルックアップ テーブルに設定するを参照してください。

参照モデルでのモデルの引数の設定

  1. 再利用可能なアルゴリズムを表すモデル ex_arg_LUT_ref を作成します。

  2. モデル エクスプローラーを使用して、モデル ワークスペースに Simulink.LookupTable オブジェクトを追加します。[Simulink Lookup Table の追加] ボタン を使用できます。このオブジェクトに LUTArg という名前を付けます。

  3. [テーブルの次元数]2 に設定します。表形式の領域 [テーブル] および [ブレークポイント] で、[テーブル][BP1][BP2] データの値を指定します。たとえば、以下の値を MATLAB 式のボックスに入力することで、テーブルとブレークポイント データを設定します。

    • テーブル[3 4;1 2]

    • BP1[1 2]

    • BP2[3 4]

    ex_arg_LUT_ref から直接シミュレーションやコード生成を行う場合、モデルではこれらの値が使用されます。

  4. [構造体の型定義] の下で [名前]LUTArg_Type に設定します。

  5. [適用] をクリックします。

  6. [コンテンツ] ペインで、LUTArg について、[引数] 列のチェック ボックスをオンにします。

  7. 参照モデルの n-D Lookup Table ブロックで、[データの仕様][ルックアップ テーブル オブジェクト] に設定します。[名前]LUTArg に設定します。

  8. モデルを保存します。

インスタンス固有の引数の値の作成

  1. 再利用可能なアルゴリズムを 2 回使用するモデル ex_arg_LUT を作成します。

  2. コマンド プロンプトで、Simulink.LookupTable オブジェクトをベース ワークスペースに作成します。または、データ ディクショナリで Simulink.LookupTable オブジェクトを作成できます。

    LUTForInst1 = Simulink.LookupTable;
  3. オブジェクトのブレークポイント データとテーブル データを指定します。

    LUTForInst1.Table.Value = [8 7; 6 5];
    LUTForInst1.Breakpoints(1).Value = [5 6];
    LUTForInst1.Breakpoints(2).Value = [3 4];
    
  4. 構造体型名を指定します。この名前は、参照モデル ワークスペース内のオブジェクトによって指定されている名前と一致させます。

    LUTForInst1.StructTypeInfo.Name = 'LUTArg_Type';
    
  5. 構造体を使用して 2 番目の Model ブロックに対してインスタンス固有の引数値を作成します。構造体のブレークポイント データとテーブル データを指定します。

    StructForInst2.Table = [9 8; 7 7];
    StructForInst2.BP1 = [3 4];
    StructForInst2.BP2 = [5 6];
    
  6. ex_arg_LUT モデルで、モデル インスタンス Model に対し、[インスタンス パラメーター] タブで [LUTArg] の値を LUTForInst1 に設定します。

  7. モデル インスタンス Model1 について、[LUTArg]StructForInst2 に設定します。

ex_arg_LUT_ref の 1 つのインスタンスはベース ワークスペースの Simulink.LookupTable オブジェクトに保存されたテーブル データとブレークポイント データを使用し、他のインスタンスは構造体に保存されたテーブル データとブレークポイント データを使用します。

参考

| |

関連する例

詳細