複数のモデル引数を単一の構造体にグループ化
この例では、構造体を使用することで、同じブロック パラメーターに違う値を使用するように参照モデルの複数のインスタンスをプログラムで設定する方法について説明します。
構造体にグループ化されたモデル引数を使用するように参照モデルを構成する
構造体を使用して、引数の追加、名前の変更、または削除を行うときに保守の作業を減らすことができます。構造体を使用しても、モデルの数学的な機能は同じです。
パラメーター値を、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
の場合は、structArg を structForInst1Param
に設定します。モデル インスタンス Model1
の場合は、structArg を structForInst2Param
に設定します。
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
オブジェクトの場合、DataType
を Bus: 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)