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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
. v: M9 E) }$ m1 A" _1 V, x
- a) Y3 e5 D* y, B8 @! V% j
- T3 H4 W, d; @3 K/ h
$ d3 c4 @/ u, y4 {8 I% G% B
玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
4 c: j+ \1 @) z" l  q1 C" r1 p; [& D1 X
(1)Icon Drawing commands,用来绘制block的形状。
6 W3 z$ [- c& z7 e* }$ h4 i( l(2)Dialog Callback,当设置参数时,执行相关响应。) z" f& t/ m- n; o0 B6 |
(3)Initialization command,仿真时的一些初始化命令。
9 h3 n, C: P1 i& H1 r, L3 C
# z2 M: Q; ~9 n# Y其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!0 i) J/ P* P8 C, e9 M# |" l

* ?9 i) C! [0 q" g* E4 s
& c+ \/ X1 y1 ?6 R, \; \' q一、绘图命令执行(Drawing Command Execution)
2 x1 c. F9 ~- L- M7 l
/ E# ^  C9 m" K& e, j" \Simulink在下列情况下会执行图标绘制命令,重绘模块的图标:! V$ a, i' {& O6 L
$ J! q% X1 w4 N0 V
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作! r& l# D; Z8 c( p

+ \- ~$ i: r  n3 h2 F' I" O其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。! {: E8 W' U4 K. p& q2 z: T
" Q: X4 Q* V' c% }1 a. ~+ v7 \, d

* ^8 Y3 u! Z0 [. Z: h7 k3 A二、初始化命令执行(Initialization Command Execution)3 P  }! y1 B7 @
( b% |# u2 E" f1 `  C9 }7 p  V
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:
    , E% d6 G) T; h: g6 p8 n& U
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。* k+ {6 ?; u+ ~' r2 j
     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)
, l; c+ a, N- c0 y4 d# l6 V' N
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:
    1 q  R) V2 q, [; F. S8 i+ }& Y3 M
     (1)更新框图
1 ~: w1 L! l! c9 ]     (2)开始仿真
; M( Y0 z  h  o7 ]$ a     (3)代码生成
1 A0 o' |7 k6 v# j6 x2 {
  • 单独某个模块,在下列情况会执行初始化命令:
    ! }# ^, k9 a- N! E2 L/ j, T0 \
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。2 q% m7 _5 g5 u; |9 |6 F. b
     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。) q  @5 F5 h- ^6 V; x- Z
     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。
: d7 R! b$ K8 \  m( ^0 Z     (4)重新拷贝封装模块。
' P7 }2 ~" M  b1 Y9 E' d9 E! V: s- L4 \% {
+ v5 z" n6 S# F4 x
三、对话框回调函数(Dialog Callback Code Execution)( D0 d9 A/ G. E% |2 d$ r, G

. e' S8 ]7 R) _9 R# d" w3 ySimulink在下列情况执行封装模块的对话框回调函数:
, R+ K5 c1 g' \3 D, K  Y
; x0 b4 ?: J. r+ c! E
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的Dialog Callback。
  • 在Mask Edito中修改参数的取值,然后把焦点切换到其它地方(比如摁下Tab键,或鼠标点击其它地方)。注意使用set_param函数设置参数,并不会执行Dialog Callback。
  • 在Mask Edito中或使用set_param函数设置参数,并点击Apply或Ok按钮。Simulink在执行Dialog Callback后接着执行Initialization初始化命令,然后图标绘制命令。
  • 更新Simulink框图,比如快捷键Ctr+D,或者菜单Simulation→Update diagram4 q2 i8 D& d5 _: F

( U4 u9 {) O) _" M
! ?9 `% x1 I$ ?4 D' M8 L4 R6 g四、三个回调函数的执行顺序(Order of Mask Callback)" ]8 F3 `0 r2 A3 p4 n$ f% n: [% E

: w. C$ z$ o+ r3 ^$ i* \从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。
2 ], m+ e4 _) _. W5 B3 B+ h7 Q* x& }
(1)双击打开封装模块时
* Y: K" _0 Y9 r- ]* j( r1 q% J- o6 S- L
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...6 }3 b. z2 r) Y4 i

1 i' B% d/ Z' l2 s% A% g  M- f(2)修改参数k,然后摁Tab键2 l% `9 K9 J% m8 B$ o
  • 正在执行"斜率(k)"的Dialog Callback...
    ) |$ T( v& N  _& c
8 H( f0 J% ^" i
(3)修改参数b,然后直接点击Apply按钮
# X  h+ g, v, P. a& l
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...0 g3 Y' G% i9 ]* A

& @/ x- n! H! e" s1 W$ q(4)旋转封装子系统(Ctr+R)2 F% m, `' P8 B( O
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    ' \( ]6 V* _* p1 \& X0 ]
; }2 l2 [& u. k; [
(5)更新Simulink框图(Ctr+D)
3 _7 _: d- r% U# k. N+ m8 U
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...6 n  P0 R/ V7 r1 ]- X

  |$ D" g8 E( r' u. U) I2 ]& H(6)关闭Simulink,然后重新打开模型
/ ]4 l) C7 Q9 ~6 V* H6 `+ B
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    7 L+ K' w9 o* W4 r5 @

/ r5 ]- c: k6 o! A$ I* p(7)删除图标绘制命令,重新打开模型
; D6 o- o4 d- g" o/ D. m8 g! z" A
  • 什么回调函数都没有执行: n; R$ D. Z, j) P& O/ k
- K$ y. \5 z1 M$ W& o

# A8 J! O  ?) }; v) @: O- S( s  M对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):0 [5 ?- U* G# d9 B5 J% p
(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。
! p, K/ D5 Q, i(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。
$ m0 v4 w3 Q% M6 ]  Z(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。
( x6 \$ O, V0 e4 ~(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
2 ^9 N! s  p2 q2 z, t* C(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。
: q8 r* p2 J# t4 r3 H) t7 |* s& {9 B/ M9 ?(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。7 S7 Z( X! R7 F5 @7 d

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-21 05:54 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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