Main Content

カスタムのモデル アドバイザー チェック用のコンパイル オプションの定義

モデルの実装と、カスタム チェックで何を実現するかに応じて、適切なコンパイル オプションを指定することが重要です。次のように CallbackContext プロパティを設定することで、ModelAdvisor.Checkオブジェクトのチェック定義関数のコンパイル オプションを指定します。

  • None は、カスタム チェックによる解析の前にモデル アドバイザーによるモデルのコンパイルが必要がないことを指定します。NoneCallbackContext プロパティの既定の設定です。

  • PostCompile は、モデル アドバイザーがモデルをコンパイルしてモデルのブロック線図を更新してから、モデルをシミュレートしてカスタム チェックを実行しなければならないことを指定します。モデル アドバイザーは、コード生成中に失敗したモデル化の問題にはフラグを付けません。これらの問題はシミュレートされたモデルには影響しないからです。

  • PostCompileForCodegen は、モデル アドバイザーはコード生成専用にモデルのブロック線図をコンパイルして更新しなければならないが、モデルをシミュレートする必要はないことを指定します。モデルのコード生成の準備状態を解析するモデル アドバイザー チェックには、このオプションを使用します。このオプションはカスタム編集時チェックではサポートされません。

モデルのコード生成の準備状態を評価するチェック

モデル内のコード生成の設定に関する問題を早い段階で特定し、コード生成時の予期せぬエラーを回避するために、モデル アドバイザー エンジンを有効化するカスタム モデル アドバイザー チェックを作成できます。たとえば、このモデルでは、BasicColors および OtherColors 内の Red の列挙値は、シミュレートされたモデルで使用できます。ただし、生成されたコードでは、これらの Red の列挙値は列挙値の衝突を引き起こします。'PostCompileForCodegen' オプションを使用することにより、モデル アドバイザーのカスタム チェックは、コード生成の設定に関するこのタイプの問題を特定できます。

Class definitions for BasicColors and OtherColors, showing the enumeration clash from Red enumeration

'PostCompileForCodegen' オプションは、すべてのバリアント選択のためにモデルをコンパイルします。このコンパイルによって、モデル内のアクティブ、非アクティブなバリアント パス用に生成されたコード内に存在する可能性のある問題を解析できます。例がモデルのアクティブおよび非アクティブなバリアント パスを評価するカスタム チェックの作成で提供されています。

モデルのアクティブおよび非アクティブなバリアント パスを評価するカスタム チェックの作成

この例では、バリアント システム モデルのアクティブおよび非アクティブなバリアント パスを評価する、モデル アドバイザーのカスタム チェックの作成について説明します。この例で示すモデル アドバイザーの結果は、モデルからコードを生成することが最終的な目的である場合に、ModelAdvisor.Check.CallbackContext プロパティの値として PostCompile ではなく PostCompileForCodegen を使用する理由を示します。

モデルを更新してバリアントのすべての選択肢を解析

モデル アドバイザーでバリアント システムのアクティブなパスおよび非アクティブなパスを評価するには、バリアント ブロック (Variant SinkVariant Source、およびVariant Subsystem, Variant Model, Variant Assembly Subsystem) の [バリアントのアクティベーションのタイミング] パラメーターを Code compile または startup に設定しなければなりません。また、[システム ターゲット ファイル] コンフィギュレーション パラメーターを ert.tlc に設定しなければなりません。

メモ: このオプションを選択すると、実行時間に影響し、モデル アドバイザーがモデルを評価する所要時間が長くなる場合があります。

  1. モデル例 ex_check_compile_code_gen を開きます。

  2. 各 Variant Source ブロックについて、ブロック パラメーターを開いて [バリアントのアクティベーションのタイミング] パラメーターを Code compile に設定します。

  3. モデルをローカルの作業フォルダーに保存します。

関数 sl_customization の作成

作業フォルダーで、以下の関数 sl_customization を作成し、保存します。

function sl_customization(cm)

% register custom checks 
cm.addModelAdvisorCheckFcn(@defineModelAdvisorCheck);

% -----------------------------
% defines Model Advisor Checks
% -----------------------------
function defineModelAdvisorCheck
CheckSingleToBoolConversion;

関数 sl_customization は、カスタマイズ マネージャー オブジェクトを受け入れます。カスタマイズ マネージャー オブジェクトは、カスタム チェックを登録するための addModelAdvisorCheckFcn メソッドを含みます。このメソッドへの入力は、関数 (defineModelAdvisorCheck) へのハンドルです。この関数には、カスタム チェックに対応するチェック定義関数の呼び出しが含まれています。

