Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

モデル アドバイザー カスタム コンフィギュレーションの作成と配布

モデルが企業の標準やモデリング ガイドラインに適合しているかどうかをチェックするため、モデル アドバイザーをカスタマイズすることができます。この例では、モデル アドバイザーにカスタム チェックを追加する方法と、必要のない付属チェックを削除する方法について説明します。カスタム コンフィギュレーションは保存して、開発グループの他の人に配布することができます。カスタム コンフィギュレーションを配布すると、開発グループが同じチェック セットを使用してモデルを確認できるようになります。

カスタム チェックの定義

この例では、以下の 3 種類のカスタム チェックを定義します。

  • 結果をブロックおよびサブシステムごとにグループ化し、修正アクションを提供するパス/失敗チェック。

  • モデル コンフィギュレーション パラメーター設定を検証するチェック。

  • ブロック パラメーター設定に制約を指定し、修正アクションを提供するチェック。

この例では、モデル アドバイザーに上記の 3 つのチェックを追加し、付属チェックをすべて削除します。

1.現在のフォルダーを書き込み可能なディレクトリに設定します。

2.スクリプト prepare_cust_chk_code を現在のフォルダーにコピーし、スクリプトを実行します。スクリプトにより、この例に必要なファイルが現在のフォルダーにコピーされます。

copyfile(fullfile(matlabroot,'examples','slcheck','main','prepare_cust_chk_code.m'),...
    'prepare_cust_chk_code.m','f');
run('prepare_cust_chk_code.m');

3.ファイルの 1 つ、sl_customization.m には、カスタム チェックを定義する関数 sl_customization が含まれています。sl_customization.m ファイルを開いて検証します。

function sl_customization(cm)
% SL_CUSTOMIZATION - Model Advisor customization demonstration.

% Copyright 2019 The MathWorks, Inc.

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

% -----------------------------
% defines Model Advisor Checks
% -----------------------------
function defineModelAdvisorChecks
defineDetailStyleCheck;
defineConfigurationParameterCheck;
defineBlockConstraintCheck;

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

修正アクションを伴うパス/失敗チェック

defineDetailStyleCheck.m ファイルには、定義関数 defineDetailStyleCheck が含まれています。これは、ブロックの下に名前が表示されていないブロックをリストするチェックを定義する関数です。このチェックは、これらの名前をブロックの下に移動する修正を提供します。このチェックの名前は [ブロック名がブロックの下になっているかどうかをチェック] です。defineDetailStyleCheck.m ファイルを開いて検証します。

function defineDetailStyleCheck

mdladvRoot = ModelAdvisor.Root;

% Create ModelAdvisor.Check object and set properties.
rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle');
rec.Title = 'Check whether block names appear below blocks';
rec.TitleTips = 'Check position of block names';
rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
% Create ModelAdvisor.Action object for setting fix operation.
myAction = ModelAdvisor.Action;
myAction.setCallbackFcn(@ActionCB);
myAction.Name='Make block names appear below blocks';
myAction.Description='Click the button to place block names below blocks';
rec.setAction(myAction);
mdladvRoot.publish(rec, 'Demo'); % publish check into Demo group.

end

% -----------------------------
% This callback function uses the DetailStyle CallbackStyle type. 
% -----------------------------
function DetailStyleCallback(system, CheckObj)
mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object

% Find all blocks whose name does not appear below blocks
violationBlks = find_system(system, 'Type','block',...
    'NamePlacement','alternate',...
    'ShowName', 'on');
if isempty(violationBlks)
    ElementResults = ModelAdvisor.ResultDetail;
    ElementResults.IsInformer = true;
    ElementResults.Description = 'Identify blocks where the name is not displayed below the block.';
    ElementResults.Status = 'All blocks have names displayed below the block.';
    mdladvObj.setCheckResultStatus(true);
