Grundsätzlich ähnelt die objektorientierte Programmierung in LabVIEW anderen objektorientierten Programmiersprachen, da LabVIEW eine Umgebung zur grafischen Programmierung ist. Allerdings existieren gewisse Unterschiede hinsichtlich der Handhabung der LabVIEW-Klassendaten und der Behebung von Fehlern im Programmcode von Klassen.

Objekte in LabVIEW werden basierend auf einem Wert und nicht basierend auf einer Referenz weitergeleitet. LabVIEW erstellt Kopien des Objekts gemäß den Regeln, die für Cluster und Arrays gelten.

Konstruktoren und Destruktoren

Konstruktoren und Destruktoren sind implizit in der objektorientierten Programmierung in LabVIEW. Es ist nicht notwendig, einen Konstruktor für die Initialisierung von LabVIEW-Klassendaten aufzurufen. LabVIEW ruft immer dann einen Standardkonstruktor auf, wenn eine Klasse initialisiert werden muss. Die Initialisierung einer Klasse findet normalerweise an einem Frontpanel-Element oder einer Blockdiagrammkonstante statt. Die Werte der Klasse werden als Standardwerte initialisiert, die im Privatdatenelement festgelegt sind. Wenn es für die Klasseninformationen keine Verwendung mehr gibt, findet eine Speicherfreigabe wie für Cluster und Arrays statt. Wenn Sie für die Klassendaten einen anderen Wert festlegen möchten, müssen Sie ein Member-VI erstellen, das den neuen Wert bestimmt. Wenn der Standardwert für Anzahl der Gänge in der Fahrzeugklasse beispielsweise drei lautet und Sie in der Klasse "Lastkraftwagen" Anzahl der Gänge einen anderen Wert zuweisen möchten, müssen Sie ein Member-VI erstellen, das den Wert in der Fahrzeugklasse ändert. Eine Option für das Festlegen eines neuen Werts ist die Erstellung eines Member-VIs, das keine Eingänge aufweist, aber eine Klasse mit dem gewünschten Wert für Anzahl der Gänge ausgibt und gleichzeitig eine Blockdiagramm-Konstante des Klassendatentyps erstellt.

Serialisieren und Deserialisieren von Daten

LabVIEW speichert Daten als serialisierte Daten. Die Funktionen Daten serialisieren und String deserialisieren können für alle Klassendatentypen verwendet werden. LabVIEW serialisiert und deserialisiert Daten automatisch. Alle Typdeskriptoren speichern den Typ der Daten für serialisierte Datentypen in LabVIEW. Zusätzlich dazu werden bei den serialisierten Daten der LabVIEW-Klasse auch Informationen zur Klassenversion gespeichert. Da die LabVIEW-Klasse Informationen in Zusammenhang mit der Deserialisierung speichert, können Daten nicht deserialisiert werden, wenn die Klasse aufgrund von Verschieben oder Löschen nicht gefunden wird. Es wird eine Fehlermeldung angezeigt. Ähnlich wie bei einem fehlenden SubVI können Sie das Member-VI öffnen und werden dann bemerken, dass das Element mit den fehlenden LabVIEW-Klassendaten ausgegraut ist. Wenn Sie die fehlende Klasse laden, werden die Daten deserialisiert und das Element wird nicht mehr als fehlerhaft angezeigt.

Hinweis Daten von Klassen können auch mit den Funktionen In XML konvertieren und Aus XML zurückkonvertieren bearbeitet werden.

Ändern von Daten

