このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モデルを修正し、モデル アドバイザーで指定した条件に準拠させる
この例では、モデル アドバイザーの修正アクション付きにカスタマイズされたパス/失敗チェックをにより作成する方法を示しています。モデルにチェック項目違反が含まれない場合、結果にはチェックの説明と結果のステータスが含まれます。モデルにチェック項目違反が含まれる場合、結果にはチェックの説明、結果の状態、および問題を修正するための推奨アクションが含められます。この例では、モデル アドバイザーの [製品別]、[デモ] サブフォルダーにカスタム チェックを追加します。
この例のカスタム チェックは、名前がブロックの下に表示されていないブロックを特定します。修正アクションは、ブロックの下にブロック名を表示させることです。
チェックにパスしていない場合、結果にはチェック項目に違反した各モデル要素へのハイパーリンクが含められます。これらのハイパーリンクを使用することで、モデルまたはサブシステム内の場所を簡単に特定できます。この例のコードは、sl_customization.m
ファイルと defineDetailStyleCheck.m
ファイルで構成されます。
sl_customization
ファイルの作成
作業フォルダーで
sl_customization.m
ファイルを作成します。カスタム チェックを登録するには、関数
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
ファイルを作成する方法を説明します。
ModelAdvisor.Root
オブジェクトを作成します。mdladvRoot = ModelAdvisor.Root;
ModelAdvisor.Check
オブジェクトを作成し、一意のチェック ID を定義します。このチェックでは、ID はcom.mathworks.sample.detailStyle
です。rec = ModelAdvisor.Check('com.mathworks.sample.detailStyle');
ModelAdvisor.Check.Title
およびModelAdvisor.Check.TitleTips
プロパティを指定します。rec.Title = 'Check whether block names appear below blocks'; rec.TitleTips = 'Check position of block names';
setCallbackFcn
メソッドを使用してコールバック関数を呼び出します。setCallbackFcn
メソッドの引数は、コールバック関数とModelAdvisor.Check.CallbackStyle
プロパティ値へのハンドルです。この例では、CallbackStyle
プロパティの値はDetailStyle
です。このスタイルにより、ブロックごと、サブシステムごと、または推奨アクションごとに結果を表示できます。このスタイルを適用すると、既定の書式が生成されるため、ModelAdvisor.FormatTemplate
クラスまたはその他のモデル アドバイザーの書式設定 API を使用して、モデル アドバイザーに表示される結果の書式設定を行わなくてすむようになります。rec.setCallbackFcn(@DetailStyleCallback,'None','DetailStyle');
修正動作を設定するには、
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';
setAction
メソッドを使用してチェックのアクションを設定します。rec.setAction(myAction);
publish
メソッドを使用して、[製品別] フォルダー内のフォルダーにチェックをパブリッシュします。この例では、フォルダー名は [Demo] です。mdladvRoot.publish(rec, 'Demo'); % publish check into Demo group.
チェック コールバック定義関数
defineDetailStyleCheck.m
ファイルで、チェック コールバック関数を作成します。この例では、関数の名前はDetailStyleCallback
です。この関数への入力はModelAdvisor.CheckObject
と、モデル アドバイザーが解析するモデルまたはシステムへのパスです。function DetailStyleCallback(system, CheckObj)
Simulink.ModelAdvisor
オブジェクトを作成するには、関数Simulink.ModelAdvisor.getModelAdvisor
を使用します。mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); % get object
チェックに違反するブロックを特定するには、関数
find_system
を使用します。この関数は、各モデル要素についてModelAdvisor.ResultDetail
オブジェクトを作成します。violationBlks = find_system(system, 'Type','block',... 'NamePlacement','alternate',... 'ShowName', 'on');
関数
find_system
がブロックの下に名前が表示されないブロックを検出しない場合についてコードを記述します。この場合、ElementResults
はModelAdvisor.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);
関数
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
結果をチェック オブジェクトと関連付けるには、
setResultDetails
メソッドを使用します。CheckObj.setResultDetails(ElementResults); end
アクション コールバック定義関数の作成
defineDetailStyleCheck.m
ファイルでアクション コールバック関数を作成します。この例では、関数の名前はsampleActionCB
です。この関数への入力はModelAdvisor.Task
オブジェクトです。function result = ActionCB(taskobj)
Simulink.ModelAdvisor
およびModelAdvisor.Check
オブジェクトへのハンドルを作成します。mdladvObj = taskobj.MAObj; checkObj = taskobj.Check;
チェックに違反するブロックについての情報を格納するため、
ModelAdvisor.ResultDetail
オブジェクトの配列を作成します。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);
チェックの実行
sl_customization.m
およびdefineDetailStyleCheck.m
ファイルを保存します。MATLAB コマンド ウィンドウで次を入力します。
Advisor.Manager.refresh_customizations
MATLAB コマンド プロンプトで以下のコマンドを入力し、モデル
sldemo_fuelsys
を開きます。openExample('sldemo_fuelsys')
最上位モデルで、
Engine Speed
という名前のブロックを選択します。ツールストリップの [書式設定] タブで、[ブロック名の表示位置を反転] をクリックします。fuel_rate_control
サブシステムを開きます。validate_sample_time
という名前のブロックを選択します。ツールストリップの [書式設定] タブで、[ブロック名の表示位置を反転] をクリックします。最上位モデルに戻り、
example_sldemo_fuelsys
という名前で保存します。[モデル化] タブで、[モデル アドバイザー] を選択します。[システム セレクター - モデル アドバイザー] ダイアログ ボックスが開きます。[OK] をクリックします。モデル アドバイザーが開きます。
左側のペインで、[製品別]、[Demo]、[Check whether block names appear below blocks] を選択します。
[チェックの実行] を選択します。変更したブロックに対する警告がモデル アドバイザー チェックで生成されます。
[レポート] タブまたは [結果の詳細] タブを選択して結果を確認します。
どちらのタブでも、チェックに違反する各ブロックについて推奨アクションが示されます。ハイパーリンク パスをクリックして、ブロックをモデル エディターで開くことができます。以下に例を示します。
以下のいずれかの方法を使用し、推奨アクションに従って、違反しているブロックを修正します。
ハイパーリンクをダブルクリックしてブロックを開き、各違反を個別に更新します。ブロックを選択します。ツールストリップの [書式設定] タブで、[ブロック名の表示位置を反転] を選択します。
ツールストリップで [修正] をクリックします。モデル アドバイザーはモデルの問題を自動で修正します。違反の修正後はボタンがグレー表示されていることに注意してください。
モデル アドバイザー チェックを再度実行します。このチェックはパスします。
参考
ModelAdvisor.Check
| ModelAdvisor.FormatTemplate
| ModelAdvisor.FormatTemplate
| ModelAdvisor.Check.CallbackContext
| Simulink.ModelAdvisor
| Simulink.ModelAdvisor.getModelAdvisor
| Simulink.ModelAdvisor.openConfigUI
| Simulink.ModelAdvisor.reportExists