else
    ElementResults(1,numel(violationBlks))=ModelAdvisor.ResultDetail;
    for i=1:numel(ElementResults)
        ElementResults(i).setData(violationBlks{i});
        ElementResults(i).Description = 'Identify blocks where the name is not displayed below the block.';
        ElementResults(i).Status = 'The following blocks have names that do not display below the blocks:';
        ElementResults(i).RecAction =  'Change the location such that the block name is below the block.';
    end
    mdladvObj.setCheckResultStatus(false);
    mdladvObj.setActionEnable(true);
end
CheckObj.setResultDetails(ElementResults);
end

% -----------------------------
% This action callback function changes the location of block names. 
% -----------------------------
function result = ActionCB(taskobj)
mdladvObj = taskobj.MAObj;
checkObj = taskobj.Check;
resultDetailObjs = checkObj.ResultDetails;
for i=1:numel(resultDetailObjs)
    % take some action for each of them
    block=Simulink.ID.getHandle(resultDetailObjs(i).Data);
    set_param(block,'NamePlacement','normal');
end

result = ModelAdvisor.Text('Changed the location such that the block name is below the block.');
mdladvObj.setActionEnable(false);
end

このチェックはsetCallbackFcnタイプの DetailStyle を使用します。このスタイルを適用すると既定の書式が生成されるため、ModelAdvisor.FormatTemplateまたはその他のモデル アドバイザーの書式設定 API を使用して、モデル アドバイザーに表示される結果の書式設定を行う必要がなくなります。このタイプのチェック定義関数を作成する方法の詳細については、モデルを修正し、モデル アドバイザーで指定した条件に準拠させるを参照してください。

モデル コンフィギュレーション パラメーター設定のチェック

defineConfigurationParameterCheck.m ファイルには、チェック定義関数 defineConfigurationParameterCheck が含まれています。これは、MISRA C:2012 準拠コード生成に影響を与える可能性のあるモデル コンフィギュレーション パラメーター設定を特定するチェックを定義する関数です。このチェックの名前は [Check model configuration parameters] です。

このチェック タイプには、チェック対象のモデル コンフィギュレーション パラメーター設定を含む、サポート XML データ ファイルが必要です。このファイルは MATLAB パス上になければなりません。この例では、このファイルは configurationParameterDataFile.xml. です。このチェック タイプを作成する方法の詳細については、モデル コンフィギュレーション パラメーターに対するモデル アドバイザー チェックの作成を参照してください。

defineConfigurationParameterCheck.m ファイルを開いて検証します。

function defineConfigurationParameterCheck

% Create ModelAdvisor.Check object and set properties.
rec = ModelAdvisor.Check('com.mathworks.sample.configurationParameter');
rec.Title = 'Check model configuration parameters';
rec.setCallbackFcn(@(system)(Advisor.authoring.CustomCheck.checkCallback...
    (system)), 'None', 'StyleOne');
rec.TitleTips = 'Identify configuration parameters that might impact MISRA C:2012 compliant code generation.';

% --- data file input parameters
rec.setInputParametersLayoutGrid([1 1]);
inputParam1 = ModelAdvisor.InputParameter;
inputParam1.Name = 'Data File';
inputParam1.Value = 'configurationParameterDataFile.xml';
inputParam1.Type = 'String';
inputParam1.Description = 'Name or full path of XML data file.';
inputParam1.setRowSpan([1 1]);
inputParam1.setColSpan([1 1]);
rec.setInputParameters({inputParam1});

% -- set fix operation
act = ModelAdvisor.Action;
act.setCallbackFcn(@(task)(Advisor.authoring.CustomCheck.actionCallback...
    (task)));
act.Name = 'Modify Settings';
act.Description = 'Modify model configuration settings.';
rec.setAction(act);

% publish check into Demo group.
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec, 'Demo'); 

end

ブロック パラメーターの制約のチェック

defineBlockConstraintCheck.m ファイルには、チェック定義関数 defineBlockConstraintCheck が含まれます。これは、矩形形状を持たない Logical Operator ブロックを特定するチェックを定義する関数です。このチェックの名前は、[Logical Operator ブロックのアイコン形状をチェック] です。

