Erzeuger-/Verbraucherarchitektur in LabVIEW

Überblick

Das Erzeuger/Verbraucher-Entwurfsmuster basiert auf dem Master/Slave-Muster und ist auf einen erweiterten Datenaustausch zwischen mehreren Schleifen ausgerichtet, die unterschiedlich schnell ausgeführt werden. Das Erzeuger-/Verbraucher-Muster dient der Trennung von Prozessen, die Daten unterschiedlich schnell erfassen und ausgeben. Die parallelen Schleifen des Erzeuger/Verbraucher-Musters werden in zwei Kategorien unterteilt: Schleifen, die Daten erzeugen, und Schleifen, welche die Daten als Eingangsgrößen benötigen.

In diesem Artikel werden häufige Anwendungsfälle und Vorteile der Erzeuger-/Verbraucherarchitektur erläutert. Er verweist auch auf Ressourcen für den Einsatz dieser Technik in LabVIEW. Wenn Sie einen tieferen Einblick in den Informationsaustausch zwischen Schleifen oder eine schrittweise Anleitung und Übungen zur Erstellung einer Erzeuger/Verbraucher-Schleife in LabVIEW benötigen, sollten Sie unseren Kurs LabVIEW-Grundlagen 2 belegen.

Inhalt

Warum werden Erzeuger/Verbraucher-Muster verwendet?

Das Erzeuger/Verbraucher-Muster gibt Ihnen die Möglichkeit, auf einfache Weise mehrere Prozesse gleichzeitig zu verarbeiten und dabei mit individuellen Geschwindigkeiten zu iterieren.

Gepufferte Kommunikation

Wenn mehrere Prozesse mit unterschiedlichen Geschwindigkeiten ausgeführt werden, ist eine gepufferte Kommunikation zwischen den Prozessen äußerst effektiv. Mit einem ausreichend großen Puffer kann die Erzeugerschleife mit wesentlich höheren Geschwindigkeiten als die Verbraucherschleife ohne Datenverlust ausgeführt werden.
Nehmen wir zum Beispiel an, eine Anwendung besteht aus zwei Prozessen – der erste Prozess führt die Datenerfassung durch und der zweite Prozess nimmt diese Daten und legt sie in einem Netzwerk ab. Der erste Prozess arbeitet mit einer Geschwindigkeit, die dreimal so hoch ist wie die des zweiten Prozesses. Wenn das Erzeuger/Verbraucher-Entwurfsmuster zur Implementierung dieser Anwendung verwendet wird, fungiert der Datenerfassungsprozess als Erzeuger und der Netzwerkprozess als Verbraucher. Wenn die Kommunikations-Queue (Puffer) groß genug ist, hat der Netzwerkprozess Zugriff auf einen Großteil der Daten, die von der Datenerfassungsschleife erfasst werden. Durch diese Fähigkeit, Daten zu puffern, wird der Datenverlust minimiert.

Zur Veranschaulichung der gepufferten Kommunikation, die bei der Verwendung der Queue-Funktionen auftritt, sei auf das Beispielprogramm LabVIEW-Fenster mit Erzeuger-/Verbraucherschleifen verschieben (Move LabVIEW Window Using Producer/Consumer Loops) verwiesen

Datenerfassung und -verarbeitung

Das Erzeuger/Verbraucher-Muster kommt in der Regel zum Einsatz, wenn mehrere Datensätze erfasst werden, die der Reihe nach verarbeitet werden sollen.
Angenommen, Sie möchten eine Anwendung programmieren, die Daten während der Verarbeitung in der Reihenfolge ihres Eingangs entgegennimmt. Da die Queue-Bildung (das Erzeugen) dieser Daten viel schneller ist als die tatsächliche Verarbeitung (das Verbrauchen), ist das Erzeuger/Verbraucher-Entwurfsmuster für diese Anwendung am besten geeignet. Dadurch kann die Verbraucherschleife die Daten in ihrem eigenen Tempo verarbeiten, während die Erzeugerschleife gleichzeitig weitere Daten in die Queue stellen kann.

Dabei ist Folgendes zu beachten: Wenn sich sowohl der Erzeuger als auch der Verbraucher für diese Anwendung in der gleichen Schleife befinden, läuft die Datenerfassung langsamer ab als die Verarbeitung der Daten. Deshalb ist es von Vorteil, wenn Sie Ihren Programmcode nach Prozess, Datenerfassung (Erzeuger) und Verarbeitung (Verbraucher) aufgliedern. 

Netzwerkkommunikation

Die Netzwerkkommunikation erfordert zwei Prozesse, die gleichzeitig und mit unterschiedlichen Geschwindigkeiten arbeiten: Der erste Prozess fragt ständig die Netzwerkleitung ab und ruft Pakete ab, und der zweite Prozess nimmt diese vom ersten Prozess abgerufenen Pakete und analysiert sie. In diesem Beispiel ist der erste Vorgang also der Erzeugervorgang, der dem zweiten Vorgang Daten bereitstellt. Letzterer wiederum fungiert als Verbraucher. Diese Anwendung würde von der Verwendung des Erzeuger/Verbraucher-Entwurfsmusters profitieren. Mit der Erzeugerschleife werden Daten aus dem Netzwerk abgerufen und mit der parallelen Verbraucherschleife offline verarbeitet. Die Queue ermöglicht das Puffern der empfangenen Datenpakete. Diese Pufferung ist besonders wichtig, wenn die Netzwerkkommunikation ausgelastet ist. Aufgrund der Pufferung verläuft das Erfassen und Weiterleiten der Datenpakete schneller als das Auswerten.

Verarbeitung von Nachrichten-Queues

