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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
; `. |/ ~$ U  _* `

# X! q+ r  `, f" A$ m7 m7 c 6 P0 e; M; `# M) X& G9 G' X2 g

' ~, q' o/ \0 s: N玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
* O* A1 Y; }" [0 j1 e9 p# w6 u! _4 h
(1)Icon Drawing commands,用来绘制block的形状。
: L6 U. [  L" h7 d- W5 [(2)Dialog Callback,当设置参数时,执行相关响应。
0 t$ W9 N9 J# Q- d) \$ Y(3)Initialization command,仿真时的一些初始化命令。
) @0 g# B7 o" {* C, T
7 ^) b6 A8 k8 p5 {1 a. R其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!# p) x, T/ j; c) x

& Q  ]4 o% B: N8 A
; p* g* Y+ h' E& Z" ?& q一、绘图命令执行(Drawing Command Execution)* R6 ~; }9 J  {. E5 [3 ?7 Q) x

/ O( {1 l  A8 `" N3 RSimulink在下列情况下会执行图标绘制命令,重绘模块的图标:1 a% I" m/ o8 @; U* h" U. m% w- k! H

1 C; Y# d& f8 d( D2 v7 y6 \
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作
    7 L7 O$ U3 A* D6 w* S* T
% _) I3 d; O% Q8 q
其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。6 R& j, A  G3 I" m/ M1 `& o
" c  N1 m9 C  |+ O5 T, Y4 t2 i
  s/ Z: z! j2 m) r* e) ~0 e
二、初始化命令执行(Initialization Command Execution)
+ p( K; A9 z6 e2 o, F% ^
! L* z4 I: K9 ~, N
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:+ [$ V4 j3 r4 Z& I
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。
7 J2 x/ m5 n+ ^- m( Z5 k     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)# o8 q3 ]. w8 _8 |
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:9 e  }. c- S* o) c
     (1)更新框图9 J4 T! X% w! h9 F' w
     (2)开始仿真
5 u0 M7 G1 e4 G# l* \     (3)代码生成
# {1 t8 Z0 m& Z) l3 ~
  • 单独某个模块,在下列情况会执行初始化命令:4 |* |# G$ j: X/ o3 D* V
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。
4 @% ]7 o6 |# }3 N     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。, e! ?0 D% ]3 R, ]& X% c3 H* z1 ^
     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。, {% U- a/ W. P
     (4)重新拷贝封装模块。
" Y7 g6 h" X" S/ R; V- I# F2 m0 B
/ Y8 a& z9 H4 o- Z8 Y
三、对话框回调函数(Dialog Callback Code Execution)
+ U6 X" S4 M$ e. A7 u
1 R/ _" s" m# e$ q9 }; V) PSimulink在下列情况执行封装模块的对话框回调函数:
1 H) \# S3 A% N/ S
" A" f; _0 Q2 X- T$ w7 @) L8 H+ \
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的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  P& V; E# }2 F

; j( Z( ^. j- E4 c. b- m: n, k& }0 c4 ~. d
四、三个回调函数的执行顺序(Order of Mask Callback)
% c  k) B- G5 X, i5 X* Z3 O
* k  y* `3 J- ]3 P  m# W$ i5 Y. M从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。6 M7 W) s: H' P% v% o! u' w
6 K0 D# ^% B4 ^$ a% O0 r3 T
(1)双击打开封装模块时
- _) W6 e  L3 ^
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
    1 X; e- A, i% U& S) O; ?9 ^" X# s( G
9 P7 _- m* q0 Z$ `7 |" A2 R9 n
(2)修改参数k,然后摁Tab键* I- x2 l) M3 j5 p9 j4 X
  • 正在执行"斜率(k)"的Dialog Callback...0 V) k' e) C3 O* S3 M% |$ A
, I9 \4 x6 i$ v5 s6 [
(3)修改参数b,然后直接点击Apply按钮% t8 [5 N3 H( R' i; F
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    1 ~# F1 H& j6 u% T; I1 D, ^( B
2 o0 a1 G* I* U+ _$ \0 F
(4)旋转封装子系统(Ctr+R)
+ I' z" W$ H) g' z2 ], J* ~
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    1 J' s  U) ^3 j) S) f  t7 ?4 F
8 _% G" J& L5 C2 f) G3 \2 L
(5)更新Simulink框图(Ctr+D)# c! w9 P  R5 x8 l6 O
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    % P8 v- s1 R3 V- P8 i, |
5 J" z  I9 L. ?0 [& G( S1 I( W
(6)关闭Simulink,然后重新打开模型
* D8 F" [/ m# p& Z
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands..., D5 i$ L$ E& Q% ]/ i' t: g. i
: W$ A! p6 R( R6 K
(7)删除图标绘制命令,重新打开模型
! n2 R8 Y: u- ?; J& d9 S
  • 什么回调函数都没有执行9 q% m- p" ]2 W
' s4 c) M' w3 o6 s

1 I) F: T6 c" `) I% H对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):2 F* {9 B) V) S3 l8 R
(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。; k" V- M& n% t# j
(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。( W& s1 h0 N3 B8 A: [& a7 k
(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。7 D( [/ n8 F6 U
(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
: ]( i% U: c1 z: Q8 ]; X' c(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。
7 ?+ F# r) R' s; I* ?(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。. j! o, p9 U2 M! R9 \1 \9 O! t

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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