Main Content

根据您使用模型顾问指定的条件检查模型

此示例说明如何创建两个简单的检查类型:无修复操作的通过/失败检查和信息型检查。基本的通过/失败检查查找并报告检查内容以及检查是否通过。信息型检查查找并显示检查内容的说明以及对适用标准的任何引用。

创建 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);
此检查识别作为数字的 Constant 模块值并产生警告,但不提供修复操作。有关如何创建带修复的检查定义函数的详细信息,请参阅修复模型以符合您使用模型顾问指定的条件

为信息型检查创建检查定义函数

在本节中,您将为信息型检查创建一个检查定义函数,该检查查找并显示模型配置和校验和信息。

对于信息型检查,模型顾问显示整体检查状态,但此状态不包含在结果中。此外,信息型检查的结果不包括以下各项:

  • 状态描述。

  • 检查未通过时建议采取的操作。

  • 子检查结果。

创建新文件 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

在模型顾问中运行自定义检查

  1. 在命令行窗口中,输入:

    Advisor.Manager.refresh_customizations
  2. 通过在 MATLAB 命令提示符下键入以下命令,打开模型 sldemo_fuelsys

    openExample('sldemo_fuelsys')

  3. 建模选项卡中,选择模型顾问。将打开系统选择器对话框。点击确定

  4. 在左窗格中,选择按产品 > Demo > 标识模型配置和校验和信息

  5. 点击运行检查

    检查通过并显示信息。

  6. 在左窗格中,选择按产品 > Demo > 检查 Constant 模块使用情况

  7. 点击运行检查

    检查会产生警告,因为有几个模块包含的值是数字。结果包含这些模块的链接。结果显示建议采取的操作

  8. 按照建议采取的操作修复 Constant 模块。

另请参阅

| |

相关主题