状态机的一般概念

状态机是UML中的概念,在嵌入式开发中应用很广,但在PLC编程中基本没有流行。它和PLC编程中的SFC概念很相似,但远比它强大。下面是一张用matlab画的状态机,包含了大部分基本元素。

基于模型的PLC程序设计一 状态机介绍


这里我简要解释一下,具体可以参考《Stateflow逻辑系统建模》作者:张威。

  • 圆角的框框是一个状态,这里一共有五个状态,分别是ReadyRunM1M12M2

  • Ready上方,有一条线,一头是实心点,另一头是一个箭头,箭头指向Ready状态,说明Ready状态是初始状态,一旦整个状态机启用,Ready状态首先**,相当于SFC中的初始状态。

  • 在两个状态间的线是转移线,只允许向箭头所指的状态转移。Ready状态有两个转移出去的和从其它状态转移进来的。在转移出去先线上分别标有数字12,说明他们的转移优先级,如果条件12同时满足,那么先指向1

  • 父状态Run下有3个子状态,分别是M1M12M2,如果Run状态**,那么它下面的子状态就必然有一个**,如果父状态没有**,那么3个子状态都不可能是**状态。

  • 这里的转移条件分别有两种,一种是带方括号的,比如〔start && ~last_motor],这个是条件转移,另一种是after(40,sec)叫事件转移,{last_motor = false;} 是转移时执行的条件动作。

状态机所表示的控制要求

我们的控制任务:两个按钮,分别是Start、Stop,两个泵,分别是M1和M2。

  • 按下Start按钮,M1启动,40S后,M2启动,按下Stop按钮,两个泵停止,如果不到40S,按下Stop按钮,那么M1停止,M2不启动。
  • 再按下Start按钮, M2启动,40S后,M1启动,按下Stop按钮,两个泵停止,如果不到40S,按下Stop按钮,那么M2停止,M1不启动。
  • 再次按钮Start按钮,将重复第一步,如此循环往复。。

从图中我们可以看出,Ready下没有泵运行,属于初始状态,进入Ready状态时,last_motor初始化为false,表示上次运行的泵不是M1,当按钮start按钮后,状态从Ready转到M1,此时M1**,M1状态框中有条en last_motor = true语句,说明上次首先允许的泵是M1,after(40,sec)表示M1状态过了40S后,进入M12状态,M1状态不**,M12状态**,M12代表泵M1和泵M2同时允许。按下Stop按钮后,状态从Run转移到Ready,那么父状态Run下的所有状态都出于不**,泵M1和M2停止。当再次按下Start后,因为上次last_motor 置为true,转移条件将选择第二条分支,这次首先允许M2,last_motor置为false,40S后M12**,两个泵同时允许。

如果大家用的是matlab,那么可以根据这个状态机自动生成PLC程序。下一节我们用ST语言来描述这个状态机。

相关文章: