Main Content

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

ModelAdvisor.ResultDetail クラス

名前空間: ModelAdvisor

チェック結果の詳細を定義する

説明

カスタム チェック オーサリング アルゴリズムで ModelAdvisor.ResultDetail クラスのオブジェクトを使用して、チェック結果に関する詳細を示します。モデル アドバイザーでのみ実行されるチェックでは、setResultDetails メソッドを使用して、これらの結果を ModelAdvisor.Check オブジェクトに関連付け、関数 ModelAdvisor.Check.setCallbackFcn でコールバック スタイルとして 'DetailStyle' を指定します。

プロパティ

すべて展開する

カスタム チェックに違反している各ブロックの Simulink 識別子 (SID) または各信号の信号ハンドル。string として指定します。

データ型: char

データ型。チェック違反の場所を示す ModelAdvisor.ResultDetailType 列挙型として指定します。

  • SID – チェック違反がブロックにある

  • Signal – チェック違反が信号にある

データ型: enum

チェック結果の説明。string として指定します。

データ型: char

チェック結果のタイトル。string として指定します。

データ型: char

チェック結果に関する追加情報。string として指定します。

データ型: char

モデル アドバイザーに表示されるステータス メッセージ。string として指定します。

データ型: char

チェックを修正するための推奨アクション。string として指定します。

データ型: char

チェック結果の重大度。"pass""fail""info"、または "warn" として指定します。

データ型: char

メソッド

setDataブロック識別子または信号ハンドルを ModelAdvisor.ResultDetail オブジェクトに関連付ける

すべて折りたたむ

ブロック名がブロックの下に表示されているかどうかをチェックするカスタム モデル アドバイザー チェックを作成します。

モデルを取得してモデル アドバイザー チェックを試します。

openExample('AdvisorCustomizationExample')

Model with edit-time check violations

モデルを作業フォルダーに保存します。モデルを閉じます。

編集時チェックを登録するには、関数 sl_customization を作成します。関数 sl_customization では、1 つの引数 (カスタマイズ マネージャー オブジェクト) を受け入れます。カスタム チェックを登録するには、addModelAdvisorCheckFcn メソッドを使用します。このメソッドへの入力は、チェック定義関数へのハンドルです。この例では、defineDetailStyleCheck がチェック定義関数です。関数 sl_customization を作成し、作業フォルダーに保存します。

function sl_customization(cm)
cm.addModelAdvisorCheckFcn(@defineDetailStyleCheck);

チェック定義関数を作成します。この例では、関数 defineDetailStyleCheck を作成し、下のコードをその中にコピーします。関数を作業フォルダーに保存します。チェック定義関数には、チェック アクションおよび修正を定義する ModelAdvisor.Check オブジェクトおよび ModelAdvisor.Action オブジェクトが含まれています。コードのこれらの側面の詳細については、モデルを修正し、モデル アドバイザーで指定した条件に準拠させるを参照してください。

関数 defineDetailStyleCheck には、コールバック関数 DetailStyleCallback が含まれています。名前がブロック violationBlks の下に表示されていないブロックを返すために、関数 DetailStyleCallback は関数 find_system を使用します。

violationBlks が空の場合、コードは 1 つの ModelAdvisor.ResultDetail オブジェクトの ElementResults を作成します。ElementResults は、モデル アドバイザーで表示されるパス チェックに関する情報を指定します。

関数 find_system がチェックに違反したブロックのリストを返した場合、 ElementResultsModelAdvisor.Results オブジェクトの配列です。この配列には、チェックに違反したブロックごとに 1 つのオブジェクトが含まれます。各オブジェクトには、モデル アドバイザーに表示される違反ブロックに関する情報が含まれます。

function defineDetailStyleCheck

% 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);

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

end

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

% 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.';
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.';
        ElementResults(i).ViolationType = 'warn';
    end
    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

モデル アドバイザーをリフレッシュして、パス上の新しいチェックでキャッシュを更新します。

Advisor.Manager.refresh_customizations

AdvisorCustomizationExample モデルを開きます。

[モデル化] タブをクリックし、[モデル アドバイザー] を選択して、モデル アドバイザーを開きます。

左側のペインで、[製品別][デモ][ブロック名がブロックの下になっているかどうかをチェック] を選択し、[チェックの実行] をクリックします。

警告に対処するには、[修正] をクリックします。

Outport ブロックに接続する信号にラベルがあるかどうかをチェックするカスタム編集時チェックを作成します。

モデルを取得してモデル アドバイザー チェックを試します。

openExample('AdvisorCustomizationExample')

Model with edit-time check violations

モデルを作業フォルダーに保存します。モデルを閉じます。

カスタム編集時チェックを登録するには、関数 sl_customization を作成し、作業フォルダーに保存します。

function sl_customization(cm)
cm.addModelAdvisorCheckFcn(@defineCheck);

チェック定義関数を作成します。関数内で、ModelAdvisor.Check オブジェクトを作成し、入力引数としてチェック ID を指定します。次に、ModelAdvisor.Check Title プロパティおよび CallbackHandle プロパティを指定します。CallbackHandle プロパティは編集時チェックを定義するために作成するクラスの名前です。この例では、MyEditTimeChecks がパッケージ名で SignalLabel がクラス名です。次に、モデル アドバイザーの新しいフォルダーにチェックをパブリッシュします。この例では、フォルダー名は "DEMO: Edit Time Checks" です。この例では、関数 defineCheck を作成し、その下のコードを含めます。関数 defineCheck を作業フォルダーに保存します。

