TYPE "st_H_Systemkopf"
VERSION : 0.1
STRUCT
Primary : Bool;
Secondary : Bool;
nonRedundancy : Bool;
SyncCableFail : Bool; // Synchronisationsleitung fehlerhaft
Maintenance : Bool; // Wartung nötig (Diagnosebuffer)
Error : Bool; // Systemfehler (Diagnosebuffer)
Mode : Int; // 0 Unbekannt, 1 Stop, 2 Anlauf, 3 Run, 4 Run-Syncup
END_STRUCT;
END_TYPE
FUNCTION_BLOCK "FB_H_System"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
LADDR_HSystem : HW_ANY; // HSystem HW Adresse ""Local1~RHSystem""
LADDR_Head1 : HW_ANY; // Kopf1 HW Adresse "Local1~HCPUredCtrl"
LADDR_Head2 : HW_ANY; // Kopf1 HW Adresse "Local2~HCPUredCtrl"
LADDR_Head1_Common : HW_ANY; // Kopf1 HW Adresse "Local1~Common"
LADDR_Head2_Common : HW_ANY; // Kopf1 HW Adresse "Local2~Common"
END_VAR
VAR_OUTPUT
SystemOperatingState : Int; // 0 Unbekannt, 1 Stop, 2 Anlauf, 3 Run-Solo, 4 Syncup, 5 Run-Redundant
Kopf1 : "st_H_Systemkopf";
Kopf2 : "st_H_Systemkopf";
END_VAR
VAR
DIS_HSystem {InstructionName := 'DIS'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : DIS;
DIS_Head1 {InstructionName := 'DIS'; LibVersion := '1.0'} : DIS;
DIS_Head2 {InstructionName := 'DIS'; LibVersion := '1.0'} : DIS;
DNN {InstructionName := 'DNN'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : DNN;
Mode { S7_SetPoint := 'True'} : Byte;
Takt {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
Output {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
stTakt : Struct
q : Bool;
in : Bool;
END_STRUCT;
PrimaryID : Int;
END_VAR
VAR_TEMP
Status : Int;
Busy : Bool;
RetVal : Int;
subordinateState : UInt;
CNT_DIAG_temp : UInt;
MRP_proof_Off : Bool;
Modi : DWord;
CPU1ERRLED : Int; // Error LED
CPU1MAINLED : Int; // Wartungs LED
CPU2ERRLED : Int; // Error LED
CPU2MAINLED : Int; // Wartungs LED
END_VAR
VAR CONSTANT
Syncup_sperren : Byte := 3;
Syncup_MRP_freigeben : Byte := 4;
Syncup_anfordern : Byte := 7;
Syncup_anfrage_gesperrt : Byte := 10;
MRP_proof_deact : Byte := 14;
"RUN-Redundant" : UInt := 40;
"RUN-Solo" : UInt := 37;
END_VAR
BEGIN
// ========================================================================================
// Titel: FB_H_System
// Version: 0.0.7
//
// Datum: 1.Nov.2024
// Autor: VoR
// Beschreibung: Der Baustein wertet den aktuellen zustand des H_Systems aus. wenn
// das System wegen aufgebrochenem MRP Ring nicht synchronisiert, wird die
// MRP-Prüfung deaktiviert und das System in den Run-Redundant Modus überführt.
// die MRP-Prüfung wird wieder aktiviert sobald der Ring geschlossen wurde.
// Der aktuelle Betriebszustand wird am SystemOpteratingState ausgegeben
// Der Zustand der beiden Systemköpfe am Ausgang Kopf1 bzw. Kopf2.
// das aussetzen der MRP Prüfung bedingt Firmware >=3.0 der S7-1500 H_Steuerungen
//
// ========================================================================================
#Output(CLK := (#Mode <> 0) AND NOT #stTakt.q);
#Takt(IN := #stTakt.in,
PT := T#500ms,
Q => #stTakt.q);
#stTakt.in := NOT #stTakt.q AND (#Mode <> 0);
#Status := RH_CTRL(REQ := #Output.Q,
Mode := #Mode,
Busy => #Busy);
//Get diag state of R/H system.
#RetVal := GET_DIAG(MODE := 2, LADDR := #LADDR_HSystem, CNT_DIAG => #CNT_DIAG_temp, DIAG := #DNN);
#subordinateState := #DNN.SubordinateState;
#MRP_proof_Off := #DNN.SubordinateIOState.%X15; // MRP prüfung für Sync-Up deaktiviert.
//Get system operating state
#RetVal := GET_DIAG(MODE := 1, LADDR := #LADDR_HSystem, CNT_DIAG => #CNT_DIAG_temp, DIAG := #DIS_HSystem);
CASE #DIS_HSystem.OperatingState OF
#"RUN-Solo":
IF NOT #MRP_proof_Off AND (#subordinateState <> 0) THEN
#Mode := #MRP_proof_deact;
ELSE
#Mode := #Syncup_anfordern;
END_IF;
#"RUN-Redundant":
IF #MRP_proof_Off THEN
#Mode := #Syncup_MRP_freigeben;
ELSIF (NOT #Mode = 0) THEN
#Mode := 0;
END_IF;
END_CASE;
// Zustand an HMI
CASE #DIS_HSystem.OperatingState OF
33: // Stop
#SystemOperatingState := 1;
35: // Anlauf
#SystemOperatingState := 2;
37: // Run-Solo
#SystemOperatingState := 3;
38: // Syncup
#SystemOperatingState := 4;
40: // Run-Redundant
#SystemOperatingState := 5;
ELSE
#SystemOperatingState := 0;
END_CASE;
#PrimaryID := RH_GetPrimaryID();
REGION Zustand #Kopf1
#RetVal := GET_DIAG(MODE := 1, LADDR := #LADDR_Head1, CNT_DIAG => #CNT_DIAG_temp, DIAG := #DIS_Head1);
#CPU1MAINLED := LED(LADDR := #LADDR_Head1_Common, LED := 3);
#CPU1ERRLED := LED(LADDR := #LADDR_Head1_Common, LED := 2);
#Kopf1.Primary := #PrimaryID = 1;
#Kopf1.Secondary := #PrimaryID = 2;
#Kopf1.nonRedundancy := #DIS_HSystem.OperatingState <> #"RUN-Redundant";
#Kopf1.SyncCableFail := #DIS_Head1.OwnState = 3;
#Kopf1.Maintenance := #CPU1MAINLED > 1;
#Kopf1.Error := #CPU1ERRLED > 1;
CASE #DIS_Head1.OperatingState OF
1..4: // Stop
#Kopf1.Mode := 1;
6: // Anlauf
#Kopf1.Mode := 2;
8, 9: // Run
#Kopf1.Mode := 3;
21, 22: // Run-Syncup
#Kopf1.Mode := 4;
ELSE
#Kopf1.Mode := 0;
END_CASE;
END_REGION
REGION Zustand #Kopf2
#RetVal := GET_DIAG(MODE := 1, LADDR := #LADDR_Head2, CNT_DIAG => #CNT_DIAG_temp, DIAG := #DIS_Head2);
#CPU2MAINLED := LED(LADDR := #LADDR_Head2_Common, LED := 3);
#CPU2ERRLED := LED(LADDR := #LADDR_Head2_Common, LED := 2);
#Kopf2.Primary := #PrimaryID = 2;
#Kopf2.Secondary := #PrimaryID = 1;
#Kopf2.nonRedundancy := #DIS_HSystem.OperatingState <> #"RUN-Redundant";
#Kopf2.SyncCableFail := #DIS_Head2.OwnState = 3;
#Kopf2.Maintenance := #CPU2MAINLED > 1;
#Kopf2.Error := #CPU2ERRLED > 1;
CASE #DIS_Head2.OperatingState OF
1..4: // Stop
#Kopf2.Mode := 1;
6: // Anlauf
#Kopf2.Mode := 2;
8, 9: // Run
#Kopf2.Mode := 3;
21, 22: // Run-Syncup
#Kopf2.Mode := 4;
ELSE
#Kopf2.Mode := 0;
END_CASE;
END_REGION
END_FUNCTION_BLOCK
DATA_BLOCK "H_System_DB"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
NON_RETAIN
"FB_H_System"
BEGIN
END_DATA_BLOCK
DATA_BLOCK "H_systemzustand"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
NON_RETAIN
VAR
systemzustand : Int;
Kopf1 { S7_SetPoint := 'False'} : "st_H_Systemkopf";
Kopf2 : "st_H_Systemkopf";
END_VAR
BEGIN
END_DATA_BLOCK
ORGANIZATION_BLOCK "Main_H_System"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
BEGIN
"H_System_DB"(LADDR_HSystem := "Local1~RHSystem",
LADDR_Head1 := "Local1~HCPUredCtrl",
LADDR_Head2 := "Local2~HCPUredCtrl",
LADDR_Head1_Common := "Local1~Common",
LADDR_Head2_Common := "Local2~Common",
SystemOperatingState => "H_systemzustand".systemzustand,
Kopf1 => "H_systemzustand".Kopf1,
Kopf2 => "H_systemzustand".Kopf2);
END_ORGANIZATION_BLOCK