网站首页 > 技术教程 正文
在所有的Stateflow的非图形对象中,最常用也是最重要的就是事件(Events)。
1.添加事件
向Stateflow的框图中增加事件需要通过菜单命令来进行,步骤如下:
执行Stateflow图形中的Symbols Pane,添加事件(Event)。
或者在菜单中选择MODELING在选择Model Explorer,打开对话框。
在添加事件的对话框中,需要针对添加的事件进行属性设置,其中:
Name 属性。该属为事件的名称,相当于声明事件的变量。注意,这里定义的
事件名称和一般C语言变量的命名原则一致,即字母开头,变量名可以由字母、
数字个下划线组成,并且对字符的大小写字母敏感。
Type属性。该属性定义事件的作用类型。Event的TYPE可分为Input Event、
Local Event和Output Event。Type属性的内容定义了事件的作用范围。具有
Local属性的事件是在状态图内部发挥作用。而具有Input 属性的事件是从
Simulink框图输入到Stateflow中的,也就是Stateflow框图的外部触发事件。
同理,既有Output属性的事件是从Stateflow框图输出到Simulink中的,即利
用Stateflow定义的事件驱动或者触发其他Stateflow框图或者子系统动作。
在Stateflow的事件Type属性中,本地事件(Local Event)主要用于并行运行的Stateflow状态图中,而从Stateflow输出事件到Simulink模型中需要使用动作或者事件广播。
如果用户设置事件的Type属性Input Event或Output Event,则添加的对话框的内容会发生变化:
Port属性。该属性仅在用户将事件的作用范围设置为Input from Simulink
或者Output to Simulink时,才能够发挥作用。当事件的Scope属性为Input
from Simulink时,该属性就对应着输入事件的索引。当事件的Scope属性为
Output to Simulink属性时,该属性就是事件输出端口的序号。注意,当
输入事件或者输出事件个数多于一个时,Port/Index属性将决定每个事件
相应的序号。
Trigger属性。Trigger属性总共有四个可能值,分别为Either、Rising、
Falling和Function call。在Simulink条件执行子系统中,特别是在使
能或者触发子系统中,触发子系统工作的触发源就具有不同属性。触发子系统
的触发源与这里的Trigger属性的意义完全一样,分别是双边沿触发、下降
沿触发、上升沿触发,函数调用。
Description属性。为定义额图形或者非图形对象增加必要的文本说明,并且
在代码生成时,Description属性的文本内容可以显示在代码相应的位置。
Document Link属性。可以添加必要的超文本链接。
我们可以设置一个例子实践,设置事件的名称为E,设置Scope属性为Input from Simulink,设置Trigger属性为Rising(上升沿),由于目前只定义了一个事件,因此Port/Index属性为1。设置完毕后属性值如图:
在Stateflow的图形编辑器器中增加两个状态,并且创建相应的转移和默认转移,并设置两个状态之间的转移标签为E,创建好的结果状态图如图:
注意:如果需要用特定的事件来驱动某个转移,则该转移的标签必须包含该事件名称。一般地,一个转移仅用一个事件进行驱动。
当定义了Simulink框图,因为定义了从Simulink框图输入到Stateflow框图的触发事件,所以Stateflow Chart图块上会增加事件的输入端口,并且输入端口的样式和输入事件的Trigger属性有一定的联系。
为了能够让Stateflow的状态转移运动起来,还需要向Simulink模型中增加必要的事件源。能够发出事件的信号源必须能够产生过零信号。这里使用两个常数模块和Manual Switch模块搭建起信号源,创建的模型如图所示:
Chart里面
将Simulink模型的仿真时间设置为Inf,然后单击运行仿真。运行过程中,单击Manual Switch模块向Stateflow框图发出事件,通过Stateflow编辑器的图形界面可以查看到模型的运行过程,如图所示:
在Stateflow框图运的过程中,被蓝色高亮显示的状态为当前被激活的状态,而转移如果被蓝色高亮显示,则表示该转移正在被检测或者执行。
Stateflow的框图运行时依赖于事件驱动的,对于图示的框图,在事件E的驱动之下,其执行的次序为:
(1)当事件E第一次触发时,Stateflow首先激活状态图,然后执行默认的转移,并激活默认的状态On(默认状态)。
(2)当事件E第二次触发时,从状态On到状态Off之间的转移有效,此时系统将退出On状态,激活Off状态;
(3)当事件E第三次触发时,从状态Off到状态On之间的转移有效,此时系统将退出Off状态,激活On状态;
此后状态图的运行就在On和Off状态之间进行切换,直到整个仿真结束。
注意:在运行包含了Stateflow模型的Simulink模型时,系统会将Stateflow模型进行编译,在编译过程中会针对模型进行解析、代码生成,最后利用用户选择的第三方标准C编译器编译链接代码。这也是为什么新建的Stateflow模型在首次运行时,总是需要等待一小段时的原因。当模型被修改后,再次运行模型时系统会重新生成模型的代码,并且重新编译。不过由于代码生成仅仅针对修改过的部分,因此等待的时间不会像模型首次运行时那么长。
2.使用多个输入事件
同一个Stateflow的图块可以使用多个输入事件。但是,无论用户为Stateflow的图块定义了多少个输入事件,每个Stateflow的图块都只能具有一个事件输入端口。因此,在向Stateflow的图块增加不止一个输入事件时,需要将不同的事件通过Mux块组合输入为事件向量,然后将组合后的输入事件向量连接到Stateflow图块上。
如果需要继续向模型中增加输入事件,则继续添加一个新的事件,并将其Scope属性设置为Input from Simulink命令。系统中已经具有了一个输入事件,这次增加的事件为下降沿触发,则增加事件的对话框如图所示:
注意事件E1的对话框中的Port属性,其实此时的Port属性相当于Index属性,此时的属性值为2,表示事件E1这个事件为输入事件向量中的第二个元素。当增加E1事件之后,Simulink模型如图所示。
注意模块中的Stateflow图块,此时由于Stateflow图块能够接收两个事件,并且这两个事件的触发类型又不尽相同,因此输入事件的端口呈现出双边沿触发的样式,修改模型,向Simulink模型中增加新的事件源,并且用Mux块将两个事件组合成事件向量。
那么,Stateflow图块是如何将信号向量中的元素与定义的输入事件一一对应起来的,其实使用Mux块组合输入事件向量时,就决定了事件与信号之间的对应关系。如果Mux是垂直摆放的,则Mux块最上面的输入信号端口输入的信号为向量的第一个元素,即对应Stateflow输入事件的第一个事件,最下面的输入信号端口输入的信号为向量的最后一个元素,即对应Stateflow事件的最后一个事件。如果Mux是水平摆放的,则此顺序为从左至右。
如果多个输入事件同时发生,Stateflow将按照定义时间的索引顺序依次处理。假设Stateflow的图块具有三个输入事件,分别为E1、E2和E3,三个事件的索引分别为3、2和1。如果事件E1和E3同时发生,则Stateflow首先响应E3事件,在完成了所有与E3事件相关的工作(转移执行等等)之后,再处理与E1事件相关的动作。
3.默认转移的注意事项
上图所示的模型的默认转移上面具有事件On作为转移标签,也就是说,这个默认转移是受On事件来监控的。那么,当整个系统第一个发生的触发事件是On时,系统会如何工作?如果整个系统第一个发生的触发事件不是On,系统又会如何工作呢?
很显然,如果整个系统第一个发生的触发事件是On,则系统会正常工作。系统激活Stateflow状态图,然后执行默认的转移,接着激活Stop状态。
但是当第一个发生的触发事件不是On时,认为上面的Stateflow状态图不进入活动状态而保持原样等待On事件的到来,就是一个非常严重的错误!
这里需要再次强调:一旦状态图被激活,则必须有一个子状态被激活,否则系统会出现一个二义性的警告。而且,只要有事件发生(不管发生的是哪个事件),系统都会尝试激活状态图。
将E1事件设置为默认状态的转移事件时,运行之后就会出现报错。
一旦Stateflow状态图被激活,则状态图会一直处于激活状态直到系统仿真结束。由于默认转移的执行需要依赖状态机的再次激活,因此上图中的默认转移将不再有机会执行了。也就是说,这里的默认转移只有一次被检测执行的机会,就是在状态机被激活的时候。这是由于第一个发生的事件不是On事件,状态机激活时该默认转移虽被检测,但是无效,尽管下一个发生的事件是On,但默认转移已经不起作用了。
为了避免此类错误,一般最好不要在默认转移上增加事件的限制,如果必须根据具体发生事件来触发整个系统的执行,则可以考虑将Stateflow的框图包含于使能子系统中,并且设置触发信号类型为Reset。在创建Stateflow状态图时一定要保证它能够被正确的激活,否则整个系统将无法正常工作。
参考内容
[1] 张威.Stateflow逻辑系统建模[M].西安:西安电子科技大写出版社,2007.
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙
猜你喜欢
- 2024-12-04 效率App:Flowstate - 史上最凶险的写作体验
- 2024-12-04 Stateflow的图形函数
- 2024-12-04 Flow 操作符 shareIn 和 stateIn 使用须知
- 2024-12-04 Stateflow的状态图的基本概念
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)