Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm PLC ST语言-传感器信号上的电机反转_Algorithm_Automation_Plc - Fatal编程技术网

Algorithm PLC ST语言-传感器信号上的电机反转

Algorithm PLC ST语言-传感器信号上的电机反转,algorithm,automation,plc,Algorithm,Automation,Plc,我不能100%确定这是否适合StackOverflow,或者我应该在一个更自动化的StackExchange站点上发布,所以我向版主道歉 我试图用CodeSys对ABB PM564 PLC进行编程,该PLC控制与其输出相连的电机(正向为输出0,反向为输出1)。场景输入是一个打开/关闭电机的电源按钮(input0)和一个启动时会使电机反转的传感器(input1) 原因瞬间反转会导致电机堵塞我必须使用延迟功能(定时器延迟,又名TON)在改变旋转之前将电机暂停1秒钟 以下是结构化文本语言的代码块: F

我不能100%确定这是否适合StackOverflow,或者我应该在一个更自动化的StackExchange站点上发布,所以我向版主道歉

我试图用CodeSys对ABB PM564 PLC进行编程,该PLC控制与其输出相连的电机(
正向
为输出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;