LabVIEW-Programme

Allgemein nützliche LabVIEW-Utilities

Hier zusammengestellt sind diverse Unterprogramme, die allgemein für die LabVIEW-Programmierung hilfreich sind. Da die meisten in LabVIEW 2009 erstellt sind, gibt es jeweils auch Bilder von deren Funktionsplan, zum Nachmalen und Verstehen.

[ICO]NameLast modifiedSizeDescription
[   ]ArrayProgress.zip2020-03-05 10:39 34KProzess-Steuerung: Zeitverlaufs-Array (etwa wie CSV-Daten) bei Abarbeitung mit Fortschrittsbalken hinterlegen — Video (animiertes GIF bei heller Windows7-Kontrastdarstellung)Einsicht
[.LV]AutoDiagramm.vi2016-11-17 11:09 60KTeil von SuperMessung: Automatische Zuordnung von Signalen zu Achsen anhand von (gleichen) Einheiten, Achsenbeschriftung farbig passend zur Plotfarbe (hier: LabVIEW 2010): Testprogramm, Screenshot
[   ]FluxControl.llb2016-09-26 18:17 17K Runden von zwei Zahlenwerten als Endwerte einer Skale: Auf angebbare Genauigkeit (auch gebrochen), der obere Wert auf-, den unteren Wert abrundend. Die Nachkommastellen als Ergebnis dienen der Formatierung der Zahlen.
[.LV]FromUnicode.vi2011-02-10 12:12 14KUnicode-String in MBCS (bspw. ANSI- oder UTF-8-String) umwandeln (sinnvoll für Eingabefelder wenn UseUnicode=true in der LabVIEW.ini steht)

Converts MBCS (default: UTF-8) string to Unicode (UTF-16) string

[   ]GraphEditByMouse.zip2020-02-12 13:51 1.2MXY-Graph als CSV-Daten (mit wenigen Datenpunkten für eine Heizungssteuerung) mit der Maus editieren.Einsicht
[   ]IWP.zip2014-01-31 16:40 1.6MLLB-Sammlung für Men-At-Work:
  • TSV (Tab-Separated Values) laden/speichern, effizientes und einfach überschaubares Textformat
  • USB-HID-Zugriff (Zugriff auf Prototypen des PnPSA-Projekts, etwa diesen Durchflussmesser)
  • Unicode

Hier als Beispiel die häufig benötigte Funktion AlmostEqual (Beinahe-Gleich), hier mit Platzhalter ($1) für Einheiten:

Einsicht
[   ]Leistungsberechnung.zip2012-07-23 20:03 948KNetzanalyse an Gleich-, Wechsel- und Drehstrom, vielkanalig, via Measurement&Automation ExplorerEinsicht
[   ]Metrom.zip2012-02-29 16:43 714KFür die Untersuchung der dynamischen Genauigkeit einer (ehemaligen) parallelkinematischen Fräsmaschine mit LangspindelnEinsicht
[   ]Modalanalyse.zip2012-06-20 15:03 232KModalanalyse per Soundkarte, mittels Impulshammer und Messsonde. War mal als Scherz zur Doktorverteidigung gedacht, ist aber tatsächlich produktiv einsetzbar.Einsicht
[.LV]Signal-Array anhängen.vi2010-03-25 13:31 32KDieses VI sollte man nur für kleine Datenmengen benutzen, da wenig performant.

Bei großen Datenmengen eine (evtl. limitierte) Queue oder ein zweidimensionales Array benutzen, so wie es der Signal-Graph mit History-Daten tut.

[   ]Spindel.zip2012-07-10 14:22 4.6M(Ehemaliger) Versuchsstand Motorspindel = 2 Motoren mit Zahnriemen und Schaltschrank, 6 kapazitive Sensoren rund um die Werkzeugspindel messen Fluchtabweichung, Bonbon: 3D-Darstellung der VerkippungenEinsicht
[   ]SuperMessung.zip2015-04-16 17:41 584KMehrere Datenquellen unter einem Hut: Plugin-basiertes erweiterbares Messsystem, für Hauptanwendung Live-Visualisierung und DatenloggerEinsicht
[.LV]ToUnicode.vi2011-02-10 12:14 14KMBCS (bspw. ANSI- oder UTF-8-String) in Unicode-String umwandeln (sinnvoll für Eingabefelder wenn UseUnicode=true in der LabVIEW.ini steht)

Converts Unicode (UTF-16) string to MBCS (default: UTF-8) string

