TIA V18: Frage zur Verwendung von FBs in FCs

Beiträge
6.759
Reaktionspunkte
1.629
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich arbeite mich gerade in ein TIA-Programm ein (V18, CPU 1510SP F-1 PN FW3.0). Der OP MAIN führt einen FC aus und in diesem werden jetzt unter anderem FBs mit Global DB aufgerufen.
Ich arbeite hauptsächlich im Codesys Universum und da ist es so, dass FBs die in einem FC deklariert wurden bei jedem Aufruf des FCs neu initialisiert werden, was zu Problemen führen kann, wenn ein FB über mehrere Zyklen aufgerufen werden müsste, was nicht sinnvoll gehen würde.
Ist das bei Siemens, wenn Global DBs genutzt werden, anders? Behält hier der FB dann seine Daten?
 
Was meinst Du mit Global-DBs? Ein Global-DB ist keinem FB zugehörig sondern ist eigenständig.

Einem FB wird ein eindeutiger Instanz-DB (IDB) zugeordnet.

Wenn ein FB in einem anderen FB aufgerufen wird, kann der IDB auch in dem übergeordneten IDB deklariert sein, nennt man dann Multiinstanz-DB.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Statische Variablen der FB-Instanz behalten den Wert über mehrere Zyklen, bis sie geändert werden.
Temporäre Variablen der FB-Instanz haben einen "willkürlichen Wert" (nicht optimiert) oder beginnen mit 0/False (optimiert).

"Willkürlichen Wert" im übertragenen Sinn, um es kurz zu halten.
 
Ich frage mich schon seit Anbeginn meiner Siemens-Erfahrungen, woher diese Manie kommt, immer FCs zu verwenden. Mach einen FB draus und gut ist.
Ein FC kann und soll per Definition nichts intern speichern, also ruft man darin auch keine FBs auf.
 
FBs die in einem FC deklariert wurden bei jedem Aufruf des FCs neu initialisiert werden,
logisch... der FC hat ja auch keinen statischen Variablenbereich... Wer macht sowas?
Da müßtest Du Dir wenn dann den FB in einer GVL deklarieren und dann aus dem FC heraus aufrufen.

Das Gleiche machst Du in TIA quasi: Entweder ist der FB im FB deklariert (der dann wieder im FB deklariert ist bzw. irgendwann ganz oben einen IDB hat) oder der FB bekommt direkt einen IDB. IDB = Instanz-Datenbaustein.
Globaldatenbaustein = GVL (Codesys).

Also zu Deiner Frage: FBs mit eigenem IDB aus einem FC heraus aufzurufen macht keine Probleme.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Statische Variablen der FB-Instanz behalten den Wert über mehrere Zyklen, bis sie geändert werden.
Temporäre Variablen der FB-Instanz haben einen "willkürlichen Wert" (nicht optimiert) oder beginnen mit 0/False (optimiert).

"Willkürlichen Wert" im übertragenen Sinn, um es kurz zu halten.
OK, das ist im Codesys Universum anders.
Wurde ein FB in einem Programm instanziiert oder in einem FB, wo übergeordnet kein FC involviert ist, behalten alle Variablen und FB die unter VAR, VAR_INPUT oder VAR_OUTPUT deklariert wurden ihre Werte.
Bei FCs geht, außer mit "Tricks", immer alles bei jeder weiteren Ausführung auf Anfang.
 
OK, das ist im Codesys Universum anders.
Wurde ein FB in einem Programm instanziiert oder in einem FB, wo übergeordnet kein FC involviert ist, behalten alle Variablen und FB die unter VAR, VAR_INPUT oder VAR_OUTPUT deklariert wurden ihre Werte.
Bei FCs geht, außer mit "Tricks", immer alles bei jeder weiteren Ausführung auf Anfang.
Straf mich lügen, aber ich glaube rein theoretisch gibt es bei Codesys auch den Unterschied zwischen STAT und TEMP, nur praktisch ist es in den meisten Systemen nicht implementiert.
Das PROGRAM ist ja quasi ein FB mit integriertem IDB, daher kannst Du ihn nur in einer Instanz aufrufen, aber eben auch einen FB in ihm deklarieren.
Der FB behält in Codesys seine Werte über seine "Instanz", die entweder in einem FB oder in einer GVL angelegt ist.
Der FB bei Siemens behält seine Werte über den Instanz-DB bzw. über die Instanz in einem anderen FB. Schlußendlich aber immer über irgendeinen Instanz-DB, der ganz oben hängt.
 
