Main Content

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

再利用可能な参照モデルへのインスタンス固有パラメーター値の指定

モデル参照を使用して大規模なシステムをコンポーネントに分割する場合、各コンポーネントは個別のモデルになります。コンポーネントは複数の Model ブロックで参照することにより、再利用できます。各 Model ブロックはコンポーネントのインスタンスです。次に、ブロック パラメーター (Gain ブロックの [ゲイン] パラメーターなど) を設定して、コンポーネントの各インスタンスに同じ値または異なる値のいずれかを使用できます。異なる値を使用する場合、モデル引数を作成して使用し、ブロック パラメーターの値を設定します。

モデル引数を使用するモデルの階層構造からコードを生成する場合、引数は出力の関数 (step) など、参照モデルのエントリ ポイント関数の仮パラメーターとしてコードに表示されます。生成されたコードは次に、各 Model ブロックに指定するインスタンス固有パラメーター値を対応する関数呼び出しに渡します。

モデル引数を使用するか否かに関係なく、ストレージ クラスを使用し、生成されたコードに調整可能なグローバル変数として表示されるようにブロック パラメーターを設定できます。また、ストレージ クラスを使用して、生成されたコードによりメモリに保存されて関数呼び出しに渡される、調整可能なモデル引数の値を生成することもできます。この後、実行中に値を変更できます。

パラメーター データを参照モデルのエントリポイント関数に引数として渡す

生成モデルのエントリポイント関数の仮パラメーターを介して、パラメーター データを受け取るように参照モデルを構成します。この手法により、参照モデルのインスタンス (Model ブロック) ごとに異なるパラメーター値を指定できます。

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

ex_arg_code_ref モデルを作成します。このモデルは再利用可能なアルゴリズムを表します。

open_system('ex_arg_code_ref')

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

モデル データ エディターのデータ テーブルで、[データ型] 列を使用して Inport ブロックのデータ型を single に設定します。データ型の継承により、モデル内のその他の信号は同じデータ型を使用します。

[パラメーター] タブを選択します。

モデルで、Gain ブロックを選択します。

モデル データ エディターで、[Value] 列を使用して、[Gain] パラメーターの値を gainArg に設定します。

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

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

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

モデル データ エディターを使用して、値が 1.05coeffArg という名前の Simulink.Parameter オブジェクトを使って [Numerator] パラメーターを設定します。gainArg と同様に、パラメーター オブジェクトをモデル ワークスペースに格納します。

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

[コンテンツのフィルター] ボックスを使用して、各パラメーター オブジェクト (gainArgcoeffArg) を検索します。それぞれのオブジェクトについて、[Argument] 列のチェック ボックスをオンにします。

ex_arg_code_ref モデルを保存します。

または、コマンド プロンプトで、次のコマンドを使用してブロックとパラメーター オブジェクトを設定できます。

set_param('ex_arg_code_ref/In1','OutDataTypeStr','single')

set_param('ex_arg_code_ref/Gain','Gain','gainArg')
modelWorkspace = get_param('ex_arg_code_ref','ModelWorkspace');
assignin(modelWorkspace,'gainArg',Simulink.Parameter(3.17));

set_param('ex_arg_code_ref/Discrete Filter','Numerator','coeffArg')
assignin(modelWorkspace,'coeffArg',Simulink.Parameter(1.05));

set_param('ex_arg_code_ref','ParameterArgumentNames','coeffArg,gainArg')

save_system('ex_arg_code_ref')

Model ブロックにおけるインスタンス固有パラメーター値の指定

ex_arg_code_ref モデルを作成します。このモデルでは再利用可能なアルゴリズムの複数のインスタンス (Model ブロック) を使用します。

open_system('ex_arg_code')

モデルで、モデル データ エディターの [パラメーター] タブ ([ツール表示][モデル データ エディター]) を開きます。モデル データ エディターに、2 つの Model ブロックに対して指定できるモデル引数 (coeffArggainArg) に対応する 4 つの行が表示されます。

モデル データ エディターを使用してモデル引数の値を設定します。たとえば、次の図の値を使用します。

または、コマンド プロンプトで、次のコマンドを使用して値を設定できます。

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('coeffArg','0.98','gainArg','2.98'))

set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('coeffArg','1.11','gainArg','3.34'))

最上位モデルからコードを生成します。

rtwbuild('ex_arg_code')

