Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

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

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

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

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

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

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

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

  3. 変数またはオブジェクトをモデル引数として設定します。

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

  4. 再利用可能なモデルを参照するそれぞれの Model ブロックで、ブロック パラメーターにインスタンス固有の値を指定します。

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

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

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

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

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

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

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

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

参照モデル自体のシミュレーションを実行すると、モデル ワークスペースのパラメーター オブジェクトは Simulink.Parameter オブジェクトまたは MATLAB 変数で指定した値を使用します。ブロック パラメーターでもこれらの値を使用します。

Gain ブロックの [ゲイン] パラメーターと Discrete Filter ブロックの [分子] パラメーターをモデル引数として設定するには、以下の手順に従います。

  1. 新しい Simulink モデルを開き、3 層の階層モデルを作成します。

  2. モデルに Model ブロックを追加し、[モデル名]ex_model_arg に設定します。

  3. モデルを ex_model_arg_top として保存します。

  4. ex_model_arg_ref を開きます。このモデルは再利用可能なアルゴリズムを表します。

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

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

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

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

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

  10. Simulink.Parameter プロパティ ダイアログ ボックスで、[値]3.17 のような数値に設定します。[OK] をクリックします。

  11. モデル データ エディターを使用して、Discrete Filter ブロックの [分子] パラメーターを設定します。

    • coeffArg という名前の Simulink.Parameter オブジェクトを作成します。

    • coeffArg をモデル ワークスペースに保存します。

    • 1.05 の値を coeffArg に代入します。

  12. モデル データ エディターで [追加情報の表示/更新] ボタンをクリックします。

  13. それぞれのオブジェクトについて、[Argument] 列のチェック ボックスをオンにします。

    多くのパラメーターを使用するモデルの場合は、[コンテンツのフィルター] ボックスを使用すると、特定のパラメーターをすばやく検索できます。

  14. ex_model_arg_ref を保存します。

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

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

  1. ex_model_arg を開きます。このモデルは、再利用可能なアルゴリズムの複数のインスタンスを使用するシステム モデルを表します。

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

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

  4. モデル データ エディターを使用してパラメーターの値を設定します。たとえば、次の図の値を使用します。

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

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

  6. ex_model_arg_top を開きます。このモデルには、ex_model_arg を参照する Model ブロックが含まれています。

  7. Model の [ブロック パラメーター] ダイアログ ボックスを開き、[インスタンス パラメーター] タブを選択します。このタブで、モデル ex_model_arg で調整可能なパラメーターとして提示された各インスタンス固有パラメーターを確認できます。ここから、モデルの階層構造の coeffArg および gainArg パラメーターのすべてのインスタンスについてパラメーター値セットを作成できます。

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

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

パラメーター値を 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 を開きます。

    open_system('ex_arg_LUT_ref')
    

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

  3. [テーブルの次元数]2 に設定します。[テーブル] および [ブレークポイント] の下で、テーブル データおよびブレークポイント データの値を指定します。たとえば、次の図の値を使用します。

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

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

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

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

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

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

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

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

    open_system('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 オブジェクトに保存されたテーブル データとブレークポイント データを使用し、他のインスタンスは構造体に保存されたテーブル データとブレークポイント データを使用します。

参考

| |

関連する例

詳細