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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
( I, R9 ?$ Q7 `

# N/ R9 \' B7 ]# E " ?% J& L2 A$ h# {  _* z
; `5 W. K7 e' {$ B' Y( ^) G
玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
$ R: v3 k8 J+ _. Y# P/ y: I0 l8 c( c+ k) B  o$ t
(1)Icon Drawing commands,用来绘制block的形状。
; {8 b/ ~6 Q1 B( t(2)Dialog Callback,当设置参数时,执行相关响应。* `0 m7 s5 B7 `4 M5 ]; v$ n5 }
(3)Initialization command,仿真时的一些初始化命令。$ G2 {( X/ }; ?1 T. s$ B

) c0 o- x, S7 [, _9 T其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!
! Q9 |$ b) r+ A
, m5 M  _+ D# q
( Q/ m5 h7 |) J' G; G$ }一、绘图命令执行(Drawing Command Execution)
2 E" ~2 _" e& O- s( Z" r1 q2 a1 v
3 W9 G% y4 Z2 N. @5 `  w* aSimulink在下列情况下会执行图标绘制命令,重绘模块的图标:
% i2 \6 j2 s2 S( [% m/ X
. l/ ~' X, `2 v
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作! [6 e; A1 \& z+ A  A9 G

* a: B4 q1 ~; J) S其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。1 h2 e- g) S/ {
! ]) D7 S- w* G. _8 I

( J; Z  W: Y3 p1 @2 X% l二、初始化命令执行(Initialization Command Execution)
% E( \0 l; ?) |' O3 j7 F* Z# V- W
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:
    & t6 a1 \/ q; ]: }, o. G+ b
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。+ I, I# e/ `  x/ }" o
     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)5 w+ A' o0 Y$ }) W, n0 p
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:
    $ }! x8 r- l- s
     (1)更新框图( X. S/ ?% B# v7 J
     (2)开始仿真
: z+ f# D3 T6 P. o- a, j     (3)代码生成2 l; ^; n: q4 l8 e
  • 单独某个模块,在下列情况会执行初始化命令:+ \7 f* b( `3 _$ W4 u" x. c
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。
$ v/ s7 C  V! G0 S     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。. Z! e0 K# i$ \" h8 {0 T
     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。
- ]! E, W. O- g% O8 }9 ]7 ]     (4)重新拷贝封装模块。0 {! P2 V$ ?9 F2 d' J  ]

$ d* U( k( F0 W2 V+ c. D6 g$ x( r" i( m, N
三、对话框回调函数(Dialog Callback Code Execution)
* j. {6 P+ N. m: h" S+ [- G7 a
' s4 T9 n2 B0 x0 B6 WSimulink在下列情况执行封装模块的对话框回调函数:
  X, F" W: _$ j/ L( g" M5 h; l8 y# A% e7 R  }) N8 }3 t
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的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) q! x5 |, _) L6 q6 @! Z. j

% `: y) y; Z6 W0 }2 g& }( X; L5 E; A8 r! W( q
四、三个回调函数的执行顺序(Order of Mask Callback), M. \$ ?& a2 u' a# f. x0 `( S
9 s9 v3 d3 c5 e7 O
从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。
/ }" E9 \) n  u% u& M5 Z7 ^) ?& k
9 d/ l; Q, X; I) q" B9 U(1)双击打开封装模块时
. B( a" T5 o: j9 o" M9 }
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...* R' Q4 Y9 [8 m: M$ x: i

' _* E; r$ I; m+ P(2)修改参数k,然后摁Tab键
, Z$ P/ U1 \1 a2 |- t
  • 正在执行"斜率(k)"的Dialog Callback...) U7 a# b% J4 r! j0 t

. X! s9 h0 n0 F(3)修改参数b,然后直接点击Apply按钮% P! ^7 ~- \" J
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    3 q6 E- ~  V( _& M

8 c. r0 f% `* h$ I7 T# Y/ w(4)旋转封装子系统(Ctr+R)
( S4 I7 M% d# h
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands..., V% Z; t* t" v, b; Z
% w& G5 F* w- V3 O
(5)更新Simulink框图(Ctr+D). q9 |- c% k" \5 v# Y  ]  E& ^" c
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...2 X4 G" s. i) a+ Q2 ^

* I0 ^! T  e! S' W(6)关闭Simulink,然后重新打开模型
' q, y* l& l! h4 }4 L( T/ Y
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...8 I, X* m- I' w# T* \; v
3 w# A( |. c" t1 y! X5 C
(7)删除图标绘制命令,重新打开模型3 T- l) T) j8 W
  • 什么回调函数都没有执行
    8 o$ A  t" H9 P0 |4 \. Q( u

4 ~: J: _; C) D, R! a4 i7 C. n( b( K- Y# z2 q2 X
对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):" }. k. @/ N5 Z. Y3 i. h! e5 y
(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。- j* ^: {+ l$ v8 r( ~
(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。. g, ~# Q8 J% s- s; J! t
(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。
* J" z! N8 K7 d, D(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
& ?/ g- h5 z  n2 ?4 R) N5 H(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。& A) K* Q/ Q2 G3 r/ l
(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。# x8 D2 X3 F) d0 H' ]$ \

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 04:03 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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