LabVIEWForum.de
Reentrant aber was ist mit den subVIs? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Reentrant aber was ist mit den subVIs? (/Thread-Reentrant-aber-was-ist-mit-den-subVIs)



Reentrant aber was ist mit den subVIs? - gottfried - 06.07.2009 17:01

Verstehe ich das richtig. Ich definiere ein SubVI als reentrant und kann mich daruf verlassen, dass die internen Variablen zwischen den Calls nicht verändert werden (nebenbei... sonst noch was ?). Jetzt wir es für mich komplizier: was ist mit den SubVIs dieses SubVIs? Wenn ich scharf nachdenke, müssen die auch reentrant sein falls sie interne Variable haben? Jetzt wird es für mich noch komplexer: was ist mit den vorhandenen VIs? Ich verwende z.B. BesselFilterPtByPt - das muss eine intere Variable (und nicht nur eine haben). OK, ich habe nachgesehen die ist reentrant damit habe ich eine halbe Unklarheit weniger, denn denselben Datenstrom filtere ich beim Start wenn die Daten aus der Datenbank kommen an der Stelle A und wenn die Messung läuft an der Stelle B - fein, meiner Überlegung nach weiss also das zweite BesselFilterPtByPt nichts von seinem Vorgänger und baut mir einen Hacker in die liebliche Kurve - stimmt das? Zusätzlich habe ich nicht nur einen Datenstrom sondern vier und die treten meist in einer Schleife auf.

So, meiner Meinung nach habe ich mein eigenes FilterSubVI (das die Besselfunktion verwendet) der Einfachheit halber so umzuschreiben, dass es gleich ein ganzes Array von Datensätzen verarbeiten kann - fertig? Nein, die zweite Stelle im Programm, wo ich dasselbe machen möchte ist ahnungslos, dass in den Besselfunktionen schon interne Werte sind - oder?

Habe ich mich hinreichend umständlich ausgedrückt?


Phase Lesen aus der Datenbank: Laufende Verarbeitung:
Messwertstrom 1 -> BesselFilter Messwertstrom 1 -> BesselFilter
Messwertstrom 2 -> BesselFilter Messwertstrom 2 -> BesselFilter
Messwertstrom 3 -> BesselFilter Messwertstrom 3 -> BesselFilter
Messwertstrom 4 -> BesselFilter Messwertstrom 4 -> BesselFilter

Danke

Gottfried


Reentrant aber was ist mit den subVIs? - Kvasir - 06.07.2009 17:29

Ich habs nicht verstandenWink

Ich probier mich trotzdem:

Definierst du ein Vi als Reentrant, dann wird für jeden Aufruf (also jedes Erscheinen im BD) eine eigene Instanz aufgerufen, die unabhängig von jedem anderen Aufruf die Variablen speichert. Ein SubVi innerhalb einer Schleife zählt dabei jedoch nur als eine Instanz pro Schleife, nicht pro Durchlauf!
Konsequenterweise sind auch alle Vi's und Funktionen innerhalb eines Reentrant SubVis dadurch automatisch reentrant vom Standpunkt des übergeordneten SubVis, da für jede Instanz des SubVis auch eine Instanz der Funktion / des Vis im betreffenden SubVi aufgerufen wird.

Demnach ist die zweite Stelle völlig ahnungslos, dass in der Funktion schon Werte sind.

So ... somit stimme ich mit dir völlig überein (soweit ich dich richtig verstehe) und du hast das auch schon erkannt. Stellt sich nun die Frage, ob du nur sicherheitshalber gefragt hast, oder ob es in deinem Fall sich anders verhält, was mich stark wundern würdeSmile

Grüße


Reentrant aber was ist mit den subVIs? - schrotti - 06.07.2009 18:40

' schrieb:Definierst du ein Vi als Reentrant, dann wird für jeden Aufruf (also jedes Erscheinen im BD) eine eigene Instanz aufgerufen, die unabhängig von jedem anderen Aufruf die Variablen speichert. Ein SubVi innerhalb einer Schleife zählt dabei jedoch nur als eine Instanz pro Schleife, nicht pro Durchlauf!
Dazu muss dem VI aber auch ein eigener Speicherberiech zugewiesen werden. Da dies die Standardeinstellung ist fällt es vielleicht nicht auf.
' schrieb:Konsequenterweise sind auch alle Vi's und Funktionen innerhalb eines Reentrant SubVis dadurch automatisch reentrant vom Standpunkt des übergeordneten SubVis, da für jede Instanz des SubVis auch eine Instanz der Funktion / des Vis im betreffenden SubVi aufgerufen wird.
Da muss ich dir wiedersprechen. Es ein leichtes, mittels einer FGV Daten zweier Instanzen eines ablaufinvarianten VIs einem zweiten VI zur Verfügung zu stellen. Würde alle aufgerufenen SubVI ebenfalls ablaufinvariant sein, ginge das nicht. Anbei ein Beispiel.

Lv86_img[attachment=19534]
Lv85_img[attachment=19535]
Ist so natürlich nicht gerade sinnvoll, aber es wird klar, was ich sagen will.


Reentrant aber was ist mit den subVIs? - gottfried - 07.07.2009 16:10

Danke für Eure Mühe,

ich (glaube) ich habs verstanden ... (oder?)
Nein ich verstehe das Beispiel nicht - bitte um eine Denkanleitung

Danke

Gottfried


Reentrant aber was ist mit den subVIs? - schrotti - 07.07.2009 17:12

Naja, wenn alle aufgerufenen SubVIs eines ablaufinvarianten VIs ebenfalls ablaufinvariant wären, würde eine FGV dort gar nicht erst funktionieren. Wie du im Beispiel siehst, rufen die zwei Instanzen eines ablaufinvarianten VIs eine FGV auf. Sie holen von der FGV den alten Wert, inkrementieren bzw dekremtieren ihn und übergeben ihn wieder der FGV. Das Main ruft die ebenfalls FGV auf, um an diese Daten zu kommen. Würde nun für jede Sub eine neue Instanz der FGV und eine für das Main in den Speicher geladen, würde das Beispiel so wohl nicht funktionieren.


Reentrant aber was ist mit den subVIs? - gottfried - 08.07.2009 08:29

habs verstanden

danke


Reentrant aber was ist mit den subVIs? - Lucki - 08.07.2009 08:57

' schrieb:Phase Lesen aus der Datenbank: Laufende Verarbeitung:
Messwertstrom 1 -> BesselFilter Messwertstrom 1 -> BesselFilter
Messwertstrom 2 -> BesselFilter Messwertstrom 2 -> BesselFilter
Messwertstrom 3 -> BesselFilter Messwertstrom 3 -> BesselFilter
Messwertstrom 4 -> BesselFilter Messwertstrom 4 -> BesselFilter
Wenn die 4 Messwertströme ein Array bilden, und Du willst die Bessel-Filterung in einer For-Schleife machen, dann muß jeder Index in der for-Schleife sein eigenes Besselfilter-Ikon haben. Also so, wobei jeder Case identisch ist:
[attachment=19571]


Reentrant aber was ist mit den subVIs? - gottfried - 09.07.2009 09:09

danke - ist schon positive Geschichte (mit Eurer Hilfe)