Ein LabVIEW-Klassenelement sendet eine Warnung, wenn Daten im Element mit einer neueren Version der LabVIEW-Klasse als die Version im Speicher geschrieben werden. Die Version der LabVIEW-Klasse wird immer dann geändert, wenn Änderungen am Datentyp des Privatdatenelements oder an der Vererbung der Klasse vorgenommen werden. Sie können die Version der LabVIEW-Klasse mit Hilfe des Dialogfelds Klasseneigenschaften anzeigen. Die Versionsnummer der Klasse wird automatisch erhöht, wenn:

  • sich die Vererbung der LabVIEW-Klasse ändert.
  • sich das Privatdatenelement der LabVIEW-Klasse ändert. Änderungen können Hinzufügen, Ersetzen, Neuanordnen und Löschen von Elementen, Ändern der Darstellung eines Elements oder Aktualisierungen aufgrund geänderter Typdefinitionen sein.
  • die Klasse in einer neuen LabVIEW-Version geladen wird.
  • Sie die Versionsnummer manuell im Dialogfeld Klasseneigenschaften ändern. Dies kann der Fall sein, wenn eine neue Revision der Klasse gekennzeichnet werden soll.

Wenn Sie eine Klasse umbenennen, wird die Änderungshistorie der Klasse gelöscht. Die Klasse gilt dann als neu und die Versionsnummer wird auf 1.0.0.0 zurückgesetzt. Die Klasse wird umbenannt, wenn:

  • der Klasse durch Wahl der Option Datei»Speichern unter ein neuer Name gegeben wird.
  • die Klasse in eine übergeordnete Bibliothek verschoben wird.
  • die Klasse aus einer übergeordneten Bibliothek entfernt wird.
  • die Datei *.lvclass auf dem Datenträger umbenannt wird.
Hinweis Wenn Sie der Klasse ihren ursprünglichen Namen zurückgeben und keine Änderungen vorgenommen wurden, unterscheidet sich die Klasse nach wie vor von der Ausgangsklasse, da die Änderungshistorie nicht mehr existiert. Wenn Sie beispielsweise die Klasse "Fahrzeug" in "Fahrzeug #1" umbenennen und den Namen dann wieder in "Fahrzeug" ändern, ist die Fahrzeugklasse nicht mehr identisch mit der ursprünglichen Klasse.

Das Verfolgen der Versionsnummer einer LabVIEW-Klasse ist hilfreich für Benutzer, die Anwendungen mit Klassen entwickeln. Ein Beispiel ist eine LabVIEW-Klasse in einer Anwendung, die einen vorzeichenlosen 32-Bit-Integer im Privatdatenelement der Klasse verwendet. Der Entwickler der LabVIEW-Klasse kann eine Version der Klasse senden, die das numerische Element im Privatdatenelement in eine Fließkommazahl doppelter Genauigkeit ändert. Da LabVIEW Versionsänderungen verfolgt und Daten aller Klassen serialisieren und deserialisieren kann, können Sie die alte Version der LabVIEW-Klasse durch die aktuelle ersetzen und das Programm ausführen, ohne Veränderungen vornehmen zu müssen.

Hinweis Wenn Sie versuchen, Daten von einer zukünftigen Version einer LabVIEW-Klasse zu deserialisieren, wird ein Fehler ausgegeben. Dies wäre beispielsweise der Fall, wenn Sie Daten mit der Versionsnummer 1.0.0.3 laden möchten, die Version der LabVIEW-Klasse im Speicher aber 1.0.0.2 lautet.

Wenn eine ältere Version einer Klasse vorliegt, werden die Daten wie folgt geändert:

  • Wenn Sie Klassen von einer LabVIEW-Klassenhierarchie entfernen, werden die serialisierten Daten dieser Klassen gelöscht. Zum Beispiel erbt Klasse C von Klasse B, die wiederum von Klasse A erbt. Wenn Sie die Vererbung von Klasse C ändern, so dass sie direkt von Klasse A erbt, werden die serialisierten Daten der Klasse B in diesem Objekt gelöscht.
  • Wenn Sie der LabVIEW-Klassenhierarchie Ebenen hinzufügen, werden die Klassenstandarddaten der neuen Klasse eingefügt. Zum Beispiel erbt Klasse C von Klasse A. Wenn Sie die Vererbung von Klasse C ändern, so dass sie von Klasse B erbt, die wiederum von Klasse A erbt, werden die Klassenstandarddaten der Klasse B eingefügt.
  • Wenn Sie dem Privatdaten-Cluster der Klasse am Ende der Tabulatorreihenfolge ein Element hinzufügen, werden die alten Daten deserialisiert und die Klassenstandarddaten angehängt.
  • Wenn Sie ein Element aus dem Privatdaten-Cluster der Klasse entfernen und keine neuen Elemente hinzufügen, werden die alten Daten deserialisiert und Informationen zu dem Element gelöscht.
  • Wenn Sie die Tabulatorreihenfolge des Privatdaten-Clusters der Klasse ändern, werden die deserialisierten Daten entsprechend neu geordnet.
  • Wenn Sie während eines Bearbeitungsvorgangs ein Privatdaten-Cluster hinzufügen, löschen, ersetzen oder neu ordnen, wird ein Ablauf bestehend aus einer Kombination der eben erwähnten Schritte erstellt und ausgeführt, so dass die alten Daten entsprechend geändert werden.

