4. 状态退出动作

任务说明

本案例在Stateflow中实现一个带退出动作(exit action)的状态机:当状态被激活时执行进入动作,当状态因转移条件满足而退出时,自动执行退出动作(如重置变量、关闭设备)。通过仿真观察退出动作是否在状态离开时被触发。

模型设计

在Simulink中新建模型,添加Stateflow Chart模块。双击进入Chart编辑器,按以下步骤构建:

  1. 添加一个输入端口 trigger(数据类型double),一个输出端口 device_on(数据类型double),一个输出端口 exit_count(数据类型double)。
  2. 在Chart中创建两个状态:ON 和 OFF。
  3. 设置默认转移指向 OFF 状态。
  4. 在 ON 状态的entry动作中写入:device_on = 1;
  5. 在 ON 状态的exit动作中写入:device_on = 0; exit_count = exit_count + 1;
  6. 在 OFF 状态的entry动作中写入:device_on = 0;
  7. 添加转移: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函数。

仿真配置与运行

  1. 在Simulink模型中添加一个Signal Editor或Step模块作为 trigger 输入,设置信号在0~1秒为0,1~2秒为1,2~3秒为0。
  2. 添加Scope模块连接 device_on 和 exit_count 输出。
  3. 设置仿真停止时间为3秒,求解器选择discrete(固定步长0.01s)。
  4. 运行仿真。

验证方法与通过条件

通过以下现象判定退出动作正确触发:

  • 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;,确保输出变量初始值明确。