# Grundsätzliche Nutzung von FBs und FCs



## SPS_Nick (19 Februar 2021)

*Grundsätzliche Nutzung von FBs*

Guten Abend zusammen,

Ich weiß dieses Thema ist schon oft zur Sprache gekommen, aber ich habe in den alten Beiträgen keine Vorgehensweise für mich herausziehen können:

Und zwar geht es um die Frage ob ich einen FB oder einen FC nehme. Ich würde gerne auf Merker verzichten und nur static Variablen nutzen um somit einheitlich zu arbeiten und nicht beides zu verwenden (ist ja auch letztendlich Geschmackssache). Wenn ich mich jetzt für einen FB entscheide und einen Zugriff auf den IDB vermeiden möchte, erstelle ich zu dem Output des FB's ein gleiches Struct in einem globalen DB und weise diese Variablen dann den Ausgangsparametern des FB zu. Das ist für mich schon irgendwie doppelt. Allerdings habe ich in diesem Fall keine Probleme mit dem speichern von Zuständen oder Werten. 

Nehme ich einen FC habe ich keine Static Variablen und kann nichts Zwischenspeichern. Hier weiß ich ja manchmal vorher gar nicht ob ich etwas speichern muss oder nicht -> Wie geht ihr da vor?
In dem FC soll ja auch kein Zugriff auf den Globalen DB erfolgen, sprich es sind auch wieder In- und Output Parameter anzulegen. Letztendlich also bis auf Static die gleiche Arbeit wie beim FB.