[   ]WagoTalk.zip2012-08-13 11:50 32KModbus-TCP-Beispiel für WAGO-750-341 (Feldbuskoppler), hier: 16 digitale Ausgänge setzen+rücklesen, 8 digitale Eingänge erfassen, ohne NI-ModBus-Bibliothek (dadurch übersichtlicher)Einsicht
[   ]atropos.zip2015-04-20 10:08 624KEinsicht
[   ]ewa.zip2016-11-17 17:07 43KDateiauswahldialog für Pfadauswahl-Element programmatisch generierenEinsicht
[   ]lb32.zip2022-03-09 11:54 70Kclz bzw. ld (heute lb) aus Uint32 für FPGA ohne Takt und in nur 2 Logikstufen in Disjunktiver Normalform, für Konvertierung Int32⇒Float32 erforderlich.Einsicht
[   ]path.zip2016-11-18 13:10 86KEinsicht
[.LV]roundToSignificantDigits.vi2016-11-18 13:06 13K 

Probleme von LabVIEW

So hübsch LabVIEW auch aussehen mag, früher oder später stößt man auf unlösbare Probleme:

Vergleichbar mit Skriptsprachen haftet so auch LabVIEW das Manko der schwierigen Skalierbarkeit für größer werdende Vorhaben an. Abgesehen davon, dass man sich mit Gedeih und Verderb an die Politik von National Instruments klammert und mit den undokumentierten VI-Dateien niemals echten Quelltext vor sich hat.

Datenerfassung ohne Löcher

Ein häufiges praktisches Problem ist eine Datenerfassung, die nicht aussetzen darf. Hingegen sind Verzögerungen in der Weiterverarbeitung kein Problem. Die Abtastrate oder Kanalzuordnung sollte zur Laufzeit änderbar sein, und die Datenerfassung bei wackeliger Schnittstelle selbst „recovern“. (Dann und nur dann sind Löcher unvermeidbar und zulässig.)

Grundsäzlich sind Messdaten in Stücke von 100 ms Länge zu packen, um den besten Kompromiss von Rechenlast und Antwortverhalten zu erreichen. Der Datentyp „Signal“ (Waveform) ist stets zu bevorzugen.

Lösung:

Wichtig ist, dass:

Kann man mehrere derartige Sub-VIs parallel laufen lassen?
Ja, allerdings geht deren zeitliche Übereinstimmung flöten. Man muss sich daher im Hauptprogramm um das Angleichen (Resampling) der Messdaten der zusätzlichen Sub-VIs kümmern, wenn das erforderlich ist — es ist fast immer erforderlich!

Sonstige eigene Beispiele

Herausgewursteltes

Immer wieder stört es mich, nicht sinnvoll dynamische Einheiten verwenden zu können, etwa eine Einheit aus einem Double-Eimgabefeld herauszuholen. Die Antwort ist simpel: Es geht nicht! Die Einheitenzuordnung ist statisch (wie oben bereits bemerkt).

Nun, über ein Variant geht es doch! Den Variant kann man mittels Variant to Flattened String in einen String (enthält den Wert) und ein mysteriöses Int16-Array aufteilen. Dieses Int16-Array enthält:

Die Liste der Basiseinheiten ist wie folgt aufgebaut:

Für den Basiseinheit-Enum habe ich folgende Zuordnungen gefunden:

  1. rad (ebener Winkel, mit Umrechnung: deg)
  2. sr (Raumwinkel in Steradiant)
  3. s (Zeit: Sekunde, mit Umrechnung h u.ä.)
  4. m (Länge: Meter)
  5. kg (Masse: Kilogramm)
  6. A (Elektrischer Strom: Ampère)
  7. K (Temperatur: Kelvin; mit Umrechnung: °C; LabVIEW-Falle: degC = °C aber Cdeg = K!)
  8. mol (Stoffmenge)
  9. cd (Lichtstärke in Candela)

Wichtig: Einheitenvorsätze werden nicht weitergegeben! Man weiß also nicht, ob ein Wert in °C oder K angegeben wurde, es wird stets in K umgerechnet.

Eine Ähnlichkeit zur Einheitenkodierung im USB-HID-Deskriptor drängt sich auf; dort passt sie nibbleweise komplett in ein DWORD. Raumwinkel und Stoffmenge hat man da allerdings „vergessen“.

Eine Echse portabel machen

Auf die schlaue Idee, aus dem LabVIEW-Programm eine .EXE zu machen um diese auf einem anderen PC laufen zu lassen kam wohl schon fast jeder. Aber Pustekuchen, die Echse benötigt eine NI-Laufzeitumgebung!

Ist diese endlich installiert, stellt man schließlich fest, dass „Gerätetreiber“ zum Zugriff auf die Hardware fehlen. Das betrifft zumeist eine serielle Schnittstelle sowie NI-Hardware, oftmals ein NI USB-6008.

Dazu muss dann noch einmal Software heruntergeladen werden:

Dann sollte die Echse auf dem Zielrechner endlich funktionieren.

