antd + react model自定义footer_MATLAB自动化——在Model Advisor中自定义检查规则(一)...

在基于模型的设计开发流程中,模型验证是一项很重要的环节。

模型的验证,不仅包括模型各个子模块功能性的验证,也包括模型的规范性检查,检查模型是否符合MAAB、MISRA AC TL或者其他建模规范。如同在常规手写C代码开发过程中需要检查是否符合MISRA C等标准一样。

在Simulink开发环境中,Model Advisor 是一种Simulink自带的静态模型检查工具,能够根据设定的检查规则对所建模型进行检查,并且能够部分错误的自动修改。

Model Advisor的使用
打开Simulink模型,Analysis >Model Advisor >Model Advisor

勾选需要检查的规则,在右侧点击Run This Check进行规则检查

27c32e9e6a4d73ea530772d98f842d0a.png

右侧显示检查结果,同时可打开生成的报告

922efe0ee11d47a4df0f54629e9bc2a4.png

ad526fe53e85ff814f798d22b4a520bd.png

Html格式报告

3091cf614c0060f4bdbce4e2e13410ee.png

常见建模规范

    • Mathwork MAAB规范
    • MISRA Autocode系列规范
      MISRA官网:https://www.misra.org.uk/Activities/MISRAAutocode/tabid/72/Default.aspx

此外各个公司、项目组内部都有自己的建模规范,一种方法是使用现有的规则进行组合,组合成项目的建模规则;另一种是现有规则检查中没有的,就需要进行人工审查或者用脚本实现自动检查。

脚本实现自动检查规则,即在Model Advisor中进行自定义检查规则,用脚本实现规则判断和错误修改等流程。

在Model Advisor自定义检查规则,主要包括以下几个流程:

  • 创建自定义检查
  • 自定义检查回调函数
  • 自定义修改回调函数

​1. 创建自定义检查

首先需要在MATLAB路径下新建一个sl_customization脚本文件,注意这里脚本文件名称只能是sl_customization

  • sl_customization函数,注册自定义检查
function sl_customization(cm)
% --- register custom checks
cm.addModelAdvisorCheckFcn(@defineModelAdvisorChecks);
  • 自定义检查函数defineModelAdvisorChecks
function defineModelAdvisorChecks
% My_Check1 Check Block Name Hiding
rec = ModelAdvisor.Check('My_Check1');
rec.Title = 'Check Hide Block Name';
rec.TitleTips = 'Fail if block name is showing; Pass if block name is hidden';
rec.setCallbackFcn(@CheckBlockHidden,'None','StyleOne') 
% set modify operation
CheckBlockName_Action = ModelAdvisor.Action;
CheckBlockName_Action.Name = 'Modify';
CheckBlockName_Action.Description = 'Click the button to update all specific blocks with hide block name';
CheckBlockName_Action.setCallbackFcn(@Action_CheckBlockHidden);
rec.setAction(CheckBlockName_Action);
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(rec, 'My Checks');

主要功能介绍

rec = ModelAdvisor.Check('My_Check1');

定义一个检查项,以下Title、TitleTips、setCallbackFcn是具体说明此检查项对应的名称、描述、回调函数

ModelAdvisor.Check等相关类均可在Help文档中进行查找

eae86da374b58aafa6fcecee00fc56d1.png

ModelAdvisor.Check相关的方法、属性

da20492dfdbb3efa941dc010ae39e2cd.png

Model Advisor提供了很多API接口,这里不逐个进行介绍,这里只涉及几个基本的API接口,有兴趣的话可以查看help文件

2. 自定义检查回调函数

这一步即对第一步中的回调函数进行具体定义,在此函数中主要实现如何进行规则判断,以及判断结果的输出。

这里代码中举个例子进行说明,新建一个自定义检查项,检查模型中指定块Block Name是否是隐藏了,如果没隐藏,则报错提醒,如果都隐藏了此规则检查即pass。

规则检查思路:

  • 遍历模型中模块,选取BlockType属性为指定属性的块
  • 则对其ShowName属性进行检查,是off还是on
  • 块的ShowName属性是on时,则说明该块不符合此规则,需要保存其结果做错误提醒

这里最主要的是用到find_system函数,在模型中查找指定块,获取该块的句柄,部分代码如下:

    all_blk=find_system(system,'LookUnderMasks','all','FollowLinks','on','BlockType',blk_type{index});
    temp = find_system(all_blk,'ShowName','on');
    blk_showname_value = [blk_showname_value',temp']';

blk_showname_value即保存了所有ShowName属性是on的指定块。

