Main Content

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

モデルを修正し、モデル アドバイザーで指定した条件に準拠させる

この例では、モデル アドバイザーの修正アクション付きにカスタマイズされたパス/失敗チェックをにより作成する方法を示しています。モデルにチェック項目違反が含まれない場合、結果にはチェックの説明と結果のステータスが含まれます。モデルにチェック項目違反が含まれる場合、結果にはチェックの説明、結果の状態、および問題を修正するための推奨アクションが含められます。この例では、モデル アドバイザーの [製品別]、[デモ] サブフォルダーにカスタム チェックを追加します。

この例のカスタム チェックは、名前がブロックの下に表示されていないブロックを特定します。修正アクションは、ブロックの下にブロック名を表示させることです。

この例は、結果をチェックに違反するグループごとに収集する (すなわち、詳細な結果を収集する) 方法についても説明します。たとえば、サブシステム内のブロックごとなどです。モデル アドバイザーで以下を選択すると、結果を確認できます。

  • [表示方法][推奨アクション] ─ チェック違反がある場合、このビューにはチェックに違反しているモデル要素のリストが表示されます。違反がない場合、このビューにはチェックの違反がなかったことを示す簡単な説明が表示されます。

  • [表示方法][サブシステム] ─ このビューには、チェックに違反しているモデル要素の表が表示されます。表はモデルまたはサブシステム別に整理されます (該当する場合)。

  • [表示方法][ブロック] ─ このビューには、各ブロックのチェック項目違反リストが提供されます。

チェックにパスしていない場合、結果にはチェック項目に違反した各モデル要素へのハイパーリンクが含められます。これらのハイパーリンクを使用することで、モデルまたはサブシステム内の場所を簡単に特定できます。この例のコードは、sl_customization.m ファイルと defineDetailStyleCheck.m ファイルで構成されます。

sl_customization ファイルの作成

  1. 作業フォルダーで sl_customization.m ファイルを作成します。

  2. カスタム チェックを登録するには、関数 sl_customization(cm) を次のように作成します。関数は、1 つの引数 (カスタマイズ マネージャー オブジェクト) を受け入れます。このカスタマイズ マネージャー オブジェクトには、カスタム チェックを登録するために addModelAdvisorCheckFcn メソッドが含まれます。このメソッドへの入力は、チェック定義関数へのハンドルです。

    function sl_customization(cm)
    % SL_CUSTOMIZATION - Model Advisor customization demonstration.
    
    % Copyright 2019 The MathWorks, Inc.
    
    % register custom checks 
    cm.addModelAdvisorCheckFcn(@defineDetailStyleCheck);
    
    % -----------------------------
    % defines Model Advisor Checks
    % -----------------------------
    function 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.Name='Make block names appear below blocks';
myAction.Description='Click the button to place block names below blocks';
rec.setAction(myAction);
myAction.setCallbackFcn(@ActionCB);
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

以下の手順は、完成した defineDetailStyleCheck.m ファイルを作成する方法を説明します。

  1. ModelAdvisor.Root オブジェクトを作成します。

    mdladvRoot = ModelAdvisor.Root;
  2. ModelAdvisor.Check オブジェクトを作成し、一意のチェック ID を定義します。このチェックでは、ID は com.mathworks.sample.detailStyle です。

    rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle');
    
  3. ModelAdvisor.Check.Title および ModelAdvisor.Check.TitleTips プロパティを指定します。

    rec.Title = 'Check whether block names appear below blocks';
    rec.TitleTips = 'Check position of block names';
  4. setCallbackFcn メソッドを使用してコールバック関数を呼び出します。setCallbackFcn メソッドの引数は、コールバック関数と ModelAdvisor.Check.CallbackStyle プロパティ値へのハンドルです。この例では、CallbackStyle プロパティの値は DetailStyle です。このスタイルにより、ブロックごと、サブシステムごと、または推奨アクションごとに結果を表示できます。このスタイルを適用すると、既定の書式が生成されるため、ModelAdvisor.FormatTemplate クラスまたはその他のモデル アドバイザーの書式設定 API を使用して、モデル アドバイザーに表示される結果の書式設定を行わなくてすむようになります。

    rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
  5. 修正動作を設定するには、ModelAdvisor.Action オブジェクトを作成し、そのプロパティを定義します。

    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';
  6. setCallback メソッドを使用してアクション コールバック関数を呼び出します。このメソッドへの入力は、アクション コールバック関数へのハンドルです。

    myAction.setCallbackFcn(@ActionCB);
    
  7. setAction メソッドを使用してチェックのアクションを設定します。

    rec.setAction(myAction);
  8. publish メソッドを使用して、[製品別] フォルダー内のフォルダーにチェックをパブリッシュします。この例では、フォルダー名は [Demo] です。

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

