Algorithm PLC ST语言-传感器信号上的电机反转
我不能100%确定这是否适合StackOverflow,或者我应该在一个更自动化的StackExchange站点上发布,所以我向版主道歉 我试图用CodeSys对ABB PM564 PLC进行编程,该PLC控制与其输出相连的电机(Algorithm PLC ST语言-传感器信号上的电机反转,algorithm,automation,plc,Algorithm,Automation,Plc,我不能100%确定这是否适合StackOverflow,或者我应该在一个更自动化的StackExchange站点上发布,所以我向版主道歉 我试图用CodeSys对ABB PM564 PLC进行编程,该PLC控制与其输出相连的电机(正向为输出0,反向为输出1)。场景输入是一个打开/关闭电机的电源按钮(input0)和一个启动时会使电机反转的传感器(input1) 原因瞬间反转会导致电机堵塞我必须使用延迟功能(定时器延迟,又名TON)在改变旋转之前将电机暂停1秒钟 以下是结构化文本语言的代码块: F
正向
为输出0,反向
为输出1)。场景输入是一个打开/关闭电机的电源按钮(input0)和一个启动时会使电机反转的传感器(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
-
问题在于执行代码第25行的IF
block语句似乎没有执行,导致电机暂停一秒,每次继续向前旋转 这是我的猜测,但问题可能在这里:
IF POWER THEN
IF NOT(FORWARD OR REVERSE) THEN
FORWARD:=TRUE;
REVERSE:=FALSE;
END_IF;
该代码应在PLC每次扫描时执行。因此,当计时器运行时,正向
或反向
都不是真
。因此,执行该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;
观看delay.Q,因为它永远不可能是真的。没有计时器重置吗?此外,您是否尝试反转fwd和rev命令,并查看逻辑是否反转?传感器开启的时间有多长?它似乎只执行if开关内的第一个if
块,然后。如果我将置于倒档,则
首先切换到倒档
,但每次暂停后,它都会继续旋转倒档
。。。传感器
应该立即关闭,因为它是一个按钮,所以我将其值传递给开关
var,以避免计时器功能立即重置。嗯,也许你有点道理,但在这种情况下,我想它根本不会暂停。在我提出FORWARD:=FALSE之后,它会立即改变
@LePhleg由于计时器循环将继续使其再次为假,因此它将一直切换自身,直到计时器运行。在任何情况下,请尝试更正它,然后查看。那么您的建议是什么?如果没有,只需在此处添加一个复选框((前进或后退)和!开关)。如果switch为false,则只执行语句。这是我第一次猜测If(NOT(FORWARD或REVERSE))和NOT(switch),然后
,但在触发传感器后,它现在似乎挂起了。。与此类似,正向
和反向
都设置为false。即使再次启用传感器
,也不会改变此状态。。
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;