1

我目前正在编写一个程序,当变量达到某个点时,连接的灯将每秒闪烁一次。我知道灯已正确连接,并且我知道在打开和关闭之间切换的程序可以正常工作,因为它每秒执行多次。我尝试添加一个等待计时器来减慢闪烁速度。

这是我要添加的代码块:

VAR
    delay : TON;
    Count : INT := 0;
END_VAR

delay(IN := TRUE, PT:= T#5S);
    IF NOT (delay.Q) THEN
        RETURN;
    END_IF;

delay(IN := FALSE);

当我将它添加到我的代码中时,我得到错误无效时间常数。

我不确定这是否重要,但我正在使用施耐德电气的 EcoStruxure Machine Expert 来编写和执行我的代码。

对于那些希望看到整个程序的人,如果它有帮助,这里是:


IF (change < 70) THEN
    Light13 := FALSE;
END_IF;

IF (change >= 70) AND (change <= 90) THEN
    Light13 := TRUE;
END_IF;

IF (change > 90) THEN
    WHILE change > 90 DO
        IF (index MOD 2 = 0) THEN
            Light13 := TRUE;

        END_IF;

        IF (index MOD 2 <> 0) THEN
            Light13 := FALSE;

        END_IF;

        delay(IN := TRUE, PT:= T#5s);
            IF NOT (delay.Q) THEN
                RETURN;
            END_IF;

        delay(IN := FALSE);

        index := index + 1;

    END_WHILE;

END_IF;

为避免对这个问题重复提问,PLC 中的计时器 - 结构化文本,我将再次重申使用此方法时出现错误。只是想事先澄清一下。

如果有更好的选择,我根本不会使用这种方式。谢谢您的帮助!

4

2 回答 2

3

施耐德电气的 EcoStruxure Machine Expert 基于 CoDeSys。所以你有几个选择。

  1. 在 Util 库中使用 BLINK

打开库管理器,搜索 BLINK 并双击它。现在你有可用的闪烁块。像这样使用它。

VAR
   fbBlink: BLINK;
END_VAR

fbBlink(ENABLE := TRUE, TIMELOW := T#1s, TIMEHIGH := T#300ms, OUT => bSignal);

这种方法的优点是您可以为 lite 的 LOW 和 HIGH 状态设置不同的时间并使用不同的信号。例如,每 2 秒错误 1 ​​短闪烁一次,每半秒错误 2 短闪烁一次。

  1. 按照@Filippo 的建议创建您自己的 BLINK 函数。
于 2020-01-16T06:10:55.580 回答
1

如果你想每秒闪烁你的灯,你可以使用这个代码:

声明部分:

FUNCTION_BLOCK FB_Flash
VAR_INPUT
    tFlashTime : TIME;
END_VAR
VAR_OUTPUT
    bSignal : BOOL;
END_VAR
VAR
    fbTonDelay : TON;
END_VAR

实现部分:

fbTonDelay(IN := NOT fbTonDelay.q, PT:= tFlashTime);
IF fbTonDelay.Q
THEN
    bSignal := NOT bSignal;
END_IF

你可以这样称呼它:

fbFlash(tFlashTime := T#1S, bSignal => bFlashLight);

bFlashLight 是您的硬件输出。现在,如果您希望在满足特殊条件时让灯闪烁,您可以这样做:

IF bSpecialCondition
THEN
    fbFlash(tFlashTime := T#1S, bSignal => bFlashLight);
ELSE
    bFlashLight := FALSE;
END_IF

尽量以最简单和清晰的方式实现您的目标。

于 2020-01-15T22:06:54.103 回答