主要内容

一个状态描述无功系统的运行模式。在一个Stateflow®图表、状态用于顺序设计,以创建状态转换图。

状态可以是活跃的或不活跃的。状态的活动或不活动可以根据事件和条件而改变。事件的发生通过使状态变为活动状态或非活动状态来驱动状态转换图的执行。在执行期间的任何时刻,都存在活动和不活动状态。

国家层次

要管理多级状态复杂性,请在状态流程图中使用层次结构。通过层次结构,您可以在系统中表示多个级别的子组件。

国家层次的例子

在下面的示例中,图表中出现了三个层次结构。在另一个状态的边界内绘制一个状态表示内部状态是外部状态(或超状态)的子状态(或子状态)。外部状态是内部状态的父。

在本例中,图表是状态的父级Car_done.国家Car_done的父状态是Car_madeCar_shipped州。国家Car_made也是父母的吗Parts_assembled州。你也可以说状态Parts_assembled都是他们的孩子Car_made状态。

要以文本形式表示statflow层次结构,请使用斜杠字符(/)表示图表并使用句号(.)将状态层次结构中的每个层次分开。下面的列表是前面例子中对象层次结构的文本表示:

  • / Car_done

  • / Car_doneCar_made

  • / Car_doneCar_shipped

  • / Car_doneCar_madeParts_assembled

  • / Car_doneCar_made

状态可以包含的对象

状态可以包含所有其他statflow对象。状态流程图表示法支持在带有包容性的状态流程图中表示金宝app图形对象层次结构。一个国家是一个超级大国如果它包含其他状态。一个国家是一个亚态如果它被另一个国家所控制。既不是超州也不是另一个州的子州的州,其父州就是州流程图本身。

状态还可以包含非图形数据、事件和消息对象。此包含的层次结构出现在模型资源管理器中。您可以通过指定父对象来定义数据、事件和消息包含。

状态分解

每个州(或图表)都有一个分解它规定了状态(或图表)可以包含何种类型的子状态。超态的所有子态必须与超态分解的类型相同。状态分解可以是互斥的(OR)或并行的(AND)。

Exclusive (OR)状态分解

具有实心边界的子状态表示独占(OR)状态分解。使用此分解来描述相互排斥的操作模式。当一个状态有独占(OR)分解时,一次只能有一个子状态是活动的。

在下面的例子中,两种状态都可以一个或状态B可以活跃。如果状态一个是活动的,任一状态A1或状态A2可以在给定的时间内激活。

并行(AND)状态分解

带有虚线边框的子状态表示并行(AND)分解。使用此分解来描述并发操作模式。当一个状态有并行(AND)分解时,所有的子状态同时是活动的。

在下面的例子中,当状态一个是活跃的,A1A2都是同时活跃的。

在并行状态中的活动本质上是独立的,如下面的示例所示。

在下面的例子中,当状态一个两种状态都变得活跃BC同时变得活跃起来。当状态C任一状态变为活动状态C1或状态C2可以活跃。

状态标签

状态标签出现在状态矩形的左上角,其通用格式如下:

的名字/条目:输入操作期间:在行动退出:退出操作event_nameevent_name行动message_namemessage_name行动绑定:事件

下面的例子演示了状态标签的组件。

状态标签中的每个操作将出现在下面的子主题中。有关状态操作的更多信息,请参见状态流程图的执行

国家的名字

状态标签以州名开头,后面跟着一个可选选项/的性格。在上例中,州名为.有效的州名由字母数字字符组成,可以包括下划线(_)字符。有关更多信息,请参见命名状态流对象的指南

层次结构在命名状态方面提供了一些灵活性。当前面有祖先状态时,在状态标签上输入的名称必须是唯一的。statflow层次结构中的名称是作为状态标签输入的文本,前面是用句点分隔的父状态的名称。每个状态都可以在标签中显示相同的名称,只要它们在层次结构中的全名是唯一的。

下面的示例展示了状态的唯一命名是如何工作的。

每一个州都有一个独特的名字,因为它在图表中的位置。美国各州的全称FAN1FAN2是:

  • PowerOn.FAN1.On

  • PowerOn.FAN1.Off

  • PowerOn.FAN2.On

  • PowerOn.FAN2.Off

国家的行为

在名称之后,您可以输入带有关键字标签的状态的可选操作语句,该关键字标签标识操作类型。您可以指定none、some或all。每个关键字后面的冒号是必需的。州名后面的斜杠是可选的,只要后面跟着一个回车。

对于每种类型的操作,可以输入多个操作,方法是用回车、分号或逗号分隔每个操作。您可以通过添加附加操作来为多个事件或消息指定操作event_namemessage_name行。

如果您输入名称和斜杠,然后直接输入操作,操作将被解释为条目行动(s)。这种简写在仅指定时很有用条目行动。

该表总结了不同的状态操作类型。

