主要内容

创建和部署一个模型顾问定制配置

检查模型是否满足贵公司的标准和建模指南,你可以定制模型顾问。这个例子向您展示了如何向模型中添加自定义检查顾问和删除航运你不需要检查。你可以保存自定义检查配置并将其部署到别人在你的开发团队。部署自定义配置允许您的开发团队使用同一组检查评估模型。

定义定制的检查

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

  • 编辑时间检查提供了解决的措施。

  • 顾问检查只运行在模型和组结果模块和子系统,提供了一种解决行动。

  • 检查模型中只运行顾问和验证模型配置参数设置。

  • 一个指定一个约束的编辑时间检查一块参数设置和提供了一个解决行动。

包括的示例文件sl_customization.m文件。这个文件包含了sl_customization函数,它包含调用函数定义自定义检查。打开并检查sl_customization.m文件。

函数sl_customization (cm)% SL_CUSTOMIZATION顾问——模型定制示范。% 2019年版权MathWorks公司。%注册自定义检查cm.addModelAdvisorCheckFcn (@defineModelAdvisorChecks);% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%定义模型顾问检查% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数defineModelAdvisorChecks defineEditTimeCheck defineDetailStyleCheck;defineConfigurationParameterCheck;defineNewBlockConstraintCheck;

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

编辑时间检查与修复

defineEditTimeCheck.m文件包含defineEditTimeCheck检查定义函数,它定义了一个检查,检查尺寸和外港块是否有一定的颜色取决于它们的输出数据类型。这张支票必须检查其他编辑模块,但是它没有检查同级影响块或在整个模型的层次结构。这个检查提供了一个更新的颜色块的修复,没有正确的颜色。这张支票的名字检查尺寸和外港块的颜色。这张支票在模型中运行在编辑时间和顾问。打开并检查defineEditTimeCheck.m文件。

函数defineEditTimeCheck%检查尺寸的背景颜色和外港块。rec = ModelAdvisor.Check (“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%检查端口符合软件设计标准的背景颜色。%%背景颜色数据类型%橙色布尔%绿色所有浮点%青色所有整数%浅蓝色的枚举和总线对象%的白色汽车%方法函数obj = PortColor (checkId) obj = obj@ModelAdvisor.EdittimeCheck (checkId);obj。traversalType = edittimecheck.TraversalTypes.BLKITER;结束函数违反= blockDiscovered (obj,黑色)违反= [];如果比较字符串(get_param(黑色,“BlockType”),“尺寸”)| | strcmp (get_param(黑色,“BlockType”),“输出港”)数据类型= get_param(黑色,“OutDataTypeStr”);currentBgColor = get_param(黑色,“写成BackgroundColor”);如果比较字符串(数据类型,“布尔”)如果~ strcmp (currentBgColor,“橙”)%使用ModelAdvisor创建一个违反对象。ResultDetail类。违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S金宝appimulink.ID.getSID(黑色));侵犯。CheckID = obj.checkId;侵犯。描述=的尺寸/外港块布尔输出应该是橙色的。”;侵犯。title =“港口块颜色”;侵犯。ViolationType =“警告”;结束elseif任何(strcmp ({“单一”,“双”},数据类型))如果~ strcmp (currentBgColor,“绿色”)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S金宝appimulink.ID.getSID(黑色));侵犯。CheckID = obj.checkId;侵犯。描述=的尺寸/外港块浮点输出应该是绿色的。”;侵犯。title =“港口块颜色”;侵犯。ViolationType =“警告”;结束elseif任何(strcmp ({“uint8”,“uint16”,“uint32”,“int8”,“int16”,“int32”},数据类型))如果~ strcmp (currentBgColor,“青色”)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S金宝appimulink.ID.getSID(黑色));侵犯。CheckID = obj.checkId;侵犯。描述=的尺寸/外港块整数输出应该是青色。;侵犯。title =“港口块颜色”;侵犯。ViolationType =“警告”;结束elseif包含(数据类型,的总线:)如果~ strcmp (currentBgColor,“lightBlue”)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S金宝appimulink.ID.getSID(黑色));侵犯。CheckID = obj.checkId;侵犯。描述=的尺寸/外港块总线输出应该是浅蓝色的。”;侵犯。title =“港口块颜色”;侵犯。ViolationType =“警告”;结束elseif包含(数据类型,的枚举:)如果~ strcmp (currentBgColor,“lightBlue”)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S金宝appimulink.ID.getSID(黑色));侵犯。CheckID = obj.checkId;侵犯。描述=的尺寸/外港块枚举输出应该是浅蓝色的。”;侵犯。title =“港口块颜色”;侵犯。ViolationType =“警告”;结束elseif包含(数据类型,“汽车”)如果~ strcmp (currentBgColor,“白色”)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”S金宝appimulink.ID.getSID(黑色));侵犯。CheckID = obj.checkId;侵犯。描述=与汽车的尺寸/外港块输出应该是白色的。”;侵犯。title =“港口块颜色”;侵犯。ViolationType =“警告”;结束结束结束结束函数违反= finishedTraversal (obj)违反= [];结束函数成功=修复(obj,违反)成功= true;数据类型= get_param (violation.Data,“OutDataTypeStr”);如果比较字符串(数据类型,“布尔”)set_param (violation.Data“写成BackgroundColor”,“橙”);elseif任何(strcmp ({“单一”,“双”},数据类型))set_param (violation.Data“写成BackgroundColor”,“绿色”);elseif任何(strcmp ({“uint8”,“uint16”,“uint32”,“int8”,“int16”,“int32”},数据类型))set_param (violation.Data“写成BackgroundColor”,“青色”);elseif包含(数据类型,的总线:)| |(包含数据类型,的枚举:)set_param (violation.Data“写成BackgroundColor”,“lightBlue”);elseif包含(数据类型,“汽车”)set_param (violation.Data“写成BackgroundColor”,“白色”);结束结束结束结束

