SPS- Programmierung mit ST

nach IEC 61131 mit CODESYS V2.3, CODESYS V3, e!COCKPIT

Lösungen Kapitel 10   Bibliotheksfähige Funktionsblöcke (FBs), GRAFCET
                                    für CODESYS V2.3 (WAGO I/O Pro)

  Kopieren Sie den Programmcode und fügen Sie diesen in Ihre Entwicklungsumgebung ein.
  

 Aufgabe 10.2   Aufgabe 10.3   Aufgabe 10.4   Aufgabe 10.5   Aufgabe 10.6   Übung 10.1   Übung 10.2
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.3 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.4 Tiefpass

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 LOW_PASS in Ihre STRECKEN-Bibliothek
  

Aufgabe 10.5 Streckensimulation für Regelstrecken mit Ausgleich

Fügen Sie die 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

Benutzen Sie die Vorlage bzw. Lösung mit der Visualisierung von der Startseite.

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 Pos.schalter*)
 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 > 14 AND CTU1.CV < 41;
POS_HAUPTW:= CTU1.CV > 53 AND CTU1.CV < 87;
POS_TROCK:= CTU1.CV > 91 AND CTU1.CV < 120;
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:Standard.TON; R_TRIG_IN:Standard.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, GRAFCET

Benutzen Sie die Vorlage bzw. Lösung mit der Visualisierung von der Startseite.

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;


© Vogel Buchverlag