我想将多个输出信号作为一组从 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
我尝试了多次谷歌搜索,但我似乎找不到任何东西或无法指定正确的搜索词。
问题是 OUT_readFromPLC 与状态 200 中的其他 OUT 值同时设置,并且您的以太网协议可能不保证首先传输(和到达)哪些值。
此外,即使 OUT_OrderRead 设置为 TRUE,您的接收器也没有状态并继续读取值,直到它收到 IN_readFromPLC=FALSE。在此期间,以太网通信可能仍在积极修改信号。
一个解决方案是插入更多的状态,然后在修改值时保持 OUT_readFromPLC=FALSE,做一个短暂的延迟以确保传输已经发生,然后将其设置为 TRUE。
然后接收器应触发上升值,读取值一次,然后在下一个上升值之前不读取任何内容。 这样您就可以从 PLC 中计时输出值。您可以继续使用接收方的读取确认。
那这个怎么样?
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