ex_arg_code_ref.c ファイルは参照モデルのエントリポイント関数 ex_arg_code_ref を定義します。この関数には 2 つの仮パラメーター rtp_coeffArgrtp_gainArg があり、モデル引数 coeffArggainArg に対応しています。仮パラメーターは、Simulink® でデータ型 single に対応するデータ型 real32_T を使用します。

/* Output and update for referenced model:
   'ex_arg_code_ref' */
void ex_arg_code_ref(const real32_T *rtu_In1, 
                     real32_T *rty_Out1,
                     DW_ex_arg_code_ref_f_T *localDW, 
                     real32_T rtp_coeffArg,
                     real32_T rtp_gainArg)

ex_arg_code.c ファイルには、最上位モデルのエントリポイント関数 ex_arg_code の定義が含まれます。この関数は参照モデルのエントリポイント関数 ex_arg_code_ref を呼び出し、rtp_coeffArg および rtp_gainArg の値として指定したモデル引数の値 (1.113.34 など) を使用します。

  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw), 0.98F, 2.98F);

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw), 1.11F, 3.34F);

仮パラメーターは、データ型 real32_T (single) を使用します。

  • ex_arg_code_ref でブロック パラメーターは内部ルールに基づいてデータ型を決定する。たとえば、Gain ブロック ダイアログ ボックスの [パラメーター属性] タブで、[パラメーターのデータ型][Inherit: Inherit via internal rule] (既定) に設定します。この場合、内部ルールは同じデータ型 single を入出力信号として選択します。

  • DataType プロパティの値が auto (既定値) に設定されているため、モデル ワークスペース内のモデル引数は、状況依存データ型指定を使用します。この設定により、モデル引数はブロック パラメーター single と同じデータ型を使用します。

  • 生成されたコード内の仮パラメーターは、モデル引数 single と同じデータ型を使用します。

調整可能な引数の値の生成

インスタンス固有の値を生成されたコードに調整可能なグローバル変数として表示されるように Model ブロックで設定できます。この手法を使用すると、各インスタンスのパラメーター値をメモリ内に格納して、コードの実行時に値を調整できます。

最上位モデル ex_arg_code で、モデル データ エディターの [パラメーター] タブを選択します。

モデル データ エディターを使用して、次の図に従ってモデル引数の値を設定します。

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('coeffArg','coeffForInst1','gainArg','gainForInst1'))
set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('coeffArg','coeffForInst2','gainArg','gainForInst2'))

ex_arg_code_ref モデル ワークスペースの内容をモデル エクスプローラーに表示します。[モデル化] タブで [モデル エクスプローラー] をクリックします。

ex_arg_code_ref モデル ワークスペースからベース ワークスペースに gainArg および coeffArg をコピーします。

名前 gainArggainForInst1 に変更します。名前 coeffArgcoeffForInst1 に変更します。

gainForInst1 = getVariable(modelWorkspace,'gainArg');
gainForInst1 = copy(gainForInst1);
coeffForInst1 = getVariable(modelWorkspace,'coeffArg');
coeffForInst1 = copy(coeffForInst1);

gainForInst1 および coeffForInst1gainForInst2 および coeffForInst2 としてコピーします。

gainForInst2 = copy(gainForInst1);
coeffForInst2 = copy(coeffForInst1);

ベース ワークスペースのパラメーター オブジェクトの Value プロパティを使用して、インスタンス固有のパラメーター値を設定します。

gainForInst1.Value = 2.98;
coeffForInst1.Value = 0.98;

gainForInst2.Value = 3.34;
coeffForInst2.Value = 1.11;

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

[ビューの変更] ドロップダウン リストを [コード] に設定します。

新しいパラメーター オブジェクトの場合、[Storage Class] 列の値を [ExportedGlobal] に設定します。この設定によって、パラメーター オブジェクトが調整可能なグローバル変数として生成されたコードに表示されるようになります。

gainForInst1.StorageClass = 'ExportedGlobal';
coeffForInst1.StorageClass = 'ExportedGlobal';
gainForInst2.StorageClass = 'ExportedGlobal';
coeffForInst2.StorageClass = 'ExportedGlobal';

最上位モデルからコードを生成します。

rtwbuild('ex_arg_code')

ファイル ex_arg_code.c は、ベース ワークスペースのパラメーター オブジェクトに対応するグローバル変数を定義します。

