このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ModelAdvisor.ResultDetail クラス
名前空間: ModelAdvisor
チェック結果の詳細を定義する
説明
カスタム チェック オーサリング アルゴリズムで ModelAdvisor.ResultDetail
クラスのオブジェクトを使用して、チェック結果に関する詳細を示します。モデル アドバイザーでのみ実行されるチェックでは、setResultDetails
メソッドを使用して、これらの結果を ModelAdvisor.Check
オブジェクトに関連付け、関数 ModelAdvisor.Check.setCallbackFcn
でコールバック スタイルとして 'DetailStyle
' を指定します。
プロパティ
Data
— ブロック識別子または信号線ハンドル
string
カスタム チェックに違反している各ブロックのブロック識別子または各信号の信号線ハンドル。string として指定します。
データ型: char
Type
— データ型
SID
(既定値) | Signal
データ型。次のように指定します。
SID
– チェック違反がブロックにあるSignal
– チェック違反が信号にある
データ型: enum
Description
— チェック結果の説明
string
チェック結果の説明。string として指定します。
データ型: char
Title
— タイトル
string
チェック結果のタイトル。string として指定します。
データ型: char
Information
— 追加情報
string
チェック結果に関する追加情報。string として指定します。
データ型: char
Status
— ステータス メッセージ
string
モデル アドバイザーに表示されるステータス メッセージ。string として指定します。
データ型: char
RecAction
— 推奨アクション
string
チェックを修正するための推奨アクション。string として指定します。
データ型: char
ViolationType
— チェック結果の重大度
"warn"
(既定値) | "pass"
| "fail"
| "info"
チェック結果の重大度。"pass"
、"fail"
、"info"
、または "warn"
として指定します。
データ型: char
メソッド
パブリック メソッド
ModelAdvisor.ResultDetail.setData | モデル アドバイザー チェックの結果を特定のブロックまたは信号に関連付ける |
例
ブロック違反用のカスタム モデル アドバイザー チェックの定義
ブロック名がブロックの下に表示されているかどうかをチェックするカスタム モデル アドバイザー チェックを作成します。
モデルを開きます。
openExample('AdvisorCustomizationExample')
モデルを作業フォルダーに保存します。モデルを閉じます。
編集時チェックを登録するには、関数 sl_customization
を作成します。関数 sl_customization
では、1 つの引数 (カスタマイズ マネージャー オブジェクト) を受け入れます。カスタム チェックを登録するには、addModelAdvisorCheckFcn
メソッドを使用します。このメソッドへの入力は、チェック定義関数へのハンドルです。この例では、defineDetailStyleCheck
がチェック定義関数です。関数 sl_customization
を作成し、作業フォルダーに保存します。
function sl_customization(cm)
cm.addModelAdvisorCheckFcn(@defineDetailStyleCheck);
チェック定義関数を作成します。この例では、defineDetailStyleCheck.m
という名前の関数ファイルを作成します。以下のコード defineDetailStyleCheck.m
をコピーし、関数を作業フォルダーに保存します。
function defineDetailStyleCheck % Create a ModelAdvisor.Check object and set the 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 a ModelAdvisor.Action object for setting a 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 the check to the Demo group. mdladvRoot = ModelAdvisor.Root; mdladvRoot.publish(rec, 'Demo'); end % ----------------------------- % This callback function uses the DetailStyle CallbackStyle type. % ----------------------------- function DetailStyleCallback(system, CheckObj) % Get the Model Advisor object. mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % Find the blocks whose names do not appear below the block. violationBlks = find_system(system, 'Type','block',... 'NamePlacement','alternate',... 'ShowName', 'on'); if isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail; ElementResults.ViolationType = 'info'; 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 block:'; 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 the block names. % ----------------------------- function result = ActionCB(taskObj) mdladvObj = taskObj.MAObj; checkObj = taskObj.Check; resultDetailObjs = checkObj.ResultDetails; for i=1:numel(resultDetailObjs) 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
チェック定義関数には、チェック アクションおよび修正を定義する ModelAdvisor.Check
オブジェクトおよび ModelAdvisor.Action
オブジェクトが含まれています。コードのこれらの側面の詳細については、モデルを修正し、モデル アドバイザーで指定した条件に準拠させるを参照してください。
関数 defineDetailStyleCheck
には、コールバック関数 DetailStyleCallback
が含まれています。名前が下に表示されていないブロックを返すために、関数 DetailStyleCallback
は関数 find_system
を使用します。
violationBlks
が空の場合、コードは 1 つの ModelAdvisor.ResultDetail
オブジェクトの ElementResults
を作成します。ElementResults
は、モデル アドバイザーで表示されるパス チェックに関する情報を指定します。
関数 find_system
がチェックに違反したブロックのリストを返した場合、 ElementResults
は ModelAdvisor.ResultDetail
オブジェクトの配列です。この配列には、チェックに違反したブロックごとに 1 つのオブジェクトが含まれます。各オブジェクトには、モデル アドバイザーに表示されるブロックに関する情報が含まれます。
モデル アドバイザーをリフレッシュして、パス上の新しいチェックでキャッシュを更新します。
Advisor.Manager.refresh_customizations
AdvisorCustomizationExample
モデルを開きます。
[モデル化] タブをクリックし、[モデル アドバイザー] を選択して、モデル アドバイザーを開きます。
左側のペインで、[製品別] 、 [デモ] 、 [ブロック名がブロックの下になっているかどうかをチェック] を選択し、[チェックの実行] をクリックします。
警告に対処するには、[修正] をクリックします。
信号違反用のカスタム編集時チェックの定義
Outport ブロックに接続する信号にラベルがあるかどうかをチェックするカスタム編集時チェックを作成します。
モデルを開きます。
openExample('AdvisorCustomizationExample')
モデルを作業フォルダーに保存します。モデルを閉じます。
カスタム編集時チェックを登録するには、関数 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
フォルダーに保存します。
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
ModelAdvisor.EdittimeCheck
クラス内のコードの詳細については、編集時チェックを定義し、モデル アドバイザーで指定した条件に準拠させるを参照してください。
blockDiscovered
メソッドには、チェック違反を定義したアルゴリズムが含まれます。モデル アドバイザーでのみ表示されるカスタム チェックとは異なり、このアルゴリズムには関数 find_system
は含まれていません。blockDiscovered
メソッドは入力としてブロック ハンドルを受け取り、モデルを移動するため、カスタム編集時チェック用に関数 find_system
は不要です。
チェックに違反したモデル要素ごとに、コードで ModelAdvisor.ResultDetail
オブジェクトが作成されます。この例では、違反は信号にあるため、チェックではブロックのライン ハンドルでパラメーターを使用する必要があります。違反のある信号を検出するために、LineHandles
オプションを指定しなければなりません。特に、Outport ブロックに接続する信号に対して、このアルゴリズムは Name
信号パラメーターに値があるかどうかを確認します。信号に違反があるため、次にアルゴリズムは、Type
プロパティ値を Signal
に設定して違反オブジェクトを作成し、その信号を強調表示します。
モデル アドバイザーをリフレッシュして、パス上の新しいチェックでキャッシュを更新します。
Advisor.Manager.refresh_customizations
AdvisorCustomizationExample
モデルを開きます。
[モデル化] タブをクリックし、[モデル アドバイザー] 、 [構成エディター] を選択して、モデル アドバイザー構成エディターを開きます。
カスタム編集時チェックで構成されるカスタム構成を作成します。これを行うには、次のフォルダーを除くすべてのフォルダーを削除します。"DEMO:Edit Time Checks" フォルダー。
構成を my_config.json
として保存します。この構成を既定として設定するように求めるプロンプトが表示されたら、[いいえ] をクリックします。
モデル アドバイザー構成エディターを閉じます。
[モデル化] タブをクリックし、[モデル アドバイザー] 、 [編集時チェック] を選択して、カスタム構成を my_config.json
ファイルに設定します。[コンフィギュレーション パラメーター] ダイアログ ボックスで、[モデル アドバイザー構成ファイル] パラメーターに構成ファイルのパスを指定します。
[編集時チェック] パラメーターを選択して、編集時チェックをオンにします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。
編集時の警告を表示するには、黄色で強調表示された信号をクリックします。Outport ブロックに接続している信号にはラベルがないため、警告が生成されます。
次のイメージは、モデル アドバイザー レポートにおける ModelAdvisor.ResultDetail
のプロパティを示しています。
バージョン履歴
R2018b で導入R2023b: IsInformer
プロパティと IsViolation
プロパティは削除予定
ModelAdvisor.ResultDetail
クラスの IsInformer
プロパティと IsViolation
プロパティは将来のリリースで削除される予定です。モデル アドバイザーのチェック結果の重大度を指定するには、代わりに ViolationType
プロパティを使用します。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)