PLC脉动定时器

时间:2018-01-17 15:51:18

标签: plc st

我尝试在结构化文本中在PLC(Mistubishi Melsec Q00UJCPU)上创建交替输出。 out1和out2 - 是输出。 IN1 - 输入。

这是代码

IF IN1=TRUE THEN;
    timer1(IN:= TRUE, PT:=T#0s , Q:=timer1.Q);
END_IF;
IF timer1.Q THEN;
    out1:=FALSE;
    out2:=TRUE;
    timer1(IN:=FALSE, PT:=T#1s);
    timer2(IN:= TRUE, PT:=T#500ms , Q:=timer2.Q);
END_IF;
IF timer2.Q THEN;
    out2:=FALSE;
    out1:=TRUE;
    timer2(IN:=FALSE, PT:=T#1s);
    timer1(IN:=TRUE , PT:=T#500ms , Q:=timer1.Q);
END_IF;

相同的代码在Codesys中有效,但在GX Works2中不起作用。它可能有什么问题?在Codesys和GX Works ST编程中有这么多不同的东西吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

GX Works2 IEC61131?如果是这样,它应该使用与Codesys相同的标准。 GX Works2代码是否编译?正如pboedker上面所说,你的代码可能会产生一些编译器错误。可能下面的东西会更好。

InstRTrig(clk:=IN1);
InstFTrig(clk:=IN1);

IF InstRTrig.Q THEN
  timer1(IN:= TRUE, PT:=T#1s , Q:=timer1.Q);
END_IF;
IF InstFTrig.Q THEN
  out1:=FALSE;
  out2:=FALSE;
  timer1(IN:=FALSE, PT:=T#1s);
  timer2(IN:= FALSE, PT:=T#500ms);
END_IF;
IF timer1.Q THEN
  out1:=FALSE;
  out2:=TRUE;
  timer1(IN:=FALSE, PT:=T#1s);
  timer2(IN:= TRUE, PT:=T#500ms);
END_IF;
IF timer2.Q THEN
 out2:=FALSE;
 out1:=TRUE;
 timer2(IN:=FALSE, PT:=T#1s);
 timer1(IN:=TRUE , PT:=T#500ms);
END_IF;

答案 1 :(得分:0)

您的代码包含很多错误。

  1. 这是Q:=timer1.Q的内容?首先,您必须在输出变量oф功能块上使用=>,并且不能将计时器的输出Q设置为同一计时器的相同输出Q

  2. 当你这样做时

    IF timer2.Q THEN
     out2:=FALSE;
     out1:=TRUE;
     timer2(IN:=FALSE, PT:=T#1s);
     timer1(IN:=TRUE , PT:=T#500ms);
    END_IF;
    

    timer1(IN:=TRUE , PT:=T#500ms);只能使用一次因为您之前将timer2关闭。

  3. 以下是如何在不使用本机代码的计时器的情况下进行交替计时器。因为计时器本身是用ST写的。

    FUNCTION_BLOCK ALTERNATOR
    VAR_INPUT
        IN: BOOL;
        T1: TIME;
        T2: TIME;
    END_VAR
    VAR_OUTPUT
        Q1:BOOL;
        Q2:BOOL;
    END_VAR
    VAR
        tStart:TIME;
        tET: TIME;
        xM:BOOL;
    END_VAR
    
        IF IN THEN
            IF NOT xM THEN
                tStart := TIME();
            END_IF
    
            IF NOT Q1 AND NOT Q2 THEN
                Q1 := TRUE;
            END_IF
    
            tET := TIME() - tStart;
    
            IF Q1 AND tET >= T1 THEN
                Q1 := FALSE;
                Q2 := TRUE;
                tStart := TIME();
                tET := T#0s;
            END_IF      
    
            IF Q2 AND tET >= T2 THEN
                Q2 := FALSE;
                Q1 := TRUE;
                tStart := TIME();
                tET := T#0s;
            END_IF
    
        ELSE
            Q1 := FALSE;
            Q2 := FALSE;
        END_IF
        xM := IN;
    END_FUNCTION_BLOK
    

    这是非常及时的wцкшеутб我相信这个代码有优化的空间。

    在程序中,您可以使用此替换

    PROGRAM PLC_PRG
    VAR
        fbT: ALTERNATOR;
        xStart: BOOL;
        xOut1: BOOL;
        xOut2: BOOL;
    END_VAR
        fbT(IN := xStart, T1 := T#2s, T2:= T#1s, Q1 => xOut1, Q2 => xOut2);
    END_PROGRAM