LabVIEW geht bei Veränderungen in mehreren Versionen immer seriell vor, z. B. von 1.0.0.2 nach 1.0.0.6.

Hinweis Die Änderungen einer LabVIEW-Klasse können nicht rückgängig gemacht werden, wenn sich die Versionsnummer der Klasse erhöht hat. LabVIEW hat nicht genügend Informationen, um die Änderungen an den Daten in den Anzeige- und Bedienelementen der LabVIEW-Klasse rückgängig zu machen. Wenn Sie die aktuellen Änderungen nicht beibehalten möchten, speichern Sie diese nicht. Entfernen Sie die Klasse und alle VIs, die auf die Klasse verweisen, und laden Sie die Klasse erneut vom Speichermedium.

Weitere Informationen zur Datenänderung bei der Bearbeitung von Klassen finden Sie im Support-Dokument auf ni.com.

Umwandeln von LabVIEW-Klassen

LabVIEW-Klassen können mit Hilfe der Funktion Nach allgemeinerer Klasse aufwärts und mit Hilfe der Funktion Nach spezifischerer Klasse abwärts umgewandelt werden. Diese Funktionen können auch für Referenzdatentypen mit einer Vererbungshierarchie verwendet werden, z. B. Referenzen von VI-Server-Elementen. Der Funktionsumfang ist der Gleiche. Die Funktion "Nach allgemeinerer Klasse" ändert keine Daten, sondern nur den Typ der Verbindung, über die die Daten weitergeleitet werden. Während der Ausführung des VIs ist die Funktion wirkungslos. Die Hauptanwendung der Funktion "Nach allgemeinerer Klasse" ist das Entfernen von Typumwandlungspunkten, wenn bei der Programmierung nach Codierungskonventionen verfahren wird, die solche Umwandlungen nicht zulassen.

Die Funktion "Nach spezifischerer Klasse" wirkt sich nur auf die Daten aus, wenn ein Fehler auftritt. Wenn die übertragenen Daten bei der Ausführung nicht der spezifischeren Klasse entsprechen, gibt die Funktion einen Fehler aus und die Ausgabe entspricht dem Standardwert des Verbindungstyps. Die Hauptanwendung der Funktion "Nach spezifischerer Klasse" ist das Testen von Typen an einem Wert einer Elternklasse. Sehr häufig verbinden Programmierer dieselbe Elternklassenverbindung mit mehreren Aufrufen der Funktion "Nach spezifischerer Klasse", wobei die einzelnen Aufrufe immer spezifischeren Klassen gelten. Basierend auf der Fehlerausgabe wird dann verschiedener Code ausgeführt. Diese Vorgehensweise ist äußerst ineffizient. Wenn Sie diese Methode des Testens in Erwägung ziehen und Elternklassen bearbeiten können, sollten Sie eventuell für die Elternklasse ein dynamisches Member-VI schreiben und dieses durch die einzelnen Kindklassen mit deren Funktionalität überschreiben lassen.

