创建并部署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.
打开并检查defineNewBlockConstraintChec
k.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.扩大产品>演示文件夹中。在检查定义函数中发布
命令将检查添加到产品>演示文件夹中。
指定并部署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块不产生警告,因为它有汽车
数据类型,为白色。
4.对于每个import块,单击编辑时警告窗口。然后单击修复.方块的颜色变为青色,警告消失。
5.逻辑操作符块产生警告,因为它应该具有矩形形状。单击编辑时警告窗口,然后单击修复.逻辑操作符块的形状变为矩形,警告消失。
6.现在您已经处理了编辑时检查警告,打开Model Advisor来处理任何剩余的检查问题。
modeladvisor (“AdvisorCustomizationExample.slx”);
Model Advisor正在删除现有的报表。
7.Model Advisor在自定义配置中包含四项检查。点击运行检查.您在编辑期间处理的两个检查通过了。另外两个检查产生警告。
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
另请参阅
ModelAdvisor。检查
|ModelAdvisor。EdittimeCheck