主要内容

创建并部署Model Advisor自定义配置

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

定义自定义检查

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

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

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

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

  • 一种编辑时检查,为块参数设置指定约束并提供修复操作。

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

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

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

编辑时检查与修复

defineEditTimeCheck.m文件包含defineEditTimeCheck函数,该函数定义了一个检查,检查import和Outport块是否根据其输出数据类型具有特定的颜色。这个检查必须检查其他被编辑的块,但是它不需要检查同一级别或整个模型层次结构中受影响的块。此检查提供了一个修复程序,可以更新没有正确颜色的块的颜色。这张支票的名字是检查输入和输出块的颜色.该检查在编辑时和Model Advisor中运行。打开并检查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检查端口是否符合软件设计的背景颜色标准。。背景颜色数据类型% orange布尔值%绿色所有浮点数% cyan所有整数%浅蓝色枚举和总线对象%白色自动方法函数obj = PortColor (checkId) obj = obj@ModelAdvisor.EdittimeCheck (checkId);obj。traversalType = edittimecheck.TraversalTypes.BLKITER;结束函数违规= blockDiscovered(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,违规)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文件。

函数defineDetailStyleCheck 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类型。% -----------------------------函数DetailStyleCallback(system, CheckObj) mdladvObj = 万博1manbetxSimulink.ModelAdvisor.getModelAdvisor(system);% get对象查找所有名称未出现在块下面的块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文件包含defineConfigurationParameterCheck检查定义函数,该函数定义了一个检查,该检查可以识别可能影响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合规代码生成的配置参数。”%——数据文件输入参数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文件包含defineNewBlockConstraintCheck函数,该函数定义了一个检查,用于标识非矩形形状的逻辑操作符块。这张支票的名字是检查逻辑操作符块的图标形状

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

打开并检查defineNewBlockConstraintCheck.m文件

函数defineNewBlockConstraintCheck rec = advisor . authors . createblockconstraintcheck (“com.mathworks.sample.blockConstraint”...“约束”, @createBlockConstraints);%约束的创建是块约束检查定义的一部分rec.Title =“检查逻辑运算符块的图标形状”;rec.TitleTips =检查逻辑操作符块的图标形状。逻辑操作符的图标形状应该是矩形的。%发布检查到演示文件夹。mdladvRoot = ModelAdvisor.Root;mdladvRoot.publish (rec,“演示”);结束函数constraints = createBlockConstraints()创建块约束。c1 = advisor .author . 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缓存…Model Advisor缓存已更新。对于新的自定义,要更新缓存,请使用Advisor.Manager。refresh_customizations方法。

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

customModelAdvisor.png

指定并部署Model Advisor自定义配置

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

1.要打开配置编辑器,请在Model Advisor中单击打开>打开配置编辑器

2.属性中的选项中进行选择,可添加或删除复选和文件夹编辑Model Advisor配置编辑器的部分。

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

4.关闭模型和model Advisor Configuration Editor。

bdclose;

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

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

1.打开示例模型。

open_system (“AdvisorCustomizationExample.slx”);

2.关联自定义配置,demoConfiguration.json,与模型。当您将自定义配置与模型相关联时,每次您打开模型时,模型都会使用相同的检查配置。单击建模选项卡,选择Model Advisor >编辑时检查.的配置文件的路径模型的顾问配置文件参数。或者,在命令提示符处输入以下命令:

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

3.控件打开编辑时检查建模TAB和选择Model Advisor >编辑时检查.打开“配置参数”对话框。选择编辑时间检查参数。或者,您也可以在命令提示符下输入该命令:

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配置,然后在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

另请参阅

|

相关的话题