参考视频:Simulink/stateflow的入门培训_哔哩哔哩_bilibili
一、概述
Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模与仿真,或者说,Stateflow适用于针对事件响应系统进行建模与仿真。
下图所示的是TCP状态机,系统每时每刻都会处于一个状态,当满足某些条件后,系统下一时刻的状态可能就会变换并做出指定动作,Stateflow正是用于实现这种复杂的控制逻辑,如果不使用Stateflow,而仅仅依靠Simulink中的其它模块对状态机进行搭建,这样不仅会使建模难度大大提升,还可能会发生系统在同一时刻处于两种状态的情况。
二、基本的Stateflow创建和模块信号交互
1、Stateflow的创建
(1)方法一:在命令行窗口中输入“sfnew”,MATLAB会新建一个模型文件并在其中添加一个状态机。
(2)方法二:直接打开模块库,找到Chart模块并将其拖拽到模型文件中。
(3)方法三:如下图所示,在MATLAB的工具栏中可以直接新建一个模型文件并在其中添加一个状态机。(较低版本的MATLAB可能不支持该方式)
2、模块信号交互
(1)双击Chart模块,即可进入Stateflow的编辑界面。
(2)和其它子系统模块一样,Chart模块可以随意添加输入端口和输出端口,在未旋转的前提下,添加输入端口时将信号线往Chart模块左侧引进,添加输出端口时将信号线往Chart模块右侧引进即可。
(3)使用Chart模块需要对其进行变量管理,按下Ctrl+H可打开模型浏览器,在这里可以更改输入变量、输出变量及内部变量的名称、数据类型等属性。
(4)Chart模块中只可对输出变量和内部变量进行更改,对输入变量只有读的权限。
三、Stateflow中的基础功能块
1、State状态块与Default transition缺省转移
(1)每个状态在Chart模块中对应一个状态块,状态块的添加方式如下图所示,其它模块的添加方式亦是如此。
(2)在添加第一个状态块时会自动为该块添加缺省转移,缺省转移可认为是状态机的入口,决定状态机的初始状态是哪一个状态块,它必须有且每个状态机中只能有一个。
(3)状态块的内容编辑可分为以下几部分:(其中关键词并不是必须都要有,且下面没有列出全部关键词,仅列出了三个常用的)
①状态名称:每个状态的名称置于状态块编辑区首行,其命名规则和一般变量名一样。
②entry关键词:在编辑区中键入“entry:”或者“en:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态被激活时(或者说进入该状态)执行的动作,且只是在进入状态之初执行一次,并不是重复执行。
③exit关键词:在编辑区中键入“exit:”或者“ex:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态退出时执行的动作。
④during关键词:在编辑区中键入“during:”或者“du:”,在下一个关键词出现之前,以下的代码段(用MATLAB编写)都是该状态下重复执行的动作,重复频率取决于仿真步长(在本章中如无特殊说明,所有举例的仿真步长均为0.2s)。
2、transition转移
(1)状态块与状态块之间需要依靠转移线连接,转移线代表状态的转换路径,其编辑区中提供了一对方括号和一对花括号。
①方括号内需要填写转移条件,在有触发事件的前提下也可以不填写,当状态机处于转移线首端的状态,且转移条件为真时(如果有触发事件,事件需要已发生),状态会根据该条转移线进行状态的切换,也就是退出上一个状态并进入下一个状态。(缺省转移没有转移条件)
②花括号内填写的是转移发生时执行的动作(也称条件动作),条件动作可以不填写。
③括号之外可填写触发事件,在有转移条件的前提下也可以不填写,当状态机处于转移线首端的状态,且事件发生时(如果有转移条件,转移条件需要为真),状态会根据该条转移线进行状态的切换。(缺省转移没有触发事件)
④除了缺省转移外,如果转移线不填写转移条件和触发事件,仿真时也能运行,但因为转移没有任何限制,转移线首端的状态仅会持续一个仿真步长就会退出。
(2)点击状态块的边界(除了四个角以外),按住鼠标拖动,即可从状态块引出一条转移线,拖住转移线的末端即可将其连接到其它状态块上(转移线两端可以连在同一个状态块上)。
(3)比较常用的触发事件有时间触发事件after,它有两个参数,第一个是时间参数,第二个是时间单位参数,当进入转移线首端的状态时,after开始计时,当达到计时时间后事件发生。
(4)当一个状态块引出两条转移线时,转移线上会有编号,Chart模块会优先判断编号较小的转移线是否满足转移条件(以下提到的“满足转移条件”均指的是转移条件为真且事件触发)。
(5)当转移线两端连接同一个状态块时,有两种情况:
①转移线在状态块外部:如果转移线生效,当前状态会先退出再重新进入,也就是要执行关键词entry下的代码段。
②转移线在状态块内部:内部的转移线优先判断,如果转移线生效,当前状态不会退出,不会执行关键词entry下的代码段。
3、Junction节点
(1)在Stateflow中,流程图是一种比较特殊的应用,流程图中不包含任何状态,它仅由连接节点和转移线组成,节点之间的转移线连接操作方法和状态块直接转移线的连接操作一样。
(2)由于流程图中没有任何状态,因此不具备任何记忆元件(状态块是记忆元件)。
(3)流程图从检测其默认转移开始,到检测完每一条有效的通路且到达不具备有效出口的转移线为止,简单来说就是从流程图的入口开始“走流程”,直到走到没有通往其它节点转移线的节点为止,这个过程是在一个仿真步长内完成的,这是和状态图最大的区别。
(4)使用节点和转移线搭建逻辑结构:
①选择结构:
[1]单分支if语句:
if <条件表达式>
<满足条件执行的语句组>
end
[2]双分支if语句:
if <条件表达式>
<满足条件执行的语句组>
else
<不满足条件执行的语句组>
end
[3]多分支if语句:(switch语句实际上也是多分支选择结构,只是在流程图中表示起来可能稍微复杂些,这里不进行演示)
if <条件表达式1>
<满足条件1执行的语句组>
elseif <条件表达式2>
<不满足条件1而满足条件2执行的语句组>
... ...
elseif <条件表达式m>
<仅满足条件m执行的语句组>
else
<不满足所有条件执行的语句组>
end
②循环结构:
[1]for循环:
for <循环变量> = <取值列表> %取值列表通常是一个向量
<循环体> %不要在循环体内改变循环变量的值
end %循环语句可以嵌套使用
[2]while循环:
while <条件表达式>
<循环体>
end %循环语句可以嵌套使用
[3]do...while循环:(MATLAB中没有直接提供do...while循环结构的语句)
4、Annotation和Image
(1)Annotation是文字说明模块,相当于程序文字版注释,不会影响状态机。
(2)Image是图片说明模块,相当于程序图片版注释,也不会影响状态机。
四、层次化建模
1、动作执行的顺序
在系统状态转换时,可能涉及到多个动作,它们是有先后执行顺序的,首先状态机执行转移线上的条件动作,然后执行旧状态退出时需执行的动作,接着执行转移线上的转移动作(转移动作的代码段也用花括号包含,它位于条件动作之后,二者用“/”分隔,不过转移动作使用较少),最后执行新状态进入时需执行的动作。