FUNCTION_BLOCK FB85 (* PI-Regler *) (* Geschwindigkeitsalgorithmus *) (* mögliche Erweiterungen: *) (* Fehlererfassung TI=0 *) (* Anlauf *) (* Begrenzung nach PI3 *) {S7_tasklist := 'OB100'} (* Attribut für den Baustein: Einfügen auch in OB100 *) (* Anlaufverhalten *) // Bausteinparameter VAR_INPUT // Eingangsparameter TRACK : BOOL; //Baustein Reset (Tracken) ER MAN : BOOL := 1; //Betriebsart Hand EYH DEV : REAL; //Regeldifferenz E DISV : REAL; //Störgrößenaufschaltung Z GAIN : REAL := 0.1; //Regelverstärkung KP TI : REAL := 10.0; //Nachstellzeit TN LMN_HLM : REAL := 100.0; //Obergrenze Automatikbetrieb Stellgröße YAO LMN_LLM : REAL; //Untergrenze Automatikbetrieb Stellgröße YAU VMAN : REAL; //Handstellgröße YH VTRACK : REAL; //Resetwert Stellgröße (Tracken) YR SAMPLE_T {S7_sampletime:='true'} : REAL := 1.0; //Abtastzeit END_VAR VAR_IN_OUT // Durchgangsparameter // für Zwangswert herausgeführt LMN_O : REAL; //Stellgröße Altwert YALT END_VAR VAR_OUTPUT // Ausgangsparameter LMN : REAL; //Stellgröße, Reglerausgang Y END_VAR VAR //Statische Variablen //Altwerte EALT : REAL; ZALT : REAL; ANLAUF : BOOL; END_VAR VAR_TEMP // temporäre Variablen (* Strukte für SFC6 *) TOP_SI: struct EV_CLASS: byte; EV_NUM: byte; PRIORITY: byte; NUM: byte; TYP2_3: byte; TYP1: byte; ZI1: word; ZI2_3: dword; end_struct; START_UP_SI: struct EV_CLASS: byte; EV_NUM: byte; PRIORITY: byte; NUM: byte; TYP2_3: byte; TYP1: byte; ZI1: word; ZI2_3: dword; end_struct; ERR : INT; END_VAR BEGIN ERR := RD_SINFO (TOP_SI := TOP_SI, START_UP_SI := START_UP_SI); (* RD_INFO ist Symbol für SFC6 *) (* SFC6 meldet in TOP_SI.NUM den OB über den er aufgerufen wird *) IF TOP_SI.NUM = 100 THEN // Anlauf merken ANLAUF := 1; ELSIF (TRACK = 1) THEN // Reset ( Tracken ) LMN := VTRACK; LMN_O := VTRACK; EALT := 0; ZALT := DISV; ANLAUF := 0; ELSIF (ANLAUF = 1) THEN // Anlauf EALT := DEV; ZALT := DISV; ANLAUF := 0; ELSIF MAN = 1 THEN // Betriebsart Hand LMN := VMAN; LMN_O := VMAN; EALT := DEV; ZALT := DISV; ELSE // Algorithmus Automatikbetrieb LMN := LMN_O + GAIN * ((DEV - EALT) + SAMPLE_T / TI * (DEV + EALT)/2 ) + (DISV - ZALT) ; // Begrenzung Stellgröße IF LMN>LMN_HLM THEN LMN := LMN_HLM; ELSIF LMN