1. 基础状态机

基础状态机:交通灯控制 学习卡片

任务说明

使用Stateflow在Simulink中建立一个三状态交通灯控制器:红灯→绿灯→黄灯→红灯循环切换,每个状态持续固定时间,并输出对应的控制信号(1=红灯,2=绿灯,3=黄灯)。本案例聚焦状态机建模与时间逻辑,不涉及传感器或外部车辆检测。

模型结构

模型由三部分组成:

  • Signal Editor(或Constant 0)——提供仿真时钟触发,实际时间推进由Stateflow内部使用after()函数完成;
  • Stateflow Chart——包含状态机逻辑;
  • Scope/Display——观察输出信号变化。

Stateflow实现步骤

  1. 新建Simulink模型,添加Stateflow Chart模块;
  2. 双击Chart进入编辑界面,定义输入事件(可选)和输出数据;
  3. 创建三个互斥状态:Red、Green、Yellow;
  4. 每个状态内编写during动作设置输出值,并使用after(n, tick)作为转移条件;
  5. 状态转移按红灯→绿灯→黄灯→红灯闭环连接。

关键完整代码(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可选,不影响本逻辑。

运行与验证

  1. 点击Run开始仿真;
  2. 打开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,不需要额外定义秒事件。