0

对于不同的方法,这应该是一个很好的问题。我很新,所以请原谅我的简单问题。

假设我有 6 个 LED。

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(我想要的)。因此,如果您按下特定按钮并将其切换为 ON,它将通过相应的 LED 执行此操作:

LED[i] := button[i]; 

这很容易。现在说我有 3 个当前处于打开状态。

我希望能够按一个独特的“脉冲”按钮并同时脉冲所有 3 个当前点亮的 LED 3 个脉冲周期。每 1 秒长。前任。开 --> 关 --> 开 --> 关 --> 开 --> 关

结构化文本中能够知道哪些当前处于 ON状态的最佳方法是什么,如果是这样,请使用 Timers 将当前 ON LEDS 脉冲 3 次

谢谢!

4

2 回答 2

0

您需要在 TwinCAT、TON和/或TOF中使用定时器。您还需要检测按钮何时被按下,以重置计时器。按下 LED 按钮后,您将重新启动两个计时器并启动开启计时器。

一个快速而肮脏的可能不是 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
于 2018-02-03T08:37:05.677 回答
0

让我提供我的 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
于 2018-04-02T17:09:39.170 回答