Main Content

モデル データ構成のコード マッピングへの移行

R2020b 以降では、コード生成用にモデル データを構成する方法として、コード マッピング エディターまたはコード マッピング API を使用する方法が推奨されます。1 つのインターフェイスから、データのカテゴリに対して既定の設定を構成し、必要に応じて特定のデータ要素についてそれらの設定をオーバーライドできます。パラメーターについては、既定でインライン化するか調整可能にするかを指定できます。コード ジェネレーターでデータのコードを生成する際、指定したコード定義を使用して、生成コードでのデータの表現方法が決定されます。

R2020b より前のリリースで作成されたモデルを開くと、Simulink® ではモデルで指定されたコード定義がモデル コード マッピングに移行されます。

移行の影響

モデル内で構成されているデータについて、移行プロセスで既存のストレージ クラスの指定が対応するコード マッピングに置き換えられます。コード生成用にモデル内で構成されるデータには、以下で表されるデータが含まれます。

  • Outport ブロック

  • 信号線

  • ブロック状態

  • データ ストア

  • モデル ワークスペース内のパラメーター オブジェクト

次の表に、特定のモデルの状況とそれに対応する移行結果を示します。

条件移行結果
モデルがライブラリ モデルである。Simulink は、モデル内で構成されたデータに関連付けられているコード構成を破棄します。
モデル内でデータ要素がコード生成用に構成されていて、そのデータ要素が Simulink.CoderInfo オブジェクトに関連付けられており、そのオブジェクトの StorageClass プロパティが Custom に設定され、CustomStorageClass プロパティが Default に設定されている。Simulink は、ストレージ クラス設定を Custom (Default) から ExportedGlobal に変更し、警告を表示します。

ExportedGlobalImportedExtern などの組み込みストレージ クラスに TypeQualifier ストレージ クラス プロパティを使用するように構成されたデータ オブジェクトをモデルで使用している。これには、以下として設定されたプロパティが含まれます。

  • ワークスペースまたはデータ ディクショナリのデータ オブジェクトの CoderInfo.TypeQualifier プロパティ

  • ポート パラメーター RTWStorageTypeQualifier

  • Data Store Memory、Discrete Filter、Discrete State-Space、Discrete-Time Integrator、Discrete Transfer Fcn、Discrete Zero-Pole、Memory の各ブロックのブロック パラメーター RTWStateStorageTypeQualifier

Simulink は、プロパティがサポートされなくなったことを示す警告を発行します。同じ結果を得るために他のインターフェイスを使用できます。
Simulink.CoderInfo オブジェクトの Alignment プロパティをモデル内で構成されたデータに対して使用している。Simulink は、プロパティがモデル固有のデータに対してサポートされなくなったことを示す警告を発行します。このプロパティは、ベース ワークスペースまたはデータ ディクショナリに保存されたデータに対しては使用できます。
モデルのモデル ワークスペースを MAT ファイル、MATLAB® ファイル、データ ディクショナリなどの外部データ ソースから初期化する。Simulink は、そのモデルのコード マッピングにパラメーター オブジェクトのコード構成を移動します。
Subsystem ブロックを右クリックしてコードと実行可能プログラムを生成する個々のサブシステムについて、サブシステムの入出力信号に対するストレージ クラスおよびストレージ クラス プロパティをサブシステムの外部で構成している。 入出力インターフェイスのデータに対する変数は生成コードに含まれません。

次の操作を実行する場合、対応が必要になることがあります。

  • Simulink エディターを使用して別のモデルにブロックの線をコピーする。Simulink では、コピーするモデリング要素に関連付けられているコード構成情報はコピーされません。詳細については、ブロックと信号線のモデル間でのコピー (Embedded Coder)を参照してください。

  • モデルのシステム ターゲット ファイル設定を GRT ベースと ERT ベースのシステム ターゲット ファイル間で切り替える。Simulink では、コピーするモデルのコピー元バージョンのシステム ターゲット ファイルのコード構成情報は無視されます。詳細については、GRT ベースと ERT ベースのシステム ターゲット ファイルの切り替え (Embedded Coder)を参照してください。

移行前の考慮事項

