FUNCTION_BLOCK ROLLO_CONTROL
CONST
TAKT_ZEIT:=0.1; // ZEIT Taktmerker für Berechnung
POS_ROLLO_LANGSAM:=90; // Position ab der Lamellen eintauchen
END_CONST
VAR_INPUT
E_ROLLO_AUF :BOOL;
E_ROLLO_ZU :BOOL;
E_FENSTER_TUERE_ZU :BOOL;
POS_EIN :BOOL;
POS :INT; // POSITION von 0-100
TAKT :BOOL;
E_SCHALTUHR :ARRAY[1..3] OF BOOL; //1=Rollo_ZU 2=ROLLO_AUF 3=ROLLO_POS
END_VAR
VAR_OUTPUT
A_ROLLO_AUF :BOOL;
A_ROLLO_ZU :BOOL;
END_VAR
VAR_TEMP
// temporäre Variablen
END_VAR
VAR
HMI :STRUCT
BUTTON_ROLL_ZU :BOOL; // Rollo Zu Button HMI
BUTTON_ROLL_AUF :BOOL; // Rollo Auf Button HMI
BUTTON_ROLL_POS :BOOL; // Position vom HMI anfahren
ROLL_POS :INT; // Position vom HMI
EINRICHTEN :BOOL; // Einrichten
END_STRUCT;
IST_POS_ROLLO :INT; // Ist Position Rollo %
IST_POS_ROLLO_REAL :REAL;
SOLL_POS_ROLLO :INT; // Soll Position Rollo %
POS_ROLLO_AUF :INT:=0 ;//Position Rollo Auf Anfangswert 0
POS_ROLLO_ZU :INT:=100;//Position Rollo Zu Anfangswert 100
NACHLAUFZEIT :TP; // Nachlaufzeit bei Pos 0 und 100
T_NACHLAUFZEIT :TIME:=t#5s;
SPERZEIT_ROLLO :TOF; // Sperzeit zwischen wechsel AUF / AB
M_ROLLO_ZU :BOOL;
M_ROLLO_AUF :BOOL;
LAUFZEIT_ROLLO_AUF :REAL:=20.0;// sec
LAUFZEIT_ROLLO_ZU :REAL:=20.0;// sec
P_E_ROLL_ZU :BOOL;
P_E_ROLL_AUF :BOOL;
P_HMI_BUTTON_ROLL_ZU :BOOL;
P_HMI_BUTTON_ROLL_AUF :BOOL;
P_TAKT :BOOL;
Edge_flag_pos1 :BOOL;
Edge_flag_pos2 :BOOL;
Edge_flag_pos3 :BOOL;
Edge_flag_pos4 :BOOL;
Edge_flag_pos5 :BOOL;
END_VAR
BEGIN
//*******************************************************************************************************************************************//
// Flankenmerker
//Bildung der positiven Flanke //get the positive pulse
P_E_ROLL_ZU := E_ROLLO_ZU AND NOT Edge_flag_pos1;
Edge_flag_pos1 := E_ROLLO_ZU;
P_E_ROLL_AUF := E_ROLLO_AUF AND NOT Edge_flag_pos2;
Edge_flag_pos2 := E_ROLLO_AUF;
P_HMI_BUTTON_ROLL_ZU := HMI.BUTTON_ROLL_ZU AND NOT Edge_flag_pos3;
Edge_flag_pos3 := HMI.BUTTON_ROLL_ZU ;
P_HMI_BUTTON_ROLL_AUF := HMI.BUTTON_ROLL_AUF AND NOT Edge_flag_pos4;
Edge_flag_pos4 := HMI.BUTTON_ROLL_AUF ;
P_TAKT := TAKT AND NOT Edge_flag_pos5;
Edge_flag_pos5 := TAKT ;
//***********************************************************
//* SPERZEIT *
//***********************************************************
SPERZEIT_ROLLO(IN :=A_ROLLO_AUF OR A_ROLLO_ZU,PT := T#2s);
//***********************************************************
//* // Soll Position Rollo setzen *
//***********************************************************
IF HMI.EINRICHTEN THEN
SOLL_POS_ROLLO := REAL_TO_INT (IST_POS_ROLLO_REAL);
ELSIF P_HMI_BUTTON_ROLL_ZU OR P_E_ROLL_ZU OR (E_SCHALTUHR[1] AND E_FENSTER_TUERE_ZU) AND NOT A_ROLLO_AUF THEN
SOLL_POS_ROLLO := POS_ROLLO_ZU;
ELSIF P_HMI_BUTTON_ROLL_AUF OR P_E_ROLL_AUF OR E_SCHALTUHR[2] AND NOT A_ROLLO_ZU THEN
SOLL_POS_ROLLO := POS_ROLLO_AUF;
ELSIF HMI.BUTTON_ROLL_POS THEN
SOLL_POS_ROLLO := HMI.ROLL_POS;
ELSIF POS_EIN OR (E_SCHALTUHR[3] AND E_FENSTER_TUERE_ZU) THEN
SOLL_POS_ROLLO := POS;
END_IF;
//***********************************************************
//* Überprüfung ob SOLL_POS logisch *
//***********************************************************
IF SOLL_POS_ROLLO >100 THEN
SOLL_POS_ROLLO := 100;
ELSIF SOLL_POS_ROLLO <0 THEN
SOLL_POS_ROLLO := 0;
END_IF;
//***********************************************************
//* ROLLO Stoppen wärend fahrt *
//***********************************************************
IF A_ROLLO_AUF AND (P_HMI_BUTTON_ROLL_ZU OR P_E_ROLL_ZU) THEN
SOLL_POS_ROLLO := IST_POS_ROLLO;
END_IF;
IF A_ROLLO_ZU AND (P_HMI_BUTTON_ROLL_AUF OR P_E_ROLL_AUF) THEN
SOLL_POS_ROLLO := IST_POS_ROLLO;
END_IF;
//***********************************************************
//* // Rollo in Position Fahren
//***********************************************************
M_ROLLO_AUF:=IST_POS_ROLLO > SOLL_POS_ROLLO;
M_ROLLO_ZU :=IST_POS_ROLLO < SOLL_POS_ROLLO;
//***********************************************************
//* Nachlaufzeit Rollo bei Pos 0 oder 100
//***********************************************************
NACHLAUFZEIT(IN :=IST_POS_ROLLO = 0 OR IST_POS_ROLLO = 100,PT := T_NACHLAUFZEIT);
//***********************************************************
//* Ausgänge setzen
//***********************************************************
// Ausgänge EIN setzen
IF M_ROLLO_AUF=TRUE AND SPERZEIT_ROLLO.Q=FALSE THEN
A_ROLLO_AUF:=TRUE;
END_IF;
IF M_ROLLO_ZU =TRUE AND SPERZEIT_ROLLO.Q=FALSE THEN
A_ROLLO_ZU:=TRUE;
END_IF;
// Ausgänge AUS setzen
IF M_ROLLO_AUF=FALSE AND NACHLAUFZEIT.Q=FALSE THEN
A_ROLLO_AUF:=FALSE;
END_IF;
IF M_ROLLO_ZU =FALSE AND NACHLAUFZEIT.Q=FALSE THEN
A_ROLLO_ZU :=FALSE;
END_IF;
//***********************************************************
//* Position errechnen: Rollo bis 80% der Laufzeit schnell
// fahren dann langsam
//************************************************************
// ROLLO AUF
IF A_ROLLO_AUF AND P_TAKT THEN
IF IST_POS_ROLLO < POS_ROLLO_LANGSAM THEN
IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL - (INT_TO_REAL (POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_AUF*0.8))*TAKT_ZEIT;
ELSE
IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL - (INT_TO_REAL (100 - POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_AUF*0.2))*TAKT_ZEIT;
END_IF;
IST_POS_ROLLO := REAL_TO_INT (IST_POS_ROLLO_REAL);
IF IST_POS_ROLLO <= 0 THEN
IST_POS_ROLLO:=0;
IST_POS_ROLLO_REAL:=0.0;
END_IF;
END_IF;
// ROLLO ZU
IF A_ROLLO_ZU AND P_TAKT THEN
IF IST_POS_ROLLO < POS_ROLLO_LANGSAM THEN
IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL + (INT_TO_REAL (POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_ZU*0.8))*TAKT_ZEIT;
ELSE
IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL + (INT_TO_REAL (100 - POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_ZU*0.2))*TAKT_ZEIT;
END_IF;
IST_POS_ROLLO := REAL_TO_INT (IST_POS_ROLLO_REAL);
IF IST_POS_ROLLO >= 100 THEN
IST_POS_ROLLO:=100;
IST_POS_ROLLO_REAL:=100.0;
END_IF;
END_IF;
;
END_FUNCTION_BLOCK