我目前正在编写一个程序,当变量达到某个点时,连接的指示灯将每秒闪烁一次。我知道灯已正确连接,并且我知道该程序可以在开和关之间交替工作,因为它每秒执行多次。我尝试添加一个等待计时器以减慢闪烁速度。
这是我要添加的代码块:
VAR
delay : TON;
Count : INT := 0;
END_VAR
delay(IN := TRUE, PT:= T#5S);
IF NOT (delay.Q) THEN
RETURN;
END_IF;
delay(IN := FALSE);
当将其添加到代码中时,出现错误无效时间常数。
我不确定这是否太大,但是我正在使用Schneider Electric的EcoStruxure Machine Expert编写和执行我的代码。
对于那些希望查看整个程序的人,如果有帮助,这里是:
IF (change < 70) THEN
Light13 := FALSE;
END_IF;
IF (change >= 70) AND (change <= 90) THEN
Light13 := TRUE;
END_IF;
IF (change > 90) THEN
WHILE change > 90 DO
IF (index MOD 2 = 0) THEN
Light13 := TRUE;
END_IF;
IF (index MOD 2 <> 0) THEN
Light13 := FALSE;
END_IF;
delay(IN := TRUE, PT:= T#5s);
IF NOT (delay.Q) THEN
RETURN;
END_IF;
delay(IN := FALSE);
index := index + 1;
END_WHILE;
END_IF;
为了避免对此问题再次提出问题,Timers in PLC - Structured Text,我再次重申,使用此方法时遇到错误。只是想事先澄清一下。
如果有更好的选择,我完全不会使用这种方式。感谢您的帮助!
如果您想每秒钟闪烁一次,可以使用此代码:
声明部分:
FUNCTION_BLOCK FB_Flash
VAR_INPUT
tFlashTime : TIME;
END_VAR
VAR_OUTPUT
bSignal : BOOL;
END_VAR
VAR
fbTonDelay : TON;
END_VAR
实施部分:
fbTonDelay(IN := NOT fbTonDelay.q, PT:= tFlashTime);
IF fbTonDelay.Q
THEN
bSignal := NOT bSignal;
END_IF
您可以这样称呼它:
fbFlash(tFlashTime := T#1S, bSignal => bFlashLight);
bFlashLight是您的硬件输出。现在,如果您希望在特殊条件满足时指示灯闪烁,可以执行以下操作:
IF bSpecialCondition
THEN
fbFlash(tFlashTime := T#1S, bSignal => bFlashLight);
ELSE
bFlashLight := FALSE;
END_IF
尝试以最大的简洁性和清晰性来实现您的目标。