3. 基于状态机的虚拟设备启停逻辑调试

基于状态机的虚拟设备启停逻辑调试 学习卡片

输送带启停状态机的状态划分与转换条件

虚拟输送带的启停逻辑用状态机描述时,核心是四个稳定状态和它们之间的受控转换。启动、停止、急停、复位四个命令分别触发不同的转换路径,而急停具有最高优先级,任何状态下都必须立即进入急停状态。

STOPPED 停止 / 输送带静止 STARTING 启动中 / 加速至设定速度 RUNNING 运行 / 输送带匀速运转 E_STOP 急停 / 立即切断动力 启动命令 Start=1 速度达标 Speed ≥ 设定值 停止命令 Stop=1 Stop=1 急停 E_Stop=1 急停 E_Stop=1 急停 E_Stop=1 复位 Reset=1 且 E_Stop=0 状态指示:STOPPED→绿灯灭/红灯亮 | STARTING→黄灯闪烁 | RUNNING→绿灯亮 | E_STOP→红灯闪烁+蜂鸣

状态机在虚拟调试环境中的实现

在虚拟调试平台中,状态机通常以PLC程序中的CASE语句或状态变量实现。以下代码展示一个基于整数状态变量的启停状态机,可直接在虚拟PLC中运行并与三维模型信号映射。

// 状态定义
// 0 = STOPPED, 1 = STARTING, 2 = RUNNING, 3 = E_STOP

VAR
    State : INT := 0;           // 当前状态
    StartCmd : BOOL;            // 启动按钮
    StopCmd : BOOL;             // 停止按钮
    EStopCmd : BOOL;            // 急停按钮
    ResetCmd : BOOL;            // 复位按钮
    BeltSpeed : REAL := 0.0;    // 当前带速 m/s
    TargetSpeed : REAL := 1.5;  // 目标带速 m/s
    AccelRate : REAL := 0.5;    // 加速度 m/s²
    GreenLamp : BOOL;           // 绿灯
    RedLamp : BOOL;             // 红灯
    YellowLamp : BOOL;          // 黄灯
    Buzzer : BOOL;              // 蜂鸣器
END_VAR

// 状态机主逻辑
CASE State OF
    0: // STOPPED
        BeltSpeed := 0.0;
        GreenLamp := FALSE;
        RedLamp := TRUE;
        YellowLamp := FALSE;
        Buzzer := FALSE;
        IF EStopCmd THEN
            State := 3;
        ELSIF StartCmd THEN
            State := 1;
        END_IF;

    1: // STARTING
        RedLamp := FALSE;
        YellowLamp := TRUE;
        BeltSpeed := BeltSpeed + AccelRate * 0.1; // 假设扫描周期100ms
        IF EStopCmd THEN
            State := 3;
        ELSIF StopCmd THEN
            State := 0;
        ELSIF BeltSpeed >= TargetSpeed THEN
            BeltSpeed := TargetSpeed;
            State := 2;
        END_IF;

    2: // RUNNING
        YellowLamp := FALSE;
        GreenLamp := TRUE;
        BeltSpeed := TargetSpeed;
        IF EStopCmd THEN
            State := 3;
        ELSIF StopCmd THEN
            State := 0;
        END_IF;

    3: // E_STOP
        BeltSpeed := 0.0;
        GreenLamp := FALSE;
        YellowLamp := FALSE;
        RedLamp := TRUE;
        Buzzer := TRUE;
        IF ResetCmd AND NOT EStopCmd THEN
            State := 0;
        END_IF;
END_CASE;

调试操作与状态一致性验证

将上述状态机变量映射到三维输送带模型的驱动信号和指示灯后,按以下顺序操作并观察模型动作与状态指示是否一致:

  1. 初始状态确认:模型输送带静止,红灯常亮,绿灯和黄灯熄灭,蜂鸣器关闭。
  2. 触发启动:置位StartCmd,观察输送带是否从静止逐渐加速,黄灯是否闪烁,带速是否在约3秒内达到1.5 m/s后转为绿灯常亮。
  3. 运行中停止:置位StopCmd,观察输送带是否立即停止,绿灯熄灭、红灯亮起,状态回到STOPPED。
  4. 急停测试:在RUNNING状态下置位EStopCmd,观察输送带是否立即切断动力(带速归零),红灯闪烁且蜂鸣器响,状态进入E_STOP。
  5. 复位验证:保持EStopCmd为0,置位ResetCmd,观察状态是否回到STOPPED,红灯恢复常亮,蜂鸣器关闭。
调试时可在虚拟PLC中强制State变量为各值,直接观察模型和指示灯响应,快速定位映射错误或状态转换遗漏。若模型动作与状态指示不一致,优先检查信号映射表中BeltSpeed、GreenLamp、RedLamp、YellowLamp、Buzzer的地址是否与PLC变量一一对应。

常见状态转换异常与排查

现象可能原因排查方法
启动后输送带不加速BeltSpeed未映射到模型驱动,或AccelRate为0强制BeltSpeed=1.5观察模型是否动作;检查AccelRate初值
急停后无法复位EStopCmd仍为1,或ResetCmd未正确触发监控EStopCmd和ResetCmd变量值;确认复位条件为ResetCmd AND NOT EStopCmd
黄灯不闪烁STARTING状态未正确进入,或闪烁逻辑未实现强制State=1观察黄灯输出;检查闪烁定时器或脉冲逻辑
运行中按停止无响应StopCmd未映射到PLC输入,或RUNNING状态未处理StopCmd强制StopCmd=1观察State是否变为0;检查CASE分支