モデル アドバイザーを使用して指定した条件に対してモデルを確認
この例では、修正アクションなしのパス/失敗チェックと情報チェックという 2 つのシンプルなチェック タイプについて説明します。基本的なパス/失敗チェックは、チェックによる確認対象とチェックがパスしたか失敗したかを検出し報告します。情報チェックは、チェックによる確認対象と該当する規格への参照を検出し表示します。
関数 sl_customization
の作成
作業フォルダーで、sl_customization.m
ファイルを作成します。カスタム チェックを登録するには、sl_customization.m
ファイル内で、関数 sl_customization(cm)
を以下のように作成します。この関数は、1 つの引数 (カスタマイズ オブジェクト) を受け入れます。このカスタマイズ マネージャー オブジェクトには、カスタム チェックを登録するために addModelAdvisorCheckFcn
メソッドが含まれます。このメソッドへの入力は、2 つのチェック定義関数への呼び出しを含む、関数 (defineModelAdvisorChecks
) へのハンドルです。これらの関数には、シンプルなパス/失敗チェックと情報チェックの定義が含まれます。
function sl_customization(cm) % SL_CUSTOMIZATION - Model Advisor customization demonstration. % Copyright 2019 The MathWorks, Inc. % register custom checks cm.addModelAdvisorCheckFcn(@defineModelAdvisorCheck); % ----------------------------- % defines Model Advisor Checks % ----------------------------- function defineModelAdvisorCheck definePassFailCheck defineInformationCheck
修正アクションなしのパス/失敗チェックのチェック定義関数の作成
このセクションでは、Constant ブロックの値が数字か文字かをチェックするチェック定義関数を作成します。値が数字の場合、チェックは警告を生成します。値が文字の場合、チェックはパスします。
このチェックは、DetailStyle
タイプのコールバック関数を使用します。このスタイルにより、ブロックごと、サブシステムごと、または推奨アクションごとに結果を表示できます。このスタイルを適用すると、既定の書式が生成されるため、ModelAdvisor.FormatTemplate
クラスまたはその他のモデル アドバイザーの書式設定 API を使用して、モデル アドバイザーに表示される結果の書式設定を行わなくてすむようになります。このスタイルは、setCallbackFcn
メソッドへの入力として指定します。
新しいファイル definePassFailCheck.m
を作成し、以下に示す関数を入力します。
function definePassFailCheck mdladvRoot = ModelAdvisor.Root; rec = ModelAdvisor.Check('simplePassFailCheck'); rec.Title = 'Check Constant block usage'; rec.TitleTips = ['Warn if Constant block value is a number; Pass if' ... ' Constant block value is a letter']; rec.setCallbackFcn(@simplePassFailCheck,'None','DetailStyle') mdladvRoot.publish(rec, 'Demo'); % --- Callback function that checks Constant blocks function simplePassFailCheck(system,CheckObj) mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); all_constant_blk=find_system(system,'LookUnderMasks','all',... 'FollowLinks','on','BlockType','Constant'); violationBlks=find_system(all_constant_blk,'RegExp','On','Value','^[0-9]'); if isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail; ElementResults.Description = 'Identify Constant blocks with a value that is a number.'; ElementResults.Status = 'All Constant blocks have a value that is a letter.'; 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 Constant blocks with a value that is a number.'; ElementResults(i).Status = 'The following Constant blocks have values that are numbers:'; ElementResults(i).RecAction = 'Change the Constant block value to a letter.'; end mdladvObj.setCheckResultStatus(false); mdladvObj.setActionEnable(true); end CheckObj.setResultDetails(ElementResults);
情報チェックのチェック定義関数の作成
このセクションでは、モデル コンフィギュレーションとチェックサム情報を検出して表示する、情報チェックのチェック定義関数を作成します。
情報チェックの場合、モデル アドバイザーには全体でのチェック ステータスが表示されますが、結果にはステータスは表示されません。また、情報チェックの結果には次の項目は含まれません。
ステータスの説明。
チェックがパスしない場合に推奨されるアクション。
サブチェックの結果。
新しいファイル defineInformationCheck.m
を作成し、以下に示す関数を入力します。
function defineInformationCheck % Create ModelAdvisor.Check object and set properties. rec = ModelAdvisor.Check('com.mathworks.sample.infocheck'); rec.Title = 'Identify model configuration and checksum information'; rec.TitleTips = 'Display model configuration and checksum information'; rec.setCallbackFcn(@modelVersionChecksumCallbackUsingFT_Detail,'None','DetailStyle'); % Publish check into Demo group. mdladvRoot = ModelAdvisor.Root; mdladvRoot.publish(rec, 'Demo'); end % ----------------------------- % This callback function uses the DetailStyle CallbackStyle type. % ----------------------------- function modelVersionChecksumCallbackUsingFT_Detail(system,CheckObj) model = bdroot(system); mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system); ElementResults = ModelAdvisor.ResultDetail; ElementResults.Description = 'Display model configuration and checksum information'; % If running the Model Advisor on a subsystem, add note to description. if strcmp(system, model) == false ElementResults.Status = 'NOTE: The Model Advisor is reviewing a subsystem, but these results are based on root-level settings.'; ElementResults(end + 1) = ModelAdvisor.ResultDetail; end % If error is encountered, use these values. mdlver = 'Error - could not retrieve Version'; mdlauthor = 'Error - could not retrieve Author'; mdldate = 'Error - could not retrieve Date'; mdlsum = 'Error - could not retrieve CheckSum'; % Get model configuration and checksum information. try mdlver = get_param(model,'ModelVersion'); mdlauthor = get_param(model,'LastModifiedBy'); mdldate = get_param(model,'LastModifiedDate'); mdlsum = Simulink.BlockDiagram.getChecksum(model); mdlsum = [num2str(mdlsum(1)) ' ' num2str(mdlsum(2)) ' ' ... num2str(mdlsum(3)) ' ' num2str(mdlsum(4))]; mdladvObj.setCheckResultStatus(true); catch mdladvObj.setCheckResultStatus(false); end lbStr ='<br/>'; resultStr = ['Model Version: ' mdlver lbStr 'Author: ' mdlauthor lbStr ... 'Date: ' mdldate lbStr 'Model Checksum: ' mdlsum]; ElementResults(end).Status = resultStr; CheckObj.setResultDetails(ElementResults); end
モデル アドバイザーでのカスタム チェックの実行
コマンド ウィンドウで次を入力します。
Advisor.Manager.refresh_customizations
MATLAB コマンド プロンプトで以下のコマンドを入力し、モデル
sldemo_fuelsys
を開きます。openExample('sldemo_fuelsys')
[モデル化] タブで、[モデル アドバイザー] を選択します。[システム セレクター] ダイアログが開きます。[OK] をクリックします。
左側のペインで、[製品別] 、 [デモ] 、 [Identify model configuration and checksum information] を選択します。
[チェックの実行] をクリックします。
このチェックはパスし、情報が表示されます。
左側のペインで [製品別] 、 [デモ] 、 [Check Constant block usage] を選択します。
[チェックの実行] をクリックします。
このチェックでは、いくつかのブロックに数値が含まれるため、警告が表示されます。この結果には、これらのブロックへのリンクが含まれます。結果には [推奨アクション] が表示されます。
[推奨アクション] に従って、Constant ブロックを修正します。
参考
ModelAdvisor.Check
| ModelAdvisor.FormatTemplate
| ModelAdvisor.Check.CallbackContext