2021.11.06
——
参考文献
[1] 李霞,王永章,梁宏斌,等.有限状态机在开放式数控系统中的应用[J].计算机集成制造系统,2005(3):428-432.
[2] 余孟尝. 数字电子技术基础简明教程[M]. 第三版. 北京:高等教育出版社, 2006.
[3] 王永华. 现场总线技术及应用教程[M]. 第2版. 北京:机械工业出版社, 2012.
[4] 三菱电机. FX3S·FX3G·FX3GC·FX3U·FX3UC系列微型可编程控制器 编程手册[基本·应用指令说明书][EB/OL]. 2016[2021-11-6]. cn.mitsubishielectric.com.
状态机,又称自动机,通常指有限状态机(FSM,Finite State Machine),按其输出特性可分为Moore状态机和Mealy状态机:
FSM由一定数目的状态和相互之间的转移构成,在任何时候只能处于给定数目状态中的一个。它以一种事件驱动的方式工作,当接收到一个事件时,状态机产生一个输出,同时也可能伴随着状态的转移。
FSM构成四要素:
FSM使用状态图(Statechart Diagram) 来表示,该状态图可以使用UML(Unified Modeling Language,统一建模语言) 进行描述。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。UML状态图是Harel状态图面向对象的表示方式,Harel状态图是对传统状态图的扩展,扩展的内容包 括层次 、并发和通信。
在UML状态图中,状态由环绕着状态文本的圆角矩形表示,用一条有向线表示状态的转移,线上的文字代表的是状态的转移条件。
状态图还包含开始状态和结束状态。
●开始状态:由一个实心圆圈表示。有且只有一个开始状态。
●终止状态:由一个牛眼符号表示。终止状态是可选的,对象可以有多个终止状态。
状态转换的完整语法格式为:
事件(参数列表)[警戒条件]/动作^目标.发送事件(参数)
一个状态允许嵌套,子状态被嵌套地放入父状态的框图里,并继承其父状态的所有转换。
上述状态采用了省略表示,若动作较多,则可采用状态的完整表示。
图中activities活动由一系列动作组成。
状态的入口动作用“entry/动作”表示,出口动作用“exit/动作”表示。
Switch状态机
此处用C语言表示了状态机的一个状态。
cur_state=nex_state;
switch(cur_state)
{
case s0://s0状态
{
if(event0)
{
//如果发生event0,则执行相关操作,执行完后,不需要切换状态
nex_state=s0;//切换状态为自身,可省略该行
}
else if(event1)
{
//如果发生event1,则执行相关操作,执行完成后,切换状态
nex_state=s1;//切换状态
}
else if(event2)
{
//如果发生event2,则执行相关操作,执行完成之后,切换状态
nex_state=s2;
}
break;
}
顺序功能图( Sequential Function Chart,SFC)是专用于工业控制领域的状态机建模语言,隶属于标准工业控制编程语言IEC61131-3。SFC实质为一种图形表示方法,可以直接输入PLC来执行控制动作。
SFC的具体实现与状态转移图略有不同,这里指出差异和新增之处,一些不重要的概念将不会讲解。
状态类型
在这里状态被细分为初始状态、工作状态和与状态对应的动作。
●初始状态:初始状态是功能图的运行起点,其图形符号为双线矩形图框,一个功能图至少要有一个初始状态;初始状态的意义在于同于执行流程的相互分离,以及防止双重启动。
●工作状态:控制系统正常运行时的状态;
●与状态对应的动作:这里要注意动作与状态对应,而非与转移对应;
功能图类型
功能图类型被分为单流程、选择分支流程、并行分支流程、跳转和循环。
1)单流程:每个状态仅连接一个转移,每个转移仅连接一个状态;
2)选择分支流程:有三种选择分支流程表示方法,用于决定分支执行顺序:
●按从左到右的固定顺序来计算和判断转移条件;
●由用户定义转移执行的优先级,并将表示优先级的数字写在分支旁边;
●由用户定义相互排斥的转移条件,保证每次只有一个分支可以发生状态转移;
3)并行分支流程:一个顺序状态控制流可以分为多个同时被激活的并行分支;当多个并行分支的结果相同时,则可以进行分支的合并。并行分支使用双水平线表示。
4)跳转和循环:可以通过设定状态转移条件来决定流程的跳转和循环。
直接转移到下方的状态以及转移到流程外的状态,称为跳转;
转移到上方的状态称为循环;
一些低端PLC仅仅支持梯形图语言而不支持SFC,为了能够实现动作时序控制,为梯形图增加了新的语言元素,称之为步进梯形图。
在步进梯形图中,用步(STEP) 来表示状态,其规则同SFC一致,只是采用了便于编程的LD梯形图形式,因此支持同继电器梯形图的混合编程(使用RET指令作为分界)。在步进梯形图程序中,将状态S视作1个控制工序,在其中对输入条件和输出控制的顺序进行编程。由于工序推进时,前工序就转为不动作,所以可以按各工序的简单的顺序来控制机械。
以三菱FX3U的步进梯形图编程为例,一个状态的规范结构如下(可以作为状态机编程的标准参考):
S n = { S T L S n 启动状态 S n a c t i o n 与状态对应的动作 c o n d i t i o n → S E T S n + 1 状态转移条件,条件满足时执行 S n + 1 , S n 自动复位 R E T 结束状态 S n S^n=\begin{cases} STL~~~S^n~~~启动状态S^n\\ action~~~与状态对应的动作\\ condition~\rightarrow~SET S^{n+1}~~~状态转移条件,条件满足时执行S^{n+1},S^n自动复位\\ RET~~~结束状态S^n \end{cases} Sn=⎩ ⎨ ⎧STL Sn 启动状态Snaction 与状态对应的动作condition → SETSn+1 状态转移条件,条件满足时执行Sn+1,Sn自动复位RET 结束状态Sn
注意STL、SET和RET属于专用指令,而action和condition则指代相应程序段,相关含义已在结构中注释。
此外初始状态的启动编程方法为:
M 8002 S E T S o M8002~~~SET~~~S^o M8002 SET So
M8002为初始化脉冲,仅在上电的一个周期ON。
状态执行的时序图见下:
分为ON执行 → \rightarrow →OFF执行 → \rightarrow →不执行,共3个阶段。
当进入下一状态时,上一状态的驱动输出除被设定为强制输出的软元件外全部自动复位,因此在步进梯形图中,支持多线圈输出和定时器的重复调用,但由于状态执行时序的关系,不允许出现在相连程序步。
基于模型的设计(Model Based Design, MBD)是一种形式化的软件开发方法。用户可以使用状态机建模软件如stateflow创建状态机模型,然后利用代码生成工具如Simulink PLC Coder自动生成符合 IEC61131-3 编程标准的 ST 语言代码。
MBD的优势在于,用户可将精力集中在算法开发、逻辑控制的研究与模型的建立上,而无需进行人为的编程实现;用户无需关心生成的代码结果,执行出错时,只需要重新修正模型即可,只要模型正确,则执行结果必定正确。
然而很可惜,在PLC领域这项技术还没有在国内普及,相关论文数量也不多,只能长个见识罢了。