# TIA Portal - Instanz DB eines FB an sich selbst übergeben



## RosiBro (3 Dezember 2021)

Hey,

die Frage ist vielleicht ein bisschen doof:

Ergibt es Sinn, wenn ich bei einem FB (MB_CLIENT), den ich in einem anderen FB (MB_COM[FB3]) aufrufe und dessen Instanz DB (MB_Instance_DB) ich in dem übergeordneten DB (DB3) abspeichere, den Instanz-DB (MB_Instance_DB) des untergeordneten FB als Parameter an den FB selbst übergebe?

Ungefähr so:



In meinem Kopf würde da aus einem Call by Value einfach nur ein Call by Reference werden, oder? Ich würde auch alle Wertänderungen, die irgendwo im Programm passieren und diesen FB betreffen direkt an diesen DB übergeben. Oder habe ich da einen Denkfehler?

 Ich erhoffe mir davon, dass ich Variablen einfach "durchreichen" kann und diese nicht an jeder FB-Grenze neu kopiert werden müssen und ich dafür eine neue Variable anlegen muss, wenn ich mal eine Verschachtelung mehrerer FB's habe.

Kann das funktionieren?


----------



## Oberchefe (3 Dezember 2021)

Ich würde die benötigten Variablen in einen UDT packen und dann die Variable vom Typ UDT als In/Out durchreichen. Wenn dann noch was dazu kommen soll, einfach im UDT ergänzen und in allen Bausteinen drauf zugreifen.


----------



## PN/DP (3 Dezember 2021)

Nur den DB übergeben kann nicht reichen, weil die Instanz ja als sog. Multiinstanz an irgendeinem Offset in irgendeinem DB liegen kann. Wenn schon, dann müsstest Du eine Referenz auf die Instanz des Datentyps übergeben. Dann müssten Instanzvariablen beim Aufruf zwar nicht mehr kopiert werden, der aufgerufene Baustein müsste dann aber jeden Zugriff auf die übergebene Instanz viel umständlicher indirekt adressiert ausführen. Dadurch wird der kompilierte Code u.U. aufgebläht und langsamer. Ob das dann viel besser ist?

Harald


----------



## Larry Laffer (3 Dezember 2021)

Sorry ... ich verstehe weder den Sinn (im Augenblick) noch den Ansatz - vor Alle nicht bei dem gewählten Screenshot.
Der MB_Instance_DB (bzw. der FB) kennt doch die übergebenen Variablen sowieso schon ...

@TE:
Du solltest (zumindestens für mich) schon noch etwas mehr dazu ausführen ...


----------



## RosiBro (3 Dezember 2021)

Ok, danke euch für das Feedback. Das war beides sehr nützlich ein bisschen Ordnung in das Chaos in meinem Kopf zu bringen. 
Ich werde von dem Gedanken wieder Abstand nehmen. Ich glaube ich weiß jetzt auch wo mein Denkfehler lag.


Larry Laffer schrieb:


> Sorry ... ich verstehe weder den Sinn (im Augenblick) noch den Ansatz - vor Alle nicht bei dem gewählten Screenshot.
> Der MB_Instance_DB (bzw. der FB) kennt doch die übergebenen Variablen sowieso schon ...
> 
> @TE:
> Du solltest (zumindestens für mich) schon noch etwas mehr dazu ausführen ...



Wie gesagt: ich glaube ich habe einen totalen Denkfehler und was Grundlegendes noch nicht verstanden (offensichtlich das von Harald erwähnte Problem noch nicht).
Das Ganze war der Versuch direkt in den Instanz-DB des FB zu schreiben, so dass ich an den unterschiedlichen Aufruf-Ebenen nicht immer einen neuen DB anlegen muss, wenn da sowieso immer nur die gleichen Werte kopiert und bearbeitet werden. Irgendwie dachte ich gerade, dass ich ja auch die Variablen des Instanz-DB immer in die nächsthöhere Ebene mit IN und OUT mitschleifen muss. Aber das muss ich ja gar nicht, wenn ich die Werte in einem globalen DB speichere und einfach auf den Ebenen, in denen es überhaupt notwendig ist in/aus diesem schreibe/lese und sie nicht als IN oder OUT an jeder Ebene übergeben. Dann werden sie ja nur an der letzten Ebene (Übergabe an MB_Client) einmal in den Instanz-DB kopiert.
(Hat das mehr Sinn ergeben, oder war das irgendwie verständlicher?)

