主要内容

修复模型以符合您在模型顾问中指定的条件

此示例展示了如何使用修复操作创建自定义的Model Advisor通过/失败检查。当模型不包含检查冲突时,结果包含检查描述和结果状态。当模型包含检查冲突时,结果包含检查描述、结果状态和修复问题的建议操作。这个例子将自定义检查添加到Model Advisor中按产品>演示子文件夹。

对于本例,自定义检查识别那些名称没有出现在块下面的块。修复操作是使块名称出现在块的下面。

当检查未通过时,结果包括指向违反检查的每个模型元素的超链接。使用这些超链接可以轻松地定位模型或子系统中的区域。此示例的代码由一个sl_customization.m文件和adefineDetailStyleCheck.m文件。

创建sl_customization文件

  1. 在您的工作文件夹中创建一个sl_customization.m文件。

  2. 要注册自定义检查,请创建一个sl_customization (cm)函数如下所示。这个函数接受一个参数,一个定制管理器对象。自定义管理器对象包括addModelAdvisorCheckFcn自定义检查的注册方法。这个方法的输入是函数的句柄defineModelAdvisorChecksdefineModelAdvisorChecks包含对自定义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文件。

  1. 创建一个ModelAdvisor。根对象。

    mdladvRoot = ModelAdvisor.Root;
  2. 创建一个ModelAdvisor。检查对象并定义唯一的检查ID。对于这张支票,ID是com.mathworks.sample.detailStyle

    rec = ModelAdvisor。检查(“com.mathworks.sample.detailStyle”);
  3. 指定ModelAdvisor.Check.TitleModelAdvisor.Check.TitleTips属性。

    rec.Title =“检查区块名称是否出现在区块下方”;rec.TitleTips =“检查块名称的位置”;
  4. 使用setCallbackFcn方法调用回调函数。的setCallbackFcn方法参数是回调函数的句柄和ModelAdvisor.Check.CallbackStyle属性值。对于本例,CallbackStyle属性值为DetailStyle.这种风格允许您按块、子系统或推荐操作查看结果。应用此样式将生成默认格式,因此您不必使用ModelAdvisor。格式Template类或其他模型顾问格式化api来格式化出现在模型顾问中的结果。

    rec.setCallbackFcn (@DetailStyleCallback“没有”“DetailStyle”);
  5. 要设置修复操作,请创建ModelAdvisor。行动对象并定义其属性。使用setCallback方法调用动作回调函数。这个方法的输入是动作回调函数的句柄。

    myAction = ModelAdvisor.Action;myAction.setCallbackFcn (@ActionCB);myAction。Name =“让区块名称出现在区块下方”;myAction。描述=“点击按钮将区块名称放在区块下方”;
  6. 使用setAction方法设置检查的动作。

    rec.setAction (myAction);
  7. 使用发布方法将检查发布到控件中的文件夹通过产品文件夹中。对于本例,文件夹名称为演示

    mdladvRoot.publish (rec,“演示”);将签入发布到Demo组。

创建Check回调定义函数

  1. defineDetailStyleCheck.m文件,创建check回调函数。在本例中,函数名为DetailStyleCallback.这个函数的输入是aModelAdvisor。CheckObject以及模型顾问分析的模型或系统的路径。

    函数CheckObj DetailStyleCallback(系统)
  2. 创建一个仿真软件。ModelAdvisor对象,使用该函数Simulink.ModelAdvisor.getModelAdvisor

    mdladvObj = Simulink.ModelAdvisor.getModelAdvisor(system);% get对象
  3. 要识别违反检查的块,请使用find_system函数。对于每个模型元素,该函数创建一个ModelAdvisor。ResultDetail对象。

    violationBlks = find_system(system,“类型”“块”“NamePlacement”“替代”“ShowName”“上”);
  4. 的情况下编写代码find_system函数不识别名称没有出现在块下面的块。在这种情况下,ElementResults是一个实例吗ModelAdvisor。ResultDetail对象,仅提供信息内容。该方法指定不存在检查冲突并显示通过了在模型顾问中。

    如果isempty(violationBlks) ElementResults = ModelAdvisor.ResultDetail;ElementResults。IsInformer = true;ElementResults。描述=找出没有在方块下方显示姓名的方块。;ElementResults。状态=“所有积木的下方都有名字。”;mdladvObj.setCheckResultStatus(真正的);
  5. 的情况下编写代码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(真正的);结束
  6. 要将结果与检查对象关联,请使用setResultDetails方法。

    CheckObj.setResultDetails (ElementResults);结束

创建动作回调定义函数

  1. defineDetailStyleCheck.m文件,创建动作回调函数。在本例中,函数名为sampleActionCB.这个函数的输入是aModelAdvisor。任务对象。

    函数result = ActionCB(taskobj)
  2. 创建句柄仿真软件。ModelAdvisorModelAdvisor。检查对象。

    mdladvObj = taskobj.MAObj;checkObj = taskobj.Check;
  3. 创建一个数组ModelAdvisor。ResultDetail对象,用于存储违反检查的块的信息。

    resultDetailObjs = checkObj.ResultDetails;
  4. 编写代码,将块名称位置更改为块下方。

    i = 1:元素个数(resultDetailObjs)对每一个都采取一些行动块= Simulink.ID.getHandle (resultDetailObjs(我). data);set_param(块,“NamePlacement”“正常”);结束result = ModelAdvisor。文本(更改了位置,使区块名称位于区块下方。);
  5. 禁用行动盒子。

    mdladvObj.setActionEnable(假);

运行检查

  1. 保存sl_customization.mdefineDetailStyleCheck.m文件。

  2. 在MATLAB命令窗口中输入:

    Advisor.Manager.refresh_customizations
  3. 打开模型sldemo_fuelsys在MATLAB命令提示符中输入以下命令:

    sldemo_fuelsys

  4. 在顶部模型中,选择名为发动机转速.在工具栏中,在格式选项卡上,单击翻转的名字

  5. 打开fuel_rate_control子系统。选择名为validate_sample_time.在工具栏中,在格式选项卡上,单击翻转的名字

    返回到顶部模型并保存为example_sldemo_fuelsys

  6. 建模选项卡上,选择模型的顾问.一个系统选择器-模型顾问对话框。点击好吧.模型顾问打开。

  7. 在左侧窗格中,选择By Product > Demo >检查block下方是否出现block名称

  8. 选择运行检查.Model Advisor检查为您更改的块生成一个警告。

  9. 通过选择报告结果细节选项卡。

    这两个选项卡都为违反检查的每个块提供了建议的操作。您可以单击超链接路径来打开模型编辑器中的块。例如:

    Model Advisor显示了一个包含违规的块表,以及指向块路径的超链接

  10. 使用以下方法之一,按照建议的操作来修复违规块:

    • 通过双击超链接打开块来单独更新每个违规。选择该块。在工具栏中,在格式选项卡上,选择翻转的名字

    • 2 .在工具栏中,单击修复.Model Advisor会自动修复模型中的问题。注意,在违规被修复后,按钮会变暗。

  11. 重新运行Model Advisor检查。支票通过了。

    具有合格结果的Model Advisor

另请参阅

|||||||

相关的话题

Baidu
map