Как ждать 1 секунду, используя структурированный текст? - PullRequest
1 голос
/ 15 января 2020

В настоящее время я пишу программу, которая, когда переменная достигает определенной точки, подключенный индикатор будет зажигать и выключать sh каждую секунду. Я знаю, что свет правильно подключен, и я знаю, что программа чередования между включением и выключением работает, потому что она делала это несколько раз в секунду. Я попытался добавить таймер ожидания, чтобы замедлить мигание.

Вот фрагмент кода, который я пытаюсь добавить:

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 от Schneider Electri c, чтобы написать и выполнить мой код.

Для те, которые sh видят всю программу, если это поможет, вот она:


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;

Чтобы избежать повторного вопроса на этот вопрос, Таймеры в PL C - Структурированный текст , еще раз повторю, что получаю ошибку, используя этот метод. Просто хотел уточнить заранее.

Я совсем не настроен использовать этот способ, если есть лучший вариант. Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Schneider Electri c Эксперт по машинам EcoStruxure основан на CoDeSys. Таким образом, у вас есть несколько вариантов.

  1. Использование BLINK в библиотеке Util

Откройте диспетчер библиотеки, найдите BLINK и дважды щелкните по нему. Теперь у вас есть мигающий блок. Используйте это следующим образом.

VAR
   fbBlink: BLINK;
END_VAR

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

Преимущество этого метода в том, что вы можете устанавливать разное время для LOW и HIGH состояний вашего lite и использовать разные сигналы. Например, короткое мигание каждые 2 секунды с ошибкой 1 и короткое мигание каждые полсекунды с ошибкой 2.

Создайте свою собственную функцию BLINK в соответствии с рекомендациями @ Filippo.
1 голос
/ 16 января 2020

Если вы хотите, чтобы sh включал и выключал свет каждую секунду, вы можете использовать этот код:

Часть декларации:

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 - ваш аппаратный вывод. Теперь, если вы хотите, чтобы свет вспыхнул sh, когда особое условие выполнено, вы можете сделать это следующим образом:

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

Постарайтесь достичь своих целей с максимальной простотой и ясностью.

...