以下の状況に該当する場合は、移行前に以降の節の推奨事項に従って準備することを検討してください。

  • ライブラリ モデル内で構成されたデータ

  • ストレージ クラスの TypeQualifier プロパティ

  • コード生成用のデータ配置

  • モデル ワークスペース内の初期化されたパラメーター オブジェクトのコード構成

  • サブシステムの I/O インターフェイスのコード構成

ライブラリ モデル内で構成されたデータ

モデルがライブラリ モデルの場合、データのコード生成を構成し直します。ライブラリを使用するモデルのコンテキストでデータのコード生成を再構成します (コード インターフェイスの設定を参照)。

モデル内で構成されたデータのコード構成が失われないようにするには、以前のリリースでモデルを読み込み、以下を行う MATLAB スクリプトを作成して実行します。

  1. モデル データを読み込む。

  2. コード生成用にモデル内で構成されているデータを検索する。

  3. MAT ファイル、MATLAB ファイル、データ ディクショナリなどの外部ソースに保存するデータ オブジェクトにデータの表現を変換する。

  4. 外部データ オブジェクトを使用するようにモデルを更新する。

ストレージ クラスの TypeQualifier プロパティ

モデルで ExportedGlobalImportedExtern などの組み込みストレージ クラスをもつデータ オブジェクトを構成し、ストレージ クラスの TypeQualifier プロパティを使用している場合、R2020b 以降のリリースでモデルを読み込むと Simulink から警告が発行されます。この警告を回避し、サポートされている代替方法を使用するようにモデルを更新するには、以前のリリースでモデルを読み込み、以下を行う MATLAB スクリプトを作成して実行します。

  1. モデルのデータ オブジェクトをモデル ワークスペース、ベース ワークスペース、またはデータ ディクショナリから読み込む。

  2. TypeQualifier プロパティが空でない string 値に設定されているデータ オブジェクトを検索する。

  3. ストレージ クラス設定を必要な型修飾子が事前定義されているストレージ クラスに変更する (たとえば、ストレージ クラス Const にはデータの宣言と定義に修飾子 const が含まれています)。

次のスクリプト例は、モデルのデータ オブジェクトをベース ワークスペースから読み込み、ストレージ クラスの TypeQualifier プロパティを使用して構成されているデータのインスタンスを検索し、ストレージ クラス設定を Const に変更します。

vars = who;

  for idx = 1:length(vars)
    thisVar = evalin('base',vars{idx});
    if (isa(thisVar,'Simulink.Parameter') && (isequal(thisVar.CoderInfo.TypeQualifier, 'const')))
      thisVar.CoderInfo.TypeQualifier = '';
      thisVar.CoderInfo.StorageClass = 'Custom';
      thisVar.CoderInfo.CustomStorageClass = 'Const';
    end
  end

コード生成用のデータ配置

モデルに対して構成されているデータ配置情報を保持するには、モデルの外部のデータ オブジェクトでデータを表します。たとえば、以前のリリースの Simulink でモデルを開き、次の表にリストされたアクションを実行します。

データ要素のタイプアクション
モデル ワークスペース内のパラメーター オブジェクトモデル エクスプローラーを使用して、モデル ワークスペースからベース ワークスペースまたはデータ ディクショナリにオブジェクトを移動します。次に、オブジェクトのストレージ クラスと配置のプロパティを設定します。モデルを保存します。
信号線[信号プロパティ] ダイアログ ボックスを開き、信号の名前を指定して [信号名を Simulink の信号オブジェクトに関連付ける] を選択します (ストレージ クラスは Auto でなければなりません)。ベース ワークスペースまたはデータ ディクショナリで Simulink.Signal オブジェクトを作成し、オブジェクトのストレージ クラスと配置のプロパティを設定します。モデルを保存します。
ブロックの状態[ブロック パラメーター] ダイアログ ボックスを開き、状態の名前を指定して [状態名を Simulink の信号オブジェクトに関連付ける] を選択します (ストレージ クラスは Auto でなければなりません)。ベース ワークスペースまたはデータ ディクショナリで Simulink.Signal オブジェクトを作成し、ストレージ クラスと配置のプロパティを設定します。モデルを保存します。

