同步 PLC 的输出和另一台设备的输入

问题描述 投票:0回答:2

我想将多个输出信号作为一组从 PLC 发送到不同设备上的输入。如果我只是使用设备从 PLC 读取输入,我经常得不到更新的信号。例如。 PLC 的输出之一可能被 PLC 设置为高电平,但由于系统之间的通信速度较慢而被设备读取为低电平。

有哪些最佳实践可确保我已正确阅读所有输出?

例如。这是一种常见的方法吗?

PLC

State := 100    <- initial value

--------------------

CASE State OF:
    100: // Init
        ReadFromPLC := FALSE
        I := 1
        OrderRead := FALSE

        State := 200
    200:

        OUT_Value1 := 2 + (I * 2)
        OUT_Value2 := 78 + I
        OUT_Value3 := NOT OUT_Value3

        OUT_readFromPLC := TRUE

        State := 300
    300:
        IF IN_OrderRead AND NOT OrderRead THEN
            OrderRead := TRUE

            OUT_readFromPLC := FALSE
        ELSEIF OrderRead AND NOT IN_OrderRead THEN
            OrderRead := FALSE

            I := I + 1
            State := 200
        END_IF
END_CASE

接收设备

Cycle:

    SIGNAL -OUT_OrderRead
    SWAIT IN_readFromPLC

    read_value1 = BITS (1001, 16)
    read_value2 = BITS (1017, 16)
    read_value3 = SIG (1033)

    SIGNAL OUT_OrderRead

    ...

    GOTO Cycle

我尝试了多次谷歌搜索,但我似乎找不到任何东西或无法指定正确的搜索词。

plc twincat
2个回答
0
投票

问题是 OUT_readFromPLC 与状态 200 中的其他 OUT 值同时设置,并且您的以太网协议可能不保证首先传输(和到达)哪些值。

此外,即使 OUT_OrderRead 设置为 TRUE,您的接收器也没有状态并继续读取值,直到它收到 IN_readFromPLC=FALSE。在此期间,以太网通信可能仍在积极修改信号。

一个解决方案是插入更多的状态,然后在修改值时保持 OUT_readFromPLC=FALSE,做一个短暂的延迟以确保传输已经发生,然后将其设置为 TRUE。

然后接收器应触发上升值,读取值一次,然后在下一个上升值之前不读取任何内容。 这样您就可以从 PLC 中计时输出值。您可以继续使用接收方的读取确认。


0
投票

那这个怎么样?

PLC:

DelayOrderReady : TON;
State           : INT := 100;

--------------------

CASE State OF:
    100: // Init
        OrderWritten := FALSE;
        OrderRead := FALSE;
        DelayOrderReady(IN:=FALSE);
        OUT_OrderReady := FALSE;

        State := 200;
    200: // Prepare next order
        // Ensure IN_OrderRead is FALSE before preparing a order
        IF IN_OrderRead THEN
            RETURN;
        END

        // Set output values
        IF NOT OrderWritten THEN
            OUT_Value1 := x;
            OUT_Value2 := y;
            OUT_Value3 := z;

            OrderWritten := TRUE;
        END_IF

        // Wait 1 sec before setting order ready
        DelayOrderReady(IN:=TRUE, PT:=T#1s)
        IF DelayOrderReady.Q THEN
            DelayOrderReady(IN:=FALSE);

            OUT_OrderReady := TRUE;
            OrderWritten := FALSE;

            State := 300;
        END
    300: // Wait for order to complete
        IF IN_OrderRead THEN
            OUT_OrderReady := FALSE;
            OrderRead := TRUE;
        END_IF

        // Wait for order to complete
        IF OrderRead AND IN_OrderDone THEN
            OrderRead := FALSE;
            State := 200;
        END_IF
END_CASE

川崎机器人:

SIGNAL -OUT_OrderRead
SIGNAL -OUT_OrderDone
OrderRead = FALSE
OrderDone = TRUE

State = 100

Cycle:

    CASE State OF
        100:
            CALL SafeHome
            State = 200

        200:
            ; Waiting for order
            IF OrderDone AND SIG (IN_OrderReady) THEN
                Value1 = BITS (1001, 16)
                Value2 = BITS (1017, 16)
                Value3 = SIG (1033)

                PULSE OUT_OrderRead, 1
                SWAIT -IN_OrderReady

                State = 300
            END
        
        300:
            ; Carry out order
            OrderDone = FALSE

            ...

            PULSE OUT_OrderDone, 1

            OrderDone = TRUE
            State = 200
    END

    GOTO Cycle
© www.soinside.com 2019 - 2024. All rights reserved.