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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

. I4 O' u( v# r( t$ H# A2 J  g- ~! Q5 M
7 u) a8 [: Q# _8 M' ^7 {

( }3 M+ _1 n  e9 ?0 w* A  v  x" j$ }玩过Simulink封装系统,对上面的界面应该不陌生。在封装子系统(Mask Editor)中有三个地方可以输入自定义命令的,分别是:
* G, K' Y& M% n2 n# R( i9 E
% m. Z+ m7 }" Z; V(1)Icon Drawing commands,用来绘制block的形状。( e! }( p9 G4 |: b  t
(2)Dialog Callback,当设置参数时,执行相关响应。2 x: O, v" o/ I  _, V
(3)Initialization command,仿真时的一些初始化命令。
- m; e* o2 k( g" z# w  H, B7 x: G7 ?. Y7 d
其中(1)和(3)估计很多人都知道用来干什么的,但是(2)会用的同学可能不多。本文不打算详解介绍如何设置这三个选项,只是讨论什么时候触发相应的回调函数,以及这些回调函数的执行顺序。关于创建动态封装系统(就会全部使用到上面的三个函数),将在下一个专题中介绍,因为只有知道他们的触发条件和执行顺序才可以合理的安排代码呀!% G( d+ o/ i7 j' k1 M

+ e2 w8 N+ Q( B& z3 I2 k
: |$ X  N$ e! L" X一、绘图命令执行(Drawing Command Execution)5 W- I) [; ]' ~3 W
4 O7 E* b* T, ^2 s8 ]: Q
Simulink在下列情况下会执行图标绘制命令,重绘模块的图标:0 O6 [, [2 [' R/ h2 E" H
0 I5 ^% J/ R9 z& a8 ^' C  F
  • 修改封装参数(mask parameters )取值后。
  • 当调整封装模块的外形时,比如旋转等相关操作( b% w5 R/ Q6 ^+ B0 a/ a& \

: H# `7 W3 {# I其实上面说的不全,很多时候都会导致图标重绘,一般只要执行初始化命令之后,都会执行图标重绘。4 V/ j& s3 V* q+ q9 s' |

  |7 g, [4 d4 I5 D4 w: ~3 s- J
8 b8 n- {' Z+ k+ w  S$ M, |* x二、初始化命令执行(Initialization Command Execution)6 Z4 O7 x7 K# v; A

3 M  D  A4 ?, B' M3 q) r3 T
  • 打开一个Simulink模型(Model)时,所有可见的封装模块(子系统下的封装子模块不算,因为不在可视范围内),满足下面条件会执行初始化命令:  ~7 v; Z. f$ \8 F, F
     (1)如果封装子系统中设置了绘图命令。如果没有设置绘图命令,即使有初始化命令,也不会初始化封装模块。
( K* c- h0 ^4 F9 Y: H+ C' K     (2)如果封装子系统属于一个库,并勾选了允许库模块修改它的内容(Allow library block to modify its contents)
% X" g  q+ t+ G% j9 ]/ T- P9 g/ b
  • 模型中的所有封装模块,在下列情况下会执行初始化命令:2 n/ n" ?9 I& f9 i3 y( L7 p2 X
     (1)更新框图2 K8 R  v: r3 {. Y9 x' e
     (2)开始仿真
+ K6 _8 X) ]( u9 F, R     (3)代码生成) m5 W& l; @# i0 e: L0 x
  • 单独某个模块,在下列情况会执行初始化命令:" [% r/ J$ g6 b/ N1 ~
     (1)使用Mask Editor或set_param函数修改封装模块的MaskDisplay和MaskInitialization属性。' P1 j. G) q9 t5 p; }
     (2)如果图标重绘命令依赖于初始化,所有引起图标重绘的操作,比如旋转或翻转封装模块。7 D# u4 G- O( d& r% @; ^
     (3)在Mask Editor(需要点击Apply或Ok)或使用set_param(立即生效)函数修改封装参数的取值。! X5 ^0 k$ L7 z% j
     (4)重新拷贝封装模块。
" I% x5 `5 P3 F! O) i' r3 c  M& @) @% L
- U# j8 O! V8 e2 x- g7 X$ {/ D
三、对话框回调函数(Dialog Callback Code Execution). h! Q7 w) _" y6 o; }

+ B- F6 `6 t) y/ v1 DSimulink在下列情况执行封装模块的对话框回调函数:! q9 H$ t# M9 J3 h5 h, h; k( f
5 b- G! F& n1 c+ W* m
  • 打开封装模块的参数设置对话框(也就是双击模块),此时会从上到下依次执行所有参数的Dialog Callback。
  • 在Mask Edito中修改参数的取值,然后把焦点切换到其它地方(比如摁下Tab键,或鼠标点击其它地方)。注意使用set_param函数设置参数,并不会执行Dialog Callback。
  • 在Mask Edito中或使用set_param函数设置参数,并点击Apply或Ok按钮。Simulink在执行Dialog Callback后接着执行Initialization初始化命令,然后图标绘制命令。
  • 更新Simulink框图,比如快捷键Ctr+D,或者菜单Simulation→Update diagram1 f! P0 h3 u: r9 p! M

& J4 j8 V) @7 p* l/ i! ]  R. ^0 u8 ?1 L0 {3 ]* y
四、三个回调函数的执行顺序(Order of Mask Callback)9 C5 F# E* a2 E% T- l! z
/ ]3 j) ~. b5 B/ R8 e5 f
从上面的函数触发条件可以看出,有些事件可能导致三个函数都被执行(比如开始仿真、更新框图、修改参数),但执行顺序如何呢?为了得到答案,我们定义了一个简单封装系统,然后同时设置了三个函数。* {- i3 B' ?# C$ U% l" n
! r) Y  x1 f1 J8 H7 J9 m
(1)双击打开封装模块时; Q. s" J4 H7 T7 Y' U
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
    ! u/ `2 C7 F% D$ H. b) }

7 G4 R9 k. ?) u/ m. X(2)修改参数k,然后摁Tab键
" R8 E# O# L: O) `! E
  • 正在执行"斜率(k)"的Dialog Callback...# I' F$ J5 X4 j! Q5 q- ^. d

# U% n) K; K8 T; {7 t, R(3)修改参数b,然后直接点击Apply按钮
7 c" m7 [  N* @$ T
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    2 V$ ?9 {0 y, N2 F% o

; e5 x6 x5 |/ w/ j6 I(4)旋转封装子系统(Ctr+R)7 U* ]3 Z0 R% A! B8 S
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...: x& y4 m% i5 N" `& j, ]) m

6 T' X+ |3 _' C: W0 R(5)更新Simulink框图(Ctr+D)
9 |2 O/ _4 c* i; ~5 a" c9 e8 U; S
  • 正在执行"斜率(k)"的Dialog Callback...
  • 正在执行"截距(b)"的Dialog Callback...
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    / m8 e! ~, q* _2 E& L2 n- Z
3 n( x, [. L1 O
(6)关闭Simulink,然后重新打开模型  s/ X) S: R5 u, p$ \' X6 G
  • 正在执行Initialzation...
  • 正在执行Ico Drawing Commands...
    ! V5 G4 A. _& A0 d$ s

4 {4 ]+ u( a1 S0 s5 g2 d(7)删除图标绘制命令,重新打开模型7 p4 Y; K9 K1 q4 x8 _7 O
  • 什么回调函数都没有执行
    0 c6 p  F0 P( _& m! c8 F

  P  x6 Q# v3 r& {5 h" ~7 o5 I2 y% u$ {6 K3 S" f
对于封装子系统,大概总结如下(不一定完全正确,但是基本差不多):, P9 b, V8 ]6 Z) f
(1)对话框回调函数必须手工操作(Tab按钮、更新框图,点击Apply)才会执行,set_param函数是无法触发对话框回调函数的。/ K6 `/ u6 }# M2 v$ v
(2)初始化命令很容易触发,只要你修改参数或稍微动动,就会执行。
3 f& i) p: c7 p2 J7 F& \! G(3)目前的测试没有发现绘图命令和初始化命令分开,一般只要执行初始化,绘图命令接着就会被执行。& K$ j$ m4 ^7 X$ r
(4)开始仿真,更新框图、修改参数这样的大操作一般都会触发三个命令,只是前三者是模型中所有封装模块都执行,而修改参数只是相应的模块执行。
9 v& x$ }$ [' u(5)从上面的执行结果来看,三个回调函数的执行顺序是:对话框回调函数 > 初始化命令 > 图标重绘命令。% Q' a2 A( Y9 A! B0 F3 ~
(6)有些命令既可以放在初始化中,也可以放在对话框回调函数中,还可以放在图标重绘命令的。比如判断设置的参数是否合法,假如非数字就报错。那每个函数中到底应用填写什么代码,以及如何创建动态封装系统,这个我们可能在下一个主题中讲解。2 Q$ c( f- S; c* o9 {0 ^# g

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-20 07:45 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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