Main Content

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

この例では、構造体を使用することで、同じブロック パラメーターに違う値を使用するように参照モデルの複数のインスタンスをプログラムで設定する方法について説明します。

構造体にグループ化されたモデル引数を使用するように参照モデルを構成する

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

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

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

open_system('ex_model_arg_ref')

ex_model_arg_ref ワークスペースに存在するパラメーター オブジェクトごとに 1 つのフィールドを含む構造体を作成します。各フィールドの値を指定します。

structForInst1.gain = 3.17;
structForInst1.coeff = 1.05;

構造体を Simulink.Parameter オブジェクトに格納します。

structForInst1Param = Simulink.Parameter(structForInst1);

Simulink.Parameter オブジェクトを ex_model_arg_ref モデル ワークスペースにコピーします。この例では、オブジェクト structArg のコピーに名前を付けます。

modelWorkspace = get_param('ex_model_arg_ref','ModelWorkspace');
assignin(modelWorkspace,'structArg',copy(structForInst1Param));

structArg を唯一のモデル引数として設定します。

set_param('ex_model_arg_ref','ParameterArgumentNames','structArg')

ex_model_arg_ref モデルでは、Gain ブロックの [ゲイン] パラメーターを structArg.gain に設定し、Discrete Filter ブロックの [分子] パラメーターを structArg.coeff に設定します。

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

既存の構造体を structForInst2Param としてコピーします。

structForInst2Param = copy(structForInst1Param);

2 つの構造体のフィールド値を、Model ブロックでモデル引数の値の設定に使用したのと同じ数値に設定します。

structForInst1Param.Value.coeff = 0.98;
structForInst1Param.Value.gain = 2.98;
structForInst2Param.Value.coeff = 1.11;
structForInst2Param.Value.gain = 3.34;

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

open_system('ex_model_arg')

モデル インスタンス Model の場合は、structArgstructForInst1Param に設定します。モデル インスタンス Model1 の場合は、structArgstructForInst2Param に設定します。

instSpecParamsStruct = get_param('ex_model_arg/Model','InstanceParameters');
instSpecParamsStruct1 = get_param('ex_model_arg/Model1','InstanceParameters');

instSpecParamsStruct(1).Value = 'structForInst1Param';
instSpecParamsStruct1(1).Value = 'structForInst2Param';

set_param('ex_model_arg/Model','InstanceParameters',instSpecParamsStruct);
set_param('ex_model_arg/Model1','InstanceParameters',instSpecParamsStruct1);

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

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

構造体のデータ型をバス オブジェクトに設定するには、以下の手順に従います。

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

Simulink.Bus.createObject(structForInst1Param.Value);

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

myParamStructType = copy(slBus1);

バス オブジェクトを使用して、ベース ワークスペースのパラメーター オブジェクトのデータ型を設定します。

structForInst1Param.DataType = 'Bus: myParamStructType';
structForInst2Param.DataType = 'Bus: myParamStructType';

structArg オブジェクトの場合、DataTypeBus: myParamStructType に設定します。

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

関連するトピック