主要内容

状态

一种状态描述无功系统的运行模式。在一个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可以在给定时间处于活动状态。

平行(和)状态分解

使用虚线边框的变化表示并行(和)分解。使用此分解描述并发操作模式。当状态有平行(和)分解时,所有代表均在同一时间都处于活动状态。

在以下示例中,当状态一种是活跃的,A1A2既活跃在一起。

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

在以下示例中,当状态一种变得活跃,两个国家B.C同时变得活跃。何时C任一状态变为活动状态C1.或状态C2.可以活跃。

国家标签

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

姓名/ 入口:输入操作期间:在行动退出:退出操作event_nameevent_name行动message_name.message_name行动绑定:事件

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

状态标签中的每个操作都显示在遵循的子主题中。有关国家行动的更多信息,请参阅状态流程图的执行

国家的名字

状态标签以状态的名称开头,然后是可选的/的性格。在上例中,州名为.有效的州名由字母数字字符组成,可以包括下划线(_) 特点。有关更多信息,请参阅命名状态垃圾对象的指南

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

以下示例显示了各州的独特命名是有用的。

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

  • poweron.fan1​​.on.

  • PowerOn.FAN1.Off

  • poweron.fan2.on.

  • poweron.fan2.off.off.

国家行动

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

对于每种类型的操作,您可以通过将每个操作与回车,分号或逗号分隔,输入多个操作。您可以通过添加额外来指定多个事件或消息的操作event_namemessage_name.行。

如果您输入名称和斜杠,然后直接输入操作,操作将被解释为条目行动。如果您仅指定,则此速记非常有用条目行动。

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

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

event_name

没有一个 在状态处于活动状态时执行,它收到广播event_name

message_name.

没有一个 执行消息时执行message_name.可用。

N.event_name的)

N.,秒)

N.,msec)

N.购买)

没有一个

执行时间:

  • 事件event_name至少发生了N.由于相关国家变得活跃的时间。

  • 至少N.自相关国家变得活跃以来已经过去了时间单位。

有关更多信息,请参阅

at.N.event_name的)

at.N.,秒)

没有一个

执行时间:

  • 事件event_name发生完全N.由于相关国家变得活跃的时间。

  • 完全N.由于相关国家变得活跃,因此已经过去了秒。

有关更多信息,请参阅

在之前N.event_name的)

在之前N.,秒)

在之前N.,msec)

在之前N.购买)

没有一个

执行时间:

  • 事件event_name发生了少于N.由于相关国家变得活跃的时间。

  • 不到N.自相关国家变得活跃以来已经过去了时间单位。

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

在每一个N.event_name的)

在每一个N.,秒)

没有一个

执行:

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

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

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

条目行动

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

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

退出行动

当状态处于活动状态时执行退出操作并发生出局的转换。退出行动由前缀组成退出(或缩写前任)然后是冒号()和一个或多个操作。要分隔多个退出操作,请使用分号或逗号。您还可以在单​​独的行中输入操作。

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

行动

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

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

捆绑行动

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

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

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

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

国家行动 错误的原因
绑定:id在州B. 只有一个状态可以改变数据id,这势必是州a
条目:time_out在州C 只有一个州可以广播该事件time_out,这势必是州a

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

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

行动

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

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

在ev1:Action1();在EV2:Action2();
如果多个事件同时发生,则相应的操作按顺序执行它们在状态操作标签中显示。例如,在前面的示例中,如果事件ev1ev2在同一时间发生,那么action1 ()首先执行action2 ()执行第二个。看状态流程图的执行

相关的话题