Files
HundM_Fortna/1_BaseSystemLib/180_Safety/FB_ESTOPhandling.scl
T
2026-06-29 16:28:48 +02:00

124 lines
4.4 KiB
Plaintext

FUNCTION_BLOCK "FB_ESTOPhandling"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
tInPeriodicTime : Time := T#500ms; // BlinkTime LED Output
sInAlarmFunction : String[20]; // Alarm Function Name
sInAlarmDevice : String[16]; // Alarm Prefix
sInAlarmSuffix : String[16]; // Alarm Suffix
sInAlarmMessage : String; // Alarm Message
xInAckReqLocal : Bool; // Info from F-CPU: ESTOP.ACK_REQ
xInEstopOkLocal : Bool; // Info from F-CPU: ESTOP.Q Safety is Enabled
xInAckReqGlobal : Bool; // Sum-Info from Local ESTOP
xInSafetyNotOkGlobal : Bool; // Sum-Info from Local ESTOP
xInMainCabinet : Bool := false; // Activate Main Cabinet and global reset
wInTextListId_Message : Word;
wInTextListId_Function : Word;
wInTextListId_Prefix : Word;
wInTextListId_Suffix : Word;
END_VAR
VAR_OUTPUT
xOutLed : Bool; // PushButton LED Output
xOutSafetyNotOk : Bool; // Info Output for MainCabinet
xOutAckReq : Bool; // Info Output for MainCabinet
END_VAR
VAR_IN_OUT
stInOutControlUnitCabinet : "UDT_MainState"; // MachineState of FB_StateMain
stInOutHmiEstopPanel : "UDT_Panel_EmergencyStop";
END_VAR
VAR
FB_Blinker : "FB_Blinker";
fbMonitoringEStop : "FB_Monitoring";
END_VAR
BEGIN
REGION Blinker
// #FB_Blinker(tInPeriodicTime := #tInPeriodicTime,
// xInActivate := 1);
END_REGION
REGION Logic
// Local
IF NOT #xInMainCabinet THEN
IF NOT #xInEstopOkLocal AND #xInAckReqLocal THEN
// Button not pressed but not Acknowledged
#xOutLed := "Clock_1Hz"(* #FB_Blinker.xOutput *);
#xOutSafetyNotOk := FALSE;
#xOutAckReq := TRUE;
ELSIF NOT #xInEstopOkLocal AND NOT #xInAckReqLocal THEN
// Button pressed
#xOutLed := TRUE;
#xOutSafetyNotOk := TRUE;
#xOutAckReq := FALSE;
ELSIF #xInEstopOkLocal AND NOT #xInAckReqLocal THEN
// ESTOP Activated
#xOutLed := FALSE;
#xOutSafetyNotOk := FALSE;
#xOutAckReq := FALSE;
ELSE
// Button pressed or Hardware-Error
#xOutLed := TRUE;
#xOutSafetyNotOk := TRUE;
#xOutAckReq := FALSE;
END_IF;
ELSE // Global, Main Cabinet
IF ((NOT #xInEstopOkLocal AND #xInAckReqLocal AND NOT #xInAckReqGlobal) OR
(#xInEstopOkLocal AND NOT #xInAckReqLocal AND #xInAckReqGlobal) OR
(NOT #xInEstopOkLocal AND #xInAckReqLocal AND #xInAckReqGlobal))
AND NOT #xInSafetyNotOkGlobal THEN
#xOutLed := "Clock_1Hz"(* #FB_Blinker.xOutput *);
ELSIF (NOT #xInEstopOkLocal AND NOT #xInAckReqLocal) OR #xInSafetyNotOkGlobal THEN
#xOutLed := true;
ELSIF #xInEstopOkLocal AND NOT #xInAckReqLocal THEN
#xOutLed := false;
ELSE
#xOutLed := true;
END_IF;
END_IF;
END_REGION
REGION Monitoring
#fbMonitoringEStop.stSettings.nErrorType := 1;
#fbMonitoringEStop.stSettings.xErrLedIfMachineIsOff := TRUE;
#fbMonitoringEStop.stSettings.xSelfQuit := TRUE;
#fbMonitoringEStop(sInFctnName := #sInAlarmFunction,
sInPrefix := #sInAlarmDevice,
sInSuffix := #sInAlarmSuffix,
InOutMachineState := #stInOutControlUnitCabinet,
xInQuitError := #stInOutControlUnitCabinet.xQuitError,
xInSignal := #xInEstopOkLocal,
wInTextListId_Message := 0,
wInTextListId_Function := #wInTextListId_Function,
wInTextListId_Prefix := #wInTextListId_Prefix,
wInTextListId_Suffix := #wInTextListId_Suffix,
sInAlarmMessage := #sInAlarmMessage);
END_REGION
REGION HMI
#stInOutHmiEstopPanel.sPanelName := #sInAlarmDevice;
#stInOutHmiEstopPanel.sBMKEStop := #sInAlarmSuffix;
#stInOutHmiEstopPanel.sBMKResetButton := '';
#stInOutHmiEstopPanel.sBMKResetLED := '';
#stInOutHmiEstopPanel.xEStopActive := NOT #xInEstopOkLocal;
#stInOutHmiEstopPanel.xReset := #xOutLed;
END_REGION
END_FUNCTION_BLOCK