PLC编程:简单脉冲发生器ST初学者问题

问题描述 投票:0回答:1

在 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

已尝试过解决方法但无济于事

plc structured-text st beckhof
1个回答
0
投票

我稍微修改了你的块,以便能够放置一些变量来通过图表进行监控,我放置了一个来监控

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 循环时间来开发您的功能块,请参阅此处的一些提示。

© www.soinside.com 2019 - 2024. All rights reserved.