Eine Kanalverbindung ist eine Verbindung für den asynchronen Datenaustausch zwischen zwei parallelen Programmabschnitten, durch die jedoch keine Ausführungsreihenfolge erzwungen wird. Eine Kanalverbindung wird ähnlich wie eine Referenz oder Variable eingesetzt, bei der Daten von einer Schleife gesendet und von der anderen Schleife ausgelesen werden. Die Datenübertragung wird jedoch anders als bei Referenzen oder Variablen grafisch als Verbindung dargestellt.

In der folgenden Abbildung wird dargestellt, wie Sie durch die Verwendung von Kanalverbindungen im Blockdiagramm den gleichen Funktionsumfang erzielen wie durch Queue-Referenzen.

Jede Kanalverbindung benötigt mindestens einen schreibenden und einen lesenden Kanalendpunkt (Sendeendpunkt und Empfangsendpunkt). Endpunkte sind Teile des Programmcodes, die dem Datenaustausch dienen. Ein Sendeendpunkt überträgt Daten an den Kanal. Ein Empfangsendpunkt liest Daten aus dem Kanal aus. Durch das Verbinden des Sendeendpunkts mit dem Empfangsendpunkt über eine Kanalverbindung wird der asynchrone Datenaustausch zwischen parallelen Programmabschnitten ermöglicht.

Es stehen verschiedene Kanalvorlagen zum Erstellen von Anwendungen in LabVIEW zur Verfügung. Jede Vorlage verwendet ein anderes Protokoll für den Datenaustausch. Sie können je nach Anforderungen Ihrer Anwendung und der Art des Datenaustauschs eine der folgenden Vorlagen auswählen:

Ein schreibender oder lesender Kanalendpunkt wird erstellt, indem Sie mit der rechten Maustaste auf einen Anschluss oder eine Verbindung klicken und Erstellen»Schreibender Kanalendpunkt oder Erstellen»Lesender Kanalendpunkt auswählen. Im daraufhin geöffneten Dialogfeld "Kanalendpunkt auswählen" können Sie zwischen schreibenden und lesenden Endpunkten umschalten, indem Sie auf Zwischen Lesen/Schreiben wechseln klicken. Wenn Sie einen Endpunkt von einem Anschluss aus erstellen, wird ein Exemplar der Kanalvorlage mit demselben Datentyp als Übertragungstyp erzeugt.

Stream-Kanäle sind nicht verzweigbar. Das bedeutet, dass ein Sendeendpunkt mit einem Empfangsendpunkt verbunden wird. Alle anderen Kanäle sind verzweigbar und lassen mehrere Sender und Empfänger an demselben Kanal zu.

Lebensdauer von Kanälen

Das aufrufende Blockdiagramm eines Kanals steuert die Kanalausführung. Ein aufrufendes Blockdiagramm ist ein Blockdiagramm der untersten Ebene, das alle Endpunkte eines Kanals oder alle Knoten enthält, die diese Endpunkte aufrufen.

Ein Kanal wird initialisiert wenn das aufrufende Blockdiagramm mit der Ausführung beginnt. Ein Kanal wird geschlossen, wenn Letztes Element? oder der Eingang Abbrechen an einem der Endpunkte "True" ist. Wenn ein Kanal geschlossen wird, werden weitere Eingaben ignoriert. Ein Kanal wird neu initialisiert wenn das aufrufende Blockdiagramm erneut mit der Ausführung beginnt. Beim aufrufenden Blockdiagramm kann es sich entweder um einen Strukturknoten handeln, um das Blockdiagramm höchster Ebene eines VIs oder um ein Blockdiagramm höherer Ebene, welches das aktuelle Haupt-VI aufruft.

In der folgenden Abbildung ist das aufrufende Blockdiagramm des Kanals das Diagramm höchster Ebene dieses VIs. Der Kanal wird initialisiert, wenn das aufrufende Blockdiagramm mit der Ausführung beginnt. Das heißt, dass der Kanal immer dann initialisiert wird, wenn das Haupt-VI mit der Ausführung beginnt oder wenn das Haupt-VI als SubVI aufgerufen wird.