Die „Handler für Nachrichten“-Queues-Architektur ist eine Sonderform der Erzeuger-/Verbraucherarchitektur. Daten-Queues werden verwendet, um Daten zwischen Schleifen innerhalb des Erzeuger/Verbraucher-Entwurfsmusters zu kommunizieren. Diese Queues bieten den Vorteil der Möglichkeit der Datenpufferung zwischen Erzeuger- und Verbraucherschleifen

Erstellen von Erzeuger/Verbraucher-Mustern

Der Erzeuger/Verbraucher-Entwurf besteht aus parallelen Schleifen, die in zwei Kategorien unterteilt sind: Erzeuger und Verbraucher. Die Kommunikation zwischen Erzeuger- und Verbraucherschleifen erfolgt über Queues oder Kanalverbindungen.

Queues

LabVIEW verfügt über integrierte VIs für Queue-Operationen, die Sie unter Funktionenpalette >> Datenaustausch >> Queue-Funktionen finden.

Queues beruhen auf der First-In/First-Out-Theorie. Im Erzeuger/Verbraucher-Entwurfsmuster können Queues sowohl außerhalb der Erzeuger- als auch der Verbraucherschleife initialisiert werden. Da die Erzeugerschleife Daten für die Verbraucherschleife produziert, wird sie der Queue Daten hinzufügen (das Einfügen von Daten in eine Queue wird „Enqueue“ genannt).

Die Verbraucherschleife entnimmt Daten aus dieser Queue (das Entnehmen von Daten aus einer Queue wird als „Dequeue“ bezeichnet). Da Queues nach dem First-In/First-Out-Prinzip arbeiten, werden die Daten vom Verbraucher immer in der gleichen Reihenfolge analysiert, wie sie vom Erzeuger in die Queue eingefügt wurden. In Abbildung 1 ist dargestellt, wie das Erzeuger/Verbraucher-Entwurfsmuster in LabVIEW erstellt werden kann.


Abbildung 1: Erzeuger/Verbraucher-Entwurfsmuster

Hinweis: Diese Image-Datei ist ein LabVIEW-Snippet, das LabVIEW-Programmcode enthält, den Sie in Ihrem Projekt wiederverwenden können. Um ein Snippet zu verwenden, klicken Sie mit der rechten Maustaste auf die Image-Datei und ziehen Sie diese auf Ihr LabVIEW-Diagramm.


Es sind Beispiele für die Verwendung von Queues innerhalb von LabVIEW vorhanden, die Sie als Ausgangspunkt für Ihre Anwendung verwenden können. Beispiele finden Sie mithilfe der LabVIEW-Suchmaschine für Beispiele (LabVIEW Example Finder), indem Sie nach „Queue“ suchen.

Kanalanzahl

Die Funktion Kanalverbindung wurde in LabVIEW 2016 hinzugefügt. Sie können Kanalverbindungen verwenden, die den gleichen Funktionsumfang wie Queues bieten.

Bei Warteschlangen richten Sie die Queue-Referenz ein (Queue anfordern), fügen Daten hinzu (in Queue einfügen), entfernen Daten (Aus Queue entnehmen) und schließen die Queue-Referenz (Queue freigeben). Bei Kanälen wird dieser Vorgang vereinfacht, indem nur das schreibende und das lesende Objekt der Daten eingerichtet werden.

Weitere Informationen zu Kanalverbindungen und Startvorlagen finden Sie unter Kommunikation von Daten zwischen parallelen Programmabschnitten mithilfe von Kanalverbindungen in der LabVIEW-Hilfe

Wichtige Hinweise

Beim Umgang mit dem Erzeuger/Verbraucher-Entwurfsmuster sind einige Einschränkungen zu beachten, z. B. hinsichtlich der Verwendung von Queues und der Synchronisierung.

Queue-Nutzung

Problem: Queues sind an einen bestimmten Datentyp gebunden. Daher muss jedes unterschiedliche Objekt, das in einer Erzeugerschleife erzeugt wird, in verschiedene Queues eingeordnet werden. Dies könnte ein Problem darstellen, da das Blockdiagramm dadurch komplizierter wird.
Lösung: Queues können Datentypen wie Array und Cluster akzeptieren. Jedes Datenobjekt kann in einem Cluster platziert werden. Dadurch werden verschiedene Datentypen hinter dem Cluster-Datentyp maskiert. In Abbildung 1 sind die Cluster-Datentypen mit der Kommunikations-Queue implementiert.

Synchronisierung

Problem: Da das Erzeuger/Verbraucher-Entwurfsmuster nicht auf Synchronisierung basiert, folgt die anfängliche Ausführung der Schleifen keiner bestimmten Reihenfolge.  Daher kann das Initialisieren einer Schleife vor einer anderen zu Problemen führen.

Lösung: Das Hinzufügen einer Ereignisstruktur zum Erzeuger/Verbraucher-Entwurfsmuster kann diese Arten von Synchronisierungsproblemen lösen.  Die Vorlage in Abbildung 2 zeigt, wie sich diese Funktionsweise erreichen lässt.  Weitere Informationen zum Funktionsumfang der Synchronisierung finden Sie weiter unten im Abschnitt „Ähnliche Links“.


Abbildung 2: Verwendung einer Ereignisstruktur im Erzeuger/Verbraucher-Entwurfsmuster

 Hinweis: Diese Image-Datei ist ein LabVIEW-Snippet, das LabVIEW-Programmcode enthält, den Sie in Ihrem Projekt wiederverwenden können. Um ein Snippet zu verwenden, klicken Sie mit der rechten Maustaste auf die Image-Datei und ziehen Sie diese auf Ihr LabVIEW-Diagramm.