基于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
关键改动说明
- 暂停状态完整保存:在控制输入下降沿时,同步保存输出状态、两个定时器的剩余时间及运行状态,同时停止定时器
- 精准恢复逻辑:控制输入上升沿时,不仅还原输出状态,还根据保存的定时器数据,用剩余时间重启对应定时器,保证从暂停点继续计时
- 主逻辑优化:移除控制输入断开时强制设置
bOutput=FALSE的代码,避免丢失暂停前输出状态;新增定时器运行状态判断,防止重复启动导致计时异常
内容的提问来源于stack exchange,提问作者finnh98
相关产品推荐
相关产品推荐

