07-12-2013 03:54 AM
Hallo,
ich habe ein Programm erstellt, dass in einer Endlosschleife läuft. In der Schleife befinden sich 8 SubVIs die nacheinander ausgeführt werden. die VIs sind über einen Daten-Cluster verbunden. Als Eingang dient eine SingleProvessVariable. Der Cluster wird zuerst an das erste VI übergeben. Dieses liest Daten aus und speichert neue Werte in den Cluster. Danach wird der Cluster an das zweite VI übergeben. Welches wiederum Änderungen vornimmt und anschließend den Cluster an das dritte VI übergibt, usw.
Ich würde in den Cluster gerne auch Kennfelder in Form von Arrays einbauen. Diese können unter Umständen auch größer werden. Mich würde nun interessieren ob ich durch diese vorgehensweise einbußen in der Performance zu erwarten habe.
Wird bei der Übergabe des Clusters an ein SubVI der Wert des Clusters übergeben oder die Referenz auf den Cluster?
Vielen Dank und viele Grüße
Max
07-13-2013 06:43 AM - edited 07-13-2013 06:47 AM
LabVIEW verwendet intern grundsätzlich Referencen für die Daten. Aber ob eine solche Architektur wie Du sie vorstellst Performanceeinbussen mit sich bringt oder nocht hängt im Wesentlichen davon ab wie Du den Cluster verbindest und auch wie Du das in den SubVIs machst.
Ob LabVIEW Referencen oder nicht verwendet ist erst mal nebensächlich. Das Hauptprinzip in LabVIEW ist Datenfluss und alles andere muss sich dem unterordnen. Wenn Du einen Wire irgendwo verzweigst muss LabVIEW ein Kopie der Daten in dem Wire anlegen, ausser der Compiler kann feststellen dass eine Datensenke am Wire 100% sicher diese Daten nur zeitlich verwendet (etwa ein Index Array oder ein Unbundle Cluster). In dem Fall stellt LabVIEW einfach sicher dass diese Funktion die den Datenwire nicht weiter verwendet erst ausgeführt wird bevor eine andere Funktion an der anderen Abzweigung des Wires etwas damit tun darf. Wenn LabVIEW für beide (oder grundsätzlich mehr dann eine) Datensenken nicht sicher weiss ob sie die Daten nur temporär verwenden muss es die Daten n-1 mal kopieren (n ist die Anzahl Datensenken wo LabVIEW nicht sicher feststellen konnte dass sie die Daten nicht nur zeitlich benötigt), um zu verhindern dass die eine Funktion an den selben Werten rumdoktort dann die andere. Also die erste Regel um Datenkopien zu vermeiden ist jegliche Verzweigung von Wires mit potentiel viel Daten (Arrays, Strings) darin zu vermeiden.
Wenn Du in Deinem SubVI den entsprechenden Dateninput und Dateoutput nicht auf der äussersten Diagramebene hast (sondern irgendwo innerhalb von Cases, Loops oder Sequenzen, dann ist es für den Optimizer oft unmöglich um eine gute Analyse zu machen ob Daten irgendwo wiederverwendet werden und ist LabVIEW gezwungen bei Abzweigungen von Wiren jeweils eine Kopie anzulegen. Deshalb in SubVIs die Input und Outputterminals von Wires die potentiel viel Daten enthalten können immer auf der äussersten Ebene plazieren und durch sämtliche Cases, Loops und dergleichen durchverbinden. Bei Loops vorzugsweise Schieberegister verwenden um diese Wires durchzuführen anstelle von nur Tunnels. Das ermöglicht dem LabVIEW Compiler extra Optimalisierungen da die Optimalisierungen im Zusammenhang mit Schieberegistern extrem weit durchdacht sind.