stateflow学习记录(长期更新)

在simulink中搭建纯电动车的VCU模型时,经常需要用到状态机来描述各个状态之间的切换过程,而Stateflow主要用于针对控制系统中的复杂控制逻辑进行建模和仿真,同样也适用于针对事件响应系统进行建模和仿真。前面零散的学过一些Stateflow的只是,在这里系统的总结一下,以后忘了可以再看一看。

这方面的知识共分为以下几部分。


一、状态图

 状态图,主要是由Stateflow框图中包含的一个或者多个状态、相应的转移及辅助的其它元素组成。主要可以分为5个部分。

1.状态

状态的标签一般可以由三部分组成:状态名称、注释和相应的状态动作

状态动作的关键字主要有三种:entry、exit、during

Entry:当状态动作被激活时执行相应的动作

Exit:当状态退出活动状态时执行相应的动作

During:当状态保持其活动状态时执行相应的动作

2.创建连接节点

连接节点作为转移通路的判决点或汇合点,也是在状态图中常用的图形元素之一,特别是在流程图中,由于流程图中不能包含任何状态,因此只有依靠连接节点完成通路的连接和判断分支。

连接节点不是记忆元件

3.创建转移

转移描述的是有限状态系统内的逻辑流。

4.转移标签

一个完整的转移标签由四个标签组成,分别为事件、条件、条件动作和转移动作。

形式为Event[Condition]{Condition Actions}/Transition Actions

哪些语法元素可以作为动作?主要分为三类:

  1. 数学运算表达式或逻辑运算表达式
  2. 调用函数
  3. 事件广播

5.默认转移


二、状态图的仿真

Stateflow状态图被称为"状态转移图",这些状态图中包含了所谓的状态和相应的转移。一旦包含了状态转移的状态图处于活动的状态,那么状态图将一直处于这种活动状态,直到整个仿真模型计算结束。这一块的知识点主要有四点。

1.事件

如果需要用特定的事件来驱动某个转移,则该转移的标签必须包含该事件名称。一般地,一个转移仅用一个事件进行驱动。

能够发出事件的信号源必须能够产生过零信号。

由于默认转移的执行需要依赖状态机的再次激活,因此以后的默认转移将不再有机会执行。也就是说,默认转移只有一次被检测执行的机会,就是在状态机被激活的时候。这是由于第一个发生的时间不是On事件,状态机激活时刻默认转移虽然被检测,但是无效,尽管下一个发生的事件是On,但是默认转移已经无效了。因此,为了避免此类错误,一般最好不要在默认转移上增加事件的限制

2.数据对象

数据对象主要用于管理和维护Stateflow框图内部的数据信息。在Stateflow中,数据对象主要用于动作或者条件中。

数据对象的属性:

当新增数据对象时,执行Add菜单中的Data子菜单下的菜单命令Local,则会跳出对象属性对话框,其中相对应的属性意义如下:

Name属性:表示数据对象的名称,相当于声明数据变量。

Parent属性:表示将数据对象增加到Stateflow的框图中,具体的数据对象与Stateflow的图形对象之间存在隶属关系。

Scope属性:定义数据对象的类型。该属性一般具有六种不同的可选项,一般为:

(1)Local:所定义的数据对象被限制在其父对象的范围内。

(2)Constant:所定义的数据对象在Stateflow模型中为常量,即保持静态,数据对象在Simulink/Stateflow模型运行过程中其数值一般不发生变化,并且数据在模型中只读,不可写的状态。

(3)Parameter:所定义的数据对象将通过Stateflow框图的上层Simulink子系统封装之后的参数获取初值。也就是说,当Stateflow的框图处于某个封装子系统内部时,Stateflow的Parameter类型数据对象可以直接获取封装子系统设定的参数。具有Parameter属性的数据对象与具有Constant属性的数据对象类似,在整个仿真过程中,Stateflow不能修改其数值。

