我正在尝试在结构化文本中在PLC(Mistubishi Melsec Q00UJCPU)上创建交替输出。 out1和out2 - 是输出。 IN1 - 输入。
这是代码
如果IN1 = TRUE那么; timer1(IN:= TRUE,…
是个 GX Works2 IEC61131 ?如果是这样,它应该使用与Codesys相同的标准。 GX Works2代码是否编译?正如pboedker上面所说,你的代码可能会产生一些编译器错误。可能下面的东西会更好。
GX Works2
IEC61131
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;
您的代码包含很多错误。
这是什么 Q:=timer1.Q ?首先,你必须使用 => 关于输出变量o 功能块,您无法设置输出 Q 计时器到同一输出 Q 相同的计时器。
Q:=timer1.Q
=>
Q
当你这样做
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。
timer1(IN:=TRUE , PT:=T#500ms);
以下是如何在不使用本机代码的计时器的情况下执行交替计时器。因为计时器本身就是用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
这是非常及时的,确定有优化此代码的空间。
在程序中,您可以使用此更改
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