Erstellen von LabVIEW-Klassen
- Aktualisiert2025-08-27
- 19 Minute(n) Lesezeit
In LabVIEW werden benutzerdefinierte Datentypen durch Erstellen von LabVIEW-Klassen erzeugt. LabVIEW-Klassen definieren mit einem Objekt zusammenhängende Daten sowie Methoden, die mit den Daten durchführbare Operationen definieren. Mithilfe der Kapselung und Vererbung kann modularer Code erstellt werden, der einfach zu ändern ist, wobei dies keine Auswirkungen auf den Code der gesamten Anwendung hat.
In LabVIEW sind die Daten einer Klasse privat, das heißt, nur Member-VIs der Klasse können auf diese Daten zugreifen. Die Daten einer Klasse werden im Privatdatenelement definiert. Beim Erstellen und Speichern einer LabVIEW-Klasse erstellt LabVIEW eine Klassenbibliotheksdatei (*.lvclass), in der ein neuer Datentyp definiert wird. Die Klassenbibliotheksdatei protokolliert das Privatdatenelement und Informationen zu allen von Ihnen erstellten Member-VIs, z. B. eine Liste der VIs und verschiedene Eigenschaften der VIs. Die Klassenbibliothek ist vergleichbar mit der Projektbibliothek*.lvlib. Allerdings definiert die Klassenbibliothek einen neuen Datentyp.
Das Privatdatenelement ist eine eindeutige Klassenbibliotheksdatei, die einen Daten-Cluster für den neuen Datentyp definiert. Des Weiteren repräsentiert das Element die Daten an der Klassenverbindung. LabVIEW speichert das Privatdatenelement nicht auf dem Datenträger, stattdessen wird es in der Klassenbibliotheksdatei gespeichert. Durch Speichern des Privatdatenelements in der Klassenbibliotheksdatei wird sichergestellt, dass immer die korrekten Privatdaten mit der Klassendefinition verwendet werden.
Kapselung
Jede LabVIEW-Klasse besteht aus einem Cluster mit Daten und Methoden zum Lesen und Schreiben dieses Clusters. Die Daten von LabVIEW-Klassen sind immer privat und ausgeblendet für VIs, die nicht zu der Klasse gehören. Für den Zugriff auf Privatdaten müssen Sie Methoden erstellen und zwar in Form von Member-VIs der Klasse. Mithilfe dieser Methoden lassen sich Funktionen auf die Privatdaten der Klasse anwenden. Die Vereinigung von Daten und Methoden in einer LabVIEW-Klasse. Nur Member-VIs dieser Klasse können auf diese Daten zugreifen. Mit Datenkapselung können Sie modularen Programmcode erstellen, der leicht geändert werden kann, ohne die restliche Anwendung zu beeinflussen.
Daten einer Klasse sind immer privat. Member-VIs dagegen können dem Anwender auf unterschiedliche Weise bereitgestellt werden. Folgende Einstellungen für den Zugriffsbereich einer Methode sind möglich:
- Öffentlich—Jedes beliebige VI kann ein Member-VI als SubVI aufrufen.
- Community – Nur VIs in derselben Klasse, Freundobjekte der Klasse oder VIs in einer Freundbibliothek der Klassen können das Member-VI aufrufen. VIs dieser Kategorie sind im Projekt-Explorer durch einen dunkelblauen Schlüssel gekennzeichnet.
- Geschützt—Nur VIs derselben oder einer untergeordneten Klasse können das Member-VI aufrufen. Geschützte Member-VIs sind im Projekt-Explorer durch einen dunkelgelben Schlüssel gekennzeichnet.
- Privat—Nur VIs derselben Klasse können das Member-VI aufrufen. Private Member-VIs sind im Projekt-Explorer durch einen roten Schlüssel gekennzeichnet.
- Nicht spezifiziert—Diese Option wird nur angezeigt, wenn ein Ordner ausgewählt ist. In diesem Ordner ist der Zugriff auf Komponenten nicht festgelegt. Der Zugriff ist öffentlich. Für Ordner einer Klasse ist standardmäßig kein Zugriff festgelegt. Das heißt, der Ordner ist öffentlich zugänglich. Hinweis Wenn Sie für einen Ordner Zugriffsoptionen festlegen, gilt diese Zugriffsoption für alle Objekte in diesem Ordner und alle Optionen für einzelne Objekte in dem Ordner werden überschrieben.
| Hinweis VIs mit dynamischer Bindung können nicht im Community-Bereich verwendet werden. Um einem Freundobjekt Zugriff auf ein VIs mit dynamischer Bindung in einem geschützten Bereich zu gewähren, erstellen Sie ein statisches Wrapper-VI mit statischer Bindung, das vom Freundobjekt aufgerufen wird, und weisen Sie das Wrapper-VI dem Gruppenbereich zu. |
Festlegen von Freundobjekten für Bibliotheken
Legen Sie ein VI als Freundobjekt einer Bibliothek fest, so dass das VI alle Mitglieder des Gruppenbereichs der Bibliothek aufrufen kann. Auch Bibliotheken können als Freundobjekte festgelegt werden.
Eine Freundschaftsbeziehung ist intransitiv, das heißt, sie kann nur direkt hergestellt werden. Wenn beispielsweise eine Bibliothek eine andere als Freundobjekt festlegt und diese Bibliothek eine dritte als Freundobjekt bestimmt, gelten die erste und die dritte Bibliothek nicht als Freundobjekte. Die dritte Bibliothek kann erst auf VIs der ersten Bibliothek zugreifen, wenn sie direkt als Freundobjekt festgelegt wird. Wenn eine Bibliothek mit Community-Bereichszugriff eine Klasse als Freundobjekt festlegt, können die Member-VIs dieser Klasse auf die VIs der Bibliothek zugreifen. Diese Beziehung wird aber nicht auf Nachfolger der Klasse übertragen.
Sie können ein VI außerhalb der LabVIEW-Klasse erstellen und öffentliche Member-VIs als SubVIs im Blockdiagramm verwenden. Öffentliche Member-VIs ermöglichen die Bearbeitung von Privatdaten einer Klasse. Sie können private und geschützte Member-VIs in Blockdiagrammen von Member-VIs verwenden, um Privatdaten der Klasse zu verändern, die Benutzern der LabVIEW-Klasse nicht angezeigt werden. Ein VI außerhalb der Klasse kann als Freundobjekt festgelegt werden. Es kann dann Gruppenmitglieder der Klasse aufrufen. Eine beschränkte Anzahl an Eintrittspunkten erleichtert die Fehlerbehebung, da weniger Möglichkeiten für die Einführung von Fehlern bestehen.
Folgende Projekte sind Beispiele für Kapselung und die Zugriffsbereiche in LabVIEW-Klassen:
- labview\examples\Object-Oriented Programming\Data Encapsulation\Data Encapsulation with LabVIEW Classes.lvproj
- labview\examples\Object-Oriented Programming\Access Scope\Access Scope with LabVIEW Classes.lvproj
Definieren von Privatdatenelementen
LabVIEW erzeugt automatisch ein Privatdatenelement der Klasse, wenn Sie eine LabVIEW-Klasse erstellen. Im folgenden Projekt-Explorer ist das Symbol für eine LabVIEW-Klasse ein farbiger Würfel. Dieser Würfel stellt die LabVIEW-Klasse dar. Das Symbol für das Privatdatenelement ist ein farbiger Würfel mit einem grünen Zylinder. Der Zylinder stellt die Datenspeicherung dar. Das Symbol des Privatdatenelements enthält auch ein rotes Schlüsselsymbol. Dieses kennzeichnet, dass es sich um ein privates Element handelt.
Mithilfe des Element-Editors können Sie das Privatdatenelement der Klasse benutzerspezifisch anpassen. LabVIEW öffnet den Element-Editor, wenn Sie im Projekt-Explorer doppelt auf das Privatdatenelement klicken. Sie können Bedien- und Anzeigeelemente im Cluster der Klassenprivatdaten ablegen, um den Privatdatentyp einer LabVIEW-Klasse zu definieren. Die für die Elemente im Cluster der Klassenprivatdaten festgelegten Standardwerte gelten auch als Standardwerte für die Klasse.
| Hinweis Ein Privatdatenelement kann kein XControl enthalten. |
Im folgenden Beispiel enthält der Datentyp der Fahrzeugklasse die drei numerischen Werte Anzahl der Gänge, Anzahl der Türen und Farbe sowie die beiden Strings Hersteller und Modell.
| Hinweis Wenn keine Privatdaten erforderlich sind, kann der Cluster der Privatdaten für die Klasse leer bleiben. |
Sie können Symbole erstellen, die Objekte der Klasse im Blockdiagramm oder auf dem Frontpanel repräsentieren. Klicken Sie zum Öffnen des Symbol-Editors auf der Seite Allgemeine Einstellungen des Dialogfelds Klasseneigenschaften auf die Schaltfläche Bearbeiten. Erstellen Sie ein Klassensymbol, das auf alle Objekte in der Klasse angewandt wird. Bearbeiten Sie dann die einzelnen Symbole für die Objekte in der Klasse.
Erstellen von Member-VIs
Erstellen Sie VIs einer Klasse, um Operationen an den Privatdaten der Klasse durchzuführen. Member-VIs sind die Methoden der LabVIEW-Klasse. Member-VIs sind Mitglieder der LabVIEW-Klasse, in welcher sie erstellt wurden. Sie werden im Projekt-Explorer unter dem Privatdatenelement der Klasse angezeigt.
LabVIEW definiert Daten einer Klasse als Cluster. Jedes VI der Klasse kann den Cluster mit Klassendaten lesen und in diesen schreiben. In LabVIEW gibt es die Möglichkeit, ein VI zu erstellen, um auf einzelne Elemente des Clusters zuzugreifen. Diese Zugriffs-VIs gehören zu der LabVIEW-Klasse und mit Hilfe dieser VIs können die Klassendaten gelesen und geschrieben werden. Beim Erstellen eines Zugriffs-VIs, das Daten einer Klasse abfragt, werden die Klassendaten automatisch aufgeschlüsselt (siehe folgende Abbildung).
Beim Erstellen eines Zugriffs-VIs, das Daten einer Klasse ausgibt, werden die Klassendaten automatisch gebündelt (siehe folgende Abbildung).
Sie können die Privatdaten der Klasse im Blockdiagramm eines VIs der Klasse auch mit Hilfe der Funktionen Aufschlüsseln und Nach Namen aufschlüsseln aufschlüsseln. Mit den Funktionen Bündeln und Nach Namen bündeln kann der Cluster aus Privatdaten nach Zugriff und Bearbeitung erneut gebündelt werden. Da die Daten einer Klasse privat sind, werden die Knoten "Bündeln" und "Aufschlüsseln" als fehlerhaft markiert, wenn Sie diese mit Klassendaten im Blockdiagramm eines Nicht-Member-VIs verwenden.
| Hinweis Statt der Funktionen "Bündeln" und "Aufschlüsseln" sollten Sie sooft wie möglich die Funktionen "Nach Namen bündeln" und "Nach Namen aufschlüsseln" verwenden, um Fehler im VI durch das Einfügen eines neuen Elements in den Privatdaten-Cluster zu verhindern. |
Wenn Daten an ein Member-VI übertragen werden, das einen Wert aufschlüsselt, verändert und wieder in das Objekt bündelt, lässt sich die Ausführungsgeschwindigkeit ggf. mit Hilfe einer Inplace-Elementstruktur erhöhen, an deren Rändern jeweils ein Knoten des Typs "Bündeln" und "Aufschlüsseln" eingefügt ist. Bei Nutzung einer solchen Struktur werden bestimmte Optimierungsmaßnahmen im Speicher durchgeführt. Die gleichen Optimierungsmaßnahmen werden auch bei den Knoten "Aufschlüsseln" und "Bündeln" angewandt – allerdings kann es unter bestimmten Bedingungen und bei komplexen VIs vorkommen, dass der LabVIEW-Compiler die Optimierung als unsicher erachtet und daher darauf verzichtet. Dadurch verlangsamt sich die Ausführung dieser Knoten. Mit der Struktur wird die Sicherheit dieses Verfahrens und damit die ausnahmslose Optimierung Ihrer VIs gewährleistet.
VIs einer Klasse lassen sich auf verschiedene Arten erstellen. Klicken Sie mit der rechten Maustaste auf die Klasse und wählen Sie einen der folgenden Kontextmenüpunkte:
- Neu»VI—Öffnet ein leeres Member-VI.
- Neu»Eigenschaftsdefinitionsordner—Erstellt einen Eigenschaftsdefinitionsordner, in dem neue Member-VIs erstellt oder dem vorhandene Member-VIs hinzugefügt werden können. Enthält eine LabVIEW-Klasse einen Eigenschaftsdefinitionsordner, können Sie die LabVIEW-Klasse für den Zugriff auf Privatdaten mit einem Eigenschaftsknoten verbinden.
- Neu»VI von Vorlage für dynamische Bindung—LabVIEW fügt dem neuen Member-VI die Cluster Fehler (Eingang) und Fehler (Ausgang), eine Case-Struktur für die Fehlerbehandlung, die Eingangsklasse und die Ausgangsklasse hinzu. Sowohl die Eingangs- als auch die Ausgangsanschlüsse werden im Anschlussfeld des VIs als dynamisch festgelegt.
- Neu»VI von Vorlage für dynamische Bindung—LabVIEW fügt dem neuen Member-VI die Cluster Fehler (Eingang) und Fehler (Ausgang), eine Case-Struktur für die Fehlerbehandlung, die Eingangsklasse und die Ausgangsklasse hinzu. Im Gegensatz zu VIs mit dynamischer Bindung werden die Ein- und Ausgangsanschlüsse am Anschlussfeld von VIs mit statischer Bindung nicht auf dynamisch gesetzt.
- Neu»VI zum Zugriff auf Daten—Öffnet das Dialogfeld Zugriffs-VI erstellen. Mit Hilfe dieses Dialogfelds können Sie schnell VIs der Klasse mit Zugriff auf die LabVIEW-Klassendaten erstellen.

