0

我正在尝试以结构化文本在我的 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 编程有这么多不同吗?谢谢!

4

2 回答 2

1

您的代码包含很多错误。

  1. 这是什么Q:=timer1.Q?首先,您必须使用=>ф 功能块的输出变量,并且不能将计时器的输出设置为同一计时器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;
    

    Linetimer1(IN:=TRUE , PT:=T#500ms);只会工作一次,因为您之前将 timer2 关闭。

以下是如何在不使用带有本机代码的计时器的情况下进行交替计时器的方法。因为 Timers 本身是用 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
于 2018-04-02T15:58:10.933 回答
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;
于 2018-01-18T13:03:33.047 回答