あるいは、以下を行う MATLAB スクリプトを作成して実行します。

  1. モデル データを読み込む。

  2. Simulink.CoderInfo.Alignment を設定するデータ オブジェクトを検索する。

  3. MAT ファイル、MATLAB ファイル、データ ディクショナリなどの外部ソースに保存するデータ オブジェクトにデータの表現を変換する。

  4. 新しいデータ オブジェクトの Simulink.CoderInfo オブジェクト プロパティ Alignment を設定する。

たとえば、次のスクリプトは、パラメーター、ルックアップ テーブル、およびブレークポイントのデータ オブジェクトに対して Alignment が設定されているかどうかをチェックし、見つかったデータ オブジェクトを MAT ファイル savedData.mat に取得します。

filename = 'savedData.mat';
varList = who;
tosaveVars = {};
for idx = 1 : length(varList)
   variable = eval(varList{idx});
   if ((isa(variable, 'Simulink.Parameter') || ...
       isa(variable, 'Simulink.LookupTable') || ...
       isa(variable, 'Simulink.Breakpoint')) && ...
       variable.CoderInfo.Alignment ~= -1)
       tosaveVars{end+1} = varList{idx};       
   end
end
if ~isempty(tosaveVars)
  save('savedData.mat', tosaveVars{:});
end

次のコマンドを使用して、モデル ワークスペースでスクリプトを評価します。

mws = get_param(bdroot, 'ModelWorkspace');
evalin(mws, 'SaveMWSParamsWithAlignment');

モデル ワークスペース内のパラメーター オブジェクトについては、モデル エクスプローラー インターフェイスを使用して、モデル ワークスペースからベース ワークスペースまたはデータ ディクショナリにオブジェクトを移動することもできます。その後、ストレージ クラスの [Alignment] プロパティを選択します。

モデル ワークスペース内の初期化されたパラメーター オブジェクトのコード構成

R2020b 以降のリリースでモデルを読み込んだ後、モデルのモデル ワークスペースを MAT ファイル、MATLAB ファイル、データ ディクショナリなどの外部データ ソースから初期化すると、Simulink で以下が実行されます。

  • Simulink.CoderInfo オブジェクトの内容がモデル コード マッピングに保存されます。

  • 外部データ ソースで定義されている Simulink.Parameter オブジェクトから Simulink.CoderInfo オブジェクトが削除されます。

パラメーターのコード構成設定を取得および設定するには、コード マッピング エディターまたはコード マッピング API を使用します。コード インターフェイスの設定を参照してください。

サブシステムの I/O インターフェイスのコード構成

R2020b 以降のリリースで、Subsystem ブロックを右クリックしてコードと実行可能プログラムを生成する個々のサブシステムについて、生成されるサブシステムのコード インターフェイスに信号データを含めるには、サブシステムの入出力信号に対するストレージ クラスおよびストレージ クラス プロパティをサブシステムの内部で構成します。信号をサブシステムの外部で構成している場合、入出力インターフェイスのデータに対する変数は生成コードに含まれません。

詳細については、個別のサブシステムのコードと実行可能ファイルの生成を参照してください。

ブロックと信号線のモデル間でのコピー

R2020b 以降では、Simulink エディターを使用して別のモデルにブロックや信号線をコピーする場合、コピーするモデリング要素に関連付けられているコード構成情報は Simulink でコピーされません。

この変更に対処するには、コード マッピング API を使用して、データ要素のコード構成情報をコピーして貼り付けます。

  1. コピー操作のコピー元とコピー先のモデルを開きます。

  2. コード マッピング API を使用して、コピー元のモデルのコード マッピング オブジェクトを取得します。

  3. コード マッピング API を使用して、コピーするモデル要素のコード マッピング情報を取得します。

  4. コピー先のモデルにコード マッピング オブジェクトが存在しない場合は、コード マッピング API を使用して作成します。

  5. コピー先のモデルにコピーするモデル要素について、コード マッピング API を使用して、コード マッピング情報をコピー元のモデルと同じ値に設定します。

  6. コピー元のモデルを閉じます。

  7. コピー先のモデルを保存して閉じます。

次に例を示します。

.
.
.
srcMdl = 'my_src_mdl';
destMdl = 'my_dest_mdl';

open_system(srcMdl);
open_system(destMdl);

% Get data configuration from source model
srcCM = coder.mapping.api.get(srcMdl);
srcSC = getSignal(srcCM, srcPort, 'StorageClass')