Wenn LabVIEW während der Ausführung erkennt, dass Sie ein Objekt der Unterobjektklasse mit einem SubVI verbunden haben, das mit einem Objekt der Elternklasse arbeitet, kann die SubVI-Ausgabe automatisch in ein Objekt der Unterobjektklasse umgewandelt werden. Für diese automatische Abwärtsumwandlung wird die Funktion "Nach spezifischerer Klasse" nicht benötigt. Die automatische Umwandlung findet aber nur statt, wenn das Objekt mit der vom SubVI akzeptierten Eingabe kompatibel ist. Wenn Sie beispielsweise ein Klassenobjekt in einem Variant speichern und die Variantdaten mit dem SubVI verbinden, kann nicht garantiert werden, dass das SubVI Daten enthält, die zur selben Klasse gehören, wie die vom Variant ursprünglich gespeicherten Daten. Prüfen Sie mit Hilfe der Funktion Laufzeitklasse erhalten, ob das mit dem SubVI verbundene Klassenobjekt kompatibel mit dem vom SubVI akzeptierten Objekt ist. Wenn die beiden Objekte nicht kompatibel sind, gibt die Funktion einen Fehler aus und passt die Klasse der Ausgabedaten der Elternklasse an, mit der das SubVI arbeitet. Diese Funktion kann auch mit Datenwertreferenzen verwendet werden. Der Rahmenknoten des Elements Datenwertreferenz lesen / schreiben muss den Laufzeittyp beibehalten. Mit der Funktion "Laufzeitklasse erhalten" können Sie prüfen, ob die mit den Knoten "Element zum Schreiben der Datenwertreferenz" und "Element zum Lesen der Datenwertreferenz" verbundenen Objekte kompatibel sind.

Hinweis LabVIEW kann rekursive SubVIs nicht automatisch umwandeln. Die automatische Umwandlung führt zu Fehlern in aufrufenden VIs, wenn diese Datenwert-Referenzen von rekursiven SubVIs im Blockdiagramm von Inplace-Elementstrukturen oder von VIs mit dynamischer Bindung abrufen. Verwenden Sie die Funktion "Laufzeitklasse erhalten" im Blockdiagramm des rekursiven SubVIs, um zu prüfen, ob das Klassenobjekt, das Sie mit dem SubVI verbinden, mit dem vom SubVI akzeptierten Klassenobjekt kompatibel ist. Es werden keine Fehler in den aufrufenden VIs außerhalb vom rekursiven Kreisläufen verursacht, wenn die Klassenobjekte kompatibel sind.

Sperren und Freigeben von LabVIEW-Klassen

Sie können LabVIEW-Klassen sperren, um zu verhindern, dass Benutzer von LabVIEW-Klassen Member-VIs, die Teil der internen Umsetzung der Anwendung sind, anzeigen können. Das Sperren der LabVIEW-Klasse verhindert den Zugriff auf private Member-VIs, wodurch dem Einführen von Fehlern in die Anwendung vorgebeugt wird. Wie auch bei Projektbibliotheken schützen Passwörter für LabVIEW-Klassen nicht die Member-VIs. Für VIs einer Klasse muss individuell ein Passwort eingerichtet werden.

Wenn Sie eine LabVIEW-Klasse sperren, wird bei Bewegen des Cursors über die Verbindung der Kasse nur der Datentyp in der Kontexthilfe angezeigt. Wenn Sie den Cursor über die Verbindung einer nicht gesperrten LabVIEW-Klasse bewegen, zeigt die Kontexthilfe die Privatdaten der Klasse und die Privatdaten der Klasse für alle freigegebenen Elternklassen an. Ähnliche Regeln gelten für die Informationsanzeigen in allgemeinen Sonden. Weitere Informationen zur Verwendung allgemeiner Sonden mit LabVIEW-Klassen finden Sie unter Verwendung von Sonden in LabVIEW-Klassen.

Hinweis Beachten Sie, dass in der Kontexthilfe für die Verbindung der LabVIEW-Klasse und das Bedienelement der LabVIEW-Klasse verschiedene Informationen angezeigt werden. Für das LabVIEW-Klassenelement wird eine Beschreibung der Klasse für Benutzer angezeigt. Für die Verbindung der LabVIEW-Klasse werden zusätzlich Informationen über den Datentyp angezeigt.