このチェック タイプは編集時のチェックをサポートしており、ブロック制約情報を含むサポート XML ファイルが必要です。この XML ファイルは、MATLAB パス上になければなりません。この例では、このファイル名は blockConstraintDataFile.xml. です。このチェック タイプの詳細については、サポートされる、またはサポートされないブロックおよびパラメーターのモデル アドバイザー チェックの定義を参照してください。

defineBlockConstraintCheck.m ファイルを開き、検証します。

function defineBlockConstraintCheck

rec = Advisor.authoring.createBlockConstraintCheck('com.mathworks.sample.blockConstraint');
rec.Title = 'Check icon shape of Logical Operator blocks';
rec.setCallbackFcn(@(system)(Advisor.authoring.CustomCheck.checkCallback...
    (system)), 'None', 'StyleOne');
rec.TitleTips = 'Checks icon shape of Logical Operator blocks. Icon shape of Logical Operator should be rectangular.';

% --- data file input parameters
rec.setInputParametersLayoutGrid([1 1]);
inputParam1 = ModelAdvisor.InputParameter;
inputParam1.Name = 'Data File';
inputParam1.Value = 'blockConstraintDataFile.xml';
inputParam1.Type = 'String';
inputParam1.Description = 'Name or full path of XML data file.';
inputParam1.setRowSpan([1 1]);
inputParam1.setColSpan([1 1]);
rec.setInputParameters({inputParam1});
rec.SupportExclusion = false;
rec.SupportLibrary = true;

% publish check into Demo group.
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec, 'Demo'); 

end

モデル アドバイザーでのカスタム チェックの表示

1.カスタム チェックがモデル アドバイザーで表示されるようにするには、モデル アドバイザー チェックの情報キャッシュを更新しなければなりません。MATLAB コマンド プロンプトで次のコマンドを入力します。

Advisor.Manager.refresh_customizations();

2.モデル例を開きます。

open_system('AdvisorCustomizationExample.slx');

3.[モデル化] タブで [モデル アドバイザー] を開きます。MATLAB コマンド プロンプトに以下を入力しても、モデル アドバイザーを開くことができます。

modeladvisor('AdvisorCustomizationExample.slx');
Updating Model Advisor cache...
Model Advisor cache updated. For new customizations, to update the cache, use the Advisor.Manager.refresh_customizations method.

4.[製品別][デモ] フォルダーのカスタム チェックを確認します。

チェック定義関数内のpublishコマンドは、[製品別][デモ] フォルダーにチェックを追加します。既に既定のコンフィギュレーションが設定されている場合、モデル アドバイザーにチェックは表示されないことに注意してください。[設定]、[既定の設定を元に戻す] から既定の出荷時のコンフィギュレーションを復元します。

[ブロック名がブロックの下になっているかどうかをチェック] および [Check model configuration parameters] チェックには、チェック項目違反を修正するオプションを持つ [アクション] ボックスが含まれることに注意してください。カスタム チェック定義ファイルでは、アクション コールバック関数の一部として修正を指定します。カスタム チェックを定義する方法の詳細については、独自のカスタム モデル アドバイザー チェックの定義を参照してください。

モデル キャンバスで、編集時のチェックがオンであることから、Unit Delay ブロックと Logical Operator ブロックが黄色で強調表示されていることを確認してください。これらのブロックにはチェック項目違反が含まれます。編集時のチェックにより、準拠問題についてモデルを対話的にチェックして修正することが可能になります。

これらの違反を修正するには、強調表示されたブロックにカーソルを合わせ、黄色のアイコンをクリックします。[修正] ボタンを持つ診断ボックスが開きます。

編集時のチェックをオン/オフするには、[モデル化] タブで [モデル アドバイザー]、[編集時チェック] を選択します。

モデル アドバイザー カスタム コンフィギュレーションの指定と配布

