Одновременная пульсация нескольких светодиодов с помощью Beckhoff

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

Скажем, у меня 6 светодиодов.

LED1 AT %Q* : BOOL;
LED2 AT %Q* : BOOL;
LED3 AT %Q* : BOOL;
LED4 AT %Q* : BOOL;
LED5 AT %Q* : BOOL;
LED6 AT %Q* : BOOL;

Моя цель - иметь возможность переключать 3 светодиода (какой бы я хотел). поэтому, если вы нажмете определенную кнопку и включите ее, это произойдет с соответствующим светодиодом:

LED[i] := button[i]; 

Это просто. Теперь скажем, у меня есть 3, которые в настоящее время включены.

Я хотел бы иметь возможность нажимать уникальную кнопку «Импульс» и одновременно пульсировать всеми 3 светодиодами, горящими в настоящее время, в течение 3 импульсных циклов. каждые 1 секунду. бывший. ВКЛ --> ВЫКЛ --> ВКЛ --> ВЫКЛ --> ВКЛ --> ВЫКЛ

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

Спасибо!


person CuriousEngineer    schedule 02.02.2018    source источник


Ответы (2)


Вам необходимо использовать таймеры в TwinCAT, TON и/или TOF. Вам также необходимо определить, когда кнопки были нажаты, чтобы сбросить таймеры. После нажатия кнопки светодиода вы перезапускаете оба таймера, а также запускаете таймер включения.

Быстрое и грязное, вероятно, не на 100% правильное 2-минутное решение (ни в коем случае не элегантное, и которое можно значительно упростить) идет примерно так: здесь я использую только одну из кнопок. Поместите все это в цикл for, чтобы получить то, что вы хотите.

Заголовок функционального блока:

bLED : ARRAY [1..6] OF BOOL ;
bLEDButton : ARRAY [1..6] OF BOOL;
tTimersOn : ARRAY [1..6] OF TON := [(PT := T#1S)];
tTimersOff : ARRAY [1..6] OF TON := [(PT := T#1S)];
fbLEDButtonTimerReset : ARRAY [1..6] OF R_TRIG;
fbLEDOnReset : ARRAY [1..6] OF R_TRIG;
fbLEDOffReset : ARRAY [1..6] OF R_TRIG;

Тело функционального блока

fbLEDButtonTimerReset[1](CLK := bLEDButton[1]); 
IF fbLEDButtonTimerReset[1].Q THEN
    tTimersOn[1](IN := FALSE);
    tTimersOn[1].IN := TRUE;
    tTimersOff[1](IN := FALSE);
END_IF

IF bLEDButton[1] THEN
    tTimersOn[1]();
    tTimersOff[1]();
    fbLEDOffReset[1](CLK := tTimersOff[1].Q);
    IF fbLEDOffReset[1].Q THEN
        tTimersOn[1](IN := FALSE);
        tTimersOn[1].IN := TRUE;
    END_IF
    fbLEDOnReset[1](CLK := tTimersOn[1].Q);
    IF fbLEDOnReset[1].Q THEN
        tTimersOff[1](IN := FALSE);
        tTimersOff[1].IN := TRUE;
    END_IF

    bLED[1] := NOT tTimersOn[1].Q;
END_IF
person Jakob    schedule 03.02.2018
comment
Спасибо @Jakob за потраченное время! Почему нам нужно отслеживать, когда они были нажаты? Скажем, если я нажму 3 кнопки = это означает, что загорятся 3 индикатора. Затем, через 30 минут, я хотел включить 3 горящих светодиода, почему мы синхронизируем их? - person CuriousEngineer; 04.02.2018
comment
Привет @CuriousEngineer! Отслеживание кнопок — это просто сброс таймеров, когда свет горит и выключается. Скажем, например, вы отключили переключение в середине (0,5 с) включения света. Если вы снова нажмете кнопку, вы просто хотите убедиться, что таймеры сброшены, и снова запускается новый 1s-ON/1s-OFF/1s-ON/1s-OFF. - person Jakob; 05.02.2018

Позвольте мне предложить мой 5c. Я знаю, что это может быть поздно, но я думаю, что многим мой код будет полезен.

PROGRAM PLC_PRG
VAR
    xLed1 : ARRAY [1..6] OF BOOL; (* Array of LEDs *)
    xLed1M : ARRAY [1..6] OF BOOL; (* Array of LEDs to remember what to blink*)
    xLedButtons: ARRAY [1..6] OF BOOL; (* Array of buttons to toggle LED state *)
    xLedButtonsM: ARRAY [1..6] OF BOOL; (* Array of button press memmories to use pulse on rised edge of button press *)
    i:INT;
    xButtonBlink: BOOL; (* Button to press to start blinking *)
    xButtonBlinkM: BOOL; (* Memory of the button state to detect raising edge *)
    xBlinkLock: BOOL; (* Lock programm during blinking *)
    xBlinkLockM: BOOL; (* Memory of the lock to detect raising and falling edge *)
    fbTP1:TP; (* timer to enable lock for 6 seconds *)
    fbBLINK1: BLINK;
END_VAR
    (* Start lock timer of raising edge of blink button *)
    fbTP1(IN := xButtonBlink AND NOT xButtonBlinkM, PT := T#6s);
    xButtonBlinkM := xButtonBlink;

    xBlinkLock := fbTP1.Q;

    (* If locked start blinking *)
    IF xBlinkLock THEN
        (* If raised edge, of first cycle of blinking save LED array *)
        IF NOT xBlinkLockM THEN
            xLed1M := xLed1;
        END_IF
        fbBLINK1(ENABLE := TRUE, TIMEHIGH  :=  T#1s,  TIMELOW  :=  T#1s);
        FOR i :=1 TO 6 DO
            IF xLed1M[i] THEN
                xLed1[i] := fbBLINK1.OUT;
            END_IF
        END_FOR
    ELSE
        (* If falling edge of lock, restore LED array and reset blink FB *)
        IF xBlinkLockM THEN
            xLed1 := xLed1M;
            fbBLINK1(ENABLE := FALSE);
        END_IF

        (* Track button clicks and toogle state of led *)
        FOR i := 1 TO 6 DO
            IF xLedButtons[i] AND NOT xLedButtonsM[i] THEN
                xLed1[i] := NOT xLed1[i];
            END_IF;
            xLedButtonsM[i] := xLedButtons[i];
        END_FOR
    END_IF
    xBlinkLockM := xBlinkLock;
END_PROGRAMM
person Sergey Romanov    schedule 02.04.2018