Ich frage mich schon seit Anbeginn meiner Siemens-Erfahrungen, woher diese Manie kommt, immer FCs zu verwenden.
Das kommt vielleicht noch aus der S5-Zeit weil im Grunde ist der FC ja ein Nachfolger des PB (den ja ganz viele in erster Linie verwendet haben) ... Ich denke mal, dass das viel damit zu tun hat wie es gelehrt wird ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich frage mich schon seit Anbeginn meiner Siemens-Erfahrungen, woher diese Manie kommt, immer FCs zu verwenden. Mach einen FB draus und gut ist.
Ein FC kann und soll per Definition nichts intern speichern, also ruft man darin auch keine FBs auf.
Das ist nicht mein Programm, daher werde ich da auch nichts ändern. Ich schaue es mir nur an um zu beurteilen, ob ich mir, als quasi TIA Analphabet, zutrauen würde an einer Anlage in der KOP-Schrittkette nachzuschauen, wo und warum es hakt.
 
Straf mich lügen, aber ich glaube rein theoretisch gibt es bei Codesys auch den Unterschied zwischen STAT und TEMP, nur praktisch ist es in den meisten Systemen nicht implementiert.
Das PROGRAM ist ja quasi ein FB mit integriertem IDB, daher kannst Du ihn nur in einer Instanz aufrufen, aber eben auch einen FB in ihm deklarieren.
Der FB behält in Codesys seine Werte über seine "Instanz", die entweder in einem FB oder in einer GVL angelegt ist.
Der FB bei Siemens behält seine Werte über den Instanz-DB bzw. über die Instanz in einem anderen FB. Schlußendlich aber immer über irgendeinen Instanz-DB, der ganz oben hängt.
Ja, auch im Codesys Universum gibt es temporäre Variablen, die müssen in Programmen und FBs aber explizit in der Gruppe VAR_TEMP deklariert werden, die standardmäßig nicht vorhanden ist.
Im Codesys Universum kannst Du FBs in PRGs, FBs und GVLs instanziieren. In FCs theoretisch auch, aber halt mit den bereits erwähnten Konsequenzen.
In einem Programm kann man auch beliebig viele Instanzen eines FBs deklarieren. Ich würde ein Programm vereinfacht als Mischung zwischen FB und FC bezeichnen. Wie bei einem FC kann es nur eins geben und keine Instanzen, das Programm hat aber einen "dauerhaften" Speicher der auch nach der Ausführung erhalten bleibt.
 
Ja, auch im Codesys Universum gibt es temporäre Variablen, die müssen in Programmen und FBs aber explizit in der Gruppe VAR_TEMP deklariert werden.
Genauso ist ja bei Siemens auch... Du hast den STAT und den TEMP Deklarationsbereich.
In FCs theoretisch auch, aber halt mit den bereits erwähnten Konsequenzen.
Theoretisch geht das... nur warum tut man das? Wenn ich einen FB aufrufe, möchte ich ja i.d.R. Werte über die Ausführung hinaus speichern. Aber der ist dann ja eben im TEMP instanziiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich frage mich schon seit Anbeginn meiner Siemens-Erfahrungen, woher diese Manie kommt, immer FCs zu verwenden. Mach einen FB draus und gut ist.
Ein FC kann und soll per Definition nichts intern speichern, also ruft man darin auch keine FBs auf.
naja, ein FB mit IDB, welcher in einem FC aufgerufen wird, hat halt den Vorteil, erstmal unabhängig von allen anderen FBs geändert werden zu können. Wenn Du nur einen FB hernimmst und darin als Multiinstanz alle anderen FBs der kompletten SPS aufrufst, kannst Du im Endeffekt nie irgendwas an der Software im laufenden Betrieb ändern. Schon garnicht mit TIA, wo ständig reinitialisiert wird...
 