Sorry, das war ein bisschen umständlich. Wahrscheinlich ist es Freitag Abend. Ich danke euch trotzdem für eure Zeit, ich hab dadurch auch wieder was lernen können (Freitag eher Schluss machen und keine Foren-Einträge mehr verfassen und auch die obigen Hinweise/Tips)


----------



## Larry Laffer (4 Dezember 2021)

So richtig bin ich noch immer nicht in deiner Spur - sorry ...
Vielleicht ein paar Dinge, die sich für mich irgendwie komisch angehört haben :
- auf die Variablen der Instanz deines FB kannst du immer direkt zugreifen - die hast du ja in deiner Deklaration
- wenn in deinem FB weitere (andere) FB's aufgerufen werden sollen so kannst du diese auch direkt in der Instanz deines FB (im STAT-Bereich) deklarieren - sie werden dann automatisch ein Bestandteil der Instanz deines Basis-FB's.

Aber vielleicht beschreibst du einfach mal dein Vorhaben etwas konkreter - dann kann man möglicherweise auch konkreter helfen / Tipps geben ...

Gruß
Larry


----------



## RosiBro (9 Dezember 2021)

Hey Larry,

kein Grund sich zu entschuldigen -eigentlich bin ich die Person, die sich entschuldigen müsste.. Ist ja mein Problem, wenn ich meine Probleme nicht gut erklären kann. Danke dir auf jeden Fall, dass du dir die Mühe machst und die Zeit nimmst das zu versuchen nachzuvollziehen.

Also noch einmal:
Ich kann es gerade leider nicht mehr konkret machen, weil ich mein Programm umstrukturiert habe, also nur einmal folgendes angenommen:
Ich möchte einen Funktionsblock in einem Funktionsblock haben, der sich vielleicht noch einmal in einem Funktionsblock befindet.
In diesem Fall möchte ich zum Bsp den MB_Client FB in einem Funktionsblock haben, der die Kommunikation gleich mit auswertet und in Abhängigkeit von verschiedenen Zuständen steuert. Diesen möchte ich dann vielleicht in unterschiedlichen Graph-FB aufrufen, die verschiedene Subroutines ausführen.
Da gibt es Variablen, die ich als Input in wirklich jedem FB benötige, zum Beispiele die "Mode" Variable. Diese würde ich also in jeder Ebene als Inputvariable benötigen, jetzt würde ja an jeder FB-Grenze der Wert nur kopiert werden (es sei denn ich nutze In/Out wie von @Oberchefe vorgeschlagen).
Trotzdem wird an der letzten FB-Grenze eine Übergabe gefordert. Ich muss den Ein- und Ausgänge des MB_Client-FB irgendwelche Variablen zuordnen, die nicht die Variablen des Instanz-DB sein können (siehe Beitrag von Harald)
Ich kann zwar in der übergeordneten Ebene auf die Variablen lesend und schreibend zugreifen, muss aber an der letzten FB-Grenze (bei MB_Client) eine neue Variable zuordnen, die mir ja dann nur die Variablen aus dem Instanz-DB überschreibt, wenn ich sie schon irgendwo anders definiert habe.

PS:
Ich glaube ich verstehe einfach noch nicht so ganz, wie ein Programmablauf funktioniert, weshalb sich mir der Sinn der Multiinstanz-DBs noch nicht so ganz erschließt (außer dass ich auch auf Variablen des FB zugreifen kann, die nicht ausgegeben werden).
Wahrscheinlich lautet meine eigentliche Frage:
Was ist der Unterschied zu Variablen, wenn ich sie als Input rein- oder als Output ausgeben lasse zu den Variablen eines FB die ich direkt aus dem Instanz-DB aufrufe (wo ja Input- und Output-Variablen auch noch einmal auftauchen)? Gibt es da zeitliche Unterschiede, was die Aktualisierung angeht?


----------



## Larry Laffer (9 Dezember 2021)