下面部分代码即在获得上述blk_showname_value的结果后,将错误或正确结果显示在Model Advisor中,使用ModelAdvisor.FormatTemplate,该类主要是将检查结果按照模板输出到Model Advisor窗口中,同时生成相应的HTML格式的报告。

setSubResultStatusText、setListObj、setSubResultStatus这些均是ModelAdvisor.FormatTemplate具体的方法或属性,这里也不一一介绍了。

ft = ModelAdvisor.FormatTemplate('ListTemplate');
ft.setInformation('This check looks for blocks that show block name'); % Add description of subcheck to result
if ~isempty(blk_showname_value)
    ft.setSubResultStatusText('Check has failed. The following blocks show block name:'); % Add status to the check or subcheck result
    ft.setListObj(blk_showname_value); % Add list of hyperlinks to model objects                                                         
    ft.setSubResultStatus('warn'); % Add status to the check or subcheck result
    ft.setRecAction('Hide the block name');   % Add Recommended Action section and text
    mdladvObj.setCheckResultStatus(false); 
    mdladvObj.setActionEnable(true);  % Action enable
else
    ft.setSubResultStatusText(['Check has passed. No block shows block name']);
    ft.setSubResultStatus('pass');
    mdladvObj.setCheckResultStatus(true); 
end

Model Advisor窗口中显示检查结果:

e2f036003261c5e337ef07632bf1cf2b.png

生成相应的HTML报告:

6f8f29918639b250f3db13c7a9274102.png

3. 自定义修改回调函数

该回调函数的功能是在检查结果的基础上,实现对部分检查项目的自动修正,例如这里的实例是对指定块的Block Name进行检查,根据检查结果,如果Block Name 是显示状态则检查结果为错误警告,并在下方显示Modify选项,可进行自动修正,自动将块的Show Name属性都设置为'off'

规则修正思路:

  • 重新遍历模型中模块,选取BlockType属性为指定属性的块
  • 则对其ShowName属性进行检查,是off还是on
  • 块的ShowName属性是on时,则说明该块不符合此规则,需要进行自动修正,将其ShowName属性设置为off,
  • 显示修正结果

部分代码如下:

ft = ModelAdvisor.FormatTemplate('TableTemplate');
% Define table col titles
ft.setColTitles({'Block Show Name','Old Value','New Value'})
for index=1:size(blk_showname_value)
   oldVal = get_param(blk_showname_value{index},'ShowName');
   ft.addRow({blk_showname_value{index},oldVal,'off'});
   set_param(blk_showname_value{index},'ShowName','off');    
end

这里修正代码比较简单,把错误块的ShowName 设置为off即可,同时为了方便查看修正结果,使用ModelAdvisor.FormatTemplate该类和相关方法、属性,把修正结果显示在Model Advisor窗口中,如下图所示:

26621e72915a740938f575b224a98677.png
  • 写好sl_customization脚本文件后我们需要先在命令行中运行一下如下命令:Advisor.Manager.refresh_customizations,更新Model Advisor,再重新打开Simulink模型
  • Analysis >Model Advisor >Model Advisor,打开Model Advisor
  • 此时在By Product文件夹下多了一个My Checks文件夹,文件夹下有两个新建的检查规则

fa0c9d0a86fe94dcdfb2944a5d91d7e7.png

实例演示:

  • Simulink模型

部分显示了Block Name

Switch中的Criteria使用了默认值(不是u2 ~= 0)

72acb0023f985fa26833e6fd5b0af485.png

76785d68f22dc5cbe6ec93772acf1b04.png
  • Model Advisor

勾选两个自定义检查规则,并运行

4b07be471293e034799c6ac03316a4b6.png

运行结果,提示有警告

94c43236961322a40a3c52a277dd5c6e.png

250bb07cb614c9f782d1c971cd9f73dd.png

HTML报告:

35f1d480d18cc8fedb16ddb854224c0b.png
  • Modify

对每个检查项Modify

eb6458ae9b9bbe770940e23c0aeeee6c.png

35a44810dbb9a9e346c470cc05b790bd.png
  • Modify后重新运行检查

ea1fd79e6967194ce59dcd50ab0ca7d5.png

两个检查项均通过

b72ca1604a243cd5ad5281b2c50be6dd.png

b53c445b8616b3f8bbb8a17296c4640a.png

HTML报告显示均Pass

3e819e4d178805967da0a9adf4cebe1b.png

脚本和实例模型已上传至百度网盘地址:

https://pan.baidu.com/s/1XY42DG2C2amMBYPiwBmozg 提取码: tnc4

个人微信公众号也同步进行更新,欢迎关注:autogeekengineer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值