% Set data configuration for destination model to setting of source model
destCM = coder.mapping.api.get(destMdl);
setSignal(destCM, destPort, 'StorageClass', srcSC);

close_system(srcMdl);
save_system(destMdl);
close_system(destMdl);
.
.
.

GRT ベースと ERT ベースのシステム ターゲット ファイルの切り替え

R2020b 以降では、モデルのシステム ターゲット ファイル設定を GRT ベースと ERT ベースのシステム ターゲット ファイル間で切り替えると、各システム ターゲット ファイルの代替コード構成が Simulink で適用されます。この切り替えは以下の場合に発生する可能性があります。

  • Simulink Coder™ アプリと Embedded Coder® アプリを切り替える。

  • モデルのアクティブなコンフィギュレーション セットを変更する。

  • モデル コンフィギュレーション パラメーター [システム ターゲット ファイル] の設定を変更する。

モデル内で構成されたデータのコード構成情報を保持するには、コード マッピング API を使用して関連するコード マッピングをコピーする MATLAB スクリプトを作成して実行します。

  1. 保持するコピー元のシステム ターゲット ファイルとコード マッピングを含むモデルを開きます。

  2. コード マッピング API を使用して、モデルのコード マッピング オブジェクトを取得し、データ要素のデータ マッピング オブジェクトを取得します。

  3. コード マッピング API を使用して、モデルのコード マッピング オブジェクトを取得し、データ要素のデータ マッピング オブジェクトを設定します。

  4. モデルを保存して閉じます。

次のスクリプト フラグメントは、コード マッピング API を使用して、GRT システム ターゲット ファイルから ERT システム ターゲット ファイルに切り替えるときに信号オブジェクトのストレージ クラスを保持する方法を示したものです。

.
.
.
mymdl = 'my_shared_mdl';

open_system(mymdl);

% Get data configuration for Simulink Coder (GRT-based) code generation
scCodeMapping = coder.mapping.api.get(model, 'SimulinkCoderC'); 
scStorageClass = getSignal(scCodeMapping, srcPort, 'StorageClass') 

% Set data configuration for Embedded Coder (ERT-based) code generation
ecCodeMapping = coder.mapping.api.get(model, 'EmbeddedCoderC'); 
setSignal(ecCodeMapping, srcPort, 'StorageClass', scStorageClass)

save_system(mymdl);
close_system(mymdl);

.
.
.

ワークフローの変更

R2020b 以降では、モデルのデータ要素をコード生成用に構成する際に、Simulink データ オブジェクトを作成および構成する代わりに、またはそれに加えて、コード マッピング エディターまたはコード マッピング API を使用します。次のワークフローを使用します。

  1. [Simulink Coder] アプリを開きます。

  2. コード マッピング エディターで、ストレージ表現の既定の動作を構成します。

  3. 個々のデータ要素の既定の構成設定をオーバーライドするかどうかを決定します。設定をオーバーライドしない場合は、手順 8 までスキップします。

  4. 個別に構成する MATLAB 変数を特定し、モデル ワークスペースに構成を保存します。モデル エクスプローラーで、変数を Simulink.Parameter オブジェクトに変換します。結果のデータ オブジェクトがモデル パラメーターとしてコード マッピング エディターに表示されます。

  5. 生成コードの実行中に監視するアルゴリズム データを表す信号を特定し、それらを個別に構成します。特定した信号ごとに、次のいずれかを実行します。

  6. 個々のデータ要素を構成します。コード マッピング エディターで、カテゴリ タブをクリックし、データ要素を選択して、ストレージ クラスを設定します。プロパティ インスペクターで、ストレージ クラスのプロパティ値を設定します。モデル コンフィギュレーション パラメーター [既定のパラメーター動作] の設定を変更するには、ストレージ クラスが [自動] に設定されている場合の動作を示すリンクをクリックします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、パラメーターの設定を [調整可能] または [インライン] に変更します。

  7. ベース ワークスペースまたはデータ ディクショナリ内に保存されている外部データ オブジェクトを表示するには、コード マッピング エディターで、コード マッピング エディターの [更新] ボタンをクリックします。

  8. コードの生成とレビュー

関連するトピック