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