浅谈状态机

2023-05-15 10:29:10 digiproto
在工业生产中,常常会使用到建模软件,而建模的目的就是为了在制造的前期进行验证和试错,以确保制造出来的东西能够很好的使用。而在建模仿真的领域中,状态机又是逃不开的一个话题。


状态机(State Machine)是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。简单来说,状态机主要是用来描述事物或者事物间的状态以及转换的,举个例子,现实的事物灯泡,一般来说只有两个状态:亮起和熄灭,灯泡的亮起和熄灭取决于开关这个事件,所以这个灯泡抽象成状态机应该是如下图所示:

图片关键词

这就引出了状态机中几个比较重要的概念:状态、事件、动作、转换。


状态就是事物所有可能处于的状态,如门有开关两个状态,一些昆虫有卵、幼虫、蛹和成虫四个状态等等。因为这里所讲的状态机指的就是有限状态机,所以抽象出来的事物的状态是有限的,而且在建模仿真的过程中,当前有且只有处于一个状态中。


事件则是会导致状态发生变化的一个动作,在上面的图中,open和close就是事件,分别表示打开和关闭开关。


动作就是事件产生后对应事物发生的变化或者进行的动作,当open事件产生之后,灯泡会接收到电流,然后根据电流的一系列效应,最终产生光照。


转换就是就是从一个状态变化到另一个状态的过程。

介绍完了状态机,接下来就是如何去搭建状态机,在这里我们以simulink为例。


首先,我们需要了解在建模软件中,仿真如何执行的。在仿真过程中,会使用到周期这一概念,将需要仿真的时间分割成多个周期,每个周期将所有的模型和状态机按照顺序执行一次,得到输出结果,如此循环直到到达仿真终止时间。下面展示simulink中状态机部分功能:


1. state:

状态机中最基础的模块,用于定义一个新的状态。


2. state模块的创建:

通过左侧工具栏的拖拽来创建一个state模块,模块初始状态如下图所示:

图片关键词

左上角的问号为state的名字,必须要设置才能有效,否则在运行的时候会报错。


3. junction连接点的创建:

通过左侧工具栏的拖拽来创建一个连接点,其样式如下图所示:

图片关键词

连接点目前来看用途是作为过渡连线的连接点来使用的,如下图所示:

图片关键词


这个图表示的是一个if判断的逻辑,在其中连接点起到逻辑分歧的作用。


4. transition过渡连线的创建:

特殊连线:default transition,连接在状态中则表示初始状态,连接在连接点上则表示逻辑起始点。一般过渡连线则表示逻辑流向或者状态迁移的方向。


5. box封装盒子的创建:

此模块只在前端有用,用于将同一类或者同一逻辑的模块封装成一个整体,视觉上较为整齐。


6. simulink function模型方法的创建(目前暂时无法实现):

创建一个以simulink模型为方法,根据输入获取输出的模块,如下图所示:

图片关键词

在内部搭建完相应的模型之后,返回到状态机搭建这一层模型中,其就能自动增加名称,如下图所示:

图片关键词

但是也可以手动修改,基本只需要修改其方法名就可以了。下面的graphical function和matlab function分别是使用状态机相关连线以及连接点来搭建相应的function和使用matlab函数来实现相应的方法。如下图所示:

图片关键词


7. state模块的动作:

1)定义状态内的动作:有两种方式来实现,分别是使用过渡连线和连接点来进行逻辑流,和使用entry、during、exit来进行赋值和逻辑判断的操作,逻辑流能够实现if判断进而赋值,而使用语句的话则需要编写相关代码,这两者本质上是等价的,但是使用连线的方式可能可视化好一些。


2)设置内部子状态的运行方式:有两种方式,分别是AND模式和OR模式,当在state内部定义多个状态时,如果状态间是独立的话,AND模式下,子状态在同一时间只会触发一个,也就是说可能只会有一套子状态自始自终在运行着,而如果使用OR模式的话,在同一时间会有多套子状态同时运行,如下图所示:

图片关键词

在运行过程中,上面的Time子状态和下面的EnergyManager子状态会同时运行,并且simulink会根据其内部变量的依赖关系自动确定其运行顺序,以确保控制逻辑的正确。


3)设置内部子状态优先级:设置AND模式时,内部子状态运行的优先级,会影响运行顺序。


4)设置内部文字的字体大小:通过设置字号的形式来实现修改内部的文字的字号。


8. transition过渡连线的动作

1)设置迁移条件:通过在连线上使用[]来设置迁移条件,当满足迁移条件的时候,会从一个状态迁移到另一个状态。


2)设置迁移动作:通过在连线上使用{}来设置迁移动作,相当于状态中的entry,设置初始值。


3)设置优先级:在逻辑流中使用,用于实现if判断。



最后,向大家介绍一个形式化验证的代码生成工具ModelCoder,由迪捷软件自主研发,支持多种嵌入式系统建模并可以自动生成高安全可靠的C代码的软件设计和开发工具。对标产品有国外ANSYS公司的SCADE或者MathWorks公司的MATLAB/Simulink。ModelCoder支持同步数据流以及状态机等嵌入式模型,其从模型生成代码的过程经过了形式化验证,以保证生成过程的正确无误性,能够用于飞行控制系统,航空电子系统,核电的DCS等多个安全关键领域的嵌入式软件的设计和开发。ModelCoder支持的算法模型见下表:


图片关键词



首页
产品
新闻
联系