モデル アドバイザーに含めるチェックや、編集時のチェックに含めるチェックを指定するには、モデル アドバイザーの設定エディターを使用します。

1.設定エディターを開くには、[モデル化] タブで [モデル アドバイザー]、[モデル アドバイザーの設定エディター] を選択します。

2.チェックおよびフォルダーを追加または削除するには、モデル アドバイザーの設定エディターの [編集] セクションのオプションから選択します。

3.コンフィギュレーションを保存するには、[保存] を選択します。コンフィギュレーションを .json ファイルとして保存することを求めるウィンドウが表示されます。この例では、対応する demoConfiguration.json ファイルが例に同梱されているため、コンフィギュレーションを保存する必要はありません。前にこのファイルを作業フォルダーにコピーしました。

4.モデルを閉じ、モデル アドバイザーの設定エディターを閉じます。

bdclose;

コンフィギュレーションを保存するとき、既定のコンフィギュレーションとして保存するかどうかを確認するプロンプトが表示されます。既定のコンフィギュレーションとして設定すると、モデル アドバイザーを開くたびにこのコンフィギュレーションが使用されるようになります。詳細については、モデル アドバイザーの設定エディターを使用したモデル アドバイザーのカスタマイズを参照してください。

モデル アドバイザー カスタム コンフィギュレーションの読み込みと実行

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

open_system('AdvisorCustomizationExample.slx');

2.モデル アドバイザーを開きます。[設定]、[構成の読み込み] を選択し、カスタム コンフィギュレーションを読み込みます。[開く] ダイアログ ボックスで、demoConfiguration.json ファイルに移動して選択します。あるいは、MATLAB コマンド プロンプトに以下のコマンドを入力します。

modeladvisor('AdvisorCustomizationExample.slx', 'configuration',...
    'demoConfiguration.json');
Model Advisor is removing the existing report.

3.警告ダイアログ ボックスが開きます。[既存のレポートを削除して続ける] をクリックします。

モデル アドバイザーには、3 つのカスタム チェックを含む [製品別]、[デモ] フォルダーのみが含まれています。

3.[デモ] フォルダーをクリックし、[選択したチェックを実行] をクリックします。

4.[ブロック名がブロックの下になっているかどうかをチェック] チェックをクリックします。このチェックには警告が含まれます。修正を適用して警告を解決するには、右側のペインで [Make block names appear below blocks] ボタンをクリックします。

5.[Check model configuration parameters] チェックをクリックします。このチェックには警告が含まれます。修正を適用して警告を解決するには、[設定の変更] ボタンをクリックします。

6.Logical Operator ブロックのアイコン形状をチェック チェックをクリックします。このチェックには警告が含まれますが、自動修正は含まれません。修正を適用するには、推奨アクションに従います。

7.モデルとモデル アドバイザーを閉じます。

bdclose;

8.作業ディレクトリからファイルを削除します。コマンド ラインで以下のコマンドを入力し、モデル アドバイザー チェック情報キャッシュを更新します。

Advisor.Manager.refresh_customizations

プログラムによってモデル アドバイザー カスタム コンフィギュレーションを実行し、結果を表示

プログラムによってモデル アドバイザー設定を実行し、結果をモデル アドバイザーで開くことができます。

1.関数ModelAdvisor.runを呼び出します。

SysResultObjArray = ModelAdvisor.run({'AdvisorCustomizationExample'},...
'Configuration','demoConfiguration.json');

2.モデル アドバイザーで結果を表示します。

viewReport(SysResultObjArray{1},'MA')

3.ダイアログ ボックスで [続行] をクリックします。前のセクションの最後の方で、修正を適用し、警告を解決できるようになりました。

4.モデルとモデル アドバイザーを閉じます。

bdclose;

5.作業ディレクトリからファイルを削除します。コマンド タイプで以下のコマンドを入力し、モデル アドバイザー チェックの情報キャッシュを更新します。

Advisor.Manager.refresh_customizations