カスタムのモデル アドバイザー チェック用のコンパイル オプションの定義
モデルの実装と、カスタム チェックで何を実現するかに応じて、適切なコンパイル オプションを指定することが重要です。次のように CallbackContext
プロパティを設定することで、ModelAdvisor.Check
オブジェクトのチェック定義関数のコンパイル オプションを指定します。
None
は、カスタム チェックによる解析の前にモデル アドバイザーによるモデルのコンパイルが必要がないことを指定します。None
はCallbackContext
プロパティの既定の設定です。PostCompile
は、モデル アドバイザーがモデルをコンパイルしてモデルのブロック線図を更新してから、モデルをシミュレートしてカスタム チェックを実行しなければならないことを指定します。モデル アドバイザーは、コード生成中に失敗したモデル化の問題にはフラグを付けません。これらの問題はシミュレートされたモデルには影響しないからです。PostCompileForCodegen
は、モデル アドバイザーはコード生成専用にモデルのブロック線図をコンパイルして更新しなければならないが、モデルをシミュレートする必要はないことを指定します。モデルのコード生成の準備状態を解析するモデル アドバイザー チェックには、このオプションを使用します。このオプションはカスタム編集時チェックではサポートされません。
モデルのコード生成の準備状態を評価するチェック
モデル内のコード生成の設定に関する問題を早い段階で特定し、コード生成時の予期せぬエラーを回避するために、モデル アドバイザー エンジンを有効化するカスタム モデル アドバイザー チェックを作成できます。たとえば、このモデルでは、BasicColors
および OtherColors
内の Red
の列挙値は、シミュレートされたモデルで使用できます。ただし、生成されたコードでは、これらの Red
の列挙値は列挙値の衝突を引き起こします。'PostCompileForCodegen'
オプションを使用することにより、モデル アドバイザーのカスタム チェックは、コード生成の設定に関するこのタイプの問題を特定できます。
'PostCompileForCodegen'
オプションは、すべてのバリアント選択のためにモデルをコンパイルします。このコンパイルによって、モデル内のアクティブ、非アクティブなバリアント パス用に生成されたコード内に存在する可能性のある問題を解析できます。例がモデルのアクティブおよび非アクティブなバリアント パスを評価するカスタム チェックの作成で提供されています。
モデルのアクティブおよび非アクティブなバリアント パスを評価するカスタム チェックの作成
この例では、バリアント システム モデルのアクティブおよび非アクティブなバリアント パスを評価する、モデル アドバイザーのカスタム チェックの作成について説明します。この例で示すモデル アドバイザーの結果は、モデルからコードを生成することが最終的な目的である場合に、ModelAdvisor.Check.CallbackContext
プロパティの値として PostCompile
ではなく PostCompileForCodegen
を使用する理由を示します。
モデルを更新してバリアントのすべての選択肢を解析
モデル アドバイザーでバリアント システムのアクティブなパスおよび非アクティブなパスを評価するには、バリアント ブロック (Variant Sink、Variant Source、およびVariant Subsystem) の [バリアントのアクティベーションのタイミング] パラメーターを Code compile
または startup
に設定しなければなりません。また、[システム ターゲット ファイル] コンフィギュレーション パラメーターを ert.tlc
に設定しなければなりません。
メモ: このオプションを選択すると、実行時間に影響し、モデル アドバイザーがモデルを評価する所要時間が長くなる場合があります。
モデル例
ex_check_compile_code_gen
を開きます。各 Variant Source ブロックについて、ブロック パラメーターを開いて [バリアントのアクティベーションのタイミング] パラメーターを
Code compile
に設定します。モデルをローカルの作業フォルダーに保存します。
関数 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.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
モデル アドバイザーを開いてカスタム チェックを実行するには、次を行います。
保存したモデルを開きます。
[モデル化] タブで、[モデル アドバイザー] を選択します。[システム セレクター - モデル アドバイザー] ダイアログ ボックスが開きます。[OK] をクリックします。モデル アドバイザーが開きます。
左側のペインで、[製品別]、[Demo]、[Check to identify SINGLE to BOOL conversion] を選択します。
チェックを右クリックして [このチェックを実行] を選択します。モデル アドバイザーがモデルをコンパイルしてチェックを実行します。モデル アドバイザーがモデルのブロック線図を更新します。非アクティブなバリアント パスはグレー表示されます。
モデル アドバイザーの結果の確認
モデル アドバイザーでチェックの解析結果を確認します。ハイパーリンクをクリックして、違反するブロックをモデル エディターで開きます。
この例では、sl_customization.m
ファイルでコンパイル オプションを次のように定義しています。
rec.CallbackContext = 'PostCompileForCodegen';
そのため、モデル アドバイザーは、バリアント システムのアクティブ パスおよび非アクティブ パスにある Data Type Conversion ブロックに対して警告を生成します。
sl_customization.m
ファイルでコンパイル オプションを次のように定義している場合、
rec.CallbackContext = 'PostCompile';
結果には、アクティブ パスの Data Type Conversion ブロックのみが含まれます。
参考
ModelAdvisor.Check
| ModelAdvisor.Check.CallbackContext