主要内容

创建并部署模型顾问自定义配置

为了检查模型是否符合您公司的标准和建模指南,您可以定制model Advisor。这个例子向您展示了如何向Model Advisor添加自定义检查,并删除您不需要的运输检查。您可以保存自定义检查配置,并将其部署到开发组中的其他人。部署自定义配置允许您的开发小组使用相同的检查集来检查模型。

定义自定义检查

这个例子定义了四种类型的自定义检查:

  • 提供修复操作的编辑时检查。

  • 只在Model Advisor中运行并按块和子系统对结果进行分组并提供固定操作的检查。

  • 只在Model Advisor中运行并验证模型配置参数设置的检查。

  • 为块参数设置指定约束并提供固定操作的编辑时检查。

示例文件包括sl_customization.m文件。此文件包含sl_customization函数,其中包含对定义自定义检查的函数的调用。打开并检查sl_customization.m文件。

函数sl_customization (cm)% SL_CUSTOMIZATION -模型顾问定制演示。版权所有2019 The MathWorks, Inc.%登记自定义支票cm.addModelAdvisorCheckFcn (@defineModelAdvisorChecks);% -----------------------------定义模型顾问检查% -----------------------------函数defineEditTimeCheck defineDetailStyleCheck;defineConfigurationParameterCheck;defineNewBlockConstraintCheck;

sl_customization函数接受自定义管理器对象,该对象包含addModelAdvisorCheckFcn注册自定义支票的方法。这个方法的输入是函数的句柄,defineModelAdvisorChecks,其中包含对四个检查定义函数的调用,这些函数对应于四个自定义检查。

用修正进行编辑时检查

defineEditTimeCheck.m文件包含defineEditTimeCheckcheck定义函数,该函数定义了一种检查方法,用于检查import和Outport块是否根据其输出数据类型具有特定的颜色。此检查必须检查其他已编辑的块,但它不必检查同一级别或整个模型层次结构中受影响的块。此检查提供了一个修复程序,用于更新颜色不正确的块的颜色。这张支票的名字是检查导入和输出模块的颜色.该检查在编辑时和模型顾问中运行。打开并检查defineEditTimeCheck.m文件。

函数defineEditTimeCheck检查导入和导出块的背景颜色。rec = ModelAdvisor。检查(“advisor.edittimecheck.PortColor”);rec.Title =“检查输入和输出模块的颜色”;rec.CallbackHandle =“MyEditTimeChecks。PortColor”;mdladvRoot = ModelAdvisor.Root;mdladvRoot.publish (rec,“演示”);

编辑时检查有一个类定义,PortColor,由ModelAdvisor。EdittimeCheck基类。有关如何创建这种类型的检查的详细信息,请参见定义编辑时检查以符合您用模型顾问指定的条件.创建一个名为+ MyEditTimeChecks并保存PortColor.m到这个文件夹。

拷贝文件PortColor.m *+ MyEditTimeChecks

打开并检查PortColor.m文件。