Achten Sie auf eine ausreichende Dokumentation der von Ihnen entwickelten LabVIEW-Klasse, da Benutzern nur Informationen angezeigt werden, die Sie zur Verfügung stellen. Im Dialogfeld Klasseneigenschaften können Sie Klassenbeschreibungen hinzufügen und unter Eigenschaften für VIBeschreibungen für Member-VIs hinzufügen.

Verwendung von Sonden in LabVIEW-Klassen

Für die Fehlerbehebung in LabVIEW-Klassen können Sie allgemeine oder benutzerdefinierte Sonden verwenden.

Sie können allgemeine Sonden für LabVIEW-Klassenverbindungen verwenden. Die allgemeine Sonde zeigt den Namen der Klasse während der Ausführung an sowie die Privatklassendaten und die Privatklassendaten aller Elternklassen. Wenn Sie eine allgemeine Sonde mit einer gesperrten Klasse verwenden, werden der Name der Klasse während der Ausführung und alle nicht gesperrten Daten innerhalb der Klassenhierarchie angezeigt. In der folgenden Abbildung ist die Fahrzeugklasse links gesperrt und es werden keine Privatdaten der Klasse angezeigt: Anzahl der Gänge, Anzahl der Türen, Farbe, Hersteller und Modell. Die Lastkraftwagenklasse ist nicht gesperrt und LabVIEW zeigt somit die Privatdaten der Klasse an. Beachten Sie, dass in der allgemeinen Sonde für die Lastkraftwagenklasse keine von der Fahrzeugklasse geerbten Privatdaten angezeigt werden, da diese gesperrt ist.

Das Erstellen benutzerdefinierter Standardsonden für LabVIEW-Klassen ist sehr hilfreich. Eine benutzerdefinierte Sonde kann nur für eine LabVIEW-Klassenverbindung des gleichen Typs wie der Verbindungstyp oder der Vorgänger des Verbindungstyps verwendet werden. Ein Entwickler für LabVIEW-Klassen kann benutzerdefinierte Sonden erstellen, die zur Klasse gehören und in der die Privatdaten der Klasse direkt angezeigt werden können. Benutzer können eine benutzerdefinierte Standardsonde erstellen, bei welcher mit Hilfe von öffentlichen Methoden der Klasse die Anzeige aller verfügbaren Informationen möglich ist.

Ein Klassenentwickler kann für einen LabVIEW-Benutzer eine benutzerdefinierte Sonde als Standardsonde festlegen. Die allgemeine Sonde einer gesperrten Klasse erlaubt es dem Benutzer nicht, auf Informationen über den Wert der Daten zuzugreifen, da die Daten privat sind. Das Erstellen einer benutzerdefinierten Sonde und Festlegen dieser als Standardsonde für eine LabVIEW-Klasse ermöglicht es dem Entwickler, dem Benutzer eine Standardsonde für die Anzeige aller relevanten Daten (nach dem Sperren der Klasse) zur Verfügung zu stellen. Die benutzerdefinierte Sonde muss zur LabVIEW-Klasse gehören, so dass der Entwickler sie als Standardsonde festlegen kann.

Verteilen einer LabVIEW-Klasse an andere Entwickler und Anwender

Von Ihnen entwickelte LabVIEW-Klassen können an andere Entwickler und Anwender verteilt werden. Es gibt verschiedene Möglichkeiten für die Verteilung von Klassen, aus denen Sie die für Sie angemessenste auswählen sollten. Sie können mit Hilfe des Application Builders eine Zip-Datei erstellen, um Klassen zu verteilen. Sie können auch vor der Verteilung die LabVIEW-Klasse sperren, um den Zugriff der Benutzer auf die Privatdaten und Member-VIs der Klasse zu beschränken. Das Sperren der Klasse kann auch dem Einfügen von Fehlern in die Anwendung vorbeugen.

Tipp Sie können auch über eine .NET Framework-Assembly auf LabVIEW-Klassen zugreifen. LabVIEW kann eine .NET-Klasse für LabVIEW-Klassen erstellen, die Sie festlegen, und Sie können über eine .NET-Assembly auf diese.NET-Klassen zugreifen.