/* Exported block parameters */
real32_T coeffForInst1 = 0.98F;        /* Variable: coeffForInst1
                                        * Referenced by: '<Root>/Model'
                                        */
real32_T coeffForInst2 = 1.11F;        /* Variable: coeffForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */
real32_T gainForInst1 = 2.98F;         /* Variable: gainForInst1
                                        * Referenced by: '<Root>/Model'
                                        */
real32_T gainForInst2 = 3.34F;         /* Variable: gainForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */

ex_arg_code_ref の各呼び出しでは、最上位モデルのアルゴリズムはグローバル変数を使用して仮パラメーターの値を設定します。

  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw), coeffForInst1,
                  gainForInst1);

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw), coeffForInst2,
                  gainForInst2);

生成されたコードのグローバル変数はデータ型 real32_T (single) を使用します。

  • DataType プロパティが auto (既定値) に設定されているため、ベース ワークスペースのパラメーター オブジェクトは状況依存データ型指定を使用します。この設定により、ベース ワークスペースのパラメーター オブジェクトはモデル引数と同じデータ型 single を使用します。

  • 生成されたコードのグローバル変数は、ベース ワークスペースのパラメーター オブジェクトと同じデータ型を使用します。

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

モデル エクスプローラーを使用して、ex_arg_code_ref モデル ワークスペースからベース ワークスペースに gainArg および coeffArg をコピーします。

temp = getVariable(modelWorkspace,'gainArg');
gainArg = copy(temp);
temp = getVariable(modelWorkspace,'coeffArg');
coeffArg = copy(temp);

コマンド プロンプトで、これらの 2 つのパラメーター オブジェクトを 1 つの構造体 structArg にコピーします。

structArg = Simulink.Parameter(struct('gain',gainArg.Value,...
    'coeff',coeffArg.Value));

モデル エクスプローラーを使用して、structArg をモデル ワークスペースに移動します。

assignin(modelWorkspace,'structArg',copy(structArg));
clear structArg gainArg coeffArg

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

set_param('ex_arg_code_ref','ParameterArgumentNames','structArg')

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

モデル データ エディターを使用して、[Gain] パラメーターの値を structArg.gain に設定し、[Numerator] パラメーターの値を structArg.coeff に設定します。モデルを保存します。

set_param('ex_arg_code_ref/Gain','Gain','structArg.gain')
set_param('ex_arg_code_ref/Discrete Filter',...
    'Numerator','structArg.coeff')

save_system('ex_arg_code_ref')

コマンド プロンプトで、ベース ワークスペースの 4 つのパラメーター オブジェクトを 2 つの構造体に結合します。各構造体には、ex_arg_code_ref の 1 つのインスタンスのパラメーター値を格納します。

structForInst1 = Simulink.Parameter(struct('gain',gainForInst1.Value,...
    'coeff',coeffForInst1.Value));

structForInst2 = Simulink.Parameter(struct('gain',gainForInst2.Value,...
    'coeff',coeffForInst2.Value));

最上位モデル ex_arg_code で、[ビューの変更] ドロップダウン リストを [設計] に設定します。モデル データ エディターを使用して、次の図に従って引数値を設定します。

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('structArg','structForInst1'))
set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('structArg','structForInst2'))

[追加情報を表示/更新します] ボタンをクリックします。

新しいパラメーター オブジェクト structForInst1 および structForInst2 に対して、モデル データ エディターを使用してストレージ クラス ExportedGlobal を適用します。

structForInst1.StorageClass = 'ExportedGlobal';
structForInst2.StorageClass = 'ExportedGlobal';

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

Simulink.Bus.createObject(structForInst1.Value);

バス オブジェクトをコピーして名前を myParamStructType に変更します。

myParamStructType = copy(slBus1);

ex_arg_code のモデル データ エディターで、[ビューの変更][設計] に設定します。[Data Type] 列を使用して、structForInst1structForInst2 のデータ型を Bus: myParamStructType に設定します。

structForInst1.DataType = 'Bus: myParamStructType';
structForInst2.DataType = 'Bus: myParamStructType';

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

temp = getVariable(modelWorkspace,'structArg');
temp = copy(temp);
temp.DataType = 'Bus: myParamStructType';
assignin(modelWorkspace,'structArg',copy(temp));

ex_arg_code_ref モデルを保存します。

save_system('ex_arg_code_ref')

