定义编辑时间检查符合您指定的条件与模型顾问
在本例中,您创建三个自定义编辑时间检查检查符合特定的软件设计标准。自定义编辑时间检查帮助你发现问题早在模型设计评审过程中,但这些模型也检查报告问题顾问。
第一止回阀检查尺寸和外港块有一定的颜色取决于它们的输出数据类型。
第二个检查检查是否触发块高于其他模块子系统。这张支票必须检查编辑阻塞和其他相同的子系统触发块。
第三次检查检查信号,连接到外港块是否有标签。
注册并定义自定义编辑时间检查
1。注册自定义编辑时间检查,创建一个sl_customization
函数。对于这个示例,复制sl_customization_cec.m
文件到sl_customization.m
文件通过输入这个命令在命令提示符:
拷贝文件sl_customization_cec.msl_customization.mf
的sl_customization
函数接受一个参数,定制管理器对象。注册自定义检查使用addModelAdvisorCheckFcn
方法。这个方法是一个句柄的输入检查定义函数。对于这个示例,defineCheck
是检查定义函数。打开并检查sl_customization.m
文件。
函数sl_customization (cm) cm.addModelAdvisorCheckFcn (@defineCheck);
2。创建检查定义函数。对于这个示例,开放和检查defineCheck
函数。这个函数包含三个ModelAdvisor.Check
与他们的检查对象id作为输入参数。的CallbackHandle
属性是您创建的类的名称定义编辑时间检查。对于这个示例,MyEditTimeChecks
包名和吗PortColor
,TriggerBlockPosition
,SignalLabel
类名。的mdladvRoot.publish
函数将检查发布到一个新文件夹在模型中顾问。对于这个示例,该文件夹的名称演示:编辑时间检查。
函数defineCheck% %检查尺寸的背景颜色和外港块。rec = ModelAdvisor.Check (“advisor.edittimecheck.PortColor”);rec.Title =“检查尺寸和外港块的颜色”;rec.CallbackHandle =“MyEditTimeChecks.PortColor”;mdladvRoot = ModelAdvisor.Root;mdladvRoot.publish (rec,“演示:编辑时间检查”);% %检查决定是否触发块最顶部的块在一个子系统。rec = ModelAdvisor.Check (“advisor.edittimecheck.TriggerBlock”);rec.Title =“检查触发块位置高于其它块的;rec.CallbackHandle =“MyEditTimeChecks.TriggerBlockPosition”;mdladvRoot.publish (rec,“演示:编辑时间检查”);% %检查确定信号与SignalPropagation”的标签。rec = ModelAdvisor.Check (“advisor.edittimecheck.SignalLabel”);rec.Title =检查信号标签如果他们传播这些标签的;rec.CallbackHandle =“MyEditTimeChecks.SignalLabels”;mdladvRoot.publish (rec,“演示:编辑时间检查”);
3所示。创建一个编辑时间检查来源于通过创建一个类ModelAdvisor.EdittimeCheck
抽象基类。检查第一个编辑时间被打开检查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”,“白色”);结束结束结束结束
的PortColor
类定义了三个方法:PortColor
,blockDiscovered
,修复
。的PortColor
方法设置CheckId
和TraversalType
属性。这张支票有一种遍历edittimecheck.TraversalTypes.BLKITER
因为检查必须检查新添加和编辑块,但是它没有检查影响块相同的子系统或模型作为编辑或新添加的块。的blockDiscovered
方法包含一个算法,检查尺寸和外港块的颜色。然后,因为违反在一块,算法强调违反块通过创建一个ModelAdvisor.ResultDetail
违反对象与类型
属性设置为默认值SID
。的修复
方法更新块,没有正确的颜色。
5。通过打开TriggerBlockPosition检查第二个编辑时间检查。m文件。
classdefTriggerBlockPosition < ModelAdvisor.EdittimeCheck属性TriggerBlock = [];位置= [];结束方法函数obj = TriggerBlockPosition (checkId) obj = obj@ModelAdvisor.EdittimeCheck (checkId);obj。traversalType = edittimecheck.TraversalTypes.ACTIVEGRAPH;结束函数违反= blockDiscovered (obj,黑色)违反= [];如果比较字符串(get_param(黑色,“BlockType”),“TriggerPort”obj。TriggerBlock =黑色;其他的h = get_param(黑色,“位置”);obj。位置= (obj。位置,h (2)];结束结束函数违反= finishedTraversal (obj)违反= [];如果isempty (obj.TriggerBlock)返回;结束triggerPosition = get_param (obj.TriggerBlock,“位置”);如果分钟(obj.position) < triggerPosition(2)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“席德”,…金宝appSimulink.ID.getSID (obj.TriggerBlock));侵犯。CheckID = obj.checkId;侵犯。title =“触发块位置”;侵犯。描述=“子系统触发块应该顶块”;侵犯。ViolationType =“警告”;结束obj。TriggerBlock = [];obj。位置= [];结束结束结束
的TriggerBlockPosition
类定义了三个方法:TriggerBlockPosition
,blockDiscovered
,finishedTraversal
。的TriggerBlockPosition
方法设置CheckId
和TraversalType
属性。这张支票有一种遍历edittimecheck.TraversalTypes.ACTIVEGRAPH
因为它必须检查其他块相同的子系统触发块。的blockDiscovered
方法检查子系统内触发块的位置。的finishedTraversal
方法检查这些触发模块的位置是否高于其他块在一个子系统。然后,因为违反在一块,算法强调违反块通过创建一个ModelAdvisor.ResultDetail
违反对象与类型
属性设置为默认值SID
。
6。检查第三个编辑时间被打开检查SignalLabels.m
文件。
classdefSignalLabels < ModelAdvisor.EdittimeCheck方法函数obj = SignalLabels (checkId) obj = obj@ModelAdvisor.EdittimeCheck (checkId);obj。traversalType = edittimecheck.TraversalTypes.BLKITER;结束函数违反= blockDiscovered (obj,黑色)违反= [];港口= get_param(黑色,“端口”);lh = get_param(黑色,“LineHandles”);如果比较字符串(get_param(黑色,“BlockType”),“输出港”)为j = 1:港口(1)如果lh.Inport (j) ~ = 1%失败案例:没有连接allsources = get_param (lh.Inport (j),“SrcPortHandle”);hiliteHandle = get_param (lh.Inport (j),“DstPortHandle”);如果(isempty (allsources) ~ = 0) | | (isempty(找到(allsources = = 1,1)) ~ = 0) lh_obj = get_param (lh.Inport (j),“对象”);如果isempty (lh_obj.Name)如果比较字符串(lh_obj.signalPropagation“关闭”)= = 1 allsources_parent = get_param (allsources,“父”);如果比较字符串(get_param (allsources_parent,“BlockType”),“尺寸”)buscreator_outputs = get_param (allsources_parent,“IsBusElementPort”);其他的buscreator_outputs =“关闭”;结束如果~ strcmp (buscreator_outputs,“上”)违反= ModelAdvisor.ResultDetail;ModelAdvisor.ResultDetail.setData(违反,“信号”,hiliteHandle);侵犯。描述=“这应该有一个标签的信号。”;侵犯。CheckID = obj.checkId;侵犯。Title =信号标签缺失的;结束结束结束结束结束结束结束结束结束结束
的SignalLabels
类定义了两个方法:SignalLabels
和blockDiscovered
。的SignalLabels
方法设置CheckId
和TraversalType
属性。这张支票有一种遍历edittimecheck.TraversalTypes.BLKITER
因为检查必须检查新添加和编辑块,但是它没有检查影响块相同的子系统或模型作为编辑或新添加的块。因为这对信号,检查blockDiscovered
必须使用参数的处理方法,LineHandles
块找到信号,违规。具体来说,信号连接到外港街区,该算法检查是否的名字
信号参数有一个值。然后,因为违反是一个信号,该算法强调信号通过创建一个违反对象类型
属性值设置为信号
。
7所示。创建一个文件夹命名+ MyEditTimeChecks
并保存三个类定义文件的文件夹。类必须在一个文件夹,名称相同的包名。这些命令在命令提示符处输入:
拷贝文件PortColor.m *+ MyEditTimeChecksf拷贝文件TriggerBlockPosition.m+ MyEditTimeChecks拷贝文件SignalLabels.m+ MyEditTimeChecks
一个模型上运行编辑时间检查
1。为了您的自定义模型中检查可见顾问,你必须刷新缓存模型顾问检查信息。输入这个命令在命令提示符:
Advisor.Manager.refresh_customizations
2。打开模型通过输入这个命令在命令提示符。
open_system (“AdvisorCustomizationExample.slx”);
3所示。要创建一个自定义的配置检查,打开模型顾问配置编辑器。在建模选项卡上,单击模型顾问>配置编辑器。
4所示。你可以创建一个定制的配置组成的三个编辑时间检查在这个例子除了通过删除每一个文件夹演示:编辑时间检查文件夹中。的my_config.json
文件附带这个例子包含这个配置。关闭模型顾问配置编辑器。
5设置自定义配置my_config.json
文件通过单击建模选项卡并选择模型的顾问>编辑时间检查。在配置参数对话框中,指定配置文件的路径模型顾问配置文件参数。另外,输入这个命令在命令提示符:
ModelAdvisor.setModelConfiguration (“AdvisorCustomizationExample”,“my_config.json”);
6。通过单击打开编辑时间检查建模选项卡并选择模型顾问>编辑时间检查。在配置参数对话框中,选择编辑时间检查参数。或者,您可以输入这个命令在命令提示符:
edittime.setAdvisorChecking (“AdvisorCustomizationExample”,“上”);
7所示。通过单击打开模型顾问建模选项卡并选择模型的顾问。观察到的三个模型中编辑时间检查是唯一顾问。关闭模式顾问。
8。查看编辑时间警告,点击模块和信号用黄色突出显示。
在模型的顶层,两个尺寸块有一个输出数据的类型int32
。他们生产编辑时间警告,因为他们应该青色。外港块不会产生违反,因为它有一个汽车
数据类型和是白色的。在放大器子系统、轮廓尺寸和外港块不产生编辑时间警告,因为他们有数据类型汽车
是白色的。触发块不会产生一个编辑时间预警模型中,因为它是最顶部的块。如果你移动触发块低于另一个块,触发块有一个编辑时间警告。信号连接到外港块产生一个警告,因为它没有一个标签。
8。修复两个尺寸块编辑时间警告,在编辑时间检查警告窗口中,点击修复。
9。关闭模型和模型的顾问。
bdclose;
10。把文件从你的工作目录。刷新缓存模型顾问检查信息通过输入这个命令:
Advisor.Manager.refresh_customizations
性能考虑自定义编辑时间检查
有助于防止负面影响性能的自定义编辑时间检查您编辑你的模型,该模型顾问自动禁用自定义编辑时间检查,在MATLAB®会议,检查花费的时间超过500年
毫秒执行至少在三个不同的仿真软件®模型。金宝app
如果模型顾问禁用一个定制的编辑时间检查,你会看到一个警告在仿真软件上画布。金宝app你可以重新启用编辑时间检查通过:
单击超链接文本的警告。
通过检查标识符,
checkID
的函数edittime.enableCheck
:
edittime.enableCheck (checkID)
防止一个自定义的编辑时间检查被禁用,作者检查,检查执行不到500年
在你的模型毫秒。
另请参阅
ModelAdvisor.EdittimeCheck
|ModelAdvisor.Check
|ModelAdvisor.ResultDetail