文档章节

Simulink 中 model advisor 检查规则自定义

Tomato666
 Tomato666
发布于 2017/09/11 23:32
字数 1706
阅读 4
收藏 0
点赞 0
评论 0

1. Model advisor 检查规则简介

model advisor是simulink自带的静态模型检查器,能够根据设定的规则对模型进行检查,并且能够进行部分错误的自动修改。在汽车电子以及相关基于MBD(Model Based Design)开发的嵌入式项目中有重要的作用,能够帮助开发人员和团队搭建高质量的模型和使用高度统一的风格。自带的检查规则中,包含MAAB这种行业中应用广泛的规则,随着团队或者项目进程的积累,后续会慢慢发展出属于自己的一套建模规则和体系。此时则需要进行对model advisor的检查规则进行自定义。

  • 下图为Model advisor的界面截图 这里写图片描述

2. 检查规则自定义

自定义规则分两种情况,一种是对现有规则进行勾选,组合成团队需要的检查体系,另外一种是编写脚本,创建新的检查规则。在确认现有检查规则中无法满足所需要的检查,则可以进行新规则的编写。例如:

  • 找出所有具有integer rounding mode 配置的模块,并检查这些模块的这项配置是否配成Simplest

这条模型检查规则在官方自带的检查中就没有,如果想要统一团队风格只能通过编写脚本或者组织人工审查,显然作为程序员的我们对于这种选择问题的思考是不存在的,答案只有一个,代码撸起来。 本文主要针对这条规则需求进行编写脚本的详细说明和示例。

2.1 创建新的规则及放到相应目录中

既然是在model advisor中添加新的检查规则,就需要将编写的检查规则都放到统一文件夹目录下,不能与其它检查规则混用。

%--- test_int_round_mode_check function description----------------------------
function test_int_round_mode_check
int_round_mode = ModelAdvisor.Check('int_round_mode');
int_round_mode.Title = 'int_round_mode:Check the integer rounding mode 检查整数舍入模式设定';
int_round_mode.TitleTips = ['Fail if the rounding mode config is not <Simplest>'...
                            '该模块设置如果不为<Simplest>则判断为违反本条规则'];
int_round_mode.setCallbackFcn(@test_int_round_mode_checkCallback,'None','StyleOne');
% publish the check
mdladvRoot = ModelAdvisor.Root;
mdladvRoot.publish(int_round_mode,'TEST'); 

这些代码定义了检查规则的名字、简介、调用具体函数的句柄test_int_round_mode_checkCallback,并将这条规则发布在TEST文件夹下。

2.2 确定是否需要增加自动修改功能

model advisor中,允许进行部分规则的自动修改,就是点一个按钮直接把模型改的符合本条检查规则,这个功能十分实用,尤其对于规模庞大的模型简直就是福音,所以回到本示例中,因为需要检查的内容单一,规则明确,所以可以增加自动修改的功能。当检查出整数舍入模式没有设置成Simplest的模块,点击一个按钮,自动将这些模块舍入模式设成Simplest

% fix action description
int_round_modeAct = ModelAdvisor.Action;
int_round_modeAct.Name = 'Fix settings';
int_round_modeAct.Description = ['Click the button to set all blocks to Simplest'...
                                '按下按钮,将所有模块设置成 Simpleset'];
int_round_modeAct.setCallbackFcn(@test_int_round_mode_checkActCallback);
int_round_mode.setAction(int_round_modeAct);

这段代码定义了修复按钮,按钮名字为Fix settings,点击按钮的句柄为test_int_round_mode_checkActCallback

2.3 关键功能分析

  1. 对于模型中,相关模块的查找,使用find_system(system,'RegExp','On','RndMeth','.'); 可以找出模型中所有具有 integer rouding mode 配置选项的模块。
  • 其中system在脚本中表示当前检查的模型
  • RegExp on 表示开启正则表达式
  • RndMeth 为模块integer rounding mode选项的命令字
  • '.' 指代正则表达式中,所有字符(不为空字符) 综上,这条命令是说,找到当前检查模型中,所有'RndMeth'设置有任意字符的模块。
  1. 使用get_param(all_rnd_meth_block{i},'RndMeth');得到模块的整形舍入模式设定选项
  2. fix action 相关函数
  • 使用如下两条命令创建修复列表模板和修复结果显示 int_round_mode_fc = ModelAdvisor.FormatTemplate('TableTemplate'); int_round_mode_fc.setColTitles({'Block','Old Setting','New Setting'});
  • 使用如下命令在显示面板上增加所修复的目标 int_round_mode_fc.addRow({all_rnd_meth_block{i},current_rnd,correct_cfg_rnd});
  • 使用如下命令进行模块整数舍入模式选项的设置 set_param(all_rnd_meth_block{i},'RndMeth',correct_cfg_rnd);
  1. 脚本的文件名字一定要为sl_customization.m ,并且在将规则添加到model advisor中要使用sl_refresh_customizations这条命令,在不打开模型的条件下执行这条命令,这些是官方规定的操作,不能有改动。

