ParamManagerScripts/backend/script_groups/XML Parser to SCL/.example/FB_HMI_Interlock.scl

81 lines
2.2 KiB
Plaintext

// FB10
// Block Type: FB
// Block Name (Original): FB HMI Interlock
// Block Number: 10
// Original Network Languages: SCL
FUNCTION_BLOCK "FB_HMI_Interlock"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_STAT
Status : STRUCT
HMI_InUse : Bool;
HMI_CanBeUsedBy : Int;
HMI_Max_Count : Int;
i_Request : Array[0..7] of Bool;
o_HMI_CanBeUsedBy : Array[0..7] of Bool;
END_STRUCT;
AUX : STRUCT
Cycle_Count : Int;
Time_OUT : STRUCT
PT : Time;
ET : Time;
IN : Bool;
Q : Bool;
END_STRUCT;
END_STRUCT;
END_VAR
VAR_TEMP
i : Int;
END_VAR
CONSTANT
HMI_REQUEST_TRANSPORT : Int := 1;
HMI_REQUEST_ELECTRIC_GUIDES : Int := 2;
END_CONSTANT
#_5s : Bool; // Auto-generated temporary
#AUX : Bool; // Auto-generated temporary
#Status : Bool; // Auto-generated temporary
#i : Bool; // Auto-generated temporary
BEGIN
// Network 1: Number of logics that can use the HMI at the same time (Original Language: SCL)
#Status.HMI_Max_Count := 2; // Only Transport & Electric Guides
// Timeout after the HMI is not more requested by the area
#AUX.Time_OUT(IN :=NOT (#Status.i_Request[#Status.HMI_CanBeUsedBy]), PT :=T#5s);
IF #AUX.Time_OUT.Q THEN
// Cancel the actual use after timeout
#Status.HMI_InUse := FALSE;
FOR #i:=0 TO 7 DO
#Status.o_HMI_CanBeUsedBy[] := FALSE;
END_FOR;
END_IF;
IF NOT #Status.HMI_InUse THEN
#AUX.Cycle_Count := #AUX.Cycle_Count + "DINT_TO_INT"("DB ScanTime_OB1".SCAN_TIME_ms);
IF #AUX.Cycle_Count> 1000 THEN
#Status.HMI_CanBeUsedBy := (#Status.HMI_CanBeUsedBy MOD #Status.HMI_Max_Count) + 1;
#AUX.Cycle_Count := #AUX.Cycle_Count - 1000;
END_IF;
IF #Status.HMI_CanBeUsedBy > 0 AND #Status.i_Request[#Status.HMI_CanBeUsedBy] THEN
// Return that the actual request is active and can use the HMI
#Status.o_HMI_CanBeUsedBy[] := TRUE;
#Status.HMI_InUse := TRUE;
END_IF;
END_IF;
// Every cycle we reset all request. When some area need the HMI need to
// request on every cycle until is granted.
//
FOR #i:=0 TO 7 DO
#Status.i_Request[] := FALSE;
END_FOR;
#Status.o_HMI_CanBeUsedBy[0] := NOT #Status.HMI_InUse;
END_FUNCTION_BLOCK