# Funktionsbaustein aufrufen



## Spoon (3 Februar 2010)

Hallo;
Ich möchte einen Funktionsbaustein unter bestimmten Bedingungen aufrufen. Wie stelle ich das am besten an?
Meine Programmiersprache ist ST.

z.B. Taster S1 wird gedrückt Funktionsbaustein Beleuchtung wird abgearbeitet.

Vielen Dank


----------



## MasterOhh (3 Februar 2010)

```
Deklaration

fbBeleuchtung : FB_Beleuchtung;


Programmteil

IF S1 THEN
    
    fbBeleuchtung(input1:=Wert1,
                        input2:=Wert2,
                        output=>Wert3);

END_IF
```

So etwa?


----------



## Grubba (3 Februar 2010)

Ist jetzt zwar nicht direkt die Antwort auf Deine Frage, aber anstelle einen FB mal aufzurufen oder nicht, würde ich einem FB doch lieber einen Eingang Enable spendieren.

Vorteile:

- der Code wird übersichtlicher

- der Baustein kann beim wegnehmen des Enable Signals kontrolliert irgendwelche Aktionen ausführen und befindet sich danach in einem definierten Zustand (oder auch beim Start, je nachdem)


----------



## Spoon (4 Februar 2010)

Das musst du mir etwas näher erklären.
Da ich noch ganz am anfang stehe.


----------



## Grubba (4 Februar 2010)

Na dann mal los:

Wenn Du den FB nur bei einer bestimmten Bedingung aufrufen willst, ist es eigentlich sinnvoller, dem FB dafür einen eigenen Eingang zu spendieren.

Angenommen, der Baustein soll das Licht bei Schalter_1 einschalten. Wie der Baustein das macht, ist ja erstmal egal. Das sähe dann ja ungefähr so aus:

```
IF Schalter_1 THEN
 MyLightFB;
END_IF;
```

Angenommen, dieser FB würde 20 mal verwendet. Dann müsstest Du 20 mal die IF Abfrage mit irgendeinem Schalter machen.

Wenn Du den FB mit einem Freigabe-Eingang versiehst, könnte das so aussehen:

```
MyLightFB(Freigabe := Schalter_1);
```
Das ist schöner und übersichtlicher.

Im FB selber kann man das dann so programmieren:

```
IF Freigabe THEN
 ... hier sind dann die eigentlichen Zeilen, die was mit dem Licht anstellen 
END_IF;
```

So wird die Abfrage, die vorher von Aussen gesteuert wurde, nur in den FB hinein verlagert.


----------



## Grubba (4 Februar 2010)

So, Tochter ist fertig gewickelt, dann mal eben zu Teil 2:

Angenommen, der FB soll Licht beim Ein-und Ausschalten hoch und runterdimmen.

Er soll beim Eingang Freigabe=True hochdimmen, bei Eingang Freigabe=False runterdimmen.

Über diesen Eingang kann der FB erkennen was er tun soll, und intern alles dafür notwendige abarbeiten. Wenn er mit dem hoch und runterdimmen fertig ist, überspringt er intern alle unwichtigen Schritte, damit keine Rechenzeit verschwendet wird.

Wenn der FB von aussen bedingt aufgerufen würde, müsstest Du von aussen dafür Sorge tragen, das der FB mit seiner internen Arbeit fertig ist, und ihn dann überspringen. Auch das müsstest Du für jeden Aufruf separat auswerten. Dann doch lieber diese Arbeit einmal in den FB packen und dann beliebig oft ohne zusätzlichen Programmieraufwand aufrufen.

Alle Klarheiten beseitigt?


----------



## Spoon (4 Februar 2010)

Das ist ja richtig klasse. Vielen Dank.

Aber jetzt kommt gleich die nächste Frage.

Wie ist da folgendes zu verstehen:

FB_Test(Eingang:=True);

Wird der Baustein durch diesen Befehl aufgerufen und die Variable Eingang auf True gesetzt?

Hab das mal in einem Programm so stehen gesehen.


----------



## Grubba (4 Februar 2010)

> Wie ist da folgendes zu verstehen:
> 
> FB_Test(Eingang:=True);
> 
> Wird der Baustein durch diesen Befehl aufgerufen und die Variable Eingang auf True gesetzt?



Ganz genau.


----------



## trinitaucher (4 Februar 2010)

Ich habe es mir angewöhnt, einen FB nur einmal im Programm oder FB mit Parametern aufzurufen. Meist am Ende des Codes oder zusätzlich in einer Aktion verpackt.
Während des Programms verwende ich ausschließlich die einzelnen zu verändernden In/Outputs.
Sieht das in etwa so aus:

```
...
IF bVar1 THEN
   myFB.Enable := TRUE;
ELSE
   myFB.Enable := FALSE;
END_IF
...
myFB.Input1 := ...;
...
Output := myFB.Output1;
...
...
(* Ende des Codes *)
myFB(iParameter1 := 123
    iParameter2 := 456);
```
Vorteil finde ich ist, dass der FB in jedem Fall ausgeführt wird. Unabhängig von irgendwelchen Bedingungen.


----------



## Alois (6 Februar 2010)

das habe ich auch schon gemerkt, dass das ganz praktisch ist. Dadurch ist man sicher, dass Funktionsblöcke immer ausgeführt werden bzw. nicht mehrfach.  v.A. bei MotionControl-Bausteinen hat mir das den Quelltext immer erheblich gekürzt 

Gruß, Alois


----------