(4)Data Store Memory:所定义的数据对象与Simulink数据空间共享。也就是说,该数据对象与Simulink工作空间中的某个数据对象相互绑定。此时该数据对象的名称必须与Simulink工作空间中数据对象的名称一致。

(5)Input:所定义的数据对象将从Simulink模型中直接获取数据。

(6)Output:所定义的数据对象将向Simulink模型输出数据。

Size属性:数值数据对象的尺寸。

3.状态图的更新模式

Stateflow的框图有三种更新模式,分别为Inherited、Discrete和Continuous。

系统默认使用Inherited更新模式,在此种更新模式下存在三种情况:

(1)有输入事件定义。

如果Stateflow框图定义了输入事件,并且Simulink提供了相应的输入事件,则整个框图就按照所定义的事件触发来更新。也就是说,在相应类型的事件发生时,Stateflow框图进行相应的工作,例如状态的转移、动作的执行等

(2)未定义输入事件但定义了输入数据。

Stateflow框图按照其连接的Simullink输入信号中更新频率最高的信号更新周期来更新狂徒,这相当于输入数据的采样更新出发了Stateflow框图的执行。

(3)事件和数据都未定义。

如果事件和数据都没有定义,那么Stateflow框图继承其父层次模型的更新周期。如果其处于模型的顶层,则继承模型的仿真周期作为自己的更新周期。

4.模型查看器


三、流程图

在Stateflow中,流程图不包含任何状态,它仅仅由连接节点和转移组成。

1.转移冲突

转移冲突,即在Stateflow框图运行的过程中可能在某一时刻同时存在几个有效的转移,那么Stateflow会根据一些原则来处理这些冲突。

(1)若转移中同时存在事件及条件,那么当事件发生需要进行转移检测时,Stateflow总是首先检测具有最多限制得转移,如果能够满足则执行这个转移,其他的转移统统忽略。如果转移中的事件没有满足,那么就检测具有条件的转移,如果条件能够满足,则执行该转移;

(2)若转移中仅对使用条件进行了限制,那么Stateflow会报告转移冲突错误,此时要么修改模型,为转移增加必要的限制;要么在Stateflow的调试器中清除Transition Conflict的错误检测选项。清除之后,Stateflow将按照几何原则解决此类转移冲突问题:

如果转移从状态出发,则从状态的左上角开始,按顺时针的方向决定转移的优先权;

如果转移从连接节点出发,则从连接节点的12点方向开始,按顺时针的方向决定转移的优先权。

2.流程图的创建

三种逻辑结构模型:顺序结构、选择结构、循环结构

3.图形函数


四、层次化建模

1.状态动作的深入

1.1状态动作的分类:entry、exit、during

entry:当事件发生,状态被激活时执行相应的动作;

during:当事件发生,状态退出活动状态时执行相应的动作;

exit:当事件发生,状态保持其活动状态时执行相应的动作;

此外,还有两种状态动作,分别是On event和bind,其中:

On event是指当状态处于活动状态,事件event发生,而状态并不退出活动状态时所执行的动作。

Bind动作是指将事件或者数据对象与状态绑定的动作。被绑定的事件只能由状态以及状态的子状态进行广播,而被绑定的数据对象只能由状态以及状态的子状态中相应的动作进行修改。绑定的数据对象可以在其它状态中被访问,但是不能修改。

1.2条件动作、状态动作、转移动作执行的先后顺序

条件动作->状态动作->转移动作,不清楚的时候可以创建一个简单的模型运行一下,观看执行的顺序。

1.3在动作中使用事件

2.层次化建模

有限状态系统可以被分为若干模型片段,每个模型片段都是独立的有限状态系统,而彼此组合起来则可以构成复杂的有限状态系统。

2.1层次化模型的构成

在同一层次的模型中,一般都要存在一个默认转移。

每一层都要有默认转移、不同层次下的状态可以取同样的名字

2.2层次化状态图的转移

