修复模型以符合您在模型顾问中指定的条件
此示例展示了如何使用修复操作创建自定义的Model Advisor通过/失败检查。当模型不包含检查冲突时,结果包含检查描述和结果状态。当模型包含检查冲突时,结果包含检查描述、结果状态和修复问题的建议操作。这个例子将自定义检查添加到Model Advisor中按产品>演示子文件夹。
对于本例,自定义检查识别那些名称没有出现在块下面的块。修复操作是使块名称出现在块的下面。
当检查未通过时,结果包括指向违反检查的每个模型元素的超链接。使用这些超链接可以轻松地定位模型或子系统中的区域。此示例的代码由一个sl_customization.m
文件和adefineDetailStyleCheck.m
文件。
创建sl_customization
文件
在您的工作文件夹中创建一个
sl_customization.m
文件。要注册自定义检查,请创建一个
sl_customization (cm)
函数如下所示。这个函数接受一个参数,一个定制管理器对象。自定义管理器对象包括addModelAdvisorCheckFcn
自定义检查的注册方法。这个方法的输入是函数的句柄defineModelAdvisorChecks
.defineModelAdvisorChecks
包含对自定义Model Advisor通过/失败检查的检查定义函数的调用。函数sl_customization (cm)% SL_CUSTOMIZATION—模型顾问自定义演示。版权所有2019 MathWorks, Inc.%注册自定义检查cm.addModelAdvisorCheckFcn (@defineModelAdvisorChecks);% -----------------------------%定义模型顾问检查% -----------------------------函数defineModelAdvisorChecks 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。行动object for setting fix operation.myAction = ModelAdvisor.Action;myAction.setCallbackFcn (@ActionCB);myAction。Name =“让区块名称出现在区块下方”;myAction。描述=“点击按钮将区块名称放在区块下方”;rec.setAction (myAction);mdladvRoot.publish (rec,“演示”);将签入发布到Demo组。结束% -----------------------------%此回调函数使用DetailStyle CallbackStyle类型。% -----------------------------函数mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system);% get对象%查找名称没有出现在blocks下面的所有blocksviolationBlks = find_system(system,“类型”,“块”,…“NamePlacement”,“替代”,…“ShowName”,“上”);如果isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail;ElementResults。IsInformer = true;ElementResults。描述=找出没有在方块下方显示姓名的方块。;ElementResults。状态=“所有积木的下方都有名字。”;mdladvObj.setCheckResultStatus(真正的);其他的为i=1: nummel (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)对每一个都采取一些行动块= Simulink.ID.getHandle (resultDetailObjs(我). data);set_param(块,“NamePlacement”,“正常”);结束result = ModelAdvisor。文本(更改了位置,使区块名称位于区块下方。);mdladvObj.setActionEnable(假);结束
下面的步骤说明如何创建defineDetailStyleCheck.m
文件。
创建一个
ModelAdvisor。根
对象。mdladvRoot = ModelAdvisor.Root;
创建一个
ModelAdvisor。检查
对象并定义唯一的检查ID。对于这张支票,ID是com.mathworks.sample.detailStyle
.rec = ModelAdvisor。检查(“com.mathworks.sample.detailStyle”);
指定
ModelAdvisor.Check.Title
和ModelAdvisor.Check.TitleTips
属性。rec.Title =“检查区块名称是否出现在区块下方”;rec.TitleTips =“检查块名称的位置”;
使用
setCallbackFcn
方法调用回调函数。的setCallbackFcn
方法参数是回调函数的句柄和ModelAdvisor.Check.CallbackStyle
属性值。对于本例,CallbackStyle
属性值为DetailStyle
.这种风格允许您按块、子系统或推荐操作查看结果。应用此样式将生成默认格式,因此您不必使用ModelAdvisor。格式Template
类或其他模型顾问格式化api来格式化出现在模型顾问中的结果。rec.setCallbackFcn (@DetailStyleCallback“没有”,“DetailStyle”);
要设置修复操作,请创建
ModelAdvisor。行动
对象并定义其属性。使用setCallback
方法调用动作回调函数。这个方法的输入是动作回调函数的句柄。myAction = ModelAdvisor.Action;myAction.setCallbackFcn (@ActionCB);myAction。Name =“让区块名称出现在区块下方”;myAction。描述=“点击按钮将区块名称放在区块下方”;
使用
setAction
方法设置检查的动作。rec.setAction (myAction);
使用
发布
方法将检查发布到控件中的文件夹通过产品文件夹中。对于本例,文件夹名称为演示.mdladvRoot.publish (rec,“演示”);将签入发布到Demo组。
创建Check回调定义函数
在
defineDetailStyleCheck.m
文件,创建check回调函数。在本例中,函数名为DetailStyleCallback
.这个函数的输入是aModelAdvisor。CheckObject
以及模型顾问分析的模型或系统的路径。函数CheckObj DetailStyleCallback(系统)
创建一个
仿真软件。ModelAdvisor
对象,使用该函数Simulink.ModelAdvisor.getModelAdvisor
.mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system);% get对象
要识别违反检查的块,请使用
find_system
函数。对于每个模型元素,该函数创建一个ModelAdvisor。ResultDetail
对象。violationBlks = find_system(system,“类型”,“块”,…“NamePlacement”,“替代”,…“ShowName”,“上”);
的情况下编写代码
find_system
函数不识别名称没有出现在块下面的块。在这种情况下,ElementResults
是一个实例吗ModelAdvisor。ResultDetail
对象,仅提供信息内容。该方法指定不存在检查冲突并显示通过了在模型顾问中。如果isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail;ElementResults。IsInformer = true;ElementResults。描述=找出没有在方块下方显示姓名的方块。;ElementResults。状态=“所有积木的下方都有名字。”;mdladvObj.setCheckResultStatus(真正的);
的情况下编写代码
find_system
函数返回一个块列表,这些块的名称不出现在块的下面(violationBlks
).ElementResults
包括每一个ModelAdvisor。ResultDetail
对象,该对象违反检查,并提供修复检查违反的建议操作消息。在这种情况下,
setCheckResultStatus
方法指定检查冲突并显示警告或失败的在模型顾问中。的Simulink.ModelAdvisor.setActionEnable(真正的)
方法允许从Model Advisor修复检查冲突问题。其他的为i=1: nummel (violationBlks) ElementResults(1,i) = ModelAdvisor.ResultDetail;结束为i = 1:元素个数(ElementResults) ModelAdvisor.ResultDetail.setData (ElementResults(我),“席德”我,violationBlks {});ElementResults(我)。描述=找出没有在方块下方显示姓名的方块。;ElementResults(我)。状态=以下代码块的名称不会显示在代码块下方:;ElementResults(我)。RecAction =“更改位置,使区块名称位于区块下方。”;结束mdladvObj.setCheckResultStatus(假);mdladvObj.setActionEnable(真正的);结束
要将结果与检查对象关联,请使用
setResultDetails
方法。CheckObj.setResultDetails (ElementResults);结束
创建动作回调定义函数
在
defineDetailStyleCheck.m
文件,创建动作回调函数。在本例中,函数名为sampleActionCB
.这个函数的输入是aModelAdvisor。任务
对象。函数result = ActionCB(taskobj)
创建句柄
仿真软件。ModelAdvisor
和ModelAdvisor。检查
对象。mdladvObj = taskobj.MAObj;checkObj = taskobj.Check;
创建一个数组
ModelAdvisor。ResultDetail
对象,用于存储违反检查的块的信息。resultDetailObjs = checkObj.ResultDetails;
编写代码,将块名称位置更改为块下方。
为i = 1:元素个数(resultDetailObjs)对每一个都采取一些行动块= Simulink.ID.getHandle (resultDetailObjs(我). data);set_param(块,“NamePlacement”,“正常”);结束result = ModelAdvisor。文本(更改了位置,使区块名称位于区块下方。);
禁用行动盒子。
mdladvObj.setActionEnable(假);
运行检查
保存
sl_customization.m
和defineDetailStyleCheck.m
文件。在MATLAB命令窗口中输入:
Advisor.Manager.refresh_customizations
打开模型
sldemo_fuelsys
在MATLAB命令提示符中输入以下命令:sldemo_fuelsys
在顶部模型中,选择名为
发动机转速
.在工具栏中,在格式选项卡上,单击翻转的名字.打开
fuel_rate_control
子系统。选择名为validate_sample_time
.在工具栏中,在格式选项卡上,单击翻转的名字.返回到顶部模型并保存为
example_sldemo_fuelsys
.在建模选项卡上,选择模型的顾问.一个系统选择器-模型顾问对话框。点击好吧.模型顾问打开。
在左侧窗格中,选择By Product > Demo >检查block下方是否出现block名称.
选择运行检查.Model Advisor检查为您更改的块生成一个警告。
通过选择报告或结果细节选项卡。
这两个选项卡都为违反检查的每个块提供了建议的操作。您可以单击超链接路径来打开模型编辑器中的块。例如:
使用以下方法之一,按照建议的操作来修复违规块:
通过双击超链接打开块来单独更新每个违规。选择该块。在工具栏中,在格式选项卡上,选择翻转的名字.
2 .在工具栏中,单击修复.Model Advisor会自动修复模型中的问题。注意,在违规被修复后,按钮会变暗。
重新运行Model Advisor检查。支票通过了。
另请参阅
ModelAdvisor。检查
|ModelAdvisor。格式Template
|ModelAdvisor。格式Template
|ModelAdvisor.Check.CallbackContext
|仿真软件。ModelAdvisor
|Simulink.ModelAdvisor.getModelAdvisor
|Simulink.ModelAdvisor.openConfigUI
|Simulink.ModelAdvisor.reportExists