通过广播事件同步并行状态
事件帮助平行状态相互协调,允许一个状态触发另一个状态的动作。同步同一Stateflow中的并行状态®图表,将事件从一个州直接转播到另一个州。有关平行状态的更多信息,请参见通过使用并行性来建模同步子系统。
当地广播事件
一个当地的活动是一个非图形对象,可以在状态流图的并行状态下触发转换或操作。当您将一个事件广播到一个状态时,该事件在接收状态和该状态层次结构中的任何子状态中生效。要广播一个事件,请使用发送
接线员:
发送(event_name,state_name)
event_name
是要转播的赛事名称。state_name
是广播期间的活动状态。
赛事转播实例
本例使用本地事件作为家庭安全系统设计的一部分。
安防系统由一个报警器和三个反入侵传感器(一个窗户传感器、一个门传感器和一个运动探测器)组成。在系统检测到入侵后,你有一小段时间来关闭警报。否则,系统会报警。
将子系统建模为并行状态
的安全系统图表用独立的并行状态对每个子系统进行建模。使能的输入信号在在
和从
模式为报警,或之间活跃的
和禁用
每个传感器的模式。当启用时,每个传感器监测一个触发输入信号,表明可能的入侵。
子系统 | 状态 | 启动信号 | 触发信号 |
---|---|---|---|
门传感器 | 门 |
D_mode |
Door_sens |
窗口传感器 | 赢得 |
W_mode |
Win_sens |
运动检测器 | 运动 |
M_mode |
Mot_sens |
报警 | 报警 |
Alarm_active |
如果传感器在报警子系统开启时检测到入侵,那么它将广播一个警报
使用此命令的事件:
发送(预警、报警)
为了减轻零星误报的影响,运动检测器采用了脱扣设计,这样只有持续的正触发信号才会产生警报。相比之下,门窗传感器会将单个正触发信号解读为入侵,并立即发出警报。
在报警子系统中警报
事件导致从闲置
亚态的等待
亚态。当这种状态变为活跃状态时,一个警告声音提醒居住者可能有人入侵。如果发生意外警报,居住者有很短的时间来关闭安全系统。如果在这段时间内没有关闭,系统就会报警求助。
协调与其他动态仿真模块块
状态流图可以使用事件与Simulink中的其他块通信®模型。例如,在sf_security
例子:
输出事件
声音
和call_police
驱动处理警示声和报警电话的外部块。用于广播这些事件的命令出现在警报。在
状态:的命令
声音
中作为入口动作发生等待
亚态。的命令
call_police
事件之间的转换中的动作发生等待
和闲置
亚态。
在每种情况下,发出输出事件的命令是事件的名称。
输入事件
sl_call
控制运动探测器脱扣器的时间和报警前的短延迟。在每个实例中,事件发生在对时间操作员的调用中后
,这将导致在图表多次接收事件后发生转换。
输出事件
一个输出事件出现在状态流图中,但在图外的Simulink块中可见。这种类型的事件使图表能够将发生在图表中的事件通知模型中的其他块。
每个输出事件映射到图表右侧的输出端口。根据其配置,相应的信号可以控制一个触发子系统或一个函数调用子系统。配置一个输出事件:
在建模选项卡,在设计数据中,选择符号面板和属性检查器。
在符号窗格中,选择该事件。
在属性检查器,设置触发到以下选项之一:
要么
-输出事件广播导致输出信号在0和1之间切换。函数调用
—输出事件广播导致Simulink函数调用事件。
在sf_security
示例,输出事件声音
和call_police
使用边缘触发器来激活Simulink模型中的一对闩锁子系统。当每个锁存器检测到其输入信号中的值发生变化时,它会在返回到零的输出之前简要地输出一个值为1的值。
输入事件
一个输入事件发生在Simulink块中,但在状态流图中可见。这种类型的事件使其他的Simulink块,包括其他的状态流图,能够通知在它之外发生的事件的特定图表。
外部Simulink块通过连接到状态流图顶部的触发器端口的信号发送输入事件。根据其配置,输入事件由信号值的变化或通过Simulink块的函数调用产生。配置一个输入事件:
在建模选项卡,在设计数据中,选择符号面板和属性检查器。
在符号窗格中,选择该事件。
在属性检查器,设置触发到以下选项之一:
不断上升的
-当输入信号从零或负值变为正值时,Chart被激活。下降
-当输入信号从正值变为零或负值时,图表被激活。要么
-当输入信号在任意方向变化时越过零时,图表被激活。函数调用
-通过Simulink块的函数调用来激活图表。
在sf_security
例子,一个仿真软件函数调用生成器Block通过触发输入事件来控制安全系统的时间sl_call
通过周期性的函数调用。
探索的例子
安防系统图有几个输入手动开关块和输出到一对闩锁子系统,连接到显示块。在模拟过程中,你可以:
使能告警和传感器子系统,并通过单击开关块。
观看图表动画,突出显示图表中的各种活跃状态。
的输出信号范围block和在模拟数据检查器中。
要调整模拟的时间,双击函数调用生成器块,并在对话框中修改样品时间字段。例如,假设您将采样时间设置为1,并在打开所有子系统、关闭所有传感器触发器的情况下开始模拟。在模拟过程中,你会执行以下操作:
在时间t= 250几秒钟后,你触发了门传感器。警报器开始响起(
声音
= 1)所以你立即禁用alarm系统。你关掉扳机,然后把闹钟重新打开。在时间t= 520几秒钟后,你触发窗户传感器,警报开始响起(
声音
= 0)。这一次,你没有禁用闹钟。在时间t= 600,安保系统报警(call_police
= 1)。的声音
和call_police
信号继续每80秒在0和1之间切换。在时间t= 1400秒,你禁用闹钟。的
声音
和call_police
信号停止切换。
的响应声音
和call_police
向你的行动发出信号。