4. 层次化状态机:电梯控制系统

任务目标

使用Simulink Stateflow构建一个电梯控制系统的层次化状态机。系统包含主状态(电梯运行方向与停止)和子状态(开门/关门),能够响应外部楼层请求信号,完成电梯的升降与开关门操作模拟。

系统行为定义

  • 主状态:IDLE(待机)、UP(上行)、DOWN(下行)。
  • 子状态:在IDLE主状态下包含DOOR_OPEN与DOOR_CLOSED两个子状态。
  • 输入信号:floor_call(目标楼层,数据类型uint8)、current_floor(当前楼层,uint8)。
  • 输出信号:door_open(boolean,开门指示)、moving_up(boolean)、moving_down(boolean)。

逻辑规则:电梯仅在IDLE且门关闭时响应楼层请求;到达目标楼层后停止并开门,延时后自动关门回到待机。

Stateflow模型实现

在Simulink中新建空白模型,添加Stateflow Chart模块,双击进入编辑环境。按以下结构创建状态与迁移:

// Chart内部层次结构(文字描述对应图形化建模)
// 顶层状态:IDLE(含子状态)、UP、DOWN

// IDLE 内部子状态机:
//   DOOR_CLOSED --[after(2,sec) 且 door_open==false]--> DOOR_OPEN
//   DOOR_OPEN   --[door_open==true 且 floor_call==current_floor]--> DOOR_CLOSED

// 顶层迁移:
// IDLE.DOOR_CLOSED --[floor_call > current_floor]--> UP
// IDLE.DOOR_CLOSED --[floor_call < current_floor]--> DOWN
// UP --[current_floor == floor_call]--> IDLE.DOOR_OPEN
// DOWN --[current_floor == floor_call]--> IDLE.DOOR_OPEN

在Chart的Symbols中添加输入floor_call、current_floor,输出door_open、moving_up、moving_down。在Chart Properties中设置触发类型为Function Call或Sample Time(建议使用采样时间0.1s的离散触发)。

关键代码(Stateflow图形化逻辑对应的文本表示)

以下为Chart内部各状态entry动作的代码片段,用于在Simulink中直接输入到对应状态的entry/exit区域:

// 状态UP的entry动作
moving_up = true;
moving_down = false;
door_open = false;

// 状态DOWN的entry动作
moving_up = false;
moving_down = true;
door_open = false;

// 状态IDLE.DOOR_OPEN的entry动作
door_open = true;
moving_up = false;
moving_down = false;

// 状态IDLE.DOOR_CLOSED的entry动作
door_open = false;
moving_up = false;
moving_down = false;

// 状态IDLE.DOOR_CLOSED的during动作(用于模拟电梯位置更新)
// 实际位置更新建议在Simulink层通过积分器实现,此处仅做状态判断

Simulink模型搭建与仿真配置

  1. 添加Constant模块作为floor_call输入(例如设为3)。
  2. 添加Step或Ramp模块模拟current_floor变化(例如从1开始,每0.5s增加1,模拟电梯上行)。
  3. Chart输出连接至Scope模块观察波形。
  4. 设置仿真停止时间为10秒。

验证方法与通过标准

  • 场景1(上行):设floor_call=3,current_floor从1开始递增。观察Scope:当current_floor到达3时,moving_up由1变为0,door_open变为1,持续2秒后变为0。
  • 场景2(下行):设floor_call=1,current_floor从3开始递减。观察moving_down信号在到达1时归零,随后开门2秒。
  • 判定通过:上述两个场景中,输出信号变化时序与定义完全一致,且无状态卡死(即门能自动关闭,电梯能响应下一次呼叫)。

常见问题排查

  • 若门不自动关闭:检查DOOR_OPEN到DOOR_CLOSED的迁移条件是否使用了after(2,sec),且确认Chart的触发方式为时间触发而非事件触发。
  • 若电梯不响应呼叫:确认当前处于IDLE.DOOR_CLOSED状态,且floor_call与current_floor数据类型一致(均为uint8)。