In FCs theoretisch auch, aber halt mit den bereits erwähnten Konsequenzen.
Theoretisch geht das... nur warum tut man das? Wenn ich einen FB aufrufe, möchte ich ja i.d.R. Werte über die Ausführung hinaus speichern. Aber der ist dann ja eben im TEMP instanziiert.
Habe das schon gesehen bei FBs die nach einem Zyklus fertig waren, aber da hätte man dann auch einen FC anlegen können.
Man kann VAR_STAT nehmen, dann behalten die Variablen in FCs ihren Wert. Das habe ich schon öfters gesehen, zum Beispiel als Instanzzähler. Ob das auch in FCs bei der Instanziierung von FBs funktioniert weiß ich aber nicht.
 
ok... das hört sich aber doch relativ experimentell an... VAR_STAT in einem FC...
CoDeSys schreibt extra, daß RETAIN im FC keine Auswirkung hat. Ich möchte behaupten, daß es keine statischen Variablen in einem FC gibt. Was Du machen kannst - da weicht Codesys laut Hilfe von der IEC ab: Du kannst auf globale Variablen zugreifen und darin Daten speichern für den nächsten Durchlauf.

EDIT: Möglicherweise funktioniert es ja durch Zufall, weil der Speicher zufällig bis zum nächsten Aufruf nicht verändert wurde...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was meinst Du mit Global-DBs? Ein Global-DB ist keinem FB zugehörig sondern ist eigenständig.

Einem FB wird ein eindeutiger Instanz-DB (IDB) zugeordnet.

Wenn ein FB in einem anderen FB aufgerufen wird, kann der IDB auch in dem übergeordneten IDB deklariert sein, nennt man dann Multiinstanz-DB.
Ja, sorry, Formulierungsfehler, ich meinte auch Instanz-DB. Dachte der Global-DB sei der Instanz-DB. Das was ich als Instanz-DB betrachtet hatte war der DB direkt in einem FB (Multiinstanz).
 
ok... das hört sich aber doch relativ experimentell an... VAR_STAT in einem FC...
CoDeSys schreibt extra, daß RETAIN im FC keine Auswirkung hat. Ich möchte behaupten, daß es keine statischen Variablen in einem FC gibt. Was Du machen kannst - da weicht Codesys laut Hilfe von der IEC ab: Du kannst auf globale Variablen zugreifen und darin Daten speichern für den nächsten Durchlauf.

EDIT: Möglicherweise funktioniert es ja durch Zufall, weil der Speicher zufällig bis zum nächsten Aufruf nicht verändert wurde...
Ich glaube nicht, dass das experimentell ist. Wie gesagt, ein Kunde nutzt das zur Realisierung von Instanzzählern. Das der FC zufällig wieder die selbe Speicheradresse bekommen hat wie vorher und sich an dieser nichts geändert hat wäre schon ein großer Zufall.
Und VAR_STAT macht ja nur in FCs Sinn, bei den anderen Objekten bleiben die Werte ja eh gespeichert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aus meinem Verständnis (basierend auf V2) ist eine Funktion bei CoDeSys was ganz anderes wie ein FC in der Siemens Welt.
Bei CoDeSys ist es ja mehr wie eine mathematische Funktion mit nur einem Output. Bei Siemens ist es ja ein FB light.
Warum man bei CoDeSys einen FB in einer Funktion deklarieren sollte... fehlt mir die Phantasie für...
 
Bei CoDeSys ist es ja mehr wie eine mathematische Funktion mit nur einem Output.
Wie kommst Du denn darauf? Der Typ des Rückgabewertes einer Funktion kann doch auch eine Struktur mit vielen verschiedenen Variablentypen sein, außerdem kann man bei Funktionen im Codesys Universum auch VAR_OUTPUT nutzen. Da muss der Wert aber dann direkt beim Aufruf einer Variablen zugewiesen werden.
 
Zurück
Oben