4. Stateflow实现转向灯闪烁与变道提示
任务说明
本案例在Stateflow中实现一个带退出动作(exit action)的状态机:当状态被激活时执行进入动作,当状态因转移条件满足而退出时,自动执行退出动作(如重置变量、关闭设备)。通过仿真观察退出动作是否在状态离开时被触发。
模型设计
在Simulink中新建模型,添加Stateflow Chart模块。双击进入Chart编辑器,按以下步骤构建:
- 添加一个输入端口
trigger(数据类型double),一个输出端口device_on(数据类型double),一个输出端口exit_count(数据类型double)。 - 在Chart中创建两个状态:
ON和OFF。 - 设置默认转移指向
OFF状态。 - 在
ON状态的entry动作中写入:device_on = 1; - 在
ON状态的exit动作中写入:device_on = 0; exit_count = exit_count + 1; - 在
OFF状态的entry动作中写入:device_on = 0; - 添加转移:
OFF→ON,条件为trigger > 0;ON→OFF,条件为trigger <= 0。
关键点:exit_count 用于记录退出动作被执行的次数,是验证退出动作是否触发的核心观测变量。该变量需在Chart工作区中定义为输出,并在ON状态的exit动作中自增。
完整Stateflow内部逻辑(对应代码)
以下为Chart内部逻辑的文本化描述,可直接在Stateflow图形界面中按此搭建:
// Chart 内部定义
// 输入: trigger (double)
// 输出: device_on (double), exit_count (double)
// 默认转移
OFF = 0; // 初始进入OFF状态
// 状态: OFF
// entry: device_on = 0;
// 转移: OFF -> ON [trigger > 0]
// 状态: ON
// entry: device_on = 1;
// exit: device_on = 0; exit_count = exit_count + 1;
// 转移: ON -> OFF [trigger <= 0]
在Stateflow编辑器中,直接使用图形化状态和转移箭头实现上述逻辑即可,无需编写额外MATLAB函数。
仿真配置与运行
- 在Simulink模型中添加一个Signal Editor或Step模块作为
trigger输入,设置信号在0~1秒为0,1~2秒为1,2~3秒为0。 - 添加Scope模块连接
device_on和exit_count输出。 - 设置仿真停止时间为3秒,求解器选择
discrete(固定步长0.01s)。 - 运行仿真。
验证方法与通过条件
通过以下现象判定退出动作正确触发:
- 0~1秒:trigger=0,状态为OFF,
device_on保持0,exit_count保持0。 - 1秒时刻:trigger变为1,状态OFF→ON,
device_on跳变为1,exit_count仍为0(退出动作未执行)。 - 2秒时刻:trigger变为0,状态ON→OFF,此时
ON状态的exit动作执行:device_on跳变为0,exit_count从0变为1。 - 2~3秒:状态保持OFF,
device_on为0,exit_count保持1不再增加。
通过标准:Scope中 exit_count 在2秒时刻从0跳变为1,且此后不再变化;device_on 在2秒时刻从1跳变为0。若观察到上述波形,则证明退出动作在状态退出时被准确触发且仅触发一次。
常见问题
- exit_count不增加:检查是否将自增语句写在了exit动作中而非entry动作;确认转移条件在2秒时确实满足(trigger<=0)。
- device_on在2秒后仍为1:确认OFF状态的entry动作中已设置
device_on = 0,或ON状态的exit动作已正确执行。 - 初始时刻exit_count不为0:在Chart的默认转移路径上添加初始化语句
exit_count = 0;,确保输出变量初始值明确。