Hallo,
ich greife dein Vorhaben dann nochmals auf - vielleicht wird es dann für dich auch transparenter - in jedem Fall aber solltest du da selber mal mit herumspielen und sehen was passiert.
Ich bleibe dann mal bei dem MB_Client_FB - verzeih mir aber bitte wenn ich mit den falschen Sub-FB-Namen herumschmeisse. Es geht hier eher um die Machart ... 

Du benutzt las Sub-FB's in dem MB_Client ggf. einen FB_Send und einen FB_Receive (vielleicht auch noch andere - das musst du für dich dann ergänzen).
Im MB_Client legst du nun im STAT-Bereich dieses Bausteins die Variable Send an vom Typ des FB_Send und die Variable Receive vom Typ des FB_Receive. Nun kannst du diese Bausteine im MB_Client über den Variablen-Namen ansprechen. Eine andere Variante wäre, dass du den Baustein wie gewohnt aufrufst und wenn TIA dich nach dem DB fragt dann klickst du hier auf Multi-Instanz - dann macht TIA das für dich (denkt sich aber den Namen selbst aus - den kannst du natürlich nachträglich noch wieder ändern).
Du hast nun also auf diese Weise keine zusätzlichen Instanz-DB's für den FB_Send und den FB_Receive sondern sie sind Bestandteile deines MB_Client geworden. Der MB_Client kann nun auf alle Instanz- oder I-O-Variablen des FB_Send (oder FB_Receive) direkt zugreifen.
Auf deiner Baustein-Schnittstelle (also natürlich der vom MB_Client) hast du nun nur noch die Variablen, die du wirklich für den Baustein (nach aussen hin) benötigst.
Spiel einfach mal damit herum - dann wird Vieles klar werden.
Der größte Benefit dabei ist, dass der MB_Client nun autark von allem Drum-herum ist (oder werden kann).

Gruß
Larry


----------



## Banjo (3 November 2022)

Ich verstehe in der Kürze der Zeit zwar auch noch nicht so recht, was du da vorhast, aber es sieht danach aus, als könnte es dir helfen, einen FB mehrfach an verschiedenen Stellen im Programm mit dem gleichen Instanz-DB aufzurufen. Die Eingangswerte die du immer wieder in gleicher Form benötigst müsstest du dann nur an einer Stelle beschalten. Die Werte die beim Aufruf jeweils unterschiedlich sind, würdest du dann jeweils am Aufruf beschalten. Im Instanz-DB könntest du dir dann auch Flags hinterlegen, in denen du dir dann abspeicherst, ob das initiale Beschalten der Parameter bereits erfolgt ist.


----------



## Onkel Dagobert (12 November 2022)

"In der Kürze der Zeit..." - der war gut  !
Und soll noch mal einer sagen, ich hätte keinen Humor!


----------



## RosiBro (14 November 2022)

Das Thema ist schon eine Weile alt und es war tatsächlich eine doofe Frage. Um meine damalige Intention zu erklären:
Ich wollte das Programm clustern, indem ich mehrere FBs in einem FB zusammenfasse - einfach der Übersicht halber (würde ich heute nicht mehr so machen, weil das ziemlich sinnlos ist). Dafür hat mich aber genervt, dass ich an den Bausteingrenzen "unnötigerweise" die ganze Zeit Variablen kopieren musste, die ja aber schon einmal irgendwo existieren. Ich hätte also gerne einfach gerne über mehrere Ebenen auf eine global Variable zugreifen wollen, aber ohne sie zu kopieren (würde ja mit globalen Variablen und InOuts an der FB-Schnittstelle funktionieren, wie oben schon mehrmals angemerkt).
Warum wollte ich dann die Instanz des FBs an sich selbst übergeben (was wirklich überhaupt gar keinen Sinn ergibt)?
Ich dachte ich könnte die Instanz des FBs einfach als globale Variablen definieren und einfach von überall darauf zugreifen, ohne sie an jeder Bausteingrenze kopieren/übergeben zu müssen. 

Danke euch auf jeden Fall noch einmal für eure Geduld und Erklärungen. Hat mir auf jeden Fall auf die Sprünge geholfen.


----------

