根据您使用模型顾问指定的条件检查模型
此示例说明如何创建两个简单的检查类型:无修复操作的通过/失败检查和信息型检查。基本的通过/失败检查查找并报告检查内容以及检查是否通过。信息型检查查找并显示检查内容的说明以及对适用标准的任何引用。
创建 sl_customization
函数
在您的工作文件夹中,创建 sl_customization.m
文件。要注册自定义检查,请在 sl_customization.m
文件中创建 sl_customization(cm)
函数,如下所示。此函数接受一个参量,即自定义对象。此自定义管理器对象包括用于注册自定义检查的 addModelAdvisorCheckFcn
方法。此方法的输入是函数的句柄 (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')
在建模选项卡中,选择模型顾问。将打开系统选择器对话框。点击确定。
在左窗格中,选择按产品 > Demo > 标识模型配置和校验和信息。
点击运行检查。
检查通过并显示信息。
在左窗格中,选择按产品 > Demo > 检查 Constant 模块使用情况。
点击运行检查。
检查会产生警告,因为有几个模块包含的值是数字。结果包含这些模块的链接。结果显示建议采取的操作。
按照建议采取的操作修复 Constant 模块。
另请参阅
ModelAdvisor.Check
| ModelAdvisor.FormatTemplate
| ModelAdvisor.Check.CallbackContext