matlab错误: 此上下文中不允许函数定义。_MATLAB自动化——在Model Advisor中自定义检查规则(一)...

本文介绍如何在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进行规则检查

4e51fd691c01cf616e64cba1f8362c33.png

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

c6ea7da1609f941cf9c5bd9c3acd3671.png

7306f65b0dc1061ba221d33bbe250340.png

Html格式报告

b123ef92b52c7a52f5086f6c55bf7998.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文档中进行查找

d3e47bbef4f2d41bd5356fcfa04a9c5f.png

ModelAdvisor.Check相关的方法、属性

808889b264e5a7329e643dfc7ee14d24.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窗口中显示检查结果:

88c378cf3bd8b4b635da016e616d09a1.png

生成相应的HTML报告:

cd4e375776784285fed25d8356f81b5b.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窗口中,如下图所示:

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

faeec33a3a2cf2acaa545014587631c1.png

实例演示:

  • Simulink模型

部分显示了Block Name

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

90fa2f2dbc67e5b615be27b0550d9cb5.png

371272115b597251246c5a5482168ca7.png
  • Model Advisor

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

239ddbaeb52a0259146ab07b4e241ce9.png

运行结果,提示有警告

17431889038a7b5f9f88bbee02b48f53.png

939c9732909d0630a27ad6b975007991.png

HTML报告:

16b3bdab43255dfac2106ffd3d385246.png
  • Modify

对每个检查项Modify

939917b1b6cc775659774cb84a52e0a9.png

a15ba54ca6fee259dd14d3458ce5c90b.png
  • Modify后重新运行检查

d2068f10eda477da5983100598b1522f.png

两个检查项均通过

c1c880b1e93f8562b40a693b2ea2570b.png

31225aa50174b90cb0e999a0f5d94157.png

HTML报告显示均Pass

309282964c0e3c0c0e87ff6f181bc09b.png

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

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值