You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Beckhoff TC的ST语言脉冲器FB问题:暂停后无法恢复状态

问题分析

现有代码的核心缺陷:

  • 当bControlInput置为FALSE时,强制将bOutput设为FALSE,直接丢失暂停前的输出状态
  • 未保存定时器的运行进度,恢复时无法从暂停点继续计时,只能重新启动周期
  • 恢复逻辑仅还原输出状态,未还原定时器的运行状态,导致周期无法延续
修正方案

新增变量保存暂停时的关键状态(定时器剩余时间、当前运行的定时器标识、输出状态),恢复控制输入时,同时还原输出状态与定时器运行进度,确保周期从暂停点继续执行。

修正后的代码

FUNCTION_BLOCK FB_Pulser
VAR_INPUT
    bControlInput : BOOL;
    tOffTime : TIME;
    tOnTime : TIME;
END_VAR
VAR_OUTPUT
    bOutput : BOOL;
END_VAR
VAR
    fbOffTimer : TON;
    fbOnTimer : TON;
    f_trig : F_TRIG;
    r_trig : R_TRIG;
    // 新增暂停状态保存变量
    bOutputPaused : BOOL;
    tOffTimerRemaining : TIME; // 保存Off定时器剩余时间
    tOnTimerRemaining : TIME;  // 保存On定时器剩余时间
    bIsOffTimerRunning : BOOL; // 标记暂停时是否在运行Off定时器
    bIsOnTimerRunning : BOOL;  // 标记暂停时是否在运行On定时器
END_VAR

// 捕捉控制输入断开的下降沿,保存当前状态
f_trig(CLK := bControlInput);
IF f_trig.Q THEN
    bOutputPaused := bOutput;
    // 保存当前定时器的剩余时间和运行状态
    IF fbOffTimer.IN THEN
        bIsOffTimerRunning := TRUE;
        tOffTimerRemaining := tOffTime - fbOffTimer.ET;
    ELSE
        bIsOffTimerRunning := FALSE;
    END_IF
    IF fbOnTimer.IN THEN
        bIsOnTimerRunning := TRUE;
        tOnTimerRemaining := tOnTime - fbOnTimer.ET;
    ELSE
        bIsOnTimerRunning := FALSE;
    END_IF
    // 暂停时停止定时器
    fbOffTimer(IN := FALSE);
    fbOnTimer(IN := FALSE);
END_IF

// 捕捉控制输入恢复的上升沿,还原状态
r_trig(CLK := bControlInput);
IF r_trig.Q THEN
    bOutput := bOutputPaused;
    // 恢复对应的定时器运行状态和剩余时间
    IF bIsOffTimerRunning THEN
        fbOffTimer(IN := TRUE, PT := tOffTimerRemaining);
    ELSIF bIsOnTimerRunning THEN
        fbOnTimer(IN := TRUE, PT := tOnTimerRemaining);
    END_IF
END_IF

// 主控制逻辑
IF bControlInput THEN
    IF NOT bOutput THEN
        // 输出关闭时,启动Off定时器(如果未在运行)
        IF NOT fbOffTimer.IN THEN
            fbOffTimer(IN := TRUE, PT := tOffTime);
        END_IF
        // Off定时器完成,切换输出为ON并启动On定时器
        IF fbOffTimer.Q THEN
            fbOffTimer(IN := FALSE);
            bOutput := TRUE;
            fbOnTimer(IN := TRUE, PT := tOnTime);
        END_IF
    ELSE
        // 输出开启时,启动On定时器(如果未在运行)
        IF NOT fbOnTimer.IN THEN
            fbOnTimer(IN := TRUE, PT := tOnTime);
        END_IF
        // On定时器完成,切换输出为OFF并启动Off定时器
        IF fbOnTimer.Q THEN
            fbOnTimer(IN := FALSE);
            bOutput := FALSE;
            fbOffTimer(IN := TRUE, PT := tOffTime);
        END_IF
    END_IF
ELSE
    // 控制输入断开时,仅停止定时器,不强制修改输出
    fbOffTimer(IN := FALSE);
    fbOnTimer(IN := FALSE);
END_IF

关键改动说明

  1. 暂停状态完整保存:在控制输入下降沿时,同步保存输出状态、两个定时器的剩余时间及运行状态,同时停止定时器
  2. 精准恢复逻辑:控制输入上升沿时,不仅还原输出状态,还根据保存的定时器数据,用剩余时间重启对应定时器,保证从暂停点继续计时
  3. 主逻辑优化:移除控制输入断开时强制设置bOutput=FALSE的代码,避免丢失暂停前输出状态;新增定时器运行状态判断,防止重复启动导致计时异常

内容的提问来源于stack exchange,提问作者finnh98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:26:28