PLC脉动定时器
PLC Pulsating timer
我正在尝试在我的 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编程有这么多不同吗?
谢谢!
是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;
你的代码有很多错误。
这是什么Q:=timer1.Q
?首先,你必须在输出变量oа ф 功能块上使用=>
,并且不能将定时器的输出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。
这里是您可以在不使用带有本机代码的计时器的情况下执行交替计时器的方法。因为定时器本身是用 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
我正在尝试在我的 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编程有这么多不同吗? 谢谢!
是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;
你的代码有很多错误。
这是什么
Q:=timer1.Q
?首先,你必须在输出变量oа ф 功能块上使用=>
,并且不能将定时器的输出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。
这里是您可以在不使用带有本机代码的计时器的情况下执行交替计时器的方法。因为定时器本身是用 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