找回密码
 注册
关于网站域名变更的通知
查看: 1126|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-5 09:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
) E+ ^+ Y1 w) \. d6 ]

$ X8 K3 D4 B% x& E/ ^: S+ f 1 m! e" l' U- U- n+ h9 m8 x9 x6 c7 p
' x  e( ~5 S; ~
玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
. \# }6 g* s5 d% g
# E9 W( y! }( i: r6 n( m4 }5 n7 W. t(1)Icon Drawing commands,用来绘制block的形状。
. L4 E9 o5 A3 W% q2 ^/ a(2)Dialog Callback,当设置参数时,执行相关响应。
; P0 M' q% a1 R9 V+ Z(3)Initialization command,仿真时的一些初始化命令。8 s8 r: @6 q4 S6 q$ b+ r

. ~3 M: ~9 S8 B7 r其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!
6 I- G3 D) E- E, Y+ F  d" A6 X7 F- f; \5 \) O
- V5 q; L1 |. m" i* Z, e# a3 A; Z
一、绘图命令执行(Drawing Command Execution)0 Q) {5 Z7 \% z

( l& C- w& b) \Simulink在下列情况下会执行图标绘制命令,重绘模块的图标:
* ]1 @! \* r& V2 S/ f, N; n+ ?
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作3 r; J) b) }5 J1 D3 T

( I9 K1 O4 n% a6 E- x! `, c其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。
( G( G- k9 b+ Y% |9 j$ ~8 y* m$ A$ o+ f
$ h/ f5 O- ^" f- ^% g) X
二、初始化命令执行(Initialization Command Execution)+ w( q4 d0 a5 M& r- P' m9 j: [
8 |, X; G  c, R2 a9 C& f/ A9 {
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:
    # H8 O, @" I4 N, w( o# M
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。5 N4 G4 h. W* @# J' `
     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)
' z' z3 r% C9 I1 A( m
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:( r6 i" l! }6 M* k0 ^* S5 e
     (1)更新框图
' J6 j. N3 O; i; |1 {     (2)开始仿真0 M- e. [. P: S! V$ _
     (3)代码生成
$ y- K- d  D1 w0 l! Z$ T, C0 b
  • 单独某个模块,在下列情况会执行初始化命令:
    3 C3 k# j) l4 w3 ]
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。5 a  |/ r' o5 ^/ l+ Y
     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。$ Q1 {& p& C- v5 |# c
     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。
: d* ?, w( V- F; Z! c8 ^5 L# w     (4)重新拷贝封装模块。! O2 u) ~6 `  i( J8 S
; D+ u, x  @0 W% K1 b- {

/ l" B* @1 q8 s三、对话框回调函数(Dialog Callback Code Execution)) V5 a% A& N8 h$ _, b

! C$ Z- d8 Z: e# d7 JSimulink在下列情况执行封装模块的对话框回调函数:
( E! ~: h4 U7 Q6 a5 g+ H. @$ I- A0 P' p4 I6 q
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的Dialog Callback。
  • 在Mask Edito中修改参数的取值,然后把焦点切换到其它地方(比如摁下Tab键,或鼠标点击其它地方)。注意使用set_param函数设置参数,并不会执行Dialog Callback。
  • 在Mask Edito中或使用set_param函数设置参数,并点击Apply或Ok按钮。Simulink在执行Dialog Callback后接着执行Initialization初始化命令,然后图标绘制命令。
  • 更新Simulink框图,比如快捷键Ctr+D,或者菜单Simulation→Update diagram6 m$ H) ~4 E2 Q: W% l( w

) d# `  y  i4 D8 R7 g
3 {- R% D2 @" J  L; D6 l6 S& j1 X四、三个回调函数的执行顺序(Order of Mask Callback)# K3 b0 _! V4 v) a" ~0 _
+ V: `) P; l( ~$ ]& W! S8 ]
从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。; h4 m  k! M" ^; U5 f

" C. @* c- ]& k(1)双击打开封装模块时! Z* E- f3 @4 H  y6 m3 m( r# Y* I1 M; Q8 v
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
    , d3 O& e/ C2 e2 p

4 @- n; T4 z' X* e, g- C(2)修改参数k,然后摁Tab键
: d  r8 U; c% |  {5 z6 L
  • 正在执行"斜率(k)"的Dialog Callback...7 ~$ ^) e$ W. G2 C
4 s- l, i9 \* _7 z$ W
(3)修改参数b,然后直接点击Apply按钮. x7 o( ]9 a$ c8 I
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...* m4 c% _7 S  N' u/ q% _

! f3 p+ k  g7 s(4)旋转封装子系统(Ctr+R)0 h1 k7 N/ }' B/ @$ _" S
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...6 c& s, L0 K4 ~3 A, v9 M9 L
! D0 b7 Y9 ]4 J% u
(5)更新Simulink框图(Ctr+D)2 m: m# t% E9 g0 v# }; D
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...  O: Z# a, w! T) y: }' n, k$ P& j4 J
1 Q" N4 N/ `. D  Z
(6)关闭Simulink,然后重新打开模型
2 d) c. T$ Y( i4 r
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...3 W* I8 n/ U5 h
! J. l, T* w/ `# g) x; q
(7)删除图标绘制命令,重新打开模型
% h) t* k5 s4 B  s8 W: A& V
  • 什么回调函数都没有执行
    ( ?7 ^6 ]  ^, z" L% |
+ e2 O, X4 @, j; c& I- C
4 ?; F7 i  l2 s- }4 q0 K
对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):
  W, f2 @7 c4 u: E% A8 j(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。
4 `- u; f$ b; P% `# v" [# W' ?(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。7 Q2 t( {+ v' [: P
(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。
- Y( J4 {: ]& q) c4 V. w7 g6 Z(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
7 I4 ?& e: U4 m2 G/ W(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。
8 m0 N2 ?1 f" A1 J2 `(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。
5 M/ ~" u' O, u9 x# o

该用户从未签到

2#
发表于 2020-2-5 18:48 | 只看该作者
思路很清晰哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-5 23:13 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表