classdefPortColor < ModelAdvisor。EdittimeCheck检查端口是否符合软件设计标准的背景颜色。背景颜色数据类型%橙色布尔值%绿色全部浮点数% cyan所有整数浅蓝色枚举和总线对象%白色自动的方法函数obj = PortColor (checkId) obj = obj@ModelAdvisor.EdittimeCheck (checkId);obj。traversalType = edittimcheck . traversaltypes . blkiter;结束函数违规= blockfound (obj, blk)违规= [];如果比较字符串(get_param(黑色,“BlockType”),“尺寸”strcmp(get_param(blk,))“BlockType”),“输出港”) dataType = get_param(blk,“OutDataTypeStr”);currentBgColor = get_param(blk,“写成BackgroundColor”);如果比较字符串(数据类型,“布尔”如果~ strcmp (currentBgColor,“橙”使用ModelAdvisor创建一个违规对象。ResultDetail类。违规= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S万博1manbetximulink.ID.getSID(黑色));侵犯。检查ID =obj。checkId; violation.Description =“带布尔值输出的导入/输出块应该是橙色的。”;侵犯。title =“端口块颜色”;侵犯。ViolationType =“警告”结束elseif任何(strcmp ({“单一”,“双”},数据类型))如果~ strcmp (currentBgColor,“绿色”)违规= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S万博1manbetximulink.ID.getSID(黑色));侵犯。检查ID =obj。checkId; violation.Description =“带浮点输出的导入/输出块应该是绿色的。”;侵犯。title =“端口块颜色”;侵犯。ViolationType =“警告”结束elseif任何(strcmp ({“uint8”,“uint16”,“uint32”,“int8”,“int16”,“int32”},数据类型))如果~ strcmp (currentBgColor,“青色”)违规= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S万博1manbetximulink.ID.getSID(黑色));侵犯。检查ID =obj。checkId; violation.Description =“带整数输出的导入/输出块应该是青色的。”;侵犯。title =“端口块颜色”;侵犯。ViolationType =“警告”结束elseif包含(数据类型,的总线:如果~ strcmp (currentBgColor,“lightBlue”)违规= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S万博1manbetximulink.ID.getSID(黑色));侵犯。检查ID =obj。checkId; violation.Description =“带总线输出的输入/输出端口块应该是浅蓝色的。”;侵犯。title =“端口块颜色”;侵犯。ViolationType =“警告”结束elseif包含(数据类型,的枚举:如果~ strcmp (currentBgColor,“lightBlue”)违规= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S万博1manbetximulink.ID.getSID(黑色));侵犯。检查ID =obj。checkId; violation.Description =“带有枚举输出的导入/输出块应该是浅蓝色的。”;侵犯。title =“端口块颜色”;侵犯。ViolationType =“警告”结束elseif包含(数据类型,“汽车”如果~ strcmp (currentBgColor,“白色”)违规= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S万博1manbetximulink.ID.getSID(黑色));侵犯。检查ID =obj。checkId; violation.Description =“自动输出的输入/输出块应该是白色的。”;侵犯。title =“端口块颜色”;侵犯。ViolationType =“警告”结束结束结束结束函数违规= finishedTraversal(obj)违规= [];结束函数Success = fix(obj, breach) Success = true;dataType = get_param(违规。数据,“OutDataTypeStr”);如果比较字符串(数据类型,“布尔”) set_param(违反。数据,“写成BackgroundColor”,“橙”);elseif任何(strcmp ({“单一”,“双”},数据类型))set_param(违反。数据,“写成BackgroundColor”,“绿色”);elseif任何(strcmp ({“uint8”,“uint16”,“uint32”,“int8”,“int16”,“int32”}, dataType)) set_param(违反。数据,“写成BackgroundColor”,“青色”);elseif包含(数据类型,的总线:||包含(dataType,的枚举:) set_param(违反。数据,“写成BackgroundColor”,“lightBlue”);elseif包含(数据类型,“汽车”) set_param(违反。数据,“写成BackgroundColor”,“白色”);结束结束结束结束

模型顾问检查与修复

defineDetailStyleCheck.m文件包含defineDetailStyleCheck检查定义函数,该函数定义了一个检查,该检查列出了未在块下面显示其名称的块。该检查提供了一个修复程序,将这些名称移到块下面。这张支票的名字是检查块名称是否出现在块的下面.这种检查创作风格只适用于在Model Advisor中运行的检查。打开并检查defineDetailStyleCheck.m文件。

函数mdladvRoot = ModelAdvisor.Root;创建ModelAdvisor。检查object and set properties.rec = ModelAdvisor。检查(“com.mathworks.sample.detailStyle”);rec.Title ='检查区块名称是否出现在区块下方';rec.TitleTips =“检查块名称的位置”;rec.setCallbackFcn (@DetailStyleCallback“没有”,“DetailStyle”);创建ModelAdvisor。用于设置修复操作的操作对象。myAction = ModelAdvisor.Action;myAction.setCallbackFcn (@ActionCB);myAction。Name =“让区块名称出现在区块下方”;myAction。描述=“点击按钮将区块名称放置在区块下方”;rec.setAction (myAction);mdladvRoot.publish (rec,“演示”);%发布检查到Demo组。结束% -----------------------------此回调函数使用DetailStyle CallbackStyle类型。% -----------------------------函数mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(万博1manbetxsystem);%获取对象查找所有名称没有出现在块下面的块violationBlks = find_system(系统,“类型”,“块”,...“NamePlacement”,“替代”,...“ShowName”,“上”);如果isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail;ElementResults。IsInformer = true;ElementResults。描述=“识别没有显示名称的区块。”;ElementResults。状态=所有块的下面都显示有名称;mdladvObj.setCheckResultStatus(真正的);其他的i=1:numel(violationBlks) ElementResults(1,i) = ModelAdvisor.ResultDetail;结束i = 1:元素个数(ElementResults) ModelAdvisor.ResultDetail.setData (ElementResults(我),“席德”我,violationBlks {});ElementResults(我)。描述=“识别没有显示名称的区块。”;ElementResults(我)。状态='以下块的名称不显示在块下面:';ElementResults(我)。RecAction =“更改位置,使块名称位于块的下方。”结束mdladvObj.setCheckResultStatus(假);mdladvObj.setActionEnable(真正的);结束CheckObj.setResultDetails (ElementResults);结束% -----------------------------此动作回调函数更改块名称的位置。% -----------------------------函数result = ActionCB(taskobj) mdladvObj = taskobj. maobj;checkObj = taskobj.Check;resultDetailObjs = checkObj.ResultDetails;i = 1:元素个数(resultDetailObjs)为他们每一个人采取一些行动块= Sim万博1manbetxulink.ID.getHandle (resultDetailObjs(我). data);set_param(块,“NamePlacement”,“正常”);结束result = ModelAdvisor。文本(“更改了位置,使块名称位于块的下方。”);mdladvObj.setActionEnable(假);结束

此支票使用setCallbackFcn类型的DetailStyle,它会生成默认格式,因此您不必使用ModelAdvisor。FormatTemplate或其他Model Advisor格式化api来格式化出现在Model Advisor中的结果。有关如何创建这种类型的检查定义函数的详细信息,请参见修复模型以符合您用模型顾问指定的条件

型号配置参数设置

defineConfigurationParameterCheck.m文件包含defineConfigurationParameterCheckcheck定义函数,它定义了一个检查,识别可能影响MISRA C:2012兼容代码生成的模型配置参数设置。这张支票的名字是检查型号配置参数

这个检查需要一个支持的XML数据文件,该文件万博1manbetx必须在MATLAB路径上,并且包含您想要检查的模型配置参数设置。对于本例,该文件为configurationParameterDataFile.xml。有关如何创建此检查类型的详细信息,请参见创建模型顾问检查模型配置参数

打开并检查defineConfigurationParameterCheck.m文件

函数defineConfigurationParameterCheck创建ModelAdvisor。检查object and set properties.rec = ModelAdvisor。检查(“com.mathworks.sample.configurationParameter”);rec.Title =“检查模型配置参数”;rec.setCallbackFcn(@(系统)(Advisor.authoring.CustomCheck.checkCallback...(系统)),“没有”,“StyleOne”);rec.TitleTips =“确定可能影响MISRA C:2012合规代码生成的配置参数。”%——data文件输入参数rec.setInputParametersLayoutGrid ([1]);inputParam1 = ModelAdvisor.InputParameter;inputParam1。Name =“数据文件”;inputParam1。值=“configurationParameterDataFile.xml”;inputParam1。类型=“字符串”;inputParam1。描述=' XML数据文件的名称或完整路径。';inputParam1。setRowSpan ([1]);inputParam1。setColSpan ([1]);rec.setInputParameters ({inputParam1});设置修复操作act = ModelAdvisor.Action;act.setCallbackFcn(@(任务)(Advisor.authoring.CustomCheck.actionCallback...(任务)));的行为。Name =“修改设置”;的行为。描述=“修改模型配置设置。”;rec.setAction(行为);%将检查发布到演示文件夹。mdladvRoot = ModelAdvisor.Root;mdladvRoot.publish (rec,“演示”);结束

块参数约束检查

defineNewBlockConstraintCheck.m文件包含defineNewBlockConstraintCheckcheck定义函数,该函数定义了一种检查方法,用于标识没有矩形形状的逻辑运算符块。这张支票的名字是检查逻辑运算符块的图标形状

块参数约束检查支持编辑时检查。万博1manbetx有关此检查类型的更多信息,请参见为支持和不支持的块和参数定义模型顾问检查万博1manbetx

打开并检查defineNewBlockConstraintCheck.m文件

函数defineNewBlockConstraintCheck rec = Advisor.authoring.createBlockConstraintCheck(“com.mathworks.sample.blockConstraint”,...“约束”, @createBlockConstraints);%约束的创建是块约束检查定义的一部分rec.Title =“检查逻辑运算符块的图标形状”;rec.TitleTips =检查逻辑运算符块的图标形状。逻辑运算符的图标形状应该是矩形的。%将检查发布到演示文件夹。mdladvRoot = ModelAdvisor.Root;mdladvRoot.publish (rec,“演示”);结束函数constraints = createBlockConstraints()创建块约束。c1 = Advisor.authoring.PositiveBlockParameterConstraint;c1。ID =“ID_c1”;c1。BlockType =“逻辑”;c1。ParameterName =“IconShape”;c1。万博1manbetxSupportedParameterValues = {“矩形”};c1。ValueOperator =“情商”;约束= {c1};结束

createBlockConstraints函数定义块约束c1.的Advisor.authoring.createBlockConstraintCheck函数有一个“约束”调用约束创建函数的名称-值参数createBlockConstraints

在模型顾问中查看自定义检查

要确认您的自定义检查是可用的,打开Model Advisor。

1.为了让您的自定义检查在Model Advisor中可见,您必须刷新Model Advisor检查信息缓存。在MATLAB命令提示符下,输入:

Advisor.Manager.refresh_customizations ();

2.打开示例模型。

open_system (“AdvisorCustomizationExample.slx”);

3.在建模选项卡,打开模型的顾问.您也可以通过在MATLAB命令提示符中输入以下命令来打开Model Advisor:

modeladvisor (“AdvisorCustomizationExample.slx”);
正在更新Model Advisor缓存…模型Advisor缓存已更新。对于新的定制,要更新缓存,请使用Advisor.Manager。refresh_customizations方法。

4.扩大产品>演示文件夹中。在检查定义函数中,发布命令将检查添加到产品>演示文件夹中。

customModelAdvisor.png

指定并部署模型顾问自定义配置

要指定在Model Advisor中包含哪些检查,以及在编辑时检查期间使用哪些检查,请使用Model Advisor配置编辑器。

1.要打开配置编辑器,在模型顾问中单击打开>打开配置编辑器

2.控件中的选项中进行选择,以添加或删除支票和文件夹编辑模型顾问配置编辑器的部分。

3.要保存配置,请选择保存.打开一个窗口,提示您将配置保存为JSON文件。对于本例,您不必保存配置,因为文件demoConfiguration.json文件包含此示例的四个自定义检查。

4.关闭模型和模型顾问配置编辑器。

bdclose;

将自定义检查配置与模型和地址检查问题关联起来

要解决检查问题,首先要将配置与模型关联起来。然后,您可以在编辑时和在Model Advisor中解决问题。

1.打开示例模型。

open_system (“AdvisorCustomizationExample.slx”);

2.关联自定义配置,demoConfiguration.json,与模型。当您将自定义配置与模型相关联时,每当您打开模型时,模型都会使用相同的检查配置。单击建模按TAB键选择模型顾问>编辑时检查.在“配置参数”对话框中指定模型的顾问配置文件参数。或者,在命令提示符处输入以下命令:

ModelAdvisor.setModelConfiguration (“AdvisorCustomizationExample”,“demoConfiguration.json”);

3.控件来启用编辑时检查建模选项卡和选择模型顾问>编辑时检查.打开“配置参数”对话框。选择编辑时间检查参数。或者,您也可以在命令提示符处输入以下命令:

edittime.setAdvisorChecking (“AdvisorCustomizationExample”,“上”);

在模型的顶层,两个import块的输出数据类型为int32.这些块产生编辑时警告,因为它们应该是青色的。Outport块不产生警告,因为它有一个汽车数据类型,为白色。

modelHighlight.png

4.对于每个import块,单击编辑时警告窗口。然后单击修复.方块的颜色变为青色,警告消失。

5.逻辑运算符块产生警告,因为它应该具有矩形形状。单击编辑时警告窗口,然后单击修复.逻辑操作符块的形状变为矩形,警告消失。

6.现在您已经处理了编辑时检查警告,打开Model Advisor来处理任何剩余的检查问题。

modeladvisor (“AdvisorCustomizationExample.slx”);
Model Advisor正在删除现有的报表。

7.Model Advisor在自定义配置中包含了四种检查。点击运行检查.您在编辑期间处理的两个检查通过了。另外两个检查产生警告。

modelCheckStatus.png

8.单击检查块名称是否出现在块的下面检查。要应用修复程序并解决警告,请在右侧窗格中单击修复

9.单击检查型号配置参数检查。若要应用修复程序并解决警告,请单击修复

10.重新运行检查。它们现在通过了。

11.关闭模型和模型顾问。

bdclose;

12.从工作目录中删除文件。输入以下命令刷新Model Advisor检查信息缓存:

Advisor.Manager.refresh_customizations

以编程方式运行模型顾问自定义配置并查看结果

您可以以编程方式运行Model Advisor配置,然后在Model Advisor中打开结果。

1.调用ModelAdvisor.run函数。

SysResultObjArray = ModelAdvisor.run({“AdvisorCustomizationExample”},...“配置”,“demoConfiguration.json”);

2.在Model Advisor中查看结果:

viewReport (SysResultObjArray {1},“马”

3.点击继续在对话框中。现在可以应用修复程序并解决警告。

4.关闭模型和模型顾问。

bdclose;

5.从工作目录中删除文件。输入以下命令刷新Model Advisor检查信息缓存:

Advisor.Manager.refresh_customizations

另请参阅

|

相关的话题