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

时间:2013-11-25 12:41:17

标签: algorithm automation plc

我不是百分之百确定这是否符合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

2 个答案:

答案 0 :(得分:2)

这是我的猜测,但问题可能在这里:

IF POWER THEN
    IF NOT(FORWARD OR REVERSE) THEN
        FORWARD:=TRUE;
        REVERSE:=FALSE;
    END_IF;

该代码应在PLC的每次扫描时执行。因此,当计时器运行时,FORWARDREVERSE都不是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 ,因为它永远不会成真。