function defineCheck
rec = ModelAdvisor.Check("advisor.edittimecheck.SignalLabel");
rec.Title = 'Check that signals have labels if they are to propagate those labels';
rec.CallbackHandle = 'MyEditTimeChecks.SignalLabels';
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec,'DEMO: Edit Time Checks');

ModelAdvisor.EdittimeCheck 抽象基底クラスから派生するクラスを作成します。この例では、SignalLabel.m という名前のクラス ファイルを作成します。下のコードを SignalLabel.m ファイルにコピーし、+MyEditTimeChecks フォルダーに保存します。ModelAdvisor.EdittimeCheck クラス内のコードの詳細については、編集時チェックを定義し、モデル アドバイザーで指定した条件に準拠させるを参照してください。

blockDiscovered メソッドには、チェック違反を定義したアルゴリズムが含まれます。モデル アドバイザーでのみ表示されるカスタム チェックとは異なり、このアルゴリズムには関数 find_system が含まれていないことに注意してください。blockDiscovered メソッドは入力としてブロック ハンドルを受け取り、モデルを移動するため、カスタム編集時チェック用に関数 find_system は不要です。

チェックに違反したモデル要素ごとに、コードで ModelAdvisor.ResultDetail オブジェクトが作成されます。この例では、違反は信号にあるため、チェックではブロックのライン ハンドル LineHandles でパラメーターを使用し、違反のある信号を検出する必要があります。特に、Outport ブロックに接続する信号に対して、このアルゴリズムは Name 信号パラメーターに値があるかどうかを確認します。信号に違反があるため、次にアルゴリズムは、Type プロパティ値を Signal に設定して違反オブジェクトを作成し、その信号を強調表示します。

classdef SignalLabels < ModelAdvisor.EdittimeCheck
    methods
        function obj=SignalLabels(checkId)
            obj=obj@ModelAdvisor.EdittimeCheck(checkId);
            obj.traversalType = edittimecheck.TraversalTypes.BLKITER;                       
        end

        function violation = blockDiscovered(obj, blk)
            violation = [];
            ports    = get_param(blk,'Ports');
            lh = get_param(blk, 'LineHandles');
            if strcmp(get_param(blk,'BlockType'),'Outport')
                for j = 1 : ports(1)
                    if lh.Inport(j) ~= -1 % failure case: no connection
                        allsources = get_param(lh.Inport(j),'SrcPortHandle');
                        hiliteHandle = get_param(lh.Inport(j), 'DstPortHandle');
                        if (isempty(allsources) ~= 0) || (isempty(find(allsources==-1,1)) ~= 0)
                            lh_obj = get_param(lh.Inport(j),'Object');
                            if isempty(lh_obj.Name)
                                if strcmp(lh_obj.signalPropagation,'off') == 1
                                   allsources_parent = get_param(allsources,'Parent');
                                   if strcmp(get_param(allsources_parent,'BlockType'),'Inport')
                                        buscreator_outputs = get_param(allsources_parent,'IsBusElementPort');
                                    else
                                        buscreator_outputs = 'off';
                                    end
                                    if ~strcmp(buscreator_outputs,'on')
                                        violation = ModelAdvisor.ResultDetail;
                                        ModelAdvisor.ResultDetail.setData(violation, 'Signal',hiliteHandle);
                                        violation.Description ='The model does not adhere to the signal label modeling guideline.';
                                        violation.CheckID = obj.checkId;
                                        violation.Title = 'Signal Label Missing'; 
                                        violation.Information = 'This check verifies the presence of signal label.';
                                        violation.Status = 'The following signals do not have a label:';                              
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end       
end

モデル アドバイザーをリフレッシュして、パス上の新しいチェックでキャッシュを更新します。

Advisor.Manager.refresh_customizations

AdvisorCustomizationExample モデルを開きます。

[モデル化] タブをクリックし、[モデル アドバイザー][構成エディター] を選択して、モデル アドバイザー構成エディターを開きます。

カスタム編集時チェックで構成されるカスタム構成を作成します。これを行うには、次のフォルダーを除くすべてのフォルダーを削除します。"DEMO:Edit Time Checks" フォルダー。

構成を my_config.json として保存します。この構成を既定として設定するように求めるプロンプトが表示されたら、[いいえ] をクリックします。

モデル アドバイザー構成エディターを閉じます。

[モデル化] タブをクリックし、[モデル アドバイザー][編集時チェック] を選択して、カスタム構成を my_config.json ファイルに設定します。[コンフィギュレーション パラメーター] ダイアログ ボックスで、[モデル アドバイザー構成ファイル] パラメーターに構成ファイルのパスを指定します。

Model Advisor Result Details

[編集時チェック] パラメーターを選択して、編集時チェックをオンにします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

編集時の警告を表示するには、黄色で強調表示された信号をクリックします。Outport ブロックに接続している信号にはラベルがないため、警告が生成されます。

バージョン履歴

R2018b で導入

すべて展開する