このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
異なるデータ型のコンテキストでパラメーター データを再利用
Simulink.Parameter
オブジェクトまたは MATLAB® の数値変数を使用して 2 つ以上のブロック パラメーター値を設定するときにブロック パラメーターのデータ型が異なる場合、オブジェクトまたは変数のデータ型を明示的に指定しなければなりません。たとえば、パラメーター オブジェクトのデータ型を既定値 auto
のままにしておくことはできません。
モデル例の作成および設定
ex_paramdt_contexts
モデルを作成します。
ex_paramdt_contexts
[モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターの [入力端子/出力端子] タブで、[データ型] 列を使用して In1
Inport ブロックのデータ型を single
に、In2
ブロックのデータ型を int8
に設定します。
[信号] タブで、Gain ブロック出力のデータ型を [Inherit: Same as input
] に設定します。
[パラメーター] タブで、Gain ブロックの [ゲイン] パラメーターに対し、[データ型] を [Inherit: Same as input
] に設定します。
[ゲイン] パラメーターに対し、[値] を myGainParam
に設定します。
または、ブロックを設定するために、次のコマンドをコマンド プロンプトで使用します。
set_param('ex_paramdt_contexts/In1','OutDataTypeStr','single') set_param('ex_paramdt_contexts/In2','OutDataTypeStr','int8') set_param('ex_paramdt_contexts/Gain - single','Gain','myGainParam',... 'OutDataTypeStr','Inherit: Same as input',... 'ParamDataTypeStr','Inherit: Same as input') set_param('ex_paramdt_contexts/Gain - int8','Gain','myGainParam',... 'OutDataTypeStr','Inherit: Same as input',... 'ParamDataTypeStr','Inherit: Same as input')
モデル データ エディターのいずれかの "Gain" ブロック パラメーターで、[Value] 列のセルをクリックします。myGainParam
の横にあるアクション ボタン (3 つの縦向きのドット) をクリックし、[作成] を選択します。
[新規データの作成] ダイアログ ボックスで、[値] を Simulink.Parameter(3)
に設定して [作成] をクリックします。値が 3
の Simulink.Parameter
オブジェクトがモデル ワークスペースに表示されます。
myGainParam プロパティ ダイアログ ボックスで、[データ型] を int8
に設定します。
Code Generation
タブで [Coder アプリでの構成] をクリックします。
コード マッピング エディターで myGainParam
のストレージ クラスを ExportedGlobal
に設定します。ストレージ クラス ExportedGlobal
では、オブジェクトは生成されたコードにグローバル変数として表示されます。
または、パラメーター オブジェクトを作成して構成するには、コマンド プロンプトで以下のコマンドを使用します。
mws = get_param('ex_paramdt_contexts', 'modelworkspace'); mws.assignin('myGainParam',Simulink.Parameter(3)); setVariablePart(mws,'myGainParam.DataType','int8'); cm = coder.mapping.utils.create('ex_paramdt_contexts'); setModelParameter(cm,'myGainParam','StorageClass','ExportedGlobal');
このモデルでは、パラメーター オブジェクト myGainParam
を使用して 2 つのブロック パラメーター値を設定します。ブロック パラメーターはブロック入力信号から異なるデータ型 (single
または int8
) を継承します。これらの異なるデータ型のコンテキストで myGainParam
を使用するには、[DataType
] プロパティを int8
に設定することでパラメーター オブジェクトのデータ型を明示的に指定します。
パラメーター オブジェクトのデータ型と信号のデータ型の一致
オプションで、Simulink.NumericType
オブジェクトまたは Simulink.AliasType
オブジェクトを使用して、パラメーター オブジェクトのデータ型および信号のデータ型のいずれかを設定します。この手法により、パラメーター オブジェクトのデータ型と信号のデータ型の不一致に起因する不必要な型変換およびシフトが、生成されたコードで除去されます。
コマンド プロンプトで、データ型 int8
を表す Simulink.NumericType
オブジェクトを作成します。
sharedType_int8 = fixdt('int8');
モデル データ エディターの [入力端子/出力端子] タブで、In2
Inport ブロックのデータ型を sharedType_int8
に設定します。
[パラメーター] タブでブロック線図を更新します。データ テーブルに、パラメーター オブジェクト myGainParam
を表す行が含まれるようになります。
[データ型] 列を使用して、パラメーター オブジェクトのデータ型を sharedType_int8
に設定します。
または、ブロックおよびオブジェクトを設定するために、次のコマンドをコマンド プロンプトで使用します。
myGainParam.DataType = 'sharedType_int8'; set_param('ex_paramdt_contexts/In2','OutDataTypeStr','sharedType_int8')
パラメーター オブジェクトおよび信号はデータ型 int8
を使用します。このデータ型を変更するには、データ型オブジェクト sharedType_int8
のプロパティを調整します。
コードの生成と検査
モデルからコードを生成します。
slbuild('ex_paramdt_contexts')
### Starting build procedure for: ex_paramdt_contexts ### Successful completion of build procedure for: ex_paramdt_contexts Build Summary Top model targets built: Model Action Rebuild Reason ===================================================================================================== ex_paramdt_contexts Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.546s
生成されたファイル ex_paramdt_contexts.c
は、データ型 int8_T
(これは、Simulink® でのデータ型 int8
に対応) を使用してグローバル変数 myGainParam
を定義します。
file = fullfile('ex_paramdt_contexts_grt_rtw','ex_paramdt_contexts.c'); coder.example.extractLines(file,'/* Exported block parameters */','int8_T myGainParam = 3;',1,1)
/* Exported block parameters */ int8_T myGainParam = 3; /* Variable: myGainParam
モデルの関数 step
の生成されたコードのアルゴリズムは、myGainParam
を使用して 2 つの Gain ブロックの出力を計算します。入力信号がデータ型 single
を使用する Gain ブロックの場合、コード アルゴリズムは myGainParam
をデータ型 real32_T
(これは、Simulink でのデータ型 single
に対応) にキャストします。
coder.example.extractLines(file,'/* Model step function */',... '/* Model initialize function */',1,0)
/* Model step function */ void ex_paramdt_contexts_step(void) { /* Outport: '<Root>/Out1' incorporates: * Gain: '<Root>/Gain - single' * Inport: '<Root>/In1' */ ex_paramdt_contexts_Y.Out1 = (real32_T)myGainParam * ex_paramdt_contexts_U.In1; /* Outport: '<Root>/Out2' incorporates: * Gain: '<Root>/Gain - int8' * Inport: '<Root>/In2' */ ex_paramdt_contexts_Y.Out2 = (int8_T)(myGainParam * ex_paramdt_contexts_U.In2); }