我不确定这是否适合StackOverflow,或者我应该发布在一个更自动化的StackExchange站点上,所以我向版主道歉。
我试图用CodeSys编程一个ABB PM564 PLC,它控制一个连接到其输出端的电机(FORWARD
输出0,REVERSE
输出1)场景输入是一个打开/关闭马达的POWER
按钮(input0)和一个SENSOR
(input1),当马达启动时,会导致马达反转。
因为瞬间反转会导致电机堵塞,我必须使用delay
功能(计时器打开延迟,又名吨)在改变旋转之前暂停电机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行的block语句似乎没有执行,导致马达暂停一秒,每次都继续旋转。
最佳答案
这是我的猜测,但问题可能在这里:
IF POWER THEN
IF NOT(FORWARD OR REVERSE) THEN
FORWARD:=TRUE;
REVERSE:=FALSE;
END_IF;
该代码应在每次扫描可编程逻辑控制器时执行所以当定时器运行时,
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/