我不是 100% 确定这是否适合 StackOverflow,或者我应该在更自动化的 StackExchange 网站上发布,所以无论如何我向版主道歉。
我正在尝试使用 CodeSys 对 ABB PM564 PLC 进行编程,该 PLC 控制连接到其输出的电机(FORWARD
是输出 0,REVERSE
是输出 1)。场景输入是一个POWER
按钮(input0),用于打开/关闭电机;以及一个SENSOR
(input1),它会导调用机在激活时反转。
因为瞬间反转会导调用机卡住,所以我必须使用延迟
功能(定时器接通延迟,又名 TON)来将电机暂停 1 秒,然后再更改旋转。
这是结构化文本语言的代码块:
FUNCTION_BLOCK SWITCH
VAR_INPUT
POWER : BOOL;
SENSOR : BOOL;
END_VAR
VAR_OUTPUT
FORWARD : BOOL;
REVERSE : BOOL;
END_VAR
VAR
switch: BOOL;
delay : TON;
END_VAR
-
delay(IN:=switch, PT:=T#1000ms);
IF POWER THEN
IF NOT(FORWARD OR REVERSE) THEN
FORWARD:=TRUE;
REVERSE:=FALSE;
END_IF;
ELSE
FORWARD:=FALSE;
REVERSE:=FALSE;
END_IF;
IF SENSOR THEN
switch:=TRUE;
END_IF;
IF switch THEN
IF FORWARD THEN
FORWARD:=FALSE;
IF delay.Q THEN
REVERSE:=TRUE;
switch:=FALSE;
END_IF;
END_IF;
IF REVERSE THEN
REVERSE:=FALSE;
IF delay.Q THEN
FORWARD:=TRUE;
switch:=FALSE;
END_IF;
END_IF;
END_IF;
问题在于实现代码第25行的IF
block 语句似乎没有执行,导调用机暂停一秒并继续旋转FORWARD
每次..
最佳答案
这是我的猜测,但问题可能在这里:
IF POWER THEN
IF NOT(FORWARD OR REVERSE) THEN
FORWARD:=TRUE;
REVERSE:=FALSE;
END_IF;
该代码应在 PLC 的每次扫描时执行。因此,当计时器运行时,FORWARD
或 REVERSE
都不是 TRUE
。因此,该 if 语句执行并使得 FORWARD = TRUE
。
试试这个:
delay(IN:=switch, PT:=T#1000ms);
IF POWER THEN
IF (NOT(FORWARD OR REVERSE) AND NOT(switch)) THEN
FORWARD:=TRUE;
REVERSE:=FALSE;
REV_DELAY:=FALSE;
FWD_DELAY:=FALSE;
END_IF;
ELSE
FORWARD:=FALSE;
REVERSE:=FALSE;
END_IF;
IF SENSOR THEN
switch:=TRUE;
END_IF;
IF switch THEN
IF FORWARD THEN
FORWARD:=FALSE;
REV_DELAY:=TRUE;
FWD_DELAY:=FALSE;
END_IF;
IF REVERSE THEN
REVERSE:=FALSE;
FWD_DELAY:=TRUE;
REV_DELAY:=FALSE;
END_IF;
END_IF;
IF (switch AND delay.Q) THEN
REVERSE:=REV_DELAY;
FORWARD:=FWD_DELAY;
REV_DELAY:=FALSE;
FWD_DELAY:=FALSE;
switch:=FALSE;
END_IF;
关于algorithm - PLC ST 语言 - 传感器信号导调用机反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193393/