Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

異なるデータ型のコンテキストでパラメーター データを再利用

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) に設定して [作成] をクリックします。値が 3Simulink.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);
}

関連するトピック