10. Lösungen: Bibliotheksfähige Funktionsblöcke (FBs) ======================================================================= Aufgabe 10.1 Niedriger Behälter mit I-Verhalten FUNCTION_BLOCK BEHAELTER_I (*Simulation eines niedrigen Behälters – I-Verhalten, Strecke ohne Ausgleich*) VAR_INPUT rZUFLUSS, rABFLUSS:REAL;(*0 ... 1.0*) tFUELLZEIT:TIME:= T#10S; tCYCLE:TIME:= T#100MS; END_VAR VAR_OUTPUT rHOEHE:REAL;(*0 ... 1.0*) END_VAR VAR r_m:REAL;(*Steigung*) rFuellzeit, rCycle:REAL; END_VAR IF rHOEHE <= 0.0 THEN (*Begenzung*) rHOEHE:= 0.0; rABFLUSS:= 0.0; END_IF; r_m:=(rZUFLUSS-rABFLUSS); rFuellzeit:= TIME_TO_REAL(tFUELLZEIT);(*in ms*) rCycle:= TIME_TO_REAL(tCYCLE);(*in ms*) rHOEHE:= rHOEHE + r_m*rCycle/rFuellzeit;(*neue Höhe*) IF rHOEHE > 1.0 THEN (*Begenzung*) rHOEHE:= 1.0; RETURN; END_IF; PROGRAM Test (*Taskkonfiguration – zyklisch, z. B. 200 ms*) VAR rZulauf, rAblauf, rFuellstand:REAL;(*0...1.0*) BEHAELTER_1:BEHAELTER_I;(*Instanz*) END_VAR BEHAELTER_1( rZUFLUSS:= rZulauf, rABFLUSS:= rAblauf, tFUELLZEIT:= T#10s, tCYCLE:= T#200ms); rFuellstand:= BEHAELTER_1.rHOEHE; Importieren Sie den FB in Ihre STRECKEN-Bibliothek. _______________________________________________________________________ Aufgabe 10.2 Digitalfilter FUNCTION_BLOCK FILTER_M (*Gleitende Mittelwertbildung mit N+1=4*) VAR_INPUT i_X:INT;(*aktueller Eingangswert,0..10V=>0..27648*) END_VAR VAR_OUTPUT i_Y:INT;(*berechneter Ausgangswert,0..27648=>0..10V*) END_VAR VAR x0, x1, x2, x3, y:REAL; END_VAR (*x-Werte verschieben*) x3:= x2; x2:= x1; x1:= x0; (*neuen Wert einlesen*) x0:= INT_TO_REAL(i_x); (*neuen Ausgangswert berechnen*) y:= 0.25*(x0+x1+x2+x3); (*Wert in INT wandeln*) i_y:= REAL_TO_INT(y); PROGRAM TEST (*Taskkonfiguration mit einem Intervall von T#10 ms*) (*Test des Digitalfilters*) VAR temp,temp_out:INT; FILTER1:FILTER_M; END_VAR FILTER1(i_X:=temp); temp_out:= FILTER1.i_Y; Importieren Sie den FB in Ihre STRECKEN-Bibliothek. _______________________________________________________________________ Aufgabe 10.3b) Taktgeber FUNCTION_BLOCK CLOCK_R (*Taktgeber mit einstellbarer Periodendauer und einstellbarem Ausgangssignal*) VAR_INPUT PERIOD:TIME; CYCLE:TIME;(*Intervall*) OUT_MAX:REAL:= 1.0; OUT_MIN:REAL:= -1.0; END_VAR VAR_OUTPUT OUT:REAL; FAULT:BOOL; END_VAR VAR n: INT:= 1;(*Zyklenzahl*) rCycle_ms, rPERIOD_ms: REAL; END_VAR (*Eingabe überprüfen*) IF PERIOD < CYCLE THEN FAULT:= TRUE; RETURN; ELSE FAULT:= FALSE; END_IF; (*Schalten*) rPERIOD_ms:= TIME_TO_REAL(PERIOD); rCycle_ms:= TIME_TO_REAL(CYCLE); IF n=(TRUNC(rPERIOD_ms/rCycle_ms))THEN IF OUT > OUT_MIN THEN OUT:= OUT_MIN; n:= 1; ELSE OUT:= OUT_MAX; n:= 1; END_IF; ELSE n:= n+1; END_IF; PROGRAM TEST (*Taskkonfiguration mit einem Intervall von T#100 ms*) VAR rWert: REAL; CLOCK_R_1: CLOCK_R; END_VAR CLOCK_R_1( PERIOD:= T#0.499s, CYCLE:= T#100ms, OUT_MAX:= 1.0, OUT_MIN:= 0.5); rWert:= CLOCK_R_1.OUT; Importieren Sie den FB in Ihre STRECKEN-Bibliothek. Aufgabe 10.3c) Taktgeber TYPE CLOCK : STRUCT PERIOD:TIME:=T#0.5s; CYCLE:TIME:= T#100ms;(*Task-Intervall*) OUT_MAX:REAL:= 1.0; OUT_MIN:REAL:= 0.5; END_STRUCT END_TYPE FUNCTION_BLOCK CLOCK_R (*Taktgeber mit DUT CLOCK*) VAR_INPUT IN_OUT:CLOCK; END_VAR VAR_OUTPUT OUT:REAL; END_VAR VAR n: INT:= 1;(*Zyklenzahl*) rCycle_ms, rPERIOD_ms: REAL; END_VAR (*Schalten*) rPERIOD_ms:= TIME_TO_REAL(IN_OUT.PERIOD); rCycle_ms:= TIME_TO_REAL(IN_OUT.CYCLE); IF n=(TRUNC(rPERIOD_ms/rCycle_ms))THEN IF OUT = IN_OUT.OUT_MAX THEN (*oder OUT > OUT_MIN*) OUT:= IN_OUT.OUT_MIN; n:= 1; ELSE OUT:= IN_OUT.OUT_MAX; n:= 1; END_IF; ELSE n:= n+1; END_IF; PROGRAM TEST (*Zyklischer Task 100ms*) VAR rWert: REAL; CLOCK_R_1: CLOCK_R; END_VAR CLOCK_R_1(); rWert:= CLOCK_R_1.OUT; _______________________________________________________________________ Aufgabe 10.4 Tiefpass Fügen Sie FUNCTION_BLOCK LOW_PASS (*Einfacher Tiefpass, Ausgangsverlauf ist nahe der e-Funktion*) VAR_INPUT IN: REAL; N: USINT;(*nach N Zyklen wird der Endwert erreicht*) END_VAR VAR_OUTPUT FAULT: BOOL; OUT: REAL; END_VAR IF N<5 OR N>200 THEN FAULT:= TRUE; OUT:= 0.0; RETURN; ELSE FAULT:= FALSE; END_IF; OUT:=((IN-OUT)/N)+ OUT; PROGRAM TEST (*Taskkonfiguration mit einem Intervall von T#100 ms*) VAR rDruck: REAL; rWert: REAL; usiZykl: USINT:= 10; xN_Fehler:BOOL; LOW_PASS_1: LOW_PASS; CLOCK_R_1: CLOCK_R; END_VAR CLOCK_R_1( PERIOD:= T#0.5s, CYCLE:= T#100ms, OUT_MAX:= 8.5, OUT_MIN:= 7.5); rWert:= CLOCK_R_1.OUT; LOW_PASS_1(IN:= rWert, N:=usiZykl); rDruck:= LOW_PASS_1.OUT; xN_Fehler:= LOW_PASS_1.FAULT; Importieren Sie den FB in Ihre STRECKEN-Bibliothek. _______________________________________________________________________ Aufgabe 10.5 Streckensimulation für Regelstrecken mit Ausgleich Fügen Sie Ihre STRECKEN-Bibliothek hinzu. FUNCTION_BLOCK PT2 (*Strecke mit Ausgleich*) VAR_INPUT Y:REAL;(*Stellwert*) N:USINT;(*zeitliches Verhalten*) END_VAR VAR_OUTPUT X:REAL;(*Istwert*) END_VAR VAR LOW_PASS_1, LOW_PASS_2:LOW_PASS;(*Instanzen*) x1: REAL; END_VAR LOW_PASS_1(IN:= Y, N:= N); x1:= LOW_PASS_1.OUT; LOW_PASS_2(IN:= x1, N:= N); X:= LOW_PASS_2.OUT; PROGRAM TEST (*im Task 100 ms, test des FBs-PT2*) VAR (*Zum Testen Stellwert verändern, z.B. von 0 -> 0.5*) rStellwert:REAL; rIstwert:REAL; usiN:USINT:= 50; Temperaturregelstrecke:PT2; END_VAR Temperaturregelstrecke(Y:= rStellwert, N:= usiN); rIstwert:= Temperaturregelstrecke.X;(*Temperatur normiert*) Importieren Sie den FB in Ihre STRECKEN-Bibliothek. _______________________________________________________________________ Aufgabe 10.6b Autowaschanlage, ablauforientiert programmiert PROGRAM PLC_PRG (****************************************************************** Autowaschanlage, ablauforientiert programmiert, CASE, IF... mit einer simulierten Waschstraße mit Hilfe der Visualisierung und den Baustein MODELL_W Einloggen und Start, beobachten Sie den Ablauf in der Visualisierung. *******************************************************************) VAR S1_Start, S0_Stopp : BOOL;(*Taster Visu*) S2_Hand :BOOL; (*Schalter Handbetrieb Visu*) B1_pos_vorw, B2_pos_hauptw, B3_pos_trock: BOOL;(*simulierter Positionsschalter*) P1_startbereit AT %QX0.0: BOOL;(*Anzeige*) Q1_Band AT %QX0.2: BOOL;(*Schütz Bandantrieb*) M1_Vorw AT %QX0.3: BOOL;(*Ventil*) M2_Q2_Hauptw AT %QX0.4: BOOL;(*Ventil+ Schütz Bürsten*) Q3_Trockner AT %QX0.5: BOOL;(*Schütz Trocknerantrieb*) usiSchrittNr:USINT; usiAktionsNr: USINT := 1; (*Visu Anzeige und Eingabe*) WASCH1:WASCH; MODELL1:MODELL_W;(*Instanzen*) END_VAR (*Modell der Waschstraße, simuliert die Positionsschalter*) MODELL1(BAND:= Q1_Band, POS_VORW=> B1_pos_vorw, POS_HAUPTW=> B2_pos_hauptw, POS_TROCK=> B3_pos_trock); (*Waschstraße 1*) WASCH1(START:= S1_Start, STOPP:= S0_Stopp, POS_VORW:= B1_pos_vorw, POS_HAUPTW:= B2_pos_hauptw, POS_TROCK:= B3_pos_trock, HAND:= S2_Hand, AKTION_NR:= usiAktionsNr, BEREIT=> P1_startbereit, BAND=> Q1_Band, VOR_WAESCHE=> M1_Vorw, HAUPT_WAESCHE=> M2_Q2_Hauptw, TROCKNER=> Q3_Trockner, SCHRITT=> usiSchrittNr); FUNCTION_BLOCK WASCH VAR_INPUT START, STOPP, POS_VORW, POS_HAUPTW, POS_TROCK:BOOL; HAND:BOOL; AKTION_NR:USINT; END_VAR VAR_OUTPUT BEREIT, BAND, VOR_WAESCHE, HAUPT_WAESCHE, TROCKNER:BOOL; SCHRITT:USINT; END_VAR VAR FREIGABE:RS; TON1:TON; step_no: USINT; END_VAR IF HAND THEN (*********** Handbetrieb *************** Aktionsnummer wählen und S1-Start betätigen*) step_no:=0; IF AKTION_NR > 4 OR AKTION_NR < 0 THEN AKTION_NR:=0; END_IF; BAND:= AKTION_NR=1 AND START; VOR_WAESCHE:= AKTION_NR=2 AND START; HAUPT_WAESCHE:= AKTION_NR=3 AND START; TROCKNER:= AKTION_NR=4 AND START; ELSE (*********** Automatikbetrieb *****************) (* Schrittkette *) TON1(IN:= step_no = 4, PT:= T#8S); CASE step_no OF 0: IF START THEN step_no:= 1; END_IF; 1: IF POS_VORW THEN step_no:= 2; END_IF; 2: IF POS_HAUPTW THEN step_no:= 3; END_IF; 3: IF POS_TROCK THEN step_no:= 4; END_IF; 4: IF TON1.Q THEN step_no:= 0; END_IF; END_CASE; (*Aktionsfreigabe*) FREIGABE(SET:= START, RESET1:= STOPP); (* Aktionen *) BEREIT:= step_no = 0; BAND:= step_no > 0 AND FREIGABE.Q1; VOR_WAESCHE:= step_no = 2 AND FREIGABE.Q1; HAUPT_WAESCHE:= step_no = 3 AND FREIGABE.Q1; TROCKNER:= step_no = 4 AND FREIGABE.Q1; END_IF; SCHRITT:=step_no; (*Anzeige*) FUNCTION_BLOCK MODELL_W (********************************************* Simulierte die Waschstraße Sensoren B1...B3 abhängig vom BAND schalten Steuern und beobachten über die Visualisierung **********************************************) VAR_INPUT BAND, WEGFAHREN:BOOL; (*Visu- Auto wegfahren*) END_VAR VAR_OUTPUT POS_VORW, POS_HAUPTW, POS_TROCK:BOOL; END_VAR VAR TON1:TON; CTU1:CTU; END_VAR TON1(IN:= NOT TON1.Q, PT:= T#0.1S); CTU1(CU:= BAND AND TON1.Q); POS_VORW:= CTU1.CV > 7 AND CTU1.CV < 31; POS_HAUPTW:= CTU1.CV > 35 AND CTU1.CV < 60; POS_TROCK:= CTU1.CV > 65 AND CTU1.CV < 90; CTU1.RESET:= WEGFAHREN; (*Schaltfläche Visu*) _______________________________________________________________________ Übung 10.1 Lichtszenen b) Lichtszenen mit einem Zähler PROGRAM PLC_PRG (*Hauptprogramm*) (******************************** Lichtszenenbaustein mit Zähler testen S8 -> E7...E9 beobachten *********************************) VAR LICHT_SZENEN_1: LICHT_SZENEN; END_VAR LICHT_SZENEN_1(IN:= S8_Wohnzimmer); E7_Wohnzimmer:=LICHT_SZENEN_1.OUT1; E8_Wohnzimmer:=LICHT_SZENEN_1.OUT2; E9_Wohnzimmer:=LICHT_SZENEN_1.OUT3; VAR_GLOBAL (*Die Adressen sind abhängig von der Gerätekonfiguration*) S8_Wohnzimmer AT %IX2.7:BOOL; E7_Wohnzimmer AT %QX0.5:BOOL; E8_Wohnzimmer AT %QX0.6:BOOL; E9_Wohnzimmer AT %QX0.7:BOOL; END_VAR FUNCTION_BLOCK LICHT_SZENEN (*6 Szenen mit 3 Ausgänge*) VAR_INPUT IN:BOOL;(*schaltet die Szene um*) tAUS:TIME:=T#3S; END_VAR VAR_OUTPUT OUT1, OUT2, OUT3:BOOL; END_VAR VAR CTU1: CTU; TON1: TON; END_VAR CTU1(CU:= IN); CASE CTU1.CV OF 0: OUT1:= FALSE; OUT2:= FALSE; OUT3:= FALSE; 1: OUT1:= FALSE; OUT2:= TRUE; OUT3:= FALSE; 2: OUT1:= FALSE; OUT2:= TRUE; OUT3:= TRUE; 3: OUT1:= TRUE; OUT2:= TRUE; OUT3:= FALSE; 4: OUT1:= TRUE; OUT2:= FALSE; OUT3:= TRUE; 5: OUT1:= TRUE; OUT2:= TRUE; OUT3:= TRUE; END_CASE; (*Ausschalten wenn IN länger als tAUS TRUE ist*) TON1(IN:= IN, PT:= tAUS); IF CTU1.CV > 5 OR TON1.Q THEN CTU1.RESET:= TRUE; ELSE CTU1.RESET:= FALSE; END_IF c) Lichtszenen mit einer Schrittkette PROGRAM PLC_PRG (******************************** Lichtszenenbaustein- Schrittkette testen S8 -> E7...E9 beobachten *********************************) VAR S8:BOOL; E7, E8, E9:BOOL; LICHTSZENEN1:LICHTSZENEN; END_VAR LICHTSZENEN1( IN:= S8, tAUS:= T#3S, OUT1=> E7, OUT2=> E8, OUT3=> E9); FUNCTION_BLOCK LICHTSZENEN (************************************ 6 Szenen mit 3 Ausgänge, Schrittkette *************************************) VAR_INPUT IN:BOOL; tAUS:TIME:=T#3S;(*Ausschalten wenn IN länger ist*) END_VAR VAR_OUTPUT OUT1, OUT2, OUT3:BOOL; END_VAR VAR schrittNr:USINT; TON1:TON; R_TRIG_IN:R_TRIG; END_VAR R_TRIG_IN(CLK:= IN); (* Flanke von IN *) (* Schrittkette *) CASE schrittNr OF 0: IF R_TRIG_IN.Q THEN schrittNr:= 1; END_IF; 1: IF R_TRIG_IN.Q THEN schrittNr:= 2; END_IF; 2: IF R_TRIG_IN.Q THEN schrittNr:= 3; END_IF; 3: IF R_TRIG_IN.Q THEN schrittNr:= 4; END_IF; 4: IF R_TRIG_IN.Q THEN schrittNr:= 5; END_IF; 5: IF R_TRIG_IN.Q THEN schrittNr:= 0; END_IF; END_CASE; (*Ausschalten wenn IN länger als 3s TRUE ist*) TON1(IN:= IN, PT:= tAUS); (* Kontinuierlich wirkende zeitlich begrenzte Aktionen *) IF TON1.Q THEN schrittNr:=0; END_IF; OUT1:= schrittNr = 3 OR schrittNr = 4 OR schrittNr = 5; OUT2:= schrittNr = 1 OR schrittNr = 2 OR schrittNr = 3 OR schrittNr = 5; OUT3:= schrittNr = 2 OR schrittNr = 4 OR schrittNr = 5; _______________________________________________________________________ Übung 10.2 Waschstraße mit Drehbürste PROGRAM PLC_PRG (********************************************************************** Autowaschstraße mit Drehbürste, Modell und Visualisierung. Funktionsbeschreibung: Automatik: Ist das Auto in die Waschstraße gefahren und Start betätigt, so wird die Anlage freigegeben. Der Bandantrieb schaltet ein, das Vorwaschventil öffnet. Wird B11 erreicht, so schließt das Vorwasch- ventil, der Bürstenantrieb schaltet ein, das Hauptwaschventil öffnet. Solange B11=1 fährt die Bürste über M12 auf, wird B11=0, solange fährt die Bürste über M11 ab. Dies gilt auch für B12. Wird B02 erreicht, so wird alles ausgeschaltet. Handbetrieb: Ist der Schalter Hand eigeschaltet, so kann ein Aktor abhängig von der Aktionsnumer über Start tippend geschaltet werden. ***********************************************************************) VAR AUTOWASCH1: AUTOWASCH; MODELL:MODELL_B; END_VAR MODELL( BAND:= Q00_Band, AUF:= M12_auf, AB:= M11_ab, ANF=> B01_Anfang, END=> B02_Ende, SEN1=> B11, SEN2=> B12); (*** Waschstraße 1 der Anlage ***) AUTOWASCH1( xSTOPP:= S00_Stopp, xSTART:= S01_Start, xHand:= S02_Hand, usiAKTION_NR:= , xANFANG:= B01_Anfang, xENDE:= B02_Ende, xSENSOR1:= B11, xSENSOR2:= B12, xBEREIT=> P1_Bereit, xBAND=> Q00_Band, xBUERST=> Q10_Buerste, xAUF=> M12_auf, xAB=> M11_ab, xVORWASCH=> M00_Vorwasch, xHAUPTWASCH=> M01_Wasch); VAR_GLOBAL (********************************************************** Eine Zuordnung zu den Adressen des Prozessabbildes mit dem Schlüsselwort AT wurde bewusst nicht erstellt, die Variablen können dann vom MODELL-Baustein leicht beschrieben werden. **********************************************************) S00_Stopp :BOOL;(*Taster*) S01_Start :BOOL;(*Taster*) S02_Hand :BOOL; (*Schalter Handbetrieb Visu*) B01_Anfang :BOOL;(*Anfangsposition*) B02_Ende :BOOL;(*Endposition*) B11 :BOOL;(*Lichtschranke*) B12 :BOOL;(*Lichtschranke*) P1_Bereit:BOOL; Q00_Band :BOOL;(*Schütz Förderband*) M00_Vorwasch :BOOL;(*Ventil Vorwäsche*) M01_Wasch :BOOL;(*Ventil Hauptwäsche*) Q10_Buerste :BOOL;(*Schütz Bürstenantrieb*) M11_ab :BOOL;(*Ventil Bürsten ab*) M12_auf :BOOL;(*Ventil Bürsten auf*) END_VAR FUNCTION_BLOCK AUTOWASCH VAR_INPUT xSTOPP, xSTART, xHand:BOOL;(*Visu*) usiAKTION_NR:USINT:= 4;(*Eingabe in Visu*) xANFANG, xENDE,xSENSOR1,xSENSOR2:BOOL;(*Prozess*) END_VAR VAR_OUTPUT xBEREIT:BOOL;(*Visu*) xBAND, xBUERST, xAUF, xAB, xVORWASCH, xHAUPTWASCH:BOOL;(*Prozess*) usiSCHRITTNR: USINT; END_VAR VAR Freigabe:RS; END_VAR IF xHAND THEN (*********** Handbetrieb ********************* Aktionsnummer wählen und S1-Start betätigen*) usiSCHRITTNR:=0; IF usiAKTION_NR > 5 OR usiAKTION_NR < 0 THEN usiAKTION_NR:=4; END_IF; xBAND:= usiAKTION_NR=1 AND xSTART; xVORWASCH:= usiAKTION_NR=2 AND xSTART; xHAUPTWASCH:= usiAKTION_NR=3 AND xSTART; xAUF:= usiAKTION_NR=4 AND xSTART; xAB:= usiAKTION_NR=5 AND xSTART; ELSE (*********** Automatikbetrieb *****************) (*** Schrittkette ***) CASE usiSCHRITTNR OF 0: IF xANFANG THEN usiSCHRITTNR:=usiSCHRITTNR+1; END_IF; 1: IF xSTART THEN usiSCHRITTNR:=usiSCHRITTNR+1; END_IF; 2: IF xSENSOR1 THEN usiSCHRITTNR:=usiSCHRITTNR+1; END_IF; 3: IF xSENSOR2 THEN usiSCHRITTNR:=usiSCHRITTNR+1; END_IF; 4: IF xENDE THEN usiSCHRITTNR:=0; END_IF; END_CASE; (*** Aktionsfreigabe ***) Freigabe(SET:= xSTART, RESET1:= xSTOPP); (*** AKTIONEN ***) xBEREIT:= xANFANG AND usiSCHRITTNR= 1; xBAND:= (Freigabe.Q1 AND (usiSCHRITTNR=2 OR usiSCHRITTNR=3 OR usiSCHRITTNR=4)); xVORWASCH:= Freigabe.Q1 AND usiSCHRITTNR=2; xHAUPTWASCH:=Freigabe.Q1 AND (usiSCHRITTNR=3 OR usiSCHRITTNR=4); xBUERST:= Freigabe.Q1 AND (usiSCHRITTNR=3 OR usiSCHRITTNR=4); xAUF:= NOT xAB AND Freigabe.Q1 AND (usiSCHRITTNR=3 AND xSENSOR1 OR usiSCHRITTNR=4 AND xSENSOR1 OR xSENSOR2); xAB:= NOT xAUF AND Freigabe.Q1 AND (usiSCHRITTNR=0 OR usiSCHRITTNR=3 AND NOT xSENSOR1 OR usiSCHRITTNR=4 AND NOT xSENSOR2 ); END_IF; FUNCTION_BLOCK MODELL_B VAR_INPUT BAND, Auf, AB:BOOL; END_VAR VAR_OUTPUT ANF, END, SEN1, SEN2:BOOL; END_VAR VAR Auto:BOOL; z:REAL;(*Position Auto*) Auto_ein, Auto_aus: BOOL;(*Visu*) v: INT;(*Position Bürste*) END_VAR (*Auto*) IF Auto_ein THEN Auto := TRUE; ELSIF Auto_aus THEN Auto:=FALSE; END_IF; (*B01 Anfang*) IF Auto AND z > -80.0 THEN ANF:=TRUE; ELSE ANF:= FALSE; END_IF; (*Auto fährt, Position z*) IF Auto AND Q00_Band THEN z:=z-0.5; ELSIF NOT Auto THEN z:=0; END_IF; (*B11*) IF Auto AND v <=0 AND v > -12 AND z < -60 AND z > -90 OR v > -26 AND z < -88 AND z > -150 THEN SEN1:=TRUE; ELSE SEN1:= FALSE; END_IF; (*B12*) IF v <=0 AND v > -12 AND z < -100 AND z > -120 OR v > -26 AND z < -118 AND z > -173 THEN SEN2:=TRUE; ELSE SEN2:= FALSE; END_IF; (*Bürste fährt, Position*) IF AUF AND v > -30 THEN v:=v-1; ELSIF AB AND v <= -1 THEN v:=v+1; END_IF; (*B02 Ende*) IF Auto AND z < -205 THEN END:=TRUE; ELSE END:= FALSE; END_IF; _______________________________________________________________________ _______________________________________________________________________ Übung: Bandanlage Ablaufsteuerung mit Positionierung VAR_GLOBAL S0_visu, S1_visu, S2_visu:BOOL; S0 AT %IX2.0:BOOL;(*Öffner*) S1 AT %IX2.1:BOOL;(*vor*) B1_hinten AT %IX2.4:BOOL; B3_Inkr AT %IX2.6:BOOL; P1_Freigabe AT%QX0.0:BOOL; Q1_vor AT %QX0.4:BOOL; Q2_zur AT %QX0.5:BOOL; Q3_schleich AT %QX0.6:BOOL; Schritt_Nr:USINT; END_VAR FUNCTION_BLOCK BAND_POS VAR_INPUT ON, STOP, INKR, REF:BOOL; POS1, POS2:INT; WAIT:TIME; END_VAR VAR_OUTPUT AKTION_EN, FORWARD, BACKWARD, SLOW:BOOL; STEP_NO:USINT; END_VAR VAR usiStep_no:USINT; RS_Enable:RS; CTUD1:CTUD; TON_wait:TON; END_VAR (*Freigabe*) RS_Enable(SET:= ON, RESET1:= STOP, Q1=> AKTION_EN); (*Instanzen initialisieren*) TON_wait(); CTUD1(); (*Schrittkette*) CASE usiStep_no OF 0:(*Aktionen*)BACKWARD:=FALSE; CTUD1.RESET:=TRUE; (*Weiterschaltbedingungen*)IF ON THEN usiStep_no:=usiStep_no+1; END_IF; 1:FORWARD:= RS_Enable.Q1; IF REF THEN usiStep_no:=usiStep_no+1; END_IF; 2:CTUD1.RESET:=FALSE; FORWARD:= RS_Enable.Q1; CTUD1.CU:=INKR; IF CTUD1.CV = POS1 THEN usiStep_no:=usiStep_no+1; END_IF; 3:SLOW:= RS_Enable.Q1; FORWARD:= RS_Enable.Q1; CTUD1.CU:=INKR; IF CTUD1.CV = POS2 THEN usiStep_no:=usiStep_no+1; END_IF; 4:SLOW:=FALSE; FORWARD:=FALSE; TON_wait(IN:= TRUE, PT:= WAIT); IF TON_wait.Q THEN usiStep_no:=usiStep_no+1; END_IF; 5:BACKWARD:=RS_Enable.Q1; CTUD1.CD:=INKR;TON_wait(IN:=FALSE); IF REF THEN usiStep_no:=0; END_IF; END_CASE; STEP_NO:=usiStep_no; PROGRAM MAIN VAR Band1:BAND_POS; END_VAR Band1(ON:= S1 OR S1_visu, STOP:= S0 OR S0_visu, INKR:= B3_Inkr, REF:= B1_hinten, POS1:= 15, POS2:= 20, WAIT:= T#3s, AKTION_EN=> P1_Freigabe, FORWARD=> Q1_vor, BACKWARD=>Q2_zur , SLOW=> Q3_schleich, STEP_NO=>Schritt_Nr); =======================================================================