In der folgenden Abbildung ist das aufrufende Blockdiagramm des Kanals die While-Schleife. Der Kanal wird initialisiert, wenn die While-Schleife mit der Ausführung beginnt, wodurch der Kanal bei jeder Ausführung der While-Schleife ebenfalls initialisiert wird.

In der folgenden Abbildung ist das aufrufende Blockdiagramm des Kanals nicht das Haupt-VI, sondern ein Diagramm, das dem derzeitigen Blockdiagramm der höchsten Ebene übergeordnet ist. Der Kanal wird initialisiert, wenn das Blockdiagramm höherer Ebene mit der Ausführung beginnt. Das heißt, dass der Kanal immer dann initialisiert wird, wenn das übergeordnete Diagramm mit der Ausführung beginnt oder wenn das übergeordnete Diagramm als SubVI aufgerufen wird. Der Kanal wird nicht nach dem Durchlauf der While-Schleife initialisiert, da die While Schleife nicht alle Endpunkte des Kanals enthält.

In allen aufgeführten Kanalinstanzen schreibt der Sendeendpunkt die ersten drei Werte in den Kanal, ignoriert jedoch die letzten zwei Werte, da der Eingang Letztes Element? "True" ist, wenn die verbleibende Anzahl nicht geschriebener Elemente im Array 2 entspricht.

Beenden eines Endpunkts „Replizieren“

Wenn Sie einen lesenden oder schreibenden Kanalendpunkt erstellen, wählen Sie Mit Abbruch aus, um einen Endpunkt mit Abbrechen als booleschen Eingang zu erstellen. Bei TRUE sendet Abbrechen eine Anweisung an alle Endpunkte, den Wert Abgebrochen? auszugeben. Jeder Endpunkt kann das Abbruchsignal senden. Wenn Sie Schleifen mit Kanalverbindungen haben, verbinden Sie alle Schleifen mit der Ausgabe Abgebrochen? der Endpunkte, sodass die Schleifen beendet werden, sobald ein Endpunkt das Abbruchsignal sendet. Für diesen Mechanismus ist kein lokales Objekt erforderlich. Wenn Sie einen Endpunkt „Replizieren“ verwenden, muss der ursprüngliche Kanal den Abbruchwert bereitstellen. Der Endpunkt „Replizieren“ beendet seine interne Schleife und überträgt den Abbruchwert an die replizierten Kanäle.

Vorteile von Kanalverbindungen gegenüber Referenzen und Variablen

Kanalverbindung bieten die folgenden Vorteile:

  • Kanalverbindungen erfordern kein Erzeugen und Entfernen von Referenzen, wie es bei Queues der Fall ist.
  • Kanalverbindungen erfordern eine geringere Anzahl von Knoten auf dem Blockdiagramm als Queues.
  • Die Fehlersuche ist in Kanalverbindungen im Vergleich zu Referenzen und Variablen leichter, da die Richtung des Datenflusses in Kanalverbindungen angezeigt wird.
  • Kanalverbindungen können Stopp- und Abbrechen-Signale in Ihre Daten miteinbeziehen, wodurch die Fehleranfälligkeit geringer ist als bei der Erstellung solcher Signale mit Hilfe von Referenzen und Variablen.
  • Kanalverbindungen ermöglichen Ihnen das Erstellen von Koroutinen, die in anderen Programmiersprachen die Rolle von Funktionsabschlüssen erfüllen. Unter labview\examples\Channels\Replacing The Function At The Heart Of An Algorithm At Run Time\Replacing The Function At The Heart Of An Algorithm At Run Time.lvproj finden Sie ein Beispiel zur Erstellung von Koroutinen mit Hilfe von Kanalverbindungen.