Main Content

コード生成用のバリアントが含まれるモデルの準備

Embedded Coder® を使用すると、1 つ以上のバリアントの選択肢が含まれる Simulink® モデルからコードを生成できます。生成されたコードには各バリアントの選択のアクティベーションを制御するプリプロセッサの条件が含まれます。

メモ

Simulink は、コード生成のための Variant Simulink Function を含むマルチインスタンス参照モデルを使用することをサポートします。

STF_make_rtw_hook ファイルを使用してビルド プロセスをカスタマイズする方法の詳細については、STF_make_rtw_hook ファイルによるビルド プロセスのカスタマイズ (Simulink Coder)を参照してください。

バリアント制御変数の Simulink.Parameter オブジェクトへの変換

MATLAB® 変数を使用すると、モデルの作成時にバリアント制御式のプロトタイプ作成を迅速に行い、コード生成のプリプロセッサの条件を生成することができます。ただし、他のコード生成属性 (データ型など) を指定する場合、MATLAB 変数を Simulink.Parameter オブジェクトに変換できます。

  1. MATLAB バリアント制御変数を Simulink.Parameter オブジェクトに置き換えるモデルを指定します。

    model = 'my_model_containing_variant_choices';
    open_system(model);
    
  2. バリアント制御変数で参照される変数を取得します。

    vars = Simulink.VariantManager.findVariantControlVars(model)
    vars = 
    
    4x1 struct array with fields:
    
        Name
        Value
        Exists
        Source
        SourceType
  3. コードの実行時に変数定義がインポートされるように、バリアント制御値を指定するための外部ヘッダー ファイルを作成します。

    headerFileName = [model '_importedDefines.h'];
    headerPreamble = strrep(upper(headerFileName),'.','_');
    
    fid = fopen(headerFileName,'w+');
    fidErr = (fid == -1);
    if (fidErr)
        fprintf('There was an error creating header file %s:\n',...
            headerFileName);
    else
        fprintf('+++ Creating header file ''%s'' with variant control variable definitions.\n\n',...
            headerFileName);
        fprintf(fid, '#ifndef %s\n', headerPreamble);
        fprintf(fid, '#define %s\n', headerPreamble);
    end

    Simulink.Parameter オブジェクトとして定義されたバリアント制御変数は、次のいずれかのストレージ クラスをもつことができます。

    • ヘッダー ファイルが指定された Define または ImportedDefine

    • CompilerFlag

    • SystemConstant (AUTOSAR)

    • データをマクロとして定義する独自のストレージ クラス

    メモ

    アクティベーションのタイミングが startup のコードを生成する場合は、オブジェクトのサポートされるカスタム ストレージ クラスを指定します。startup のアクティベーションのタイミングをサポートする組み込みおよびカスタムのストレージ クラスの詳細については、Storage Classes for Different Variant Activation Timesを参照してください。

  4. すべての MATLAB 変数をループしてそれらを Simulink.Parameter オブジェクトに変換します。

    count = 0;
    for countVars = 1:length(vars)
        var = vars(countVars).Name;
        val = vars(countVars).Value;
        if isa(val, 'Simulink.Parameter')
            % Do nothing 
            continue;
        end   
        count = count+1;
    		
    % Create and configure Simulink.Parameter objects 
    % corresponding to the control variable names.
    % Specify the storage class as Define (Custom).
    	newVal = Simulink.Parameter(val);
    	newVal.DataType = 'int16';
    	newVal.CoderInfo.StorageClass = 'Custom';
    	newVal.CoderInfo.CustomStorageClass = 'Define (Custom)';
    	newVal.CoderInfo.CustomAttributes.HeaderFile = headerFileName;
    		
    		Simulink.data.assigninGlobal(model, var, newVal);
    		
    		if ~fidErr
        		fprintf(fid, '#endif\n');
        		fclose(fid);
    		end
    end

メモ

Define ストレージ クラスについてはヘッダー ファイルを空にすることができます。

プリプロセッサ条件を生成するためのモデルの構成

Variant Subsystem ブロックまたは Variant Model ブロック内でバリアントの選択を表現する場合、バリアントのそれぞれの選択に対して生成されるコードは、C のプリプロセッサ条件 #if#else#elif および #endif によって囲まれます。

Variant Source ブロックまたは Variant Sink ブロックを使用してバリアントの選択を表現する場合、バリアントのそれぞれの選択に対して生成されるコードは、C のプリプロセッサ条件 #if#endif によって囲まれます。

このため、アクティブなバリアントはコンパイル時に選択され、プリプロセッサ条件によってコードのどのセクションが実行されるかが決まります。

メモ

コードを生成するには Embedded Coder のライセンスが必要です。

  1. Simulink ツールストリップの [モデル化] タブで、[モデル設定] をクリックします。

  2. [コード生成] ペインを選択し、[システム ターゲット ファイル]ert.tlc に設定します。

  3. [レポート] ペインで、[コード生成レポートを作成] を選択します。

    メモ

    [コード配置] ペインで、[ファイル パッケージ化形式] ドロップダウン リストから [コンパクト] オプションを選択した場合、model_types.h ファイルは生成されず、model_types.h ファイルの内容は model.h ファイルに移動されます。

  4. [コード生成] ペインを選択し、[カスタム ストレージ クラスを無視する][適用] をオフにします。

  5. モデルでバリアントの選択 (Variant SubsystemVariant SourceVariant Sink または Variant Model) を含むブロックを右クリックして [ブロック パラメーター] を選択します。

  6. [バリアント制御モード] パラメーターに [式] (既定のオプション) が選択されていることを確認してください。

  7. [バリアントのアクティベーションのタイミング] リストから [コードのコンパイル] を選択します。

    Simulink はブロック線図の更新中またはシミュレーション中にバリアントの選択をすべて解析します。この解析によって、バリアントのすべての選択についてコード生成の準備状態の早期検証が行われます。

  8. モデルを作成します。

関連する例

詳細