Asynchrones Aufrufen von VIs
- Aktualisiert2025-08-27
- 5 Minute(n) Lesezeit
Wenn Sie ein Ziel-VI mit Hilfe eines SubVI-Knotens oder mit dem Knoten Aufruf über Referenz aufrufen, wird die Blockdiagrammausführung so lange an diesem Knoten unterbrochen, bis das Ziel-VI Ausgabewerte ausgibt. Erst dann wird die Blockdiagrammausführung an den Ausgangsanschlüssen dieses Knotens fortgesetzt.
Bei einem asynchronen Aufruf eines SubVIs dagegen beginnt die Ausführung des SubVIs, während die Blockdiagrammausführung des aufrufenden VIs weiterhin fortgeführt wird. Ein SubVI sollte asynchron aufgerufen werden, wenn das aufrufende VI die Ausgabewerte des SubVIs nicht sofort erfordert. In diesen Fällen kann die Ausführungsgeschwindigkeit des aufrufenden VIs durch den asynchronen Aufruf enorm verbessert werden. Das SubVI wird dabei parallel zum aufrufenden VI ausgeführt. Im Folgenden finden Sie eine Liste mit Beispielszenarien, in denen sich asynchrone VI-Aufrufe als nützlich erweisen:
- Übertragen von Aufgaben an SubVIs, während das VI weiterhin ausgeführt wird
- Aufteilen der Ausführung einer Aufgabe unter mehreren Instanzen des gleichen Ziel-VIs (besonders, wenn bis zur Ausführung unbekannt ist, wieviele Instanzen erforderlich sind)
- Starten komplexer Benutzeroberflächen mit Komponenten, die von verschiedenen parallel ausgeführten VIs gesteuert werden, die simultan Ausgabewerte erfassen.
Überblick über das Durchführen eines asynchronen VI-Aufrufs
In LabVIEW besteht ein asynchroner VI-Aufruf aus einer Kombination der folgenden Schritte.
- Vorbereiten einer VI-Referenz auf einen asynchronen VI-Aufruf—Sie bereiten eine VI-Referenz zur asynchronen Ausführung vor, wenn die Referenz mit Hilfe der Funktion VI-Referenz öffnen ermittelt wird. Am Eingang Optionen muss dabei entweder 0x80 oder 0x100 als Options-Flag zur asynchronen Ausführung ausgewählt sein. Mit diesem Schritt werden Ressourcen für den asynchronen Aufruf zugewiesen.
- Starten des asynchronen VI-Aufrufs—Verbinden Sie zum Starten der Ziel-VI-Ausführung die VI-Referenz mit dem Knoten Asynchronen Aufruf starten. Während der Ziel-VI-Ausführung wird die Blockdiagrammausführung des aufrufenden VIs fortgesetzt.
- (Optional) Erfassen der Ausgabewerte des asynchronen VI-Aufrufs—Wenn die Ausgabewerte eines asynchron aufgerufenen Ziel-VIs für Ihre Anwendung erforderlich ist, verbinden Sie die VI-Referenz mit dem Knoten Asynchronen Aufruf abwarten zum Erfassen der Ausgabewerte. Der Knoten "Asynchronen Aufruf abwarten" wartet bis die Ausführung des entsprechenden SubVIs beendet ist oder bis am Knoten ein Timeout eintritt.
- Schließen der VI-Referenz—Mit Hilfe der Funktion Referenz schließen wird LabVIEW darüber informiert, dass die VI-Referenz nicht mehr benötigt wird. Anschließend kann LabVIEW die verwendeten Ressourcen freigeben.
Arten von asynchronen VI-Aufrufen
Zum Durchführen eines asynchronen VI-Aufrufs müssen Sie bestimmen, welche der folgenden Vorgehensweisen für Ihren Fall zutrifft. Weitere Hinweise zu den beiden Modellen finden Sie unter:
- Aufruf ohne Datenerfassung—Ein aufrufendes VI beginnt die Ausführung eines SubVIs, erfordert aber nicht die Ausgabewerte des SubVIs.
- Aufruf mit Datenerfassung—Ein aufrufendes VI beginnt die Ausführung eines SubVIs und die Ausgabewerte müssen zu einem späteren Zeitpunkt erfasst werden.
Verwaltung der asynchronen VI-Aufrufe mit Hilfe der Liste für asynchrone Aufrufe
In den meisten Fällen ist beim asynchronen Aufrufen von VIs kein Wissen darüber notwendig, wie die asynchronen VI-Aufrufe verwaltet werden. Das Verständnis der Liste für asynchrone Aufrufe kann jedoch beim Steuern der Ausführungsgeschwindigkeit und Erstellen von deterministischen Anwendungen hilfreich sein. Beim Vorbereiten einer VI-Referenz zur asynchronen Ausführung durch Auswahl einer asynchronen Options-Flag am Eingang Optionen der Funktion "VI-Referenz öffnen" erstellt LabVIEW eine Liste mit Datenräumen, mit deren Hilfe Daten für die individuellen Aufrufe des VIs nachverfolgt werden. Da LabVIEW statt eines Datenraums eine Liste mit Datenräumen mit einer VI-Referenz verknüpft, können mehrere asynchrone Aufrufe mit derselben VI-Referenz stattfinden. Jedes Mal, wenn Sie mit Hilfe des Knotens "Asynchronen Aufruf starten" einen asynchronen Aufruf mit der VI-Referenz starten, reserviert LabVIEW einen der Datenräume in der Liste. Wenn die VI-Ausführung beendet ist, werden die Ausgabewerte im Datenraum gespeichert und der VI-Aufruf wird als beendet markiert. Wenn ein Knoten "Asynchronen Aufruf abwarten" auf die Ausgabewerte des aufgerufenen VIs wartet, gibt LabVIEW die Ergebnisse aus dem Datenraum aus. Auf diese Weise wird der Datenraum für einen anderen Aufruf desselben VIs freigegeben.
Auswirkung der Liste für asynchrone Aufrufe auf die Ausführungsgeschwindigkeit
LabVIEW erstellt für jede VI-Referenz einen Datenraum in der Liste für asynchrone Aufrufe für jeden CPU-Kern auf dem Zielrechner. Wenn mehr simultane Aufrufe des Ziel-VIs gestartet werden als Datenräume zur Verfügung stehen, erhöht LabVIEW die Größe der Aufrufliste durch Zuweisung von mehr Datenräumen. Da die Zuweisung von Datenraum nicht deterministisch ist, kann es im aufrufenden VI zu einer unerwarteten Verzögerung an jedem Knoten "Asynchronen Aufruf starten" kommen an dem eine Zuweisung von Datenräumen ausgelöst wird.
Vermeiden von unerwarteten Verzögerungen am Knoten "Asynchronen Aufruf starten"
Zum Vermeiden unerwarteter Verzögerungen in VIs, die auf einem Real-Time-System aufgeführt werden sollen, muss die Anzahl der Datenräume in der Aufrufliste für eine bestimmte VI-Referenz vorbelegt werden. Dies erfolgt durch Aufruf der Methode Speicherpool für asynchrone Aufrufe belegen vor dem Start von asynchronen Aufrufen. Durch Vorbelegung von Datenräumen werden Verzögerungen auf den Anfang des Programms beschränkt. Die Verzögerungen treten also nicht am Knoten "Asynchronen Aufruf starten" auf.
Weitere Informationen zu Auswirkungen auf die Leistung durch die Liste asynchroner Aufrufe finden Sie im VI "Populating the Asynchronous Call Pool.vi" im Verzeichnis labview\examples\Application Control\VI Server\Asynchronous Call By Reference. Nach ähnlichen Beispielen suchen
Auswirkungen der Liste für asynchrone Aufrufe auf das Erfassen von Ausgabewerten von mehreren Aufrufen desselben VIs
Wenn Sie die Ausgabewerte eines asynchronen VI-Aufrufs erfassen möchten, muss die Referenz auf das aufgerufene VI an den Knoten "Asynchronen Aufruf abwarten" weitergegeben werden. Da der Knoten "Asynchronen Aufruf abwarten" statt einer Referenz auf einen bestimmten Datenraum eine Referenz auf ein VI empfängt, kann der Knoten die Ausgabewerte eines bestimmten Aufrufs des referenzierten VIs nicht erfassen. Stattdessen gibt der Knoten Ausgabewerte aller beendeten Aufrufe dieses VIs aus. Im folgenden Blockdiagramm wird diese Funktionsweise eingehender erläutert.
Wenn mehrere Knoten des Typs "Asynchronen Aufruf abwarten" auf dieselbe VI-Referenz angewiesen sind, kann nicht vorhergesagt werden, welcher der Knoten die Ausgabewerte eines bestimmten Aufrufs der VI-Referenz ausgibt. Im vorherigen Blockdiagramm kann der obere Knoten "Asynchronen Aufruf abwarten" die Ausgabewerte von Asynchronen Aufruf starten 2 ausgeben, obwohl er mit Asynchronen Aufruf starten 1 verbunden ist. Wenn Sie mehrere Aufrufe desselben VIs durchführen möchten, der Knoten "Asynchronen Aufruf starten" aber zusammen mit einem bestimmten Knoten des Typs "Asynchronen Aufruf abwarten" ausgeführt werden soll, wählen Sie eine der folgenden Lösungen:
- Erstellen Sie eine eindeutige VI-Referenz auf das Ziel-VI für jeden asynchronen Aufruf, der ausgeführt werden soll. Wenn ein Knoten des Typs "Asynchronen Aufruf abwarten" eine eindeutige VI-Referenz gemeinsam mit einem Knoten des Typs "Asynchronen Aufruf starten" verwendet, verweisen die beiden Knoten garantiert auf dieselbe Instanz des VIs. Diese Lösung ist vergleichbar mit dem Erfassen von Ausgabewerten von mehreren Aufrufen von eindeutigen VI-Referenzen.
- Bearbeiten Sie das Ziel-VI so, dass eindeutige Zahlen oder Strings als Eingang akzeptiert werden und die gleiche Kennung ausgegeben wird. Vergleichen Sie beim asynchronen Aufruf des Ziel-VIs die Kennung, die an einen bestimmten Knoten des Typs "Asynchronen Aufruf starten" übergeben wird mit der Kennung, die vom Knoten "Asynchronen Aufruf abwarten" ausgegeben wird. Stimmt die Kennung überein, wissen Sie, welcher Aufruf vom Knoten "Asynchronen Aufruf abwarten" ausgegeben wurde.