模型顾问检查与修复

defineDetailStyleCheck.m文件包含defineDetailStyleCheck检查定义函数,它定义了一个检查列表模块的名字不显示以下的块。这个检查提供了一种解决移动块以下这些人的名字。这张支票的名字检查块的名字是否出现下面的块。这张支票创作风格是顾问的检查,只有运行模型。打开并检查defineDetailStyleCheck.m文件。

函数defineDetailStyleCheck mdladvRoot = ModelAdvisor.Root;%创建ModelAdvisor。检查对象,并设置属性。rec = ModelAdvisor.Check (“com.mathworks.sample.detailStyle”);rec.Title =“检查块的名字是否出现以下块”;rec.TitleTips =“检查块的位置名称”;rec.setCallbackFcn (@DetailStyleCallback“没有”,“DetailStyle”);%创建ModelAdvisor。操作对象制定修复操作。myAction = ModelAdvisor.Action;myAction.setCallbackFcn (@ActionCB);myAction.Name =“使块名称出现低于块”;myAction.Description =“点击下面的按钮将块名称块”;rec.setAction (myAction);mdladvRoot.publish (rec,“演示”);%发布查看演示组。结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%这个回调函数使用DetailStyle CallbackStyle类型。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数DetailStyleCallback(系统,CheckObj) mdladvObj = Simul金宝appink.ModelAdvisor.getModelAdvisor(系统);%得到对象%找到所有阻塞的名字没有出现下面violationBlks = find_system(系统,“类型”,“块”,“NamePlacement”,“替代”,“ShowName”,“上”);如果isempty (violationBlks) ElementResults = ModelAdvisor.ResultDetail;ElementResults。IsInformer = true;ElementResults。描述=“识别模块,下面显示的名字不是块。”;ElementResults。状态=所有块名称显示下面的块。;mdladvObj.setCheckResultStatus(真正的);其他的i = 1:元素个数(violationBlks) ElementResults(我)= ModelAdvisor.ResultDetail;结束i = 1:元素个数(ElementResults) ModelAdvisor.ResultDetail.setData (ElementResults(我),“席德”我,violationBlks {});ElementResults(我)。描述=“识别模块,下面显示的名字不是块。”;ElementResults(我)。状态=下面的模块名称,不显示以下模块:“;ElementResults(我)。RecAction =“改变位置,这样下面的块的名字是块。”;结束mdladvObj.setCheckResultStatus(假);mdladvObj.setActionEnable(真正的);结束CheckObj.setResultDetails (ElementResults);结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%这个动作回调函数改变块的位置名称。% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数结果= ActionCB (taskobj) mdladvObj = taskobj.MAObj;checkObj = taskobj.Check;resultDetailObjs = checkObj.ResultDetails;i = 1:元素个数(resultDetailObjs)%为他们每个人采取行动块= Sim金宝appulink.ID.getHandle (resultDetailObjs(我). data);set_param(块,“NamePlacement”,“正常”);结束结果= ModelAdvisor.Text (“改变了位置,这样下面的块的名字是块。”);mdladvObj.setActionEnable(假);结束

这张支票使用setCallbackFcn类型的DetailStyle,默认格式,所以您不需要使用ModelAdvisor.FormatTemplate或其他顾问格式化api模型格式的结果出现在模型顾问。为更多的信息关于如何创建这种类型的检查定义函数,看看修复一个模型符合您指定的条件与模型顾问

模型配置参数设置检查

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

这张支票需要一个支持XML数据文件必须在MA金宝appTLAB的路径和包含模型配置参数设置您想要检查。对于这个示例,该文件configurationParameterDataFile.xml。有关如何创建这个检查类型的更多信息,见创建模型顾问检查模型配置参数

打开并检查defineConfigurationParameterCheck.m文件

