QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2775|回复: 0
打印 上一主题 下一主题

Simulink动态封装子系统(2):回调函数触发条件和执行次序

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2015-1-22 15:03 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:

    (1)Icon Drawing commands,用来绘制block的形状。
    (2)Dialog Callback,当设置参数时,执行相关响应。
    (3)Initialization command,仿真时的一些初始化命令。

    其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!

    一、绘图命令执行(Drawing Command Execution)

    Simulink在下列情况下会执行图标绘制命令,重绘模块的图标:

    修改封装参数(mask parameters )取值后。
    当调整封装模块的外形时,比如旋转等相关操作

    其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。

    二、初始化命令执行(Initialization Command Execution)

    打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:
    (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。
    (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)
    模型中的所有封装模块,在下列情况下会执行初始化命令:
    (1)更新框图
    (2)开始仿真
    (3)代码生成
    单独某个模块,在下列情况会执行初始化命令:
    (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。
    (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。
    (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。
    (4)重新拷贝封装模块。


    三、对话框回调函数(Dialog Callback Code Execution)

    Simulink在下列情况执行封装模块的对话框回调函数:

    打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的Dialog Callback。
    在Mask Edito中修改参数的取值,然后把焦点切换到其它地方(比如摁下Tab键,或鼠标点击其它地方)。注意使用set_param函数设置参数,并不会执行Dialog Callback。
    在Mask Edito中或使用set_param函数设置参数,并点击Apply或Ok按钮。Simulink在执行Dialog Callback后接着执行Initialization初始化命令,然后图标绘制命令。
    更新Simulink框图,比如快捷键Ctr+D,或者菜单Simulation→Update diagram


    四、三个回调函数的执行顺序(Order of Mask Callback)

    从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。

    (1)双击打开封装模块时
    正在执行"斜率(k)"的Dialog Callback...
    正在执行"截距(b)"的Dialog Callback...

    (2)修改参数k,然后摁Tab键
    正在执行"斜率(k)"的Dialog Callback...

    (3)修改参数b,然后直接点击Apply按钮
    正在执行"截距(b)"的Dialog Callback...
    正在执行Initialzation...
    正在执行Ico Drawing Commands...

    (4)旋转封装子系统(Ctr+R)
    正在执行Initialzation...
    正在执行Ico Drawing Commands...

    (5)更新Simulink框图(Ctr+D)
    正在执行"斜率(k)"的Dialog Callback...
    正在执行"截距(b)"的Dialog Callback...
    正在执行Initialzation...
    正在执行Ico Drawing Commands...

    (6)关闭Simulink,然后重新打开模型
    正在执行Initialzation...
    正在执行Ico Drawing Commands...

    (7)删除图标绘制命令,重新打开模型
    什么回调函数都没有执行

    对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):
    (1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。
    (2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。
    (3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。
    (4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
    (5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。
    (6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。


    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-22 12:42 , Processed in 0.423458 second(s), 50 queries .

    回顶部