構造体を使用してパラメーター値をグループ化する場合、構造体のフィールド (たとえば、structForInst1 のフィールド) のデータ型を制御するために状況依存データ型指定を利用することはできません。ただし、バス オブジェクトのプロパティを使用してフィールドのデータ型を制御することはできます。

コマンド プロンプトで、バス オブジェクトの要素のデータ型を single に設定します。構造体の対応するフィールド (structForInst1 および structArg など) は、同じデータ型を使用します。

myParamStructType.Elements(1).DataType = 'single';
myParamStructType.Elements(2).DataType = 'single';

最上位モデル ex_arg_code からコードを生成します。

rtwbuild('ex_arg_code')

ファイル ex_arg_code_types.h では、Simulink.Bus オブジェクトに対応付けられている構造体型 myParamStructType を定義します。

typedef struct {
  real32_T gain;
  real32_T coeff;
} myParamStructType;

ファイル ex_arg_code_ref.c の、参照モデルのエントリポイント関数には、モデル引数 structArg に対応する仮パラメーター rtp_structArg があります。

/* Output and update for referenced model: 
   'ex_arg_code_ref' */
void ex_arg_code_ref(const real32_T *rtu_In1, 
                     real32_T *rty_Out1,
                     DW_ex_arg_code_ref_f_T *localDW, 
                     const myParamStructType *rtp_structArg)

ファイル ex_arg_code.c は、ベース ワークスペースのパラメーター オブジェクトに対応するグローバル構造体変数を定義します。

/* Exported block parameters */
myParamStructType structForInst1 = {
  2.98F,
  0.98F
} ;                                    /* Variable: structForInst1
                                        * Referenced by: '<Root>/Model'
                                        */

myParamStructType structForInst2 = {
  3.34F,
  1.11F
} ;                                    /* Variable: structForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */

ファイル ex_arg_code.c の最上位モデルのアルゴリズムは、構造体変数のアドレスを参照モデルのエンドポイント関数に渡します。

  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw), &structForInst1);

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw), &structForInst2);

モデル引数および引数の値のデータ型の制御

モデル引数を使用すると、以下にデータ型を適用できます。

  • 引数を使用するブロック パラメーター (Discrete ライブラリ内のブロックなどの特定のブロックの場合)。

  • 参照モデル ワークスペース内の引数。

  • Model ブロックで指定する引数の値。

不必要な型変換および C シフトを除去することで効率的なコードを生成するには、データ型を一致させるために継承および状況依存データ型指定の使用を検討してください。

  • モデル ワークスペースで、データ型が double の MATLAB® 変数または DataType プロパティが auto に設定されているパラメーター オブジェクトを使用します。この場合、変数またはオブジェクトはブロック パラメーターと同じデータ型を使用します。

  • Model ブロックで引数の値を設定する場合、状況依存データ型指定を利用します。引数の値を指定するには、データ型をもたない値を使用します。

    • 15.23 などの数値リテラル。single(15.23) などの型付き式を使用しないでください。

    • データ型が double の MATLAB 変数。

    • DataType プロパティが auto に設定されている Simulink.Parameter オブジェクト。

    このような場合、数値、変数またはオブジェクトは、参照モデル ワークスペースのモデル引数と同じデータ型を使用します。状況依存データ型指定を使用するようにモデル引数も設定する場合は、ブロック パラメーターの型を指定するだけでブロック パラメーター、引数および引数の値のデータ型を制御できます。

パラメーター データ型の制御の基本的な情報については、生成されたコードにおけるパラメーターのデータ型を参照してください。

異なるデータ型のコンテキストでのモデル引数の使用

モデル引数を使用して複数のブロック パラメーターの値を設定する場合、そしてブロック パラメーターのデータ型が異なる場合は、モデル ワークスペースの引数には状況依存データ型指定 (double または auto) を使用できません。その引数にはデータ型を明示的に指定しなければなりません。たとえば、モデル ワークスペースの引数がパラメーター オブジェクト (Simulink.Parameter など) である場合、DataType プロパティには auto 以外の値を設定します。この状況の詳細については、異なるデータ型のコンテキストでパラメーター データを再利用を参照してください。

この場合、Model ブロックで指定する引数の値のデータ型を制御するために、状況依存データ型指定を引き続き利用できます。各引数の値は、モデル ワークスペースの対応する引数に対して指定するデータ型を使用します。

関連するトピック