チェック定義関数 CheckSingleToBoolConversion.m を開いて検証します。

function CheckSingleToBoolConversion
mdladvRoot = ModelAdvisor.Root;

rec = ModelAdvisor.Check('exampleCheck1');
rec.Title = 'Check to identify Single to Bool conversions';
rec.TitleID = 'custom.dtcCheck.CompileForCodegen1';
rec.TitleTips = 'Custom check to identify Single to Bool conversions';
rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
rec.CallbackContext = 'PostCompileForCodegen'; % Compile for Code Generation

mdladvRoot.publish(rec, 'Demo');

end
    
function DetailStyleCallback(system, CheckObj)

mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system);

violationBlks = find_system(system, 'BlockType', 'DataTypeConversion');
for ii = numel(violationBlks):-1:1
    dtcBlk = violationBlks{ii};
    compDataTypes = get_param(dtcBlk, 'CompiledPortDataTypes');
    if isempty(compDataTypes)
        violationBlks(ii) = [];
        continue;
    end
    if ~(strcmp(compDataTypes.Inport, 'single') && strcmp(compDataTypes.Outport, 'boolean'))
        violationBlks(ii) = [];
        continue;
    end
end

if isempty(violationBlks)
    ElementResults = ModelAdvisor.ResultDetail;
    ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail;
    ElementResults.IsInformer = true;
    ElementResults.Description = 'This check looks for data type conversion blocks that convert single data to boolean data';
    ElementResults.Status = 'Check has passed. No data type conversion blocks that convert single data to boolean were found.';
    mdladvObj.setCheckResultStatus(true);
else
    
    for i=1:numel(violationBlks)
	ElementResults(1,i) = ModelAdvisor.ResultDetail;
    end
    for i=1:numel(ElementResults)
        
        ModelAdvisor.ResultDetail.setData(ElementResults(i), 'SID',violationBlks{i});
        ElementResults(i).Description = 'This check looks for data type conversion blocks that convert single data to boolean data';
        ElementResults(i).Status = 'Check has failed. The following data type conversion blocks convert single data to boolean:';
        ElementResults(i).RecAction =  'Modify the model to avoid converting data type from single to boolean';
    end
    mdladvObj.setCheckResultStatus(false);
    mdladvObj.setActionEnable(true);
end
CheckObj.setResultDetails(ElementResults);
end

カスタム チェックの作成方法の詳細については、カスタム モデル アドバイザー チェックの定義を参照してください。

モデル アドバイザーを開いてカスタム チェックを実行

モデル アドバイザーを開いてカスタム チェックを実行する前に、モデル アドバイザー チェックの情報キャッシュを更新しなければなりません。MATLAB コマンド ウィンドウで次を入力します。

Advisor.Manager.refresh_customizations

モデル アドバイザーを開いてカスタム チェックを実行するには、次を行います。

  1. 保存したモデルを開きます。

  2. [モデル化] タブで、[モデル アドバイザー] を選択します。[システム セレクター - モデル アドバイザー] ダイアログ ボックスが開きます。[OK] をクリックします。モデル アドバイザーが開きます。

  3. 左側のペインで、[製品別]、[Demo]、[Check to identify SINGLE to BOOL conversion] を選択します。

  4. チェックを右クリックして [このチェックを実行] を選択します。モデル アドバイザーがモデルをコンパイルしてチェックを実行します。モデル アドバイザーがモデルのブロック線図を更新します。非アクティブなバリアント パスはグレー表示されます。

モデル アドバイザーの結果の確認

モデル アドバイザーでチェックの解析結果を確認します。ハイパーリンクをクリックして、違反するブロックをモデル エディターで開きます。

この例では、sl_customization.m ファイルでコンパイル オプションを次のように定義しています。

rec.CallbackContext = 'PostCompileForCodegen';

そのため、モデル アドバイザーは、バリアント システムのアクティブ パスおよび非アクティブ パスにある Data Type Conversion ブロックに対して警告を生成します。

check_compile_code_gen_maresults.png

sl_customization.m ファイルでコンパイル オプションを次のように定義している場合、

rec.CallbackContext = 'PostCompile';

結果には、アクティブ パスの Data Type Conversion ブロックのみが含まれます。

check_compile_code_gen_maresults_postcompile.png

参考

|

関連するトピック