分享免费的编程资源和教程

网站首页 > 技术教程 正文

Stateflow的定义并使用事件

goqiw 2024-12-04 10:50:12 技术教程 49 ℃ 0 评论

在所有的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小时内删除。


作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表