チェック コールバック定義関数

  1. defineDetailStyleCheck.m ファイルで、チェック コールバック関数を作成します。この例では、関数の名前は DetailStyleCallback です。この関数への入力は ModelAdvisor.CheckObject と、モデル アドバイザーが解析するモデルまたはシステムへのパスです。

    function DetailStyleCallback(system, CheckObj)
  2. Simulink.ModelAdvisor オブジェクトを作成するには、Simulink.ModelAdvisor.getModelAdvisor メソッドを使用します。

    mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object
    
  3. チェックに違反するブロックを特定するには、関数 find_system を使用します。この関数は、各モデル要素について ModelAdvisor.ResultDetail オブジェクトを作成します。

    violationBlks = find_system(system, 'Type','block',...
                               'NamePlacement','alternate',...
                               'ShowName', 'on');
  4. 関数 find_system がブロックの下に名前が表示されないブロックを検出しない場合についてコードを記述します。この場合、ElementResultsModelAdvisor.ResultDetail オブジェクトの 1 つのインスタンスで、情報コンテンツのみを提供します。このメソッドはチェック項目違反がないことを指定し、モデル アドバイザーには [パス] と表示されます。

    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);  
  5. 関数 find_system がブロックの下に名前が表示されないブロックのリストを返す場合のコードを記述します (violationBlks)。ElementResults にはチェックに違反する各 ModelAdvisor.ResultDetail オブジェクトが含まれ、チェック項目違反を修正するための推奨アクション メッセージが提供されます。

    この場合、setCheckResultStatus メソッドはチェック項目違反を指定し、モデル アドバイザーに [警告] または [失敗] を表示します。Simulink.ModelAdvisor.setActionEnable(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    
  6. 結果をチェック オブジェクトと関連付けるには、setResultDetails メソッドを使用します。

    CheckObj.setResultDetails(ElementResults);
    end

アクション コールバック定義関数の作成

  1. defineDetailStyleCheck.m ファイルでアクション コールバック関数を作成します。この例では、関数の名前は sampleActionCB です。この関数への入力は ModelAdvisor.Task オブジェクトです。

    function result = ActionCB(taskobj)
  2. Simulink.ModelAdvisor および ModelAdvisor.Check オブジェクトへのハンドルを作成します。

    mdladvObj = taskobj.MAObj;
    checkObj = taskobj.Check;
  3. チェックに違反するブロックについての情報を格納するため、ModelAdvisor.ResultDetail オブジェクトの配列を作成します。

    resultDetailObjs = checkObj.ResultDetails;
  4. ブロック名の位置を変更するコードを記述します。

    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.');
  5. [アクション] ボックスを無効にします。

    mdladvObj.setActionEnable(false);

チェックの実行

  1. sl_customization.m および defineDetailStyleCheck.m ファイルを保存します。

  2. MATLAB コマンド ウィンドウで次を入力します。

    Advisor.Manager.refresh_customizations
  3. MATLAB ウィンドウから sldemo_fuelsys モデルを開きます。

  4. 最上位モデルで、Engine Speed ブロックを右クリックして [回転と反転][ブロック名の反転] を選択します。

  5. fuel_rate_control サブシステムを開きます。validate_sample_time ブロックを右クリックして、[回転と反転][ブロック名の反転] を選択します。

    最上位モデルに戻り、example_sldemo_fuelsys という名前で保存します。

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

  7. 左側のペインで、[製品別]、[Demo]、[Check whether block names appear below blocks] を選択します。

    メモ

    モデル アドバイザー ウィンドウに [製品別] フォルダーが表示されない場合、[設定][基本設定][製品別フォルダーを表示] を選択します。

  8. [このチェックを実行] を選択します。変更したブロックに対するモデル アドバイザー チェックは失敗します。

  9. いずれかの [表示方法] オプションを選択して、結果を確認します。

    レポートでは、各チェックについて推奨アクションが示されます。ハイパーリンク パスをクリックして、違反するブロックをモデル エディターで開くことができます。次に例を示します。

  10. 以下のいずれかの方法を使用し、推奨アクションに従って、違反しているブロックを修正します。

    • ハイパーリンクをダブルクリックしてブロックを開き、各違反を個別に更新します。ブロックを右クリックして、[回転と反転][ブロック名の反転] を選択します。

    • [Make block names appear below blocks] ボタンを選択します。モデル アドバイザーはモデルの問題を自動で修正します。違反の修正後はボタンがグレー表示されていることに注意してください。

  11. モデルを保存し、モデル アドバイザー チェックを再実行します。このチェックはパスします。

参考

| | |

関連するトピック