函数defineConfigurationParameterCheck%创建ModelAdvisor。检查对象,并设置属性。rec = ModelAdvisor.Check (“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});%——设置修复操作行动= ModelAdvisor.Action;act.setCallbackFcn(@(任务)(Advisor.authoring.CustomCheck.actionCallback(任务)));的行为。Name =“修改设置”;的行为。描述=修改模型配置设置。;rec.setAction(行为);%发布查看演示文件夹。mdladvRoot = ModelAdvisor.Root;mdladvRoot.publish (rec,“演示”);结束

块参数约束检查

defineNewBlockConstraintCheck.m文件包含defineNewBlockConstraintCheck检查定义函数,它定义了一个检查,确定逻辑算符块没有一个矩形形状。这张支票的名字检查逻辑算符的图标形状块

支持编辑时间检查一块参数约束检查。金宝app这张支票类型的更多信息,请参阅定义模型顾问检查支持和不支持的模块和参数金宝app

打开并检查defineNewBlockConstraintCheck。m文件

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

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

视图模型中的自定义检查顾问

确认您的自定义检查,打开模型顾问。

1。为了您的自定义模型中检查可见顾问,你必须刷新缓存模型顾问检查信息。在MATLAB命令提示符,输入:

Advisor.Manager.refresh_customizations ();

2。打开示例模型。

open_system (“AdvisorCustomizationExample.slx”);

3所示。在建模选项卡,打开模型的顾问。你也可以打开模型顾问通过输入这个命令在MATLAB命令提示符:

modeladvisor (“AdvisorCustomizationExample.slx”);
更新缓存模型顾问……模型顾问缓存更新。新定制,更新缓存,使用Advisor.Manager。refresh_customizations方法。

4所示。扩大通过产品>演示文件夹中。检查函数定义的发布命令添加了检查通过产品>演示文件夹中。

customModelAdvisor.png

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

在模型中指定检查包括顾问和检查使用编辑时间检查期间,使用模型顾问配置编辑器。

1。打开配置编辑器,在模型中顾问,点击打开>打开配置编辑器

2。添加或删除检查和文件夹,选择的选项编辑模型的部分顾问配置编辑器。

3所示。保存配置,选择保存。将打开一个窗口,提示您保存配置作为JSON文件。对于这个示例,您没有保存配置,因为该文件demoConfiguration.json对于这个示例文件包含四个自定义检查。

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

bdclose;

关联的自定义检查配置模型和解决检查问题

为了解决检查问题,首先将配置与一个模型。然后,您可以在编辑时间解决问题,模型中的顾问。

1。打开示例模型。

open_system (“AdvisorCustomizationExample.slx”);

2。将自定义配置,demoConfiguration.json与模型,。当你把一个自定义的配置与一个模型,该模型使用相同的检查配置每次你打开一个模型。单击建模选项卡并选择模型顾问>编辑时间检查。在配置参数对话框中,指定配置文件的路径模型的顾问配置文件参数。另外,输入这个命令在命令提示符:

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

3所示。通过单击打开编辑时间检查建模选项卡并选择模型顾问>编辑时间检查。配置参数对话框打开。选择编辑时间检查参数。或者,您可以输入这个命令在命令提示符:

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

在模型的顶层,两个尺寸块有一个输出数据的类型int32。块生成编辑时间警告,因为他们应该青色。外港块不会产生一个警告,因为它有一个汽车数据类型和是白色的。

modelHighlight.png

4所示。对于每一个尺寸块,点击编辑时间警告窗口。然后单击修复。的颜色块青色改变和消失的警告。

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

6。现在您已经解决编辑时间检查警告,打开模型顾问解决剩余的检查问题。

modeladvisor (“AdvisorCustomizationExample.slx”);
模型顾问删除现有的报告。

7所示。顾问的模型包含四个检查自定义配置。点击运行检查。这两个检查你在编辑时间解决。其他两个检查产生警告。

modelCheckStatus.png

8。单击检查块的名字是否出现下面的块检查。应用修复和解决警告,在右窗格中,单击修复

9。单击检查模型配置参数检查。应用修复和解决警告,点击修复

10。重新运行检查。他们现在通过。

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

bdclose;

12。把文件从你的工作目录。刷新缓存模型顾问检查信息通过输入这个命令:

Advisor.Manager.refresh_customizations

通过编程的方式运行一个模型顾问自定义配置和视图的结果

您可以通过编程的方式运行一个模型顾问配置,然后打开结果模型中的顾问。

1。调用ModelAdvisor.run函数。

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

2。在模型中查看结果顾问:

viewReport (SysResultObjArray {1},“马”)

3所示。点击继续在对话框中。你现在可以应用补丁和解决警告。

4所示。关闭模型和模型的顾问。

bdclose;

5。把文件从你的工作目录。刷新缓存模型顾问检查信息通过输入这个命令:

Advisor.Manager.refresh_customizations

另请参阅

|

相关的话题