我不是百分之百确定这是否符合StackOverflow,或者我应该在更自动化的StackExchange网站上发布,所以我向版主致歉。
我正在尝试使用CodeSys对ABB PM564 PLC进行编程,CodeSys控制连接到其输出的电机(FORWARD
输出0,REVERSE
输出1)。方案输入是一个POWER
按钮(input0),用于打开/关闭电机和SENSOR
(input1),这将导致电机在激活时反转其旋转。
因为瞬间反转会导致电机堵塞我必须使用delay
功能(定时器开启延迟,也就是TON)在更改旋转之前暂停电机1秒内部。< / p>
以下是结构化文本语言中的代码块:
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
阻止语句似乎没有执行,导致电机暂停一秒并且每次都继续旋转FORWARD
。
答案 0 :(得分:2)
这是我的猜测,但问题可能在这里:
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;
答案 1 :(得分:0)
观看 delay.Q ,因为它永远不会成真。