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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
! p) Q* `# W( s" Q- `( \, ^5 g
( i2 i3 r1 O. s# f& O9 u
' _- y9 n. c9 P6 n

# K; n: L1 O1 k  w% L" {" M玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
9 m, A2 k' z( W+ F: T; t( q/ t3 w4 g: Y) G; c  b7 i
(1)Icon Drawing commands,用来绘制block的形状。' ]. ?- E; W3 [3 Y, E% h' {
(2)Dialog Callback,当设置参数时,执行相关响应。
! T) I% h& [+ j/ O$ O4 b(3)Initialization command,仿真时的一些初始化命令。
8 O' c9 R  t3 W7 V6 _
8 N% ^* @' |+ |3 m其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!8 s$ w! V) z* Q( u" _
7 k" ~7 o2 P7 T. F# ~

* M2 P+ _: w% |- V3 d一、绘图命令执行(Drawing Command Execution)
7 U, s7 j8 D; N3 c7 K- V" t( t
% R9 G' H+ u5 }8 L0 @+ u: NSimulink在下列情况下会执行图标绘制命令,重绘模块的图标:+ A0 r* L7 D0 _1 B. |- c1 z  A0 S

/ G/ K+ y3 @; M+ f
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作3 e5 G5 s2 S  R  l/ O4 j
5 G* [& |# `5 C  y# }- O
其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。1 L/ b- I" Q! \( D! ]) V) q: G! _0 O
8 w; }0 \8 P& ]

5 O+ Y6 t+ w  M% A# y二、初始化命令执行(Initialization Command Execution)
* Q9 e: ^: c* `9 d: M' ^- ~9 {& d# N
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:
    2 Z2 x2 M4 I( g( b$ I
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。: N# g9 V0 n# I, h' F
     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)  X9 a$ Q% B* N. U  y
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:
    1 q% V" r% Z" _0 R0 f
     (1)更新框图
+ R+ }, M4 e. ]# Y, M- F     (2)开始仿真, a9 `( s! j8 m9 Z; \# M
     (3)代码生成7 r9 o& D7 F0 M: w* _
  • 单独某个模块,在下列情况会执行初始化命令:* r$ n+ }) D. J$ P
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。1 L2 W+ c% p" A# h9 h
     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。
& B8 C) g: M8 [5 t     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。6 I. P- O, ?% s. f, F
     (4)重新拷贝封装模块。
) e7 e* G  F5 e2 |+ W* }" H" y. x3 k9 M3 g" i. {. I0 J

2 R8 P1 [6 x, a6 J1 F4 a4 {三、对话框回调函数(Dialog Callback Code Execution)
) }# B, s& E. w9 x  P5 X8 x; V! O& {' T; Z) A. e: |
Simulink在下列情况执行封装模块的对话框回调函数:* n4 ?5 A3 z/ d% ?* ^

% L/ Y! q( ]- M2 W% 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 diagram
    . V5 E0 P' N0 R6 k/ m& }( `

; x& G# C8 i- t. c/ i+ }! R! B: `7 E" ~( q9 C' S
四、三个回调函数的执行顺序(Order of Mask Callback)
7 C9 Q: o. n- J0 G/ k* |' R, a* g+ c
从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。* S3 l6 o" h9 N" a9 ^
8 y1 x0 d* B9 @
(1)双击打开封装模块时
7 \3 M! L: V1 y
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...! s. o  B% D( r: M! y# N) E

* v1 C2 a2 I: `* J+ J6 Z(2)修改参数k,然后摁Tab键9 J5 V3 k2 l: j# u
  • 正在执行"斜率(k)"的Dialog Callback...
    # o7 [. m) k( Y% K. W" D0 s0 S

5 Z. k, J' y' x5 Z+ L. M! [7 M(3)修改参数b,然后直接点击Apply按钮
4 W3 R# N) M' ~; g( E
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    % n" q. C1 P7 {4 w' l- Q( ^; R" G
' E. ^  h) e* w- D9 v. _
(4)旋转封装子系统(Ctr+R)
5 X" W) p4 y0 d- _% g
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...: }) i4 u3 W' Q" C
' ~, J8 U+ J: o  Z
(5)更新Simulink框图(Ctr+D)
; m; u  Z, j: T# z
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    - ~  B( t, l" F- ?8 L* R
4 ?+ ]& m* u8 P! b. B3 M/ w( r
(6)关闭Simulink,然后重新打开模型
' W& }# \( }- p
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    % S# T) s. S3 h

1 {3 ]/ i% S% v! F, j/ I(7)删除图标绘制命令,重新打开模型0 `3 R0 d) `# q
  • 什么回调函数都没有执行8 Z% T1 G7 ^0 z6 `9 b3 b: J  I; G" g

9 t+ h0 F) _1 A0 M3 Z* r$ m
/ B. p. r% ^% S$ D( }+ s2 m对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):" k  Q( ^  q- o: W" f0 ~8 L& j! {
(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。4 }! V( Q# p; k5 d4 r- L+ a8 ~
(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。
$ M" B- C9 g) A3 B4 }(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。. C! G) `( a$ _' z* p$ R
(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
3 ~' Z5 ?' p% M6 b  X( Y6 b. M(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。
' B9 E, [6 S9 A1 i! j. ?(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。
& B( O! y( e7 T; I1 h

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-1 02:39 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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