原则:(1)子状态的各种对象仅仅在父状态活动时才有可能执行或者有效;

           (2)当存在直接从父状态发出的转移时,可以不用考虑具体哪一个子状态处于活动状态。

2.3历史节点

历史节点是一种特殊的Stateflow图形对象,它只能够用于具有层次的状态内部。

2.4内部转移

内部转移就是指在状态内部的转移,它从父状态内边缘出发,终止于父状态内的子状态或者连接节点边缘上,也可以终止于状态的内边缘。

2.4.1内部转移的创建

内部转移从父状态内边缘出发,终止于父状态的子状态或者连接节点边缘上,也可以终止于状态的内边缘。

2.4.2内部转移的执行

2.4.3自循环转移的执行

2.5层次化模型的转移检测优先权

转移检测的基本原则:

  • 转移测试首先从最高层次的活动状态开始,然后逐级向内检测;
  • 外部转移优先于内部转移被检测;
  • 在同样的层次上,超转移首先被检测。

基于以上的原则,有以下的检测顺序:

  • 转移的测试总是从活动的父状态开始。向外的转移,即从父层次状态外边缘出发的转移首先被测试,这些转移能够使父状态退出活动转移,所以它们首先被检测。
  • 接着被检测的是内部转移,即从父层次状态内边缘出发的转移。
  • 从活动的子状态开始检测转移。从子状态外边缘出发穿越父状态边缘的转移——超转移,然后被检测。
  • 然后是父状态内部子状态之间的转移被检测。

3.子状态图

层次化模型建立完成后,在用鼠标移动父状态时,子状态并不跟随父状态移动,对于编辑层次化的状态图不方便。

3.1使用组合的状态

步骤:

(1)在需要组合的状态上单击鼠标右键

(2)在弹出的快捷菜单中执行Make Contents子菜单下的Grouped命令。

如果需要取消组合的状态,使用同样的方法即可实现。

3.2创建子状态图

组合的状态并不是子状态图,因为通过组合的状态图还是能够直接在父状态中看到内部包含的细节。利用子状态图,可以将父层次状态的内部细节“隐藏”起来,构成真正的层次化模型,便于维护管理复杂的动态逻辑系统。

步骤:

(1)在需要构成子状态的状态上单击鼠标右键。

(2)在弹出的快捷菜单中执行Make Contents子菜单下的Subcharted命令。

3.3子状态图的超转移


五、并行机制(02.27)

对于Stateflow模型,有以下几点需要注意:

  • Stateflow的状态要么是互斥的,要么是并行的。(互斥的状态框图边框为虚线,而并行的状态框图边框为实线)
  • 由互斥状态组成的状态图或父状态,在同一时刻只能有一个活动的子状态。
  • 由并行状态组成的状态图或父状态,一旦被激活,则所有并行子状态同时处于活动状态。
  • 并行状态在它们的父层次对象——状态或父状态被激活时也被激活。
  • 转移不可以直接起始于或终止于某个并行状态,不需要也不能为并行的状态创建默认转移
  • Stateflow默认系统为互斥模式。

1 .并行机制

1.1把状态设置为并行的解析关系的步骤:

(1)向Stateflow图形编辑器中增加必要的状态。(默认情况下,层次化模型中各个层次的状态都处于互斥的解析模型)

(2)在状态图的任意空白处单击鼠标右键,执行弹出的快捷菜单中Decomposition子菜单中的Parallel(And)命令。

(3)执行菜单命令后,则相应层次中所有的状态都变为并行状态,状态的边缘为虚线。

1.2并行状态的执行次序

当状态处于并行时,并行的状态并不是严格地同时被激活,它们的执行和激活次序遵循基本的原则:

  • 在图形编辑器中,位置较高的状态具有较高的执行次序编号。
  • 处于同一水平线上并行状态,左边的状态具有较高的执行次序编号。

猜你喜欢

转载自blog.csdn.net/qq_41769322/article/details/86407111