2.4 脚本源码示例

%------------------------------------------------------------------------------
%   Simulink scrip for customer check which used in model advisor.
%   MATLAB version: R2017a
%   Shibo Jiang    2017/8/20
%   Version: 0.1
%   Instructions: Type the 'sl_refresh_customizations' in matlab command 
%                 window with all the model closed. 
%------------------------------------------------------------------------------

function sl_customization(cm)

% --- register custom checks
cm.addModelAdvisorCheckFcn(@test_int_round_mode_check);


%-----Start of test_int_round_mode_check---------------------------------------
    %--- test_int_round_mode_check function description------------------------
    function test_int_round_mode_check
    int_round_mode = ModelAdvisor.Check('int_round_mode');
    int_round_mode.Title = 'int_round_mode:Check the integer rounding mode';
    int_round_mode.TitleTips = ['Fail if the rounding mode config is not <Simplest>'];
    int_round_mode.setCallbackFcn(@test_int_round_mode_checkCallback,'None','StyleOne');
    % fix action description
    int_round_modeAct = ModelAdvisor.Action;
    int_round_modeAct.Name = 'Fix settings';
    int_round_modeAct.Description = ['Click the button to set all blocks to Simplest'];
    int_round_modeAct.setCallbackFcn(@test_int_round_mode_checkActCallback);
    int_round_mode.setAction(int_round_modeAct);                        
    % publish the check
    mdladvRoot = ModelAdvisor.Root;
    mdladvRoot.publish(int_round_mode,'TEST'); 

    %--------------creates test_int_round_mode_checkCallback function----------
    function int_round_mode_result = test_int_round_mode_checkCallback(system)
    int_round_mode_obj = Simulink.ModelAdvisor.getModelAdvisor(system);
    int_round_mode_result={};

    int_round_mode_fc = ModelAdvisor.FormatTemplate('ListTemplate');
    int_round_mode_fc.setInformation(['This check looks for the blocks which integer rounding mode is not configed as [Simplest]']);

    % find all blocks which have 'integer ronuding mode' setting
    all_rnd_meth_block = find_system(system,'RegExp','On','RndMeth','.');
    wrong_rnd_flag = 0;
    if ~isempty(all_rnd_meth_block)
        % find wrong config block
        length_rnd = length(all_rnd_meth_block);
        j = 1;
        correct_cfg_rnd = 'Simplest';
        for i = 1:length_rnd
            current_rnd = get_param(all_rnd_meth_block{i},'RndMeth'); 
            if 0 == strcmp(correct_cfg_rnd,current_rnd) 
                wrong_rnd_flag = 1;
                wrong_rnd_block{j} = all_rnd_meth_block{i};
                j = j + 1;
            else
                % Do nothing
            end
        end
    else
        wrong_rnd_flag = 0;
    end
    % report finding results
    if 0 == wrong_rnd_flag
        int_round_mode_fc.setSubResultStatusText(['Check has passed.']);
        int_round_mode_fc.setSubResultStatus('pass');
        int_round_mode_obj.setCheckResultStatus(true); 
    else
        int_round_mode_fc.setSubResultStatusText(['Check has failed. The integer rounding mode config is wrong']);
        int_round_mode_fc.setListObj(wrong_rnd_block);
        int_round_mode_fc.setSubResultStatus('warn');
        int_round_mode_fc.setRecAction(['Config the integer rounding mode as [Simplest] .']);
        int_round_mode_obj.setCheckResultStatus(false); 
        int_round_mode_obj.setActionEnable(true);
    end

    int_round_mode_fc.setSubBar(0);
    int_round_mode_result{end+1} = int_round_mode_fc;  

    %--------------creates test_int_round_mode_checkActCallback function-------
    function int_round_mode_ActResult = test_int_round_mode_checkActCallback(taskobj)
    int_round_mode_obj = taskobj.MAObj;
    int_round_mode_ActResult = {};
    system = getfullname(int_round_mode_obj.System);

    int_round_mode_fc = ModelAdvisor.FormatTemplate('TableTemplate');
    int_round_mode_fc.setColTitles({'Block','Old Setting','New Setting'})

    % find all blocks which have 'integer ronuding mode' setting
    all_rnd_meth_block = find_system(system,'RegExp','On','RndMeth','.');
    % fix wrong config block
    length_rnd = length(all_rnd_meth_block);
    correct_cfg_rnd = 'Simplest';
    for i = 1:length_rnd
        current_rnd = get_param(all_rnd_meth_block{i},'RndMeth'); 
        if 0 == strcmp(correct_cfg_rnd,current_rnd) 
            int_round_mode_fc.addRow({all_rnd_meth_block{i},current_rnd,correct_cfg_rnd});
            set_param(all_rnd_meth_block{i},'RndMeth',correct_cfg_rnd);
        else
            % Do nothing
        end
    end

    int_round_mode_fc.setSubBar(0);
    int_round_mode_ActResult = int_round_mode_fc;  
    int_round_mode_obj.setActionEnable(false);

