通过广播事件同步并行状态
事件帮助并行状态相互协调,从而使一个状态可触发另一个状态中的动作。要在同一个 Stateflow® 图中同步并行状态,请直接从一个状态向另一个状态广播事件。有关并行状态的详细信息,请参阅使用并行机制对同步子系统建模。
广播局部事件
局部事件是非图形对象,它可以触发 Stateflow 图的并行状态中的转移或动作。当您将事件广播到某个状态时,该事件将在接收状态以及该状态层次结构中的任何子状态中生效。要广播事件,请使用 send
运算符:
send(event_name,state_name)
event_name
是要广播的事件的名称。state_name
在广播期间处于激活状态。
事件广播的示例
此示例使用局部事件作为家庭安全系统设计的一部分。
该安全系统由一个警报器和三个防入侵传感器(窗口传感器、门传感器和运动检测器)组成。在系统检测到入侵后,您可以在较短的一段时间内禁用警报。否则,系统会向警方报告。
将子系统建模为并行状态
Security System 图用单独的并行状态为每个子系统建模。使能输入信号在 On
和 Off
模式(对于警报)之间或在 Active
和 Disabled
模式(对于传感器)之间进行选择。启用之后,每个传感器都会监控指示可能有入侵的触发输入信号。
子系统 | 状态 | 使能信号 | 触发信号 |
---|---|---|---|
门传感器 | Door | D_mode | Door_sens |
窗口传感器 | Win | W_mode | Win_sens |
运动检测器 | Motion | M_mode | Mot_sens |
警报 | Alarm | Alarm_active |
如果传感器在警报子系统打开时检测到入侵,则使用以下命令广播 Alert
事件:
send(Alert,Alarm)
为减轻偶发误报的影响,运动检测器采用了一种去抖设计,因此只有持续的正触发信号才会产生警报。相反,门传感器和窗口传感器将单个正触发信号解释为入侵并立即发出警报。
在警报子系统中,Alert
事件引起从 Idle
子状态到 Pending
子状态的转移。当此状态被激活时,会发出警告声,提醒住户可能发生入侵。如果发生误报,则住户可以在较短的一段时间内关闭安全系统。如果在这段时间内没有禁用,系统会向警方报警。
与其他 Simulink 模块协调
Stateflow 图可以使用事件与 Simulink® 模型中的其他模块进行通信。例如,在 sf_security
示例中:
输出事件
Sound
和call_police
驱动处理警告声音和向警方报警的外部模块。用于广播这些事件的命令在Alarm.On
状态中发生:Sound
命令作为Pending
子状态中的 entry 动作执行。call_police
命令作为Pending
到Idle
子状态转移中的动作执行。
在每种情况下,发出输出事件的命令都是事件的名称。
输入事件
sl_call
控制运动检测器去抖器的时序以及向警方报警之前的短时间延迟。在每个实例中,对时序运算符after
的调用内会对该事件计数,并在图接收事件达一定次数后引发转移。
输出事件
输出事件是在 Stateflow 图中发生但在 Stateflow 图之外的 Simulink 模块中可见的事件。这种类型的事件支持 Stateflow 图将该图中发生的事件通知给其他模块。
每个输出事件映射到图右侧的一个输出端口。根据其配置,对应的信号可以控制触发子系统或函数调用子系统。要配置输出事件,请执行以下操作:
在建模选项卡的设计数据下,选择符号窗格和属性检查器。
在符号窗格中,选择事件。
在属性检查器中,将触发器设置为以下选项之一:
Either
- 输出事件广播导致传出信号在 0 和 1 之间切换。Function call
- 输出事件广播导致 Simulink 函数调用事件。
在 sf_security
示例中,输出事件 Sound
和 call_police
使用边沿触发器来激活 Simulink 模型中的一对锁存子系统。当每个锁存子系统检测到其输入信号中的值发生变化时,它会短暂输出值 1,然后再返回到 0 输出。
输入事件
输入事件发生在 Simulink 模块中,但在 Stateflow 图中可见。这种类型的事件支持其他 Simulink 模块(包括其他 Stateflow 图)将在特定 Stateflow 图之外发生的事件通知该图。
外部 Simulink 模块通过连接到 Stateflow 图顶部的触发端口的信号发送输入事件。根据其具体配置,输入事件是由信号值的变化或通过 Simulink 模块中的函数调用产生的。要配置输入事件,请执行以下操作:
在建模选项卡的设计数据下,选择符号窗格和属性检查器。
在符号窗格中,选择事件。
在属性检查器中,将触发器设置为以下选项之一:
Rising
- 当输入信号从零或负值变为正值时,图被激活。Falling
- 当输入信号从正值变为零或负值时,图被激活。Either
- 当输入信号在任一方向变化且过零时,图被激活。Function call
- 通过从 Simulink 模块的函数调用来激活图。
在 sf_security
示例中,Simulink Function-Call Generator 模块通过周期函数调用触发输入事件 sl_call
来控制安全系统的时序。
探索示例
Security System 图从几个 Manual Switch 模块接收输入,并输出到一对连接到 Display 模块的锁存子系统。在仿真过程中,您可以:
通过点击 Switch 模块启用警报和传感器子系统并触发入侵检测。
观看图动画,其中突出显示了图中的各种激活状态。
查看 Scope 模块和仿真数据检查器中的输出信号。
要调整仿真的时序,请双击 Function-Call Generator 模块,然后在对话框中修改采样时间字段。例如,假设您将采样时间设置为 1,并在所有子系统都打开且所有传感器触发器都关闭的情况下开始仿真。在仿真过程中,您执行以下动作:
在 t = 250 秒的时刻,您触发门传感器。警报开始响起 (
Sound
= 1),因此您立即禁用警报系统。您关闭触发器并重新打开警报。在 t = 520 秒的时刻,您触发窗口传感器并且警报开始响起 (
Sound
= 0)。这次,您不禁用警报。在大约 t = 600 秒的时刻,安全系统向警方报警 (call_police
= 1)。Sound
和call_police
信号继续每隔 80 秒在 0 和 1 之间切换一次。在 t = 1400 秒的时刻,您禁用警报。
Sound
和call_police
信号停止切换。
仿真数据检查器显示 Sound
和 call_police
信号对您的动作的响应。