控制逻辑概述:
系统急停按钮按下时候, 接触器会断开,接触器触点断开, 这个信号就是 #ioInputs.cabEmergencyStopOK 这个变量。急停按下去,这个信号变为false.
系统自动运行时候,#mbrMode.mode 这个变量值是 20
IF #ioInputs.cabProcessRestart OR #ioGlobalVariables.unitStart_button THEN
#mbrMode.mode := 20;
END_IF;
IF #ioGlobalVariables.unitStandby_button OR (#mbrTMP.shutdown AND #mbrMode.mode = 20) THEN
#mbrMode.mode := 10;
END_IF;
IF (#ioGlobalVariables.unitStop_button OR #ioInputs.cabEmergencyStopOK = FALSE OR
#mbrFoamSensor.API_S.fbAlarm) AND #ioInputs.cabProcessRestart = FALSE THEN
#mbrMode.mode := 0;
END_IF;
#ioGlobalVariables.unitMode := #mbrMode.mode;
在这个FB中,我将#mbrMode.mode 这个变量设置为断电保持。
比如系统原先状态是#mbrMode.mode 这个值是20, 断电后系统再次通电, 此时这个变量断电保持继续值为20.
之前有几套系统PLC 型号是6ES7 510-1DJ01-0AB0 固件版本V2.9 ,之前这样使用都可以,每次断电,系统都会保持之前的运行状态值。
最近一套系统PLC 型号是6ES7 510-1DK03-0AB0 固件版本V3.0 调试时候发现,这样设置,每次断电重新上电,#mbrMode.mode 会被清零。 多次排查之后, 我把急停信号先删掉, 系统状态就可以保持。 可以判定就是断电瞬间这个急停信号已经进入到PLC 把 变量#mbrMode.mode 清零0 也就是 下面这段程序在断电瞬间执行了。
IF (#ioGlobalVariables.unitStop_button OR #ioInputs.cabEmergencyStopOK = FALSE OR
#mbrFoamSensor.API_S.fbAlarm) AND #ioInputs.cabProcessRestart = FALSE THEN
#mbrMode.mode := 0;
END_IF;
处理思路如下: 加入了一秒钟延时, 断电瞬间给了1秒钟延时。如果系统意外断电又供电,系统状态可以保持断电之前的运行状态。 当按下急停按钮,一秒之后这个#ioInputs.cabEmergencyStopOK 信号会作用把整个系统停掉。
延时之后程序如下
IF #ioInputs.cabProcessRestart OR
#ioGlobalVariables.unitStart_button THEN
#mbrMode.mode := 20;
END_IF;
IF #ioGlobalVariables.unitStandby_button OR
(#mbrTMP.shutdown AND #mbrMode.mode = 20) THEN
#mbrMode.mode := 10;
END_IF;
#EmergencyStopDelayStopMBR(IN := #ioInputs.cabEmergencyStopOK = FALSE,
PT := T#1S );
IF (#ioGlobalVariables.unitStop_button OR
#EmergencyStopDelayStopMBR.Q = TRUE OR
#mbrFoamSensor.API_S.fbAlarm) AND
#ioInputs.cabProcessRestart = FALSE THEN
#mbrMode.mode := 0;
END_IF;
#ioGlobalVariables.unitMode := #mbrMode.mode;