使用事件同步模型组件
事件是可以在以下情形中触发动作的 Stateflow® 对象:
Stateflow 图中的并行状态。
另一个 Stateflow 图。
Simulink® 触发子系统或函数调用子系统。
Stateflow 图可以包含的事件数量没有限制。但是,对于代码生成,底层 C 编译器强制施加 231-1 个事件的限制。
事件类型
隐式事件是在 Stateflow 图执行期间被广播的内置事件。这些事件是隐式的,因为您没有显式定义或触发它们。有关详细信息,请参阅通过使用隐式事件控制图行为。
显式事件是指您显式定义的事件。显式事件可以是以下类型之一。
| 类型 | 描述 |
|---|---|
| 输入事件 | 从图外部广播到 Stateflow 图的事件。有关详细信息,请参阅通过发送输入事件激活 Stateflow 图和使用 Stateflow 图设计人机界面逻辑。 |
| 局部事件 | 可以在 Stateflow 图的任意位置发生但只能在父对象及其后代中可见的事件。有关详细信息,请参阅广播局部事件以同步并行状态。 |
| 输出事件 | 在 Stateflow 图中发生但广播到 Simulink 模块的事件。有关详细信息,请参阅通过发送输出事件激活 Simulink 模块。 |
您可以在 Stateflow 层次结构的以下级别定义局部事件:
| 层次结构的级别 | 可见性 |
|---|---|
| Stateflow 图 | 局部事件对 Stateflow 图及其状态和子状态可见。 |
| 子图 | 局部事件对 Stateflow 子图及其状态和子状态可见。 |
| 状态 | 局部事件对状态及其子状态可见。 |
定义图中的事件
您可以使用符号窗格或 Stateflow 编辑器菜单将事件添加到 Stateflow 图中。
使用“符号”窗格添加事件
在建模选项卡上,在设计数据下,点击“符号”窗格。
点击创建事件图标
。在新事件的行中,点击类型下方的图标并选择:
输入事件
局部事件
输出事件
编辑事件的名称。
对于输入和输出事件,点击端口字段并选择端口号。
要指定事件的属性,请打开属性检查器。在符号窗格中,右键点击该事件的行并选择检查。有关详细信息,请参阅设置事件的属性。
使用 Stateflow 编辑器菜单添加事件
在 Simulink 模型的 Stateflow 图中,选择与您要添加的事件类型对应的菜单选项。
类型 菜单选项 输入事件 在建模选项卡的设计数据下,点击事件输入。 输出事件 在建模选项卡的设计数据下,点击事件输出。 局部事件 在建模选项卡的设计数据下,点击局部事件。 在“事件”对话框中,指定数据属性。有关详细信息,请参阅设置事件的属性。
从 Stateflow 图访问事件信息
您可以显示输入事件或局部事件的属性,也可以直接从 Stateflow 图打开输出事件的目标。右键点击包含事件的状态或转移,然后选择浏览。上下文菜单会列出在状态或转移中所有已解析符号的名称和作用域。从上下文菜单中选择一个输入事件或局部事件将在模型资源管理器中显示其属性。从上下文菜单中选择输出事件将打开与事件关联的 Simulink 子系统或 Stateflow 图。
在 Stateflow 图中使用事件的最佳做法
在图中使用事件时,请遵循以下最佳做法。
使用 send 命令在动作中广播显式事件
要在状态或转移动作中广播局部或输出事件,请使用 send 运算符。例如,要在转移有效时广播输出事件,请避免将事件的名称用作条件动作。
{output_event;}请改为调用 send 运算符。
{send(output_event);}避免使用显式事件触发条件动作
在以下情况下,请对转移使用条件而不是事件:
您要表示条件语句,例如,
[x < 1]或 [x == 0]。您要表示数据值的变化,例如,
[hasChanged(x)]。
避免使用隐式事件 enter 来检查状态活动
要检查状态活动,请使用 in 运算符,而不是隐式事件 enter。有关详细信息,请参阅Check State Activity by Using the in Operator。
不要在图中混合使用边沿触发输入事件和函数调用输入事件
如果将使用边沿触发器的输入事件与函数调用输入事件相混合,则会导致编译时错误。