Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

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

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

sl_customization ファイルの作成

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

  2. カスタム チェックを登録するには、関数 sl_customization(cm) を次のように作成します。関数は、1 つの引数 (カスタマイズ マネージャー オブジェクト) を受け入れます。このカスタマイズ マネージャー オブジェクトには、カスタム チェックを登録するために addModelAdvisorCheckFcn メソッドが含まれます。このメソッドへの入力は、関数 defineModelAdvisorChecks へのハンドルです。defineModelAdvisorChecks には、カスタム モデル アドバイザーのパス/失敗を確認するチェック定義関数の呼び出しが含まれています。

    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;
    

チェック定義ファイルの作成

チェック定義関数は、チェック実行時にモデル アドバイザーが行うチェック アクションと修正アクションを定義します。この例では、完成したチェック定義関数ファイルは 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.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
    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 = '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 オブジェクトを作成し、そのプロパティを定義します。setCallback メソッドを使用してアクション コールバック関数を呼び出します。このメソッドへの入力は、アクション コールバック関数へのハンドルです。

    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. setAction メソッドを使用してチェックのアクションを設定します。

    rec.setAction(myAction);
  7. 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.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
        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 = '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 を開きます。

    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. [レポート] タブまたは [結果の詳細] タブを選択して結果を確認します。

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

    The Model Advisor showing a table of blocks with violations and the hyperlinks to the block paths

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

    • ハイパーリンクをダブルクリックしてブロックを開き、各違反を個別に更新します。ブロックを選択します。ツールストリップの [書式設定] タブで、[ブロック名の表示位置を反転] を選択します。

    • ツールストリップで [修正] をクリックします。モデル アドバイザーはモデルの問題を自動で修正します。違反の修正後はボタンがグレー表示されていることに注意してください。

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

    The Model Advisor with a passing result

参考

| | | | | | |

関連するトピック