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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
/ S: B8 c2 c8 b

8 `1 h. m( h2 ~9 E1 q
+ a9 `3 |; z! l3 ^0 P/ r+ P% X+ i% m* S2 K
玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
: L5 z' L# H9 [) Z, }! ]
/ x. z9 B3 c+ b. a5 I; t: j(1)Icon Drawing commands,用来绘制block的形状。
4 n8 J/ q: X8 ]# i& I$ L(2)Dialog Callback,当设置参数时,执行相关响应。/ E) Q/ p. C  p5 F3 {
(3)Initialization command,仿真时的一些初始化命令。
( M  Z* _/ r+ s, Y  M& T7 C, S8 e  j3 M! F7 P
其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!
6 b" ]4 w$ B* I4 l
- D7 S/ ?$ x6 @" }, q1 N- W0 o7 e! `
一、绘图命令执行(Drawing Command Execution)" E* I  ~7 q. P+ r4 |
6 ?. v6 i5 p* W
Simulink在下列情况下会执行图标绘制命令,重绘模块的图标:
) {" m5 d- J. |; [" s2 Q( M9 {8 @8 k$ x/ o1 ^
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作
    ( X) e' B0 F1 [* K
6 N3 C) F$ |  `' ?$ w
其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。& L2 M: z7 n. s& h+ ]  E4 R9 j
: S# ^' P; T3 p0 R1 {) n0 p! D
  O0 X5 e3 O1 Z  g4 t
二、初始化命令执行(Initialization Command Execution)1 F/ x+ k! K2 N& G, e! w
0 R  O& h: q9 O) U7 K
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:
    3 _9 k: h6 W' ?& X0 w; `6 n  Y% ]0 S, _/ y
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。
* W# R0 U+ A6 V: o: C( a9 Y% L6 {     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)
9 d. K9 v4 b- Z  A' y6 P
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:
    2 |" n8 e4 v; p/ o
     (1)更新框图
6 q% z: P! m6 z# I+ J/ \     (2)开始仿真
- I6 b7 S1 j; K. m4 c/ N2 u     (3)代码生成/ f( k) C" K: {6 r
  • 单独某个模块,在下列情况会执行初始化命令:
    - q4 g  E, K1 P% h0 ^
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。. J8 D5 U. M1 Y$ O' e4 N
     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。
! U( s6 ?1 Z2 ^; p6 P2 A     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。
6 U& {7 m  ^: Q' C& e' Q     (4)重新拷贝封装模块。  ^( ^: \( M6 `& g0 j; \

; U7 v! X) d3 ~' n% g, p. S: H7 N$ |8 g4 {: x7 l5 k& {
三、对话框回调函数(Dialog Callback Code Execution)6 k4 t, D4 z4 ~  {8 b! Y

/ ~& t1 [) R4 h  x1 D! C5 dSimulink在下列情况执行封装模块的对话框回调函数:
8 P$ H% y: K. X; F$ Z+ S% t
1 Q+ w$ a0 D/ @
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的Dialog Callback。
  • 在Mask Edito中修改参数的取值,然后把焦点切换到其它地方(比如摁下Tab键,或鼠标点击其它地方)。注意使用set_param函数设置参数,并不会执行Dialog Callback。
  • 在Mask Edito中或使用set_param函数设置参数,并点击Apply或Ok按钮。Simulink在执行Dialog Callback后接着执行Initialization初始化命令,然后图标绘制命令。
  • 更新Simulink框图,比如快捷键Ctr+D,或者菜单Simulation→Update diagram5 v2 U  y. U( x" e" x

  A' M' P* v) d0 Y0 H7 ~+ @2 T5 {5 }. ~& Y0 m
四、三个回调函数的执行顺序(Order of Mask Callback)4 G4 t! J6 N6 P4 y  V' q- E

9 D' o: d2 R) h( Y) v" y从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。; X0 b1 M% D, Y# j! @; M9 q
4 i; N6 c6 q- m3 N, R
(1)双击打开封装模块时
+ D+ I: N7 L/ ]. Z) t, U% ~
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...& G4 W7 ^# x( _3 L% n
( l( N# z0 o7 S2 E! R0 u0 o
(2)修改参数k,然后摁Tab键3 ^2 X) }" O7 d* O3 d3 u+ P4 }
  • 正在执行"斜率(k)"的Dialog Callback...
    % q9 C3 F7 G; i& S

6 A; \$ X' Y0 X5 k* c(3)修改参数b,然后直接点击Apply按钮
/ p; ]: h  [) A! e! S
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    # D2 t) y4 B& _/ l
* s1 E" e' P( \0 E& f  I; m  \
(4)旋转封装子系统(Ctr+R)9 _! ]- j! N& d5 H/ }+ t
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...2 r1 |, U% l6 r  \2 J2 r
6 f- I2 c9 N6 `3 f) G+ K: Z
(5)更新Simulink框图(Ctr+D)! q, E7 C& ?2 T6 n& i; t
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands..., U* f4 }. V! i

7 A2 h) s" G% W, s- a. ~(6)关闭Simulink,然后重新打开模型
# H3 w: I0 ^/ I
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    * ~/ f! _, O- I
5 c4 [* G! o1 H" P  [- ?8 I3 J
(7)删除图标绘制命令,重新打开模型! y5 }' F6 V$ W& T8 `9 I4 m7 E
  • 什么回调函数都没有执行. C; z3 |/ n0 V* T
! I/ ?' W$ A  ^" m. g3 `
  K# U' _8 H7 g3 e: Q
对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):
6 f* g6 F8 }) L& Z5 \/ N+ D8 v(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。
0 o" m2 B( g- r2 Y# |2 ~- r(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。0 U  f& a5 K' J8 `
(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。
9 m+ M* v7 s: d' ]) k2 S(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
2 I/ j7 o  _/ k(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。" _5 L4 l+ O: d& u. O8 T# I  O
(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。
' x1 J5 D+ u+ z; a- N# s+ L

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 21:30 , Processed in 0.187500 second(s), 26 queries , Gzip On.

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

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

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