政府行动 缩写 描述
条目 当状态变为活动时执行。
退出 前女友 当状态处于活动状态并发生状态外的转换时执行。
当状态为活动状态并发生特定事件时执行。
绑定 没有一个 绑定事件或数据对象,以便只有该状态及其子对象才能广播事件或更改数据值。

event_name

没有一个 当状态是活动的并且它接收到的广播时执行event_name

message_name

没有一个 在消息时执行message_name是可用的。

nevent_name

n证券交易委员会)

nmsec)

n购买)

没有一个

执行时间:

  • 事件event_name至少发生了n自关联状态变为活动状态以来的时间。

  • 至少n自关联状态变为活动状态以来已经过的时间单位。

有关更多信息,请参见

nevent_name

n证券交易委员会)

没有一个

执行时间:

  • 事件event_name发生完全n自关联状态变为活动状态以来的时间。

  • 完全n关联状态变为活动状态已经过了几秒。

有关更多信息,请参见

在之前nevent_name

在之前n证券交易委员会)

在之前nmsec)

在之前n购买)

没有一个

执行时间:

  • 事件event_name发生的次数少于n自关联状态变为活动状态以来的时间。

  • 不到n自关联状态变为活动状态以来已经过的时间单位。

有关更多信息,请参见之前

在每一个nevent_name

在每一个n证券交易委员会)

没有一个

执行:

  • 每一个nth事件的发生event_name因为关联状态变为活动状态。

  • 每一个n关联状态变为活动状态后的几秒。

有关更多信息,请参见每一个

条目行动

进入操作在状态变为活动状态时执行。条目动作由前缀组成条目(或缩写),后面接冒号()和一个或多个操作。要分隔多个条目操作,请使用分号或逗号。您还可以在单独的行上输入操作。

在前面的示例中,输入操作id = x + y当图表采用默认转换且状态A变为活动状态时执行。看到输入图表或状态

退出行动

当状态处于活动状态并发生状态转移时,将执行退出操作。退出动作由前缀组成退出(或缩写前女友),后面接冒号()和一个或多个操作。要分隔多个退出操作,请使用分号或逗号。您还可以在单独的行上输入操作。

在前面的例子中,exit动作time_out当图表从状态A转换到状态B或状态c时执行退出状态

行动

在执行操作期间,当状态是活动的,事件发生,没有有效的转换到另一个状态或当前状态可用。在动作期间由前缀组成(或缩写),后面接冒号()和一个或多个操作。要分隔多个操作期间,请使用分号或逗号。您还可以在单独的行上输入操作。

在前面的例子中,during动作switch_on ()当状态C处于活动状态时执行,因为没有到另一个状态的有效转换。看到状态流程图的执行

绑定行动

控件可以将数据和事件绑定到状态绑定行动。一个绑定动作由前缀组成绑定后跟冒号()和一个或多个事件或数据。要分隔多个事件和数据,请使用分号或逗号。您还可以在单独的行上输入事件和数据。

只有一个状态及其子状态可以更改绑定到该状态的数据或广播事件。其他状态可以读取绑定数据或侦听绑定事件,但不能更改绑定数据或发送绑定事件。

无论绑定状态是否为活动状态,绑定操作都将应用于图表。在前面的例子中,绑定操作绑定:id、time_out国家一个绑定的数据id和事件time_out一个.这个绑定可以防止图表中的任何其他状态(或它的子状态)发生改变id或广播事件time_out

如果一个状态包含更改数据或广播绑定到另一个状态的事件的操作,则会发生编译时错误。例如,这个图表包含两个产生错误的状态操作。

政府行动 错误的原因
绑定:id在国家B 只有一个状态可以改变数据id它一定是状态A
条目:time_out在国家C 只有一个州可以广播该事件time_out它一定是状态A

将函数调用事件绑定到状态也绑定了它所调用的函数调用子系统。当进入绑定状态时,函数调用子系统是启用的;当退出绑定状态时,函数调用子系统是禁用的。有关此行为的更多信息,请参见通过使用绑定动作控制函数调用子系统

在MATLAB中的独立状态流图中不支持绑定金宝app操作®

行动

当状态处于活动状态并接收到事件或消息时执行On操作。On动作由前缀组成接下来是一个独特的事件event_name或消息message_name,冒号()和一个或多个操作。要分隔多个on操作,请使用分号或逗号。您还可以在单独的行上输入操作。

您可以为多个事件或消息指定操作。例如,如果您想要不同的事件触发不同的动作,请输入多个状态Action标签中的Action语句:

ev1: action1 ();ev2: action2 ();
如果同时发生多个事件,相应的on操作将按照它们在状态action标签中出现的顺序执行。例如,在前面的例子中,if事件ev1ev2在同一时间发生,那么action1 ()首先执行,action2 ()执行第二个。看到状态流程图的执行

相关的话题