1. 基础状态机
任务说明
使用Stateflow在Simulink中建立一个三状态交通灯控制器:红灯→绿灯→黄灯→红灯循环切换,每个状态持续固定时间,并输出对应的控制信号(1=红灯,2=绿灯,3=黄灯)。本案例聚焦状态机建模与时间逻辑,不涉及传感器或外部车辆检测。
模型结构
模型由三部分组成:
- Signal Editor(或Constant 0)——提供仿真时钟触发,实际时间推进由Stateflow内部使用
after()函数完成; - Stateflow Chart——包含状态机逻辑;
- Scope/Display——观察输出信号变化。
Stateflow实现步骤
- 新建Simulink模型,添加Stateflow Chart模块;
- 双击Chart进入编辑界面,定义输入事件(可选)和输出数据;
- 创建三个互斥状态:
Red、Green、Yellow; - 每个状态内编写
during动作设置输出值,并使用after(n, tick)作为转移条件; - 状态转移按红灯→绿灯→黄灯→红灯闭环连接。
关键完整代码(Stateflow内部逻辑)
// Chart 数据定义
// 输出: uint8 y
// 状态 Red
// during:
y = 1;
// 转移: Red -> Green
// 条件: after(6, tick) // 红灯持续6秒
// 状态 Green
// during:
y = 2;
// 转移: Green -> Yellow
// 条件: after(4, tick) // 绿灯持续4秒
// 状态 Yellow
// during:
y = 3;
// 转移: Yellow -> Red
// 条件: after(2, tick) // 黄灯持续2秒
// 初始转移指向 Red
// 无输入事件,使用默认时钟 tick 推进
Simulink模型配置
- Chart输出端口连接到Scope模块;
- 求解器设为
discrete,固定步长0.1s; - 仿真时长设为12秒(覆盖一个完整周期6+4+2=12秒);
- Chart属性中勾选Enable zero-crossing detection可选,不影响本逻辑。
运行与验证
- 点击Run开始仿真;
- 打开Scope观察输出波形:
预期输出(确定性结果):
- 0~6秒:输出恒为1(红灯);
- 6~10秒:输出恒为2(绿灯);
- 10~12秒:输出恒为3(黄灯);
- 12秒后重复上述周期。
通过条件:Scope中波形呈现三段阶梯状电平,每段持续时间与上述时间完全一致,且循环切换顺序正确,即判定模型逻辑正确。
常见问题
- 输出不变化:检查Chart是否设置了输入事件但未连接信号源;本案例无需输入,删除Chart中所有输入事件即可。
- 时间不准确:确认求解器为固定步长离散模式,且
after(n, tick)中的n与期望秒数一致(步长0.1s时,6秒=60个tick,但直接写6配合tick时钟即可,Stateflow自动按仿真时间计算)。 - 状态不转移:检查转移线上的条件是否误写成
after(6, sec)——本案例使用默认事件tick,不需要额外定义秒事件。