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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

# s6 Q9 X% K9 O, V5 H( F1 J, @$ {+ F7 U# Z  H) A% }  z, a# T4 y

- v* n" U# g; ?+ Z/ Z8 t  G+ a; [! s* _4 @5 L
玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
7 z1 \! S  R$ Y4 u. u$ _
+ b6 s" Y4 ?$ F; ]% s$ e- y(1)Icon Drawing commands,用来绘制block的形状。. K0 M7 t+ L; e  x# X9 ]
(2)Dialog Callback,当设置参数时,执行相关响应。# d7 F4 i; p2 [3 X& F
(3)Initialization command,仿真时的一些初始化命令。
6 d* h# M3 f; L6 ^3 n1 x* u2 ~: W9 C! T4 X. P
其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!
; p* Q, Q1 Y, ^5 U* J2 a% d7 w9 B* o) `3 N- M
; \# o8 _7 o" }
一、绘图命令执行(Drawing Command Execution)
% H+ I! j- V% C0 _
* j! J) j: P' `; F4 TSimulink在下列情况下会执行图标绘制命令,重绘模块的图标:
; }& {% k4 [: N3 c5 c8 h' R  ^$ G0 x
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作/ v* |/ L# J2 ^  N6 m0 K* ^

! p' N+ ?6 E1 b" ?! t" ?其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。0 N9 `! [7 x7 `
, W$ ?+ y& }! C

$ D; _/ E5 W: z2 T* |* D二、初始化命令执行(Initialization Command Execution)
* ?0 `8 u" F4 ~3 k- V! @
9 S- i  V8 u6 G/ o  C
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:: S- V2 E+ M# L# ?5 p% D3 {4 P# w
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。
! c- {, G1 i' ^1 A5 ^8 E     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)
+ M. V; i8 I$ \/ O  s# O& ^
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:
    + {# B  ~- h4 a, v. y. b) m9 v4 U
     (1)更新框图
0 A( Y5 d/ l. d" ~4 k     (2)开始仿真
; Y" O! D# [6 [5 p% x     (3)代码生成, y! e% a, R! p; a# v2 ]
  • 单独某个模块,在下列情况会执行初始化命令:9 {3 u: e6 r8 s* Y3 v4 E1 l
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。
# y8 P: U! w& Z9 P9 ]  o# g# H) [     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。. k% B) ?* {- `0 ?, K" U8 R
     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。
3 ^7 v, `) i/ ?, l: A     (4)重新拷贝封装模块。
! T. F3 P5 l) e  i0 X
0 p1 t; @+ t4 W: {7 U9 O, O' ?) i( x5 P3 Z/ c: F4 Q
三、对话框回调函数(Dialog Callback Code Execution)( ~1 U4 X8 |' E8 ?2 c
! g7 u' Q5 [* p, {0 r# y' X# t
Simulink在下列情况执行封装模块的对话框回调函数:
* V! \& P! Q- X9 R) S' w0 r( s' B- R) i: P: w
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的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
    " @7 H& U5 W3 ]) {

5 d) g+ i/ V- t3 W/ ?7 x" g1 M0 q. J! F
. ?; K& C2 P" U' ~四、三个回调函数的执行顺序(Order of Mask Callback)" g7 V+ h, z( x( c
6 y% L- a) _/ W6 J
从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。5 [% |% q3 K) A) b9 P
. b0 w) ^; E. V9 i( p4 ^8 W
(1)双击打开封装模块时
2 c" w. G) x& B" ^1 o* B/ c: c
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
    5 I! N& J8 k" c! |$ I: G5 [# T; {
/ k. ]8 O: O# d4 z! h
(2)修改参数k,然后摁Tab键
; ]0 P' E2 N: k
  • 正在执行"斜率(k)"的Dialog Callback...0 q- x: `% E7 \4 o

6 L( |: f& A: v(3)修改参数b,然后直接点击Apply按钮
( o2 n9 l0 P/ Y( l  h( {
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    / q! l  y1 F% F

. I& m- I2 [, M1 |* H(4)旋转封装子系统(Ctr+R)
) n6 \& I1 g2 `5 ^& E
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    ( {# a- L. j4 A# `- |

2 }; `! z. F$ k5 D' @, i(5)更新Simulink框图(Ctr+D)) i- f0 _5 }* K
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...6 H, ^6 A) z9 o, T1 l

5 G. |2 v: A+ R% p$ H(6)关闭Simulink,然后重新打开模型
2 \3 W2 S9 r- ^9 l' `# D: g6 j/ G7 X
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...$ h4 S4 a) J! h3 T. W

3 ^, o1 j6 O  Q8 D  u(7)删除图标绘制命令,重新打开模型
7 O3 J+ x9 k3 @# C9 U
  • 什么回调函数都没有执行' a6 r+ C* V  L! v

$ e6 f  a* _) a9 I7 ~! Y
  @$ F& @, ?* M$ Z对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):
+ E$ M! M4 c2 D. s4 M/ W(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。
! N0 f6 ~" H2 J(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。
) a& ^. Q: ^% W+ z- d& ^(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。! H$ K% R* G! o5 e8 L; ]
(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。  O/ A2 e, f- w( v$ u6 O
(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。9 q0 e4 `9 U' E
(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。
3 \" Z7 |* v$ c6 I

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-10 09:29 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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