Hinweis Vor Nutzung dieser Option muss die LabVIEW-Klasse gespeichert werden. LabVIEW graut die Option VI zum Zugriff auf Daten aus, wenn die neue Klasse nicht gespeichert wurde. - Neu»VI zum Überschreiben—Erstellt ein VI einer Klasse, das ein Vorgänger-Member-VIs überschreibt. Zum Erstellen eines Symbols für das neue VI verwendet LabVIEW das Symbol des übergeordneten VIs und legt das Symbol der untergeordneten Klasse transparent darüber.

Hinweis Die Option Neu»VI zum Überschreiben ist deaktiviert, wenn kein gültiges überschreibbares Member-VI vorliegt. Weitere Informationen zu dynamischen VIs und Überschreibvorgängen finden Sie im Abschnitt Vererbung.
Klicken Sie eine Klassenkonstante, ein Bedienelement oder eine Anzeige auf dem Frontpanel oder im Blockdiagramm mit der rechten Maustaste an und wählen Sie Klassenbibliothek anzeigen aus dem Kontextmenü, um die Klasse im Projekt-Explorer hervorzuheben. Befindet sich die Klasse, mit der Sie arbeiten, nicht in einem LabVIEW-Projekt, wird ein Klassenfenster zur Anzeige der Klasse geöffnet.
Vererbung
Mithilfe der Vererbung können Sie eine neue Klasse basierend auf einer bereits bestehenden Klasse erstellen. Wenn Sie eine neue LabVIEW-Klasse erstellen und für diese die Vererbung von Daten und Member-VIs von einer anderen Klasse wählen, kann die neue Klasse öffentliche und geschützte Member-VIs der vererbenden Klasse verwenden. Für eine Steigerung der Funktionalität können auch eigene Daten hinzugefügt werden. Die Privatdaten der Klasse "Fahrzeug" enthalten Anzahl der Gänge, Anzahl der Türen, Farbe, Hersteller und Modell. Sie können eine neue Klasse namens "Lastkraftwagen" erstellen. Diese Klasse kann dann beispielsweise alle Daten der Fahrzeugklasse erben und zusätzlich die booleschen Daten Kurze Ladefläche? und Allradantrieb? erhalten. Wie jedoch aus der folgenden Abbildung ersichtlich ist, zeigen die Knoten beim Bündeln und Aufschlüsseln einer LabVIEW-Klasse nur die Anschlüsse für Privatdaten der aktuellen Klasse und nicht die Daten der Vorgängerklassen an.
Vorgängerdaten sind privat und werden mithilfe von Funktionen bearbeitet, die von der Vorgängerklasse über Member-VIs bereitgestellt werden. Member-VIs von Nachfolgerklassen können wie jedes VI in LabVIEW beliebige öffentliche Member-VIs aufrufen. Member-VIs von Nachfolgerklassen können aber auch geschützte Member-VIs einer Vorgängerklasse aufrufen. Wenn Sie ein Vorgänger-Member-VI als geschützt festlegen, können Member-VIs einer beliebigen Kindklasse die Methode aufrufen. Dies ist nicht der Fall für VIs außerhalb der Vererbungshierarchie. Wenn Sie auf Anzahl der Gänge der Fahrzeugklasse in der Lastkraftwagenklasse zugreifen möchten, können Sie ein öffentliches oder geschütztes VI namens "Gänge ermitteln.vi" in der Fahrzeugklasse erstellen. Dann können Sie die Fahrzeugklasse im Blockdiagramm von "Gänge ermitteln.vi" aufschlüsseln und so die Anzahl der Gänge anzeigen. Anzahl der Gänge kann anschließend einem Ausgangsanschluss im Anschlussfeld zugeordnet werden, so dass von einer Nachfolgerklasse (wie zum Beispiel der Klasse "Lastkraftwagen") aus der Zugriff auf Privatdaten der Fahrzeugklasse möglich ist.
Sie können auch auf Anzahl der Gänge zugreifen, indem Sie ein Member-VI für den Zugriff auf Daten in der Klasse "Fahrzeug" erstellen. Aktivieren Sie beim Erstellen des Member-VIs im Dialogfeld Zugriffs-VI erstellen die Option Über Eigenschaftsknoten verfügbar machen. Sie können dann die Klasse "Truck" mit einem Eigenschaftsknoten verbinden, den Eigenschaftsanschluss mit der rechten Maustaste anklicken und Eigenschaft auswählen»Anzahl der Gänge auswählen.
| Hinweis LabVIEW-Klassen können keine privaten Member-VIs einer anderen LabVIEW-Klasse, einschließlich übergeordneter Klassen, aufrufen. Private Member-VIs können nur in Blockdiagrammen anderer Member-VIs derselben Klasse verwendet werden. |
| Hinweis (FPGA-Modul) Beim Erstellen von FPGA-VIs können Sie Vererbung mit bestimmten Einschränkungen verwenden. |
LabVIEW-Objekt
Der Ausdruck LabVIEW-Objekt bezeichnet eine bestimmte Klasse. Anzeige- und Bedienelemente der Palette "Variant und Klasse"Ein LabVIEW-Objekt ist die Basisklasse in der Vererbungsstruktur bei der objektorientierten Programmierung in LabVIEW. Standardmäßig erben alle LabVIEW-Klassen vom LabVIEW-Objekt. Mithilfe des LabVIEW-Objekts können Sie VIs erstellen, die allgemeine Operationen an mehreren LabVIEW-Klassen durchführen können. Wenn Sie beispielsweise ein Array aus LabVIEW-Klassen erstellen, so sind die Daten des Arrays verschiedenartig, da es Elemente des Klassentyps des Arrays oder einer beliebigen Nachfolgerklasse enthalten kann. Wenn ein Array den Typ LabVIEW-Objekt aufweist, kann es die Klassen "Fahrzeug", "Lastkraftwagen" und "Bowlingkugel" enthalten. Die Bowlingkugelklasse ist nicht von "Fahrzeug" oder "Lastkraftwagen" abgeleitet. Daher erstellt LabVIEW ein Array einer gemeinsamen Vorgängerklasse, in diesem Fall dem LabVIEW-Objekt.
Die folgende Abbildung zeigt Fahrzeug-Array. Dabei handelt es sich um ein Array, das die Klassen"Fahrzeug" und "Lastkraftwagen" enthält. Da "Lastkraftwagen" von "Fahrzeug" erbt, ist die gemeinsame Basisklasse dieses Arrays die Fahrzeugklasse. Die Abbildung zeigt auch ein LabVIEW-Objekt-Array. Dieses Array enthält die Klassen "LabVIEW-Objekt", "Lastkraftwagen", "Fahrzeug" und "Bowlingkugel". Bowlingkugel erbt weder von "Fahrzeug" noch von "Lastkraftwagen", aber alle drei Klassen erben von "LabVIEW-Objekt". Daher ist LabVIEW-Objekt-Array vom Typ LabVIEW-Objekt.
Vererbung festlegen
Standardmäßig erben alle LabVIEW-Klassen von LabVIEW-Objekt. Wenn Sie ändern möchten, von welcher Klasse eine andere Klasse erbt, müssen Sie nach Erstellung der betroffenen Klassen die Vererbung ändern. Konfigurieren Sie die Vererbung und andere Optionen der Klasse mithilfe des Dialogfelds Klasseneigenschaften. Im Fenster LabVIEW-Klassenhierarchie können Sie die Hierarchie der LabVIEW-Klassen anzeigen. Die Vererbungshierarchie der Klasse kann folgende Klassentypen enthalten:
- Übergeordnete Klasse—LabVIEW-Klasse, von der andere LabVIEW-Klassen Daten sowie öffentliche und geschützte VIs abgeleitet werden.
- Untergeordnete Klasse—LabVIEW-Klasse, die die öffentlichen und geschützten VIs der übergeordneten Klasse erbt. Die untergeordnete Klasse erbt nur Privatdaten, wenn die übergeordnete Klasse ein entsprechendes Zugriffs-VI bereitstellt.
- Geschwisterklasse—LabVIEW-Klasse, die dieselbe übergeordnete Klasse wie eine andere LabVIEW-Klasse hat.
- Vorgängerklasse—LabVIEW-Klasse, die Eltern-, Großeltern-, Urgroßelternklasse usw. einer LabVIEW-Klasse darstellt. LabVIEW-Objekt ist die Basisklasse (oberste Vorgängerklasse) aller LabVIEW-Klassen.
- Nachfolgerklasse—LabVIEW-Klasse, die Kind-, Enkel-, Urenkelklasse usw. einer LabVIEW-Klasse darstellt.
| Hinweis Wenn ein VI ein Eigenschaftszugriffs-VI einer übergeordneten Klasse überschreibt, müssen die Ordner in den Eigenschaftsdefinitionsordnern den gleichen Namen und den gleichen Pfad für beide Klassen (über- und untergeordnete Klasse) haben. |
Verbindungsdesign
Klassen definieren neue Datentypen. Die Verbindungen dieser Klassentypen werden im Blockdiagramm als Standardverbindungen einer LabVIEW-Klasse angezeigt oder sie übernehmen die Darstellung der übergeordneten Klasse. Über das Dialogfeld Klasseneigenschaften können Sie die Darstellung von Verbindungen einer LabVIEW-Klasse ändern. Ändern Sie die Darstellung der Verbindungen verschiedener LabVIEW-Klassen, um die Lesbarkeit eines Blockdiagramms zu verbessern. Zu viele Farben und Muster für Verbindungen können das Lesen eines Blockdiagramms erschweren. Die folgende Abbildung zeigt rechts die Standarddarstellung von Verbindungen und links einige Möglichkeiten der benutzerdefinierten Darstellung von Verbindungen.
Weitere Informationen zu Verbindungen finden Sie in der LabVIEW Style Checklist.
VIs mit dynamischer und mit statischer Bindung
Eine Methode ist ein Arbeitsschritt, der von einem Objekt oder an einem Objekt durchgeführt wird. Bei der objektorientierten Programmierung in LabVIEW sind Methoden von Ihnen erstellte VIs einer Klasse. Die VIs führen einen Arbeitsschritt an den Daten der LabVIEW-Klasse aus. Manche Methoden können mit Hilfe eines einzigen VIs definiert werden. Diese werden als Methoden mit statischer Bindung bezeichnet, da LabVIEW jedes Mal dasselbe VI aufruft. Sie können Methoden auch mit Hilfe mehrerer VIs, die denselben Namen innerhalb der gesamten Hierarchie aufweisen, definieren. Diese werden Methoden mit dynamischer Bindung genannt, da erst bei Programmausführung bekannt wird, welches VI LabVIEW tatsächlich aufruft. Die dynamische Bindung von Methoden ähnelt der Funktionsweise polymorpher VIs. Polymorphe VIs rufen VIs basierend auf dem empfangenen Datentyp auf. Methoden mit dynamischer Bindung rufen VIs in der Klassenhierarchie erst während der Ausführung auf, da sich das aufzurufende VI nach den Daten richtet, die am Eingangsanschluss anliegen.
Ob das VI statisch oder dynamisch ist, wird im Anschlussfeld des VIs festgelegt. Wenn das Anschlussfeld einen Anschluss für dynamische Bindung enthält, stellt das VI eine Variante bzw. Ausführung einer Methode dar. Wenn kein solcher Eingang vorliegt, arbeitet das VI mit statischer Bindung – d. h. es ruft immer dieselbe Methode auf.
Wenn eine LabVIEW-Klasse von einer anderen abgeleitet wird, überträgt die übergeordnete Klasse alle ihre öffentlichen und geschützten Methoden auf die untergeordnete Klasse. Eine abgeleitete Methode wird dadurch definiert, dass ein VI in der untergeordneten Klasse genauso bezeichnet wird wie ein VI der übergeordneten Klasse.
Da Methoden mit statischer Bindung nur durch ein VI definiert sind, sollten Sie für ein VI der untergeordneten Klasse nicht den gleichen Namen wie in der übergeordneten Klasse wählen. Wenn beispielsweise die übergeordnete Klasse "Fahrzeug" ein mit statischer Bindung arbeitendes VI namens "Tür öffnen" enthält, dann darf die untergeordnete Klasse "Lastkraftwagen" kein gleichnamiges VI enthalten. Die Methode "Tür öffnen" ist bereits für die Klasse "Lastkraftwagen" definiert, weil diese Klasse das VI von "Fahrzeug" erbt. Wenn Sie mit statischer Bindung arbeitende VIs einer Klasse als SubVI in das Blockdiagramm einfügen, funktionieren diese wie reguläre SubVIs.
Sie können mehrere mit dynamischer Bindung arbeitende VIs für eine Methode definieren, z. B. ein VI pro Ebene der Vererbungshierarchie. Wenn ein mit dynamischer Bindung arbeitendes VI in der über- und untergeordneten Klasse definiert wird, überschreibt die untergeordnete die übergeordnete Implementierung. Im folgenden Beispiel definieren die beiden Klassen "Fahrzeug" und "Lastkraftwagen" eine Implementierung des mit dynamischer Bindung arbeitenden Methoden-VIs "Hersteller festlegen.vi". Wenn Sie mit dynamischer Bindung arbeitendes VI als SubVI in das Blockdiagramm einfügen, funktioniert dieses wie ein regulärer SubVI-Aufruf im Bearbeitungsmodus von LabVIEW. Nach dem Starten des VIs bestimmen die Daten am Eingang für dynamische Bindung, welche Implementierung des VIs in der Klassenhierarchie aufgerufen wird. Da eine LabVIEW-Klassenverbindung ihren eigenen Datentyp oder den Datentyp einer beliebigen untergeordneten Klasse übermitteln kann, führt der Knoten die für die Klassendaten definierte Implementierung des VIs aus. Sehen Sie sich das folgende Beispiel noch einmal an. Nur die Implementierung der Klasse "Fahrzeug" des VIs "Hersteller festlegen" befindet sich im Blockdiagramm des Haupt-VIs. Während des ersten Schleifendurchlaufs wird die Implementierung des VIs "Hersteller festlegen" der Klasse "Fahrzeug" ausgeführt, da die Daten für die Klasse "Fahrzeug" über die Klassenverbindung übertragen werden. Während des zweiten Schleifendurchlaufs wird die Implementierung des VIs "Hersteller festlegen" der Klasse "Lastkraftwagen" ausgeführt, da die Daten für die Klasse "Lastkraftwagen" über die Klassenverbindung übertragen werden.
Wenn die übergeordnete Klasse ein VI mit dynamischer Bindung definiert, aber keine Implementierung dieses VIs bereitstellt, muss jedes Unterobjekt das übergeordnete VI überschreiben. Häufig lässt sich in der übergeordneten Klasse kein gemeinsamer Nenner in puncto Funktionsumfang bereitstellen. Nehmen Sie beispielsweise eine Klasse namens "Form", die das VI "Fläche" definiert. Das VI "Fläche" gibt die Fläche des durch "Form" angegebenen geometrischen Objekts aus. Es gibt jedoch keine einheitliche Formel zum Berechnen der Fläche unterschiedlicher geometrischer Formen – nicht einmal eine Formel, die für die Mehrzahl der Formen geeignet wäre. Daher muss jede Nachfolgerklasse das VI "Fläche" mit der Formel für die jeweilige geometrische Form überschreiben. Wenn Sie also eine Unterklasse "Kreis" erstellen, muss diese ein VI "Fläche" mit der Formel Pi* Radius * Radius enthalten.
Wenn Sie keine Implementierung des VIs der übergeordneten Klasse definieren, stellt das übergeordnete VI lediglich eine Definition des Anschlussfelds und der VI-Eigenschaften dar, denen alle Überschreib-VIs entsprechen müssen. Jede untergeordnete Klasse muss ein solches Überschreib-VI enthalten. Um sicherzustellen, dass diese Bedingung erfüllt wird, können Sie das VI markieren, das in der übergeordneten Klasse von jeder untergeordneten Klasse überschrieben werden muss.
Manche untergeordneten Klassen sind ggf. nicht in der Lage, Funktionen des VIs zu überschreiben. Wenn beispielsweise die Klasse "Viereck" ein Unterobjekt der Klasse "Form" ist und die Art des Vierecks unbekannt ist, können Sie keine Formel zur Berechnung der Fläche des Vierecks angeben. Um die Erstellung einer leeren Implementierung des VIs "Fläche" in der Klasse "Viereck" zu vermeiden, können Sie die Klasse anweisen, die Notwendigkeit des Überschreibens an ihre eigenen Unterobjektklassen zu übertragen. Klicken Sie hierfür die untergeordnete Klasse mit der rechten Maustaste an und wählen Sie aus dem Kontextmenü die Option Eigenschaften aus, um zum Dialogfeld Eigenschaften für Klasse zu gelangen. Aktivieren Sie dann auf der Seite Vererbung die Option Alle Anforderungen für "Muss überschreiben?" an Nachfolger übertragen. Dadurch wird erforderlich gemacht, dass untergeordnete Klassen der Klasse "Viereck" wie "Trapez" oder "Rechteck" das VI "Fläche" überschreiben.
Die Anforderung, dass Nachfolgerklassen Member-VIs der übergeordneten Klasse überschreiben, wirkt sich nicht auf die Ausführung der Member-VIs aus.
| Hinweis LLBs dürfen keine Dateien mit dem gleichen Namen enthalten. Wenn es also innerhalb der Klassenhierarchie dynamische Member-VIs mit dem gleichen Namen gibt, können diese Klassen nicht in dieselbe LLB eingefügt werden. |
| Hinweis Wenn das VI einer untergeordneten Klasse das VI seiner übergeordneten Klasse überschreibt, muss das VI der untergeordneten in folgenden Aspekten mit dem VI der übergeordneten Klasse übereinstimmen: Ablaufinvarianz-Einstellungen, Einstellungen zur bevorzugten Ausführung, Prioritätseinstellungen, Anschlussfeldanschluss, Anschlussfeldmuster und Zugriffsbereich. |
Klicken Sie im Blockdiagramm doppelt auf ein mit dynamischer Bindung arbeitendes SubVI, um zum Dialogfeld Implementierung auswählen zu gelangen. Hier können Sie alle Implementierungen des SubVIs im Speicher ansehen und Implementierungen öffnen.
Beim Überschreiben einer Vorgängerimplementierung mit Hilfe der Option Neu»VI für Überschreiben wird ein neues Member-VI mit dynamischer Bindung erstellt. Die zum Überschreiben vorgesehenen VIs haben den gleichen Namen wie ihr Gegenstück in der übergeordneten Klasse (ihr Vorgänger-VI) und enthalten Anschlüsse für dynamische Bindung. LabVIEW fügt den Knoten Methode der übergeordneten Klasse aufrufen zusammen mit den entsprechenden dynamischen Eingangs- und Ausgangsanschlüssen für Klassen sowie anderen Anschlüssen in das Blockdiagramm ein, so dass das VI dem Vorgänger-VI entspricht. LabVIEW deaktiviert die Option VI für Überschreiben, wenn kein überschreibbares Vorgänger-VI existiert.
| Hinweis (FPGA-Modul) Die Arbeit mit VIs mit dynamischer Bindung innerhalb von FPGA-VIs ist mit Einschränkungen möglich. |
Ausgänge für dynamische Bindung
Markieren Sie einen LabVIEW-Klassen-Ausgangsanschluss als dynamisch, indem Sie mit der rechten Maustaste auf den Ausgangsanschluss im Anschlussfeld klicken und Ausgang mit dynamischer Bindung (empfohlen) wählen. Wenn Sie ein VI mit einem für dynamische Bindung vorgesehenen Ausgang als SubVI aufrufen, nimmt der dynamische Ausgang den Datentyp an, der am entsprechenden Eingang anliegt. Wenn Sie beispielsweise die Klasse "Fahrzeug" mit einem Eingang für dynamische Bindung verbinden, wird am Ausgang ebenfalls die Klasse "Fahrzeug" ausgegeben. Die Daten können jedoch zwischen dem dynamischen Eingang und dem dynamischen Ausgang bearbeitet werden. Um jedoch Beibehaltung des Datentyps von LabVIEW-Klassen während der Ausführung zu gewährleisten, müssen Daten vom dynamischen Eingang an alle dynamischen Ausgänge weitergeleitet werden. Beachten Sie auch, dass keine dynamischen Blockdiagrammanschlüsse in eine Struktur eingefügt werden dürfen. Nur so wird gewährleistet, dass LabVIEW einen mit dynamischer Bindung arbeitenden Eingang nur einmal ausliest und nur einmal in einen mit dynamischer Bindung arbeitenden Ausgang schreibt.
| Hinweis Bei der Fehlersuche an einem mit dynamischer Bindung arbeitenden VI, das Ein- und Ausgänge für dynamische Bindung enthält, können Sie die Verbindung zwischen dem dynamischen Eingang und dem dynamischen Ausgang auf Fehler prüfen. Die Hintergrundfarbe der Verbindung ist Grau und nicht Weiß wie bei allen anderen Verbindungen, die von einem dynamischen Eingang stammen und nicht durch Funktionen verlaufen, die den Laufzeitdatentyp ändern können. Die Hintergrundfarbe wechselt zu Rot, wenn die Verbindung durch eine Funktion führt, die den Datentyp ändern kann. Damit dynamische Ausgänge ordnungsgemäß arbeiten, muss der Datentyp der LabVIEW-Klasse beibehalten werden. |
Wenn ein Vorgang im Blockdiagramm den LabVIEW-Klassen-Ausgangsdatentyp zwischen Eingang und Ausgang verändert, muss der dynamische Ausgang der LabVIEW-Klasse im Anschlussfeld auf Empfohlen statt auf Ausgang mit dynamischer Bindung (empfohlen) eingestellt sein. Wenn die am Eingang anliegende LabVIEW-Klasse beispielsweise "Fahrzeug" ist und die ausgegebene Klasse "Lastkraftwagen" lauten soll, müssen Sie den Standardanschluss der LabVIEW-Klasse im Anschlussfeld ändern. Statt dessen können Sie auch mit Hilfe eines leeren VIs ein Member-VI erstellen und die Anschlussfeldanschlüsse manuell einstellen.
| Hinweis Wenn Sie eine Case-Struktur oder Ereignisstruktur in einem Member-VI verwenden, das mit dynamischer Bindung arbeitet, können Sie Standard verwenden, wenn nicht verbunden nicht an den Ausgangstunneln auswählen. Wenn Sie Standard verwenden, wenn nicht verbunden für den Ausgangstunnel festlegen, wird das VI als fehlerhaft angezeigt. Sie müssen alle Cases in der Struktur verbinden. Sie sollten die Tunnel so konfigurieren, dass die Eingangs- und Ausgangstunnel automatisch verbunden werden. |
Optimieren von Speicherkopien für die dynamische Bindung
Wie bereits erwähnt, erbt jede untergeordnete Klasse beim Erstellen von Methoden mit dynamischer Bindung alle öffentlichen und geschützten Methoden, die für die übergeordnete Klasse festgelegt wurden. Die untergeordnete Klasse kann diese VIs mit eigenen Versionen überschreiben oder erweitern. Wenn ein VI eine Methode mit dynamischer Bindung aufruft, kann LabVIEW die auszuführende Version der Methode erst bei der Programmausführung ermitteln. LabVIEW optimiert daher die Speicherbelegung des aufrufenden VIs unter der Annahme, dass jedes VI einer untergeordneten Klasse genau wie sein Gegenstück in der übergeordneten Klasse konfiguriert sind. Sind also die Eingangswerte im VI der übergeordneten Klasse Konstanten, werden die Eingangswerte der VIs der untergeordneten Klasse auch als Konstanten angenommen. Wenn bei den VIs der übergeordneten Klasse die Werte bestimmter Eingänge direkt wieder ausgegeben werden, wird bei den VIs der untergeordneten Klasse das Gleiche erwartet.
Sobald sich eine dieser Vermutungen als falsch erweist, geht der Optimierungseffekt verloren. Wenn Sie z. B. ein VI einer Klasse erstellen, bei dem Eingangswerte unveränderlich sind, geht das aufrufende VI davon aus, dass auch beim nachfolgenden Überschreiben des VIs keiner der Eingangswerte modifiziert wird, selbst wenn beim Überschreiben später Eingangswerte verändert werden. Es kann auch passieren, dass im VI der übergeordneten Klasse keiner der Eingangswerte direkt an den Ausgang durchgeleitet wird. Dann geht das aufrufende VI davon aus, dass es keine gemeinsamen Speicherdaten von Ein- und Ausgängen gibt, selbst wenn Eingänge von nachfolgenden VIs direkt mit den Ausgängen verbunden sind. LabVIEW müsste zur Verarbeitung von Ausnahmen in den untergeordneten Klassen Programmcode erzeugen, was die Effizienz der Optimierung verringern würde.
Damit die Optimierung ordnungsgemäß funktioniert, sollten die Eigenschaften des VIs der übergeordneten Klasse möglichst mit den erwarteten Eigenschaften des VIs der untergeordneten Klasse übereinstimmen. Eine Möglichkeit zum Erstellen einer Methode mit dynamischer Bindung, die die Arbeitsweise jedes Anschlusses genau vorgibt, ist die Verwendung einer Inplace-Elementstruktur. Fügen Sie die Inplace-Elementstruktur in das mit dynamischer Bindung arbeitende VI innerhalb der übergeordneten Klasse ein und fügen Sie der Struktur Inplace-Elementknotenpaare hinzu. Über diese Knotenpaare können Sie angeben, welche Eingänge mit welchen Ausgängen verbunden werden sollen, welche Eingänge wie Konstanten zu behandeln sind oder welche Eingänge verändert werden. Daraufhin kann LabVIEW das aufrufende VI entsprechend optimieren.
Folgende Projekte sind Beispiele für die Arbeit mit Anschlüssen für dynamische Bindung.
- labview\examples\Object-Oriented Programming\Dynamic Dispatching\Dynamic Dispatching.lvproj
- labview\examples\Object-Oriented Programming\Dynamic Terminals\Dynamic Terminals.lvproj