# Verwendung von FB



## drfunfrock (22 November 2005)

Ich habe in der FAQ etwas zu FBs gesehen und will mal ein Bsp liefern. Alles in ST:

Oftmals benötigt man Automaten die über eine Zustandsvariable und eine Case-Verzeigung gebildet werden. Bsp eines Blinklichtes: 


```
VAR
  state : INT := 1;
  timer1  : TON;
  timer2  : TON;
END_VAR

timer1(PT:=t#500ms);
timer2(PT:=t#100ms);

CASE state OF
 1: 
  Red_Light := TRUE;
  timer1.IN := NOT timer1.Q;
  IF timer1.Q THEN
   state := 2;
  END_IF;


 2: 
  Red_Light := FALSE;
  timer2.IN := NOT timer2.Q;
  IF timer2.Q THEN
   state := 1;
  END_IF
END_CASE;
```


Diese Art der Konstruktion wiederholt sich oft im Alltag. Nun aber zum Kern. Oft hat man Stationen, die sich in manchen Grundfunktionen gleichen, wie z.B. eine Start-Taster oder die Anzeige von Zuständen. Wenn man diese Stationen als FB implementiert, so spricht nichts dagen innerhalb dieser FB wiederum einen FB zu instanzieren, der diese gemeinsamen Funktionalitäten abbildet, denn der Automat von oben kann geteilt werden:


```
VAR
  state : INT := 1;
  timer1  : TON;
  timer2  : TON;
END_VAR

timer1(PT:=t#500ms);
timer2(PT:=t#100ms);

CASE state OF
 1: 
  Red_Light := TRUE;
  timer1.IN := NOT timer1.Q;
  IF timer1.Q THEN
   state := 2;
  END_IF;
END_CASE;

CASE state OF
 2: 
  Red_Light := FALSE;
  timer2.IN := NOT timer2.Q;
  IF timer2.Q THEN
   state := 1;
  END_IF
END_CASE;
```

Somit kann ein Teil des Automaten in dem FB programmiert werden, der von allen Stationen instanziert wird während der spzielle Teil im FB der Station implementiert wird. Als Bsp sei die Montrac-Bahn genannt. Diese Bahn ermöglicht den Transport des Produktes zu den Bearbeitungsstationen. Der SPS-Code für die Verwaltung der Wagen (Start, Stop, Anstossen des Prozesses) ist allen Stationen gemeinsam und muss nicht kopiert werden, sondern wird als FB in jeder Station instanziiert Dieser Code ist nichts weiter als der 1. Teil des Automaten für eine Station mit den Zuständen:

- Wagen ist in der Station
- Ist ein Prozess passend für das Produkt auf der Station vorhanden?
- Station führe Prozess Nr. x aus
- Schick Wagen weiter


Der Vorteil ist leicht zu sehen, umgeht man doch das Kopieren von Code und die gemeinsame Codebasis, verhindert, dass man eine Station bei der Fehlerkorrektur vergisst. 

Um das zu realisieren  benötigt man noch ein globales Array mit allen Stationsdaten, in dem auch die Zustandvariable instanziiert wird. 

Doc Funfrock


----------