Will man, dass die Software „probeweise“ auf einem Zweitrechner nur zur Datenauswertung ohne Treiber läuft, muss man die Hardware zugreifenden VIs dynamisch laden. I.a. zu viel Aufwand!

Dann kann man sich an das Deinstallieren nicht benötigter Softwareteile machen. Unbedingt drauf bleiben muss das was in der Grafik rot markiert ist.

Beim Deinstallieren muss man höllisch aufpassen, wer was dereferenziert!

Man muss tatsächlich sowohl das im Bild zu sehende .NET-Geraffel als auch das LabWindows/CVI-Geraffel drauf lassen! TDM Excel, VIPM und Netzwerkbrowser kann IMHO weg. I/O Trace vermutlich auch. Das PXI-Zeug muss anscheinend drauf bleiben, auch wenn man kein PXI (= externes PCI oder PCIexpress, dass ist die ganz teure NI-Hardware) hat.

Vorteil einer Echse

Hat, auf einem Rechner mit installiertem LabVIEW, eine Echse einen Vorteil gegenüber einer LLB-Datei?
Ja, äußerst mager: Das war's auch schon!!

Probleme einer Echse

Das benutzerdefinierte Laden eines VIs nach Namen ist aus der .EXE-Datei heraus nicht möglich; EXE-Dateien sind keine LLB-Dateien.

Beim Compilieren gibt es keine entsprechende Fehlermeldung oder Warnung. Nur statische VI-Referenzen dürften funktionieren. Vielleicht.

In einem Fall wollte ich LabVIEW-Datengenerator-Threads (die Daten von A/D-Wandlern aufnehmen) sowie Linearisierungs-VIs (die diese Daten umrechnen) vom Anwender auswählbar gestalten. Schön modular also. In eine .EXE compiliert funktioniert nichts mehr davon.

Wie kommt man von LabVIEW los?

Für den portablen oder mehrfachen Einsatz von Hardware ist der Einsatz von LabVIEW sowie der teuren NI-Messtechnik schlichtweg zu teuer und umständlich. Das kann man niemandem verkaufen! LabVIEW ist gut fürs Prototyping! Heißt aber auch, dass man's nachher nochmal schreiben muss.

Keine NI-Hardware kaufen / einsetzen

Da NI-Hardware immer über den Measurement & Automation Explorer (MAX) läuft, sollte diese nicht eingesetzt werden. Nein, niemals! Der Ärger hört nicht auf. Wirklich nicht!

Alternativen sind, je nach erforderlicher Rechenleistung:

Zusätzlich muss man geeignete A/D-Wandler, D/A-Wandler und Relaiskarten finden oder basteln. Machen die Chinesen auch so.

C oder C++ oder (notfalls) C# oder Python programmieren

Aber nichts anderes! Insbesondere kein VisualBasic. Sonst kommt der Ärger wieder, und man schießt sich schon wieder ins Knie.

Auf WebUSB setzen

Seit 2019 gibt es WebUSB für Google Chrome, und mittlerweile (2022) für alle gängigen Browser außer Firefox. Insbesondere funktioniert es mit Smartphones; für diese wird ein geeignetes USB-Kabel benötigt. Der Einsatz von WebUSB erfordert, dass die Interaktion mit dem Untersuchungsobjekt ausschließlich über einen selbst zu programmierenden USB-Mikrocontroller läuft. Als Ausgangspunkt dafür eignet sich Arduino Leonardo mit ATmega32U4 (nicht Arduino Uno, Arduino Mega), Arduino Due, STM32F1xx „Blue Pill“ sowie jeder Mikrocontroller mit USB-Device-Interface, wie PIC16F1459. (Software-Pingpong-USB wie OBDevs V-USB geht auch ist aber weitestgehend obsolet weil low-performant.) Ein Raspberry ist nicht das richtige, hierfür gibt es vergleichbare Lösungen via Ethernet, Stichwort WebSocket.

WebUSB erspart es, für USB-Geräte ein Bedienfeld erstellen zu müssen, häufig Siebensegmentanzeigen und Tasten. Dies übernimmt eine mit Javascript gepickte Webseite, deren Adresse das Gerät dem Host beim Anstecken mitteilt. Zudem kann der Host (auch das Smartphone) das USB-Gerät mit Strom versorgen, und man muss sich nicht mit der Stromversorgung herumärgern.

(Eigenversorgte) WebUSB-Geräte können autonom arbeiten und sind nicht von den Launen des Host-PCs (Abstürze, Updates) abhängig. Das ist vor allem für langwierige Prozesse sowie sicherheitsrelevante Aufgaben erforderlich.

Die Anwendung wird in Javascript erstellt. Von Nutzen ist es, vorgefertigte Komponenten für die Grafdarstellung in einem canvas einzusetzen, aber letztlich kein Muss.