Ich frage mich gerade was mich daran hindern sollte nur FBs zu benutzen, selbst wenn diese nicht erneut aufgerufen werden müssen (Ich vermute mal das die neueren Modelle von Siemens CPU's doch schon einiges an Performance Leistung besitzen).

Wie seht ihr diese Situation? Gibt es für euch deutliche gründe gegen die FBs bzw. Gründe die einen zu einem FC bringen sollten?

Ich würde mir gerne ein System aneignen das ich mit der selben Art und Weise weiterführen kann und wäre über eure Meinungen / Hilfen sehr dankbar.

Grüße


----------



## winnman (20 Februar 2021)

Nimm FB und gebe die Werte die auch andere lesen/schreiben sollen in einen eigenen DB.

Dann hast du die internen Werte im IDB und die externen im DB.

Oder einen FC mit zugehörigem DB (ist dann halt kein IDB) aber da kann auch sauber jeder drauf zugreifen


----------



## ducati (20 Februar 2021)

Wenn Du UDTs verwendest, ist das mit dem Anlegen/Ändern der Stat/IN/OUT/INOUT ja kein Problem egal ob FC oder FB und Du hast ja nur jeweils einen INOUT den Du verschalten musst.

Worüber man nachdenken sollte, ob oft Änderungen im laufenden Betrieb der Anlage notwendig sind... Dann sieht die Sache ganz anders aus.

Gruß


----------



## SPS_Nick (20 Februar 2021)

Hallo,

Also macht es keinen Unterschied nur FBs zu verwenden bzw. es ist auch keine "geschmierte" Programmierung? Es ist quasi nur eine Sache des Geschmacks?

Wie handhabt Ihr das denn?

Gruß


----------



## Larry Laffer (20 Februar 2021)

Nein ...n ur FB's zu verwenden ist nichts "Geschmiertes" - eher im Gegenteil ...
Du hast ja hier den Vorteil, dass du alles, was nur zu dem Baustein gehört eben auch nur hier anlegst (Stichwort Kapselung). Damit kommst du dir schon mal nicht mit anderen Bausteinen "in die Quere". Das gilt auch für Timer (IEC-Timer verwenden). Auf deine zu erwartende Zykluszeit hat das m.E. keinen nennenswerten Einfluß.
Ich würde auch, so wie es Winman schon schreibt, alles, was irgendwie außerhalb des Bausteins laufen soll oder gebraucht werden soll, über die Schnittstelle übergeben - Querzugriffe auf die Instanzdaten deines FB's von anderen Bausteinen ist für mich ein No-Go.
Wenn man sich das einmal angewöhnt hat und für sich weiterentwickelt hat ist das eigentlich eine schöne Sache ...

Gruß
Larry


----------



## ducati (20 Februar 2021)

Was in dem Zusammenhang auch noch wichtig ist, auf welche Variablen greift das HMI zu? 

Generell ist es wichtig, sich über die Struktur der Global-DBs vorher ordentlich Gedanken zu machen, und diese nach Möglichkeit nicht ständig zu ändern... 

Also wie gesagt, UDTs benutzen mit reichlich Reserven, damit sich auch bei absoluter Adressierung des HMI noch alles passt.


----------



## Onkel Dagobert (20 Februar 2021)

*Alles Andere als eine Sache des Geschmacks!*

Hallo Nick,



SPS_Nick schrieb:


> .. Es ist quasi nur eine Sache des Geschmacks? ..


so ist es keinesfalls. FBs und FCs haben ihre Vor- und Nachteile und somit haben beide ihre Berechtigung. Der Hautvorteil eines FB sind dessen statische Lokaldaten. Warum? Weil man hier Timer, Zähler etc. verwenden kann. Der Hauptnachteil von FBs beruht ebenfalls auf den statischen Lokaldaten. Warum? Weil jedes Mal, wenn ein FB verwendet wird, eine Instanz oder Multiinstanz angelegt und initialisiert werden muss (Speicherreserven bei "optimierter Programmierung" können Andere erklären). FBs sollte man daher nur verwenden, wenn es unbedingt notwendig ist, also wenn man statische Lokaldaten wie Zähler, Timer, Flankenmerker etc. tatsächlich benötigt. FCs haben gegenüber FBs natürlich auch ihre Vorteile. Zum Einen muss man bei Verwendung keine IDBs neu generieren, zum Anderen kann man einen Rückgabewert nutzen, was besonders bei SCL vorteilhaft ist.


Statt in "FC" und "FB" solltest du in "Standardbausteine" und in "Anlagenbausteine" unterscheiden. Standardbausteine sind Funktionen, welche generelle Grundfunktionen übernehmen.

Beispiele hiefür:


Normierungen von Signalen
Überwachungen (Grenzwerte, Begrenzungen, Watchdog)
Bausteine zur Alarm-bzw. Meldungsverarbeitung
Zähler, verschiedene Dosierung
Regler (Zweipunkt, Dreipunkt, PID)

.. um nur Einige zu nennen. Bei dem einfachen Beispiel "Normierungen" macht es überhaupt keinen Sinn, einen FB zu verwenden. Der Baustein berechnet aus verschiedenen Bausteinparametern ein Endergebnis, welches über einen Ausgang oder auch über den Rückgabewert ausgegeben wird. Wozu also eine Instanz oder Multiinstanz mit all ihren Umständen anlegen bzw. immer wieder ändern, das wäre nur hinderlich. Anders sieht es komplexeren Bausteinen aus. Hier ist man auf statische Daten angewiesen. Also verwendet man hier zwangsläufig einen FB. Diese Standardbausteine legt man sinnvollerweise in einer Bibliothek ab. Dort werden sie gepflegt und versioniert. 


Dann gibt es die Anlagenbausteine, so nenne ich sie zumindest. Hier findet die anlagenspezifische Programmierung statt. Und hier verwendet man generell FBs, da man in diesen Bausteinen immer statische Lokaldaten für irgend etwas benötigen wird, sei es für einen Timer oder für eine Flankenauswertung. In der Regel hat man nur sehr wenige dieser Bausteine im Programm. Manchmal ist es auch nur ein einziger.


Wenn man mal eine etwas spezielle Standardfunktion entwickelt, bei der man noch gar nicht weiß wohin es führt, empfiehlt sich zunächst ein FB. Ggf. kann man den Code später in eine FC kopieren.


----------