%----End of test_int_round_mode_check -----------------------------------------

2.5 效果展示

  1. 将脚本放到matlab工作目录下,然后在命令窗口输入sl_refresh_customizations这里写图片描述

  2. 打开模型,并打开model advisor 这里写图片描述 可以看到,我们编写的规则已经在 By Product/TEST目录下了

  3. 点击检查本条规则 这里写图片描述 可以看到检查结果,并能够链接到模型上相应的模块。

  4. 点击修复按钮 这里写图片描述 能够看到修复的结果

  5. 再次点击检查按钮,验证本条规则是否通过 这里写图片描述 可以发现已经正确修改,本条规则已经检查通过了。

3. 备注

编写的规则存在一些使用上的bug,和Matlab版本有关,例如在Matlab2017a中,仅在第一次打开matlab时才能使用sl_refresh_customizations命令进行model advisor的规则更新,如果修改了脚本代码,再次进行更新则会失败,此时需要重启Matlab才能更新,而这个问题在Matlab2016a中不存在。

© 著作权归作者所有

共有 人打赏支持
Tomato666
粉丝 0
博文 3
码字总数 3893
作品 0
苏州
spring-aop组件详解——Pointcut切点

Pointcut(切点)是面向切面编程中的一个非常重要的概念,此概念由spring框架定义。Pointcut的唯一作用就是筛选要拦截的目标方法,因此,有很多人会把Pointcut直接理解成——要拦截的方法,其...

拉风小野驴 ⋅ 2016/06/03 ⋅ 3

Think PHP 自动验证中使用自定义函数

要使用自动验证功能一定要使用 ->create()方法 在common 中写入你的自定义函数 function chickCount($a,$b=6,$c=12) { $countA = strlen($a); if($countA >= $b and $countA <= $c ) { retu......

mickelfeng ⋅ 2012/10/30 ⋅ 0

MATLAB 添加自定义的模块到simulink库浏览器

在simulink 浏览器窗口File->new->library,打开编辑窗口,将自定义的模块托人编辑窗口。保存为DCMOTORsub_lib.mdl文件。新建function文件,编辑如下,保存文件名为 slblocks.m function blkS...

Mico_liu ⋅ 2014/05/12 ⋅ 0

matlab神经网络工具箱创建神经网络

http://blog.sina.com.cn/s/blog_8684880b0100vxtv.html 为了看懂师兄的文章中使用的方法,研究了一下神经网络 昨天花了一天的时间查怎么写程序,但是费了半天劲,不能运行,百度知道里倒是有...

zzx90 ⋅ 2015/02/07 ⋅ 0

kohana-acl模块之技术调研

对kohana的acl模块进行技术调研,主要是对AACL/deputy/bonafide3个开源项目进行调研,调研结果如下: 1 AACL https://github.com/banks/aacl 资源接口 */interface AACL_Resource{/** 资源id */...

shigebeyond ⋅ 2013/11/02 ⋅ 0

5分钟认识Simulink仿真

相信工科生都听过Simulink这个神器,要是能在毕业设计中做个仿真,论文的逼格立马上去了,是不是? Simulink是一个对动态系统(包括连续系统、离散系统和混合系统)进行建模、仿真和综合分析...

牛河 ⋅ 2017/12/12 ⋅ 0

yii验证表单

1、yii框架中验证的类文件: 上面红线内是验证的具体的类文件,下面的这个文件制定了类的别名。 2、验证邮箱的时候默认不能为空,除了可以在模型里面设置为required外,还可以在模型的rule里...

菜鸟飞来 ⋅ 2014/05/07 ⋅ 0

Yii 2 —— 字段校验

1.1 字段校验 1.1.1 简介 开发Web应用有一个很重要的原则,就是不要相信任何输入的数据,在使用之前必须要进行有效性检查,否则很有可能会引发各种安全性问题。Yii 2当然也不会忽略这个问题,...

tywali ⋅ 2016/11/22 ⋅ 0

MatLab 组件大全

MATLAB 矩阵实验室 7.0.1 Simulink 仿真 6.1 Aerospace Blockset 太空模块 1.6.1 Bioinformatics Toolbox 生物信息工具箱 1.1.1 CDMA Reference Blockset 码分多址参数模块 1.1 Communicatio......

机器的心脏 ⋅ 2017/12/15 ⋅ 0

利用URL Protocol实现网页调用本地应用程序

自定义URL Protocol 协议 一些应用软件可以在浏览器中点击一个url后自动启动,并执行操作。这是咋实现的呢? 我在 google了许多也找个博客说明。接照这些文档我也新手试了一下。 通过网站调用...

robinjiang ⋅ 2016/11/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 47分钟前 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部