在 Beckhoff TC 上的 ST 中写入一个脉冲发生器的 FB,该脉冲发生器在一个周期内打开和关闭,通过将 bControlInput 设为 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;
END_VAR
logic:
// Store output state when control input goes off
f_trig(CLK:=bControlInput);
IF f_trig.Q THEN
bOutputPaused := bOutput; ///expect: bOutputPaused true, bOutput false
END_IF
// Resume output state when control input goes on
r_trig(CLK:=bControlInput);
IF r_trig.Q THEN
bOutput := bOutputPaused;
END_IF
// Main control logic
IF bControlInput THEN
IF NOT bOutput THEN
//If output is off, start the off timer
fbOffTimer(IN:=TRUE, PT:=tOffTime);
// When the off timer completes, turn on the output
IF fbOffTimer.Q THEN
fbOffTimer(IN:=FALSE);
bOutput := TRUE;
END_IF
ELSE
// If output is on, start the on timer
fbOnTimer(IN:=TRUE, PT:=tOnTime);
// When the on timer completes, turn off the output
IF fbOnTimer.Q THEN
fbOnTimer(IN:=FALSE);
bOutput := FALSE;
END_IF
END_IF
ELSE
// If control input is off, ensure the output is off
bOutput := FALSE;
END_IF
已尝试过解决方法但无济于事
我稍微修改了你的块,以便能够放置一些变量来通过图表进行监控,我放置了一个来监控
ET
(经过时间)和 Q
(输出 - qTimerOff = fboffTimer.Q
/ qTimerOn = fbonTimer.Q
)计时器(请注意,我必须使用陷阱)。
发生的情况是,当您停止处理时,计时器不会暂停...事实上,它们不会激活输出和内部变量,但时间仍在计数,可能是因为它们必须使用PLC循环时间(我无法确认当然,我没有找到任何参考资料)。
嗯,一旦您将
bControl
设置为 TRUE
,定时器块(开或关)就会再次处理,但是,如果编程的时间已经过去,它将假定 Q
为 TRUE
并且在第一个周期中触发输出块状态的变化...
但是,现在,如果您在编程时间之前暂停并重新启动块(请参见下文,我将时间设置为 10 秒),块将按照您想要的方式运行,但请注意,时间似乎并未暂停。
如果当您将
bControl
设置回TRUE
时重置脉冲时间没有问题,那么只需添加几行即可在暂停时重置计时器。
(...)
ELSE
// If control input is off, ensure the output is off
bOutput := FALSE;
fbOnTimer(IN := FALSE);
fbOffTimer(IN := FALSE);
END_IF
如果您想从原来的位置精确地延续脉冲时间,我建议您使用 PLC 循环时间来开发您的功能块,请参阅此处的一些提示。