在基于模型的设计开发流程中,模型验证是一项很重要的环节。
模型的验证,不仅包括模型各个子模块功能性的验证,也包括模型的规范性检查,检查模型是否符合MAAB、MISRA AC TL或者其他建模规范。如同在常规手写C代码开发过程中需要检查是否符合MISRA C等标准一样。
在Simulink开发环境中,Model Advisor 是一种Simulink自带的静态模型检查工具,能够根据设定的检查规则对所建模型进行检查,并且能够部分错误的自动修改。
Model Advisor的使用
打开Simulink模型,Analysis >Model Advisor >Model Advisor
勾选需要检查的规则,在右侧点击Run This Check进行规则检查
右侧显示检查结果,同时可打开生成的报告
Html格式报告
常见建模规范
-
- 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文档中进行查找
ModelAdvisor.Check相关的方法、属性
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窗口中显示检查结果:
生成相应的HTML报告:
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窗口中,如下图所示:
- 写好sl_customization脚本文件后我们需要先在命令行中运行一下如下命令:Advisor.Manager.refresh_customizations,更新Model Advisor,再重新打开Simulink模型
- Analysis >Model Advisor >Model Advisor,打开Model Advisor
- 此时在By Product文件夹下多了一个My Checks文件夹,文件夹下有两个新建的检查规则
实例演示:
- Simulink模型
部分显示了Block Name
Switch中的Criteria使用了默认值(不是u2 ~= 0)
- Model Advisor
勾选两个自定义检查规则,并运行
运行结果,提示有警告
HTML报告:
- Modify
对每个检查项Modify
- Modify后重新运行检查
两个检查项均通过
HTML报告显示均Pass
脚本和实例模型已上传至百度网盘地址:
https://pan.baidu.com/s/1XY42DG2C2amMBYPiwBmozg 提取码: tnc4
个人微信公众号也同步进行更新,欢迎关注:autogeekengineer