Main Content

通过使用状态来表示工作模式

状态用于描述反应式系统的工作模式。在 Stateflow® 图中,状态用于顺序设计以创建状态转移图。

在仿真期间,状态可以是激活或非激活。状态的活动根据事件和条件而变化。事件会使状态变为激活或非激活,从而驱动状态转移图的执行。有关详细信息,请参阅Stateflow 图的执行

要表示一个系统中的多层级组件,请通过在父状态中嵌套子状态来创建状态的层次结构。有关详细信息,请参阅使用状态层次结构设计多级状态复杂性

要对互斥的工作模式建模,请在状态中启用互斥 (OR) 分解,以便在同一时刻最多有一个子状态处于激活状态。要实现并发运行的工作模式,请在状态中启用并行 (AND) 分解,以便所有子状态同时处于激活状态。有关详细信息,请参阅通过使用状态分解定义互斥和并行模式

例如,在此图中,状态 PowerOnPowerOff 表示空调系统的开和关模式。在状态 PowerOn 中,并行子状态 FAN1FAN2 表示一对风扇的工作模式。其中每个状态都包含称为 OnOff 的互斥子状态。有关此示例的详细信息,请参阅使用并行分解对同步子系统建模

Chart that contains a hierarchy of exclusive and parallel states that represent the operating modes of an air controller system.

创建状态

要在 Stateflow 图中添加状态,请执行以下操作:

  1. 打开图。

  2. 在对象选项板中,点击“状态”图标

  3. 在图画布上,点击新状态的位置。

  4. 输入状态的标签,并点击状态外任意位置。标签指定状态的名称以及状态在仿真期间执行的任何可选动作。有关详细信息,请参阅定义状态中的动作

在创建状态后,您可以使用 Stateflow 编辑器来更改状态的大小、位置和内容:

  • 要调整状态的大小,请点击并拖动状态的角。

  • 要移动状态,请点击并拖动状态的内部。

  • 要编辑状态标签,请点击要编辑的字符位置附近的标签文本。

提示

父状态的图形必须足够大以容纳其所有子状态,因此,您可能需要先调整父状态的大小, 然后再将新的子状态拖入父状态。您也可以将父状态转换为子图。有关详细信息,请参阅Encapsulate Modal Logic by Using Subcharts

定义状态中的动作

状态的标签指定状态的名称以及状态在仿真期间执行的任何可选动作。状态标签出现在状态的左上角,一般为以下格式:

name entry: entry_actions during: during_actions exit: exit_actions on event_name: on_event_actions on message_name: on_message_actions bind: event_name, data_name

状态动作可以按任何顺序出现。对于每种类型的动作,您可以通过在一个单独的行上输入每个语句来指定多个语句。或者,要在同一行上分隔多个语句,请使用逗号或分号。您还可以组合 entryduringexit 动作来执行相同的语句。有关详细信息,请参阅通过组合状态动作来消除冗余代码

提示

如果您直接在状态名称后添加语句,图会将这些语句解释为组合的 entryduring 动作。

状态名称

状态标签开头为状态名称,其后接可选的斜杠字符 (/)。状态名称区分大小写,由字母数字和下划线字符组合而成。有关详细信息,请参阅命名 Stateflow 对象的规范

为了避免名称冲突,不要给同级状态分配相同的名称。但是,如果每个状态的全名是唯一的,则可以对多个状态使用相同的状态名称。状态的全名由状态层次结构中的前代名称序列组成,这些前代名称由句点分隔。例如,在前面的示例中,FAN1FAN2 中的状态由下列唯一全名标识:

  • PowerOn.FAN1.On

  • PowerOn.FAN1.Off

  • PowerOn.FAN2.On

  • PowerOn.FAN2.Off

entry 动作

要添加 entry 动作,请输入 entryen,后跟冒号 (:) 和一个或多个语句。当状态变为激活时,图便会执行这些语句。例如,在下图中,当空调系统关闭时,状态 PowerOff 中的 entry 动作将 airflow 的值设置为零。有关详细信息,请参阅进入图或状态

State with entry action.

during 动作

要添加 during 动作,请输入 duringdu,后跟冒号 (:) 和一个或多个语句。当状态被激活且没有到另一个状态的有效转移时,图会执行这些语句。例如,在下图中,当空调系统打开时,状态 PowerOn 中的 during 动作会计算 airflow 的值。有关详细信息,请参阅Stateflow 图的执行

State with during action.

exit 动作

要添加 exit 动作,请输入 exitex,后跟冒号 (:) 和一个或多个语句。当状态被激活且发生转出状态的转移时,该图执行。例如,在下图中,当空调系统关闭时,状态 PowerOn 中的 exit 动作将 airflow 的值设置为零。有关详细信息,请参阅退出状态

State with exit action.

on 动作

要添加 on 动作,请输入 on,后跟事件或消息的名称、冒号 (:) 以及一个或多个语句。当状态被激活并且它接收到指定的事件或消息时,图便会执行这些语句。有关详细信息,请参阅通过广播事件同步模型组件通过发送消息与 Stateflow 图通信

可以为一个或多个事件或消息指定 on 动作。例如,对于事件 E1E2,此状态包含不同的 on 动作。

State with multiple on actions.

如果有多个事件同时发生,则对应的 on 动作将按照它们出现在状态标签中的顺序执行。有关详细信息,请参阅Stateflow 图的执行

提示

您可以使用隐式事件(如 changeenterexit)和时序逻辑运算符(如 afteratbeforeevery)来触发状态中的 on 动作。有关详细信息,请参阅通过使用隐式事件控制图行为使用时序逻辑控制图的执行

bind 动作

要添加 bind 动作,请输入 bind,后跟冒号 (:) 以及一个或多个事件或数据对象的名称。要分隔多个事件和数据,请使用分号或逗号,或在单独的行中输入事件和数据。例如,在下图中,状态 A 包含将事件 E 和数据对象 x 绑定到该状态的 bind 动作。

State with bind action that binds an event and a data object to the state.

无论状态是激活还是非激活,都会应用 bind 动作。其他状态可以读取绑定数据或侦听绑定事件,但只有该状态及其子状态可以更改绑定数据的值或广播绑定事件。否则,会发生编译时错误。

将函数调用事件绑定到某个状态还会绑定该事件所调用的函数调用子系统。当绑定状态激活时会启用函数调用子系统,当绑定状态未激活时会禁用该子系统。有关详细信息,请参阅Control Function-Call Subsystems by Using bind Actions

如果图包含将相同数据或事件绑定到多个状态的动作,则会发生编译时错误。

MATLAB® 中的独立 Stateflow 图不支持 bind 动作。

组合状态

您可以对状态的图形内容进行组合以使它们作为单个单元,从而简化图的编辑。例如,移动一个组合状态会同时移动该状态中的子状态、转移和其他图形对象。要组合某个状态,请右键点击该状态,然后在上下文菜单中选择组和子图 >

在选择状态中的对象或将其他图形对象移至该状态中之前,必须先取消该状态的组合。例如,尝试将一个状态或图形函数移至某个组合状态会导致无效交集错误。要取消组合某个状态,请右键点击该状态,然后清除上下文菜单中的组和子图 >

在 Stateflow 编辑器中,组合状态比未组合状态的显示更暗。例如,在下图中,FAN1 是组合状态,FAN2 是未组合状态。

Stateflow chart that contains a grouped state called FAN1 and an ungrouped state called FAN2.

指定状态的属性

您可以通过下面列出的属性指定状态如何与 Stateflow 图中的其他组件交互。您可以在属性检查器、模型资源管理器或“状态”属性对话框中修改这些属性。

要使用属性检查器,请执行以下操作:

  1. 建模选项卡的设计数据下,选择属性检查器

  2. 在 Stateflow 编辑器中,选择状态。

  3. 属性检查器中,编辑状态属性。

要使用模型资源管理器,请执行以下操作:

  1. 建模选项卡的设计数据下,选择模型资源管理器

  2. 模型层次结构窗格中,选择状态。

  3. 对话框窗格中,编辑状态属性。

要使用“状态”属性对话框,请执行以下操作:

  1. 在 Stateflow 编辑器中,右键点击状态。

  2. 选择属性

  3. 在属性对话框中,编辑状态属性。

您还可以通过使用 Stateflow.State 对象以编程方式修改状态属性。有关 Stateflow 编程接口的详细信息,请参阅 Overview of the Stateflow API

名称

状态的名称。此属性为只读。当您在模型资源管理器和“状态”属性对话框中点击状态名称超链接时,Stateflow 编辑器会将该状态置于前台。

执行顺序

并行 (AND) 状态的执行顺序。此属性不适用于互斥 (OR) 状态。有关详细信息,请参阅并行状态的执行顺序

创建监控输出

是否为状态创建激活状态数据输出端口。请参阅Monitor State Activity Through Active State Data

函数内联选项

生成的代码中状态函数的外观。选项包括:

  • 自动 - 内部计算确定生成代码中状态函数的外观。

  • 内联 - 只要函数不是递归的一部分,对状态函数的调用就会被代码替换。

  • 函数 - 状态函数作为单独的静态函数来实现。

有关详细信息,请参阅Inline State Functions in Generated Code (Simulink Coder)。此属性在属性检查器中不可用。

标签

状态的标签。有关详细信息,请参阅定义状态中的动作。此属性在属性检查器中不可用。

记录自身活动

是否启用信号记录。在仿真期间,信号记录将状态的自身活动保存到 MATLAB 工作区。有关详细信息,请参阅Log Simulation Output for States and Data

记录名称

用于记录状态活动的信号名称。

  • 要使用状态名称,请选择使用状态名称

  • 要指定不同名称,请选择自定义并输入自定义记录名称。

将数据点限制为最后

是否将记录的数据点数限制为指定的最大值。例如,如果将最大数据点数设置为 5000,则图仅记录仿真生成的最后 5000 个数据点。

抽取

是否通过使用指定的抽取间隔跳过某些采样来限制记录的数据量。例如,如果将抽取间隔设置为 2,图将每隔一个采样记录一次。

测试点

是否将状态设置为可以在仿真期间使用浮动示波器监控的测试点。您还可以将测试点值记录到 MATLAB 工作区。有关详细信息,请参阅Monitor Test Points in Stateflow Charts

描述

状态的描述。

文档链接

状态的在线文档的链接。您可以输入 Web URL 地址或者将文档显示为 HTML 文件或 MATLAB 命令行窗口中的文本的 MATLAB 命令。点击文档链接超链接时,Stateflow 会计算该链接并显示该文档。

另请参阅

对象

工具

相关主题