Einführung in LabVIEW von Wolfgang Georgi, Ergun Metin 5., überarbeitete und erweiterte Auflage Einführung in LabVIEW Georgi / Metin schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG Hanser München 2012 Verlag C.H. Beck im Internet: www.beck.de ISBN 978 3 446 42386 2 Inhaltsverzeichnis: Einführung in LabVIEW Georgi / Metin
3 Programmstrukturen Lernziele 1. Gedanken der strukturierten Programmierung verstehen. 2. Flache und gestapelte Sequenzen programmieren, mit lokalen Sequenzvariablen und lokalen Variablen arbeiten können. 3. Mit Hilfe der Case-Struktur Alternativen und Mehrfachalternativen programmieren können. 4. For-Schleifen programmieren können, auch unter Zuhilfenahme von Schieberegistern. 5. While-Schleifen programmieren können, u.a. zum Ersetzen der Startoption 'Wiederholt ausführen'. 3.1 Strukturiertes Programmieren Im Laufe der Entwicklung der Programmiertechnik erkannte man, dass sich jedes Programm prinzipiell aus drei Bausteinen oder Strukturblöcken aufbauen lässt. Diese Bausteine heißen Sequenz, Alternative, Schleife. Beschränkt man sich bei der Programmentwicklung konsequent auf diese drei Elemente, spricht man von 'strukturierter Programmierung'. Strukturierte Programme lassen sich mit Hilfe von Struktogrammen leicht grafisch veranschaulichen. Tabelle 3.1 zeigt die Paletten von LabVIEW 2010, welche die Strukturen Sequenz, Alternative und Schleife enthalten. Tabelle 3.2 gibt einen Überblick über diese Strukturen. Tabelle 3.1 Strukturblöcke in LabVIEW, Version 2010 Palette 'Programmierung' 'Strukturen' 'Flache Sequenz' und 'Gestapelte Sequenz' 'Case-Struktur' 'For-Schleife' und 'While-Schleife'
50 3 Programmstrukturen Tabelle 3.2 Grundtypen von Strukturblöcken und ihre Darstellung. Links Programmablaufplan, in der Mitte Struktogramm, rechts C-Notation Sequenz Alternative {} {} Besteht nur aus einer einzelnen C- Anweisung, wird sie stets durch ';' abgeschlossen. Beispiel: k = 0; ja Bedingung erfüllt nein ja Bedingung erfüllt nein if (Bedingung) {} else {} Schleife Bedingung erfüllt nein Solange Bedingung erfüllt S ja S while(bedingung) {S} Die Frage ist natürlich, inwieweit das Konzept der strukturierten Programmierung von konventionellen Programmiersprachen auf LabVIEW übertragbar ist bzw. welche Modifikationen erforderlich werden. Im Prinzip besteht jedenfalls die Möglichkeit der Übertragung.
3.2 Sequenz 51 3.2 Sequenz Nach Abschnitt 1.6.2 wird ein Knoten, d.h. eine Funktion wie z.b. das Addieren, genau dann ausgeführt, wenn alle seine Eingabe-Terminals mit Daten versorgt sind. Danach versorgt dieser Knoten alle seine Ausgabe-Terminals mit Daten. Funktionen, die voneinander bezüglich der Versorgung mit Daten unabhängig sind, werden in LabVIEW parallel ausgeführt. Ein sequenzieller Ablauf ist in LabVIEW-Programmen also keineswegs selbstverständlich. Die Funktionen, die zuerst alle notwendigen Daten über die Verbindungsleitungen erhalten, werden als Erste ausgeführt. Läuft eine Leitung parallel zu verschiedenen Funktionen, ist nicht vorhersagbar, welche Funktion zuerst abläuft. In vielen Fällen ist das auch gleichgültig. Manchmal ist aber eine gewisse Reihenfolge unabdingbar. Dann ist die Sequenzstruktur nützlich. Ein einfaches Beispiel für den Gebrauch der Sequenz ist die Aufgabe, den Zeitbedarf für eine gewisse Zahl von Operationen zu bestimmen. Wir wollen z.b. wissen, wie lange LabVIEW auf einem gegebenen PC braucht, um die Reihe 1 1 1 1 s 5 = 1+ + + + 2 3 4 5 zu berechnen und das Ergebnis anzuzeigen. Ein erster einfacher Ansatz zur Summenbildung besteht in der Entwicklung eines Programms gemäß Bild 3.1. Bild 3.1 Erster Schritt zur Programmentwicklung für die Messung des Zeitbedarfs bei der Berechnung einer Reihe aus fünf Summanden Die Konstante 1,00 erhält man aus 'Funktionen' 'Programmierung' 'Numerisch' als 'Numerische DBL-Konstante' links im unteren Teil der Palette. In unserem Beispiel wurde anschließend im Kontextmenü dieser Konstante über 'Anzeigeformat ' auf 'Fließkomma' und 2 Kommastellen umgestellt sowie der Haken vor 'Abschließende Nullen ausblenden' entfernt. Die übrigen Konstanten wurden aus der 1,00 durch Kopieren und Wertänderung erstellt. Das erspart die wiederholte Anpassung des Anzeigeformats. Die 5 Summanden werden mit der Funktion für Mehrfacharithmetik (unter 'Funktionen' 'Numerisch') addiert, die hier auf fünf Eingänge erweitert wurde. Anschließend folgen ein Rechtsmausklick auf den Ausgang dieses Operators und die Auswahl von 'Erstellen' 'Anzeigeelement'. Die Beschriftung (Label) des so gebildeten Elements wurde in 'Summe' umbenannt, das Anzeigeformat auf 3 Stellen nach dem Komma erweitert. Für die Zeitberechnung nutzt man eine Funktion, welche die Millisekunden zählt, die seit dem Einschalten des Rechners vergangen sind. Man findet sie unter 'Funktionen' 'Programmierung' 'Timing' links oben. Bezeichnung: 'Timerwert (ms)'. Die Programmierung der Zeitmessung nach dem Muster von Bild 3.2 schlägt fehl! Wegen der Parallelverarbeitung in LabVIEW könnte z.b. zuerst die Endzeit ermittelt werden, dann die Anfangszeit und erst danach die Summe. Auch eine andere Abfolge wäre möglich. Sie hängt von der
52 3 Programmstrukturen Reihenfolge der Programmierschritte ab, die das fertige LabVIEW-Programm bilden, und ist dem Anwender in der Regel nicht bekannt. Bild 3.2 Falsche Behandlung der Aufgabe, die Zeit zur Berechnung und Anzeige einer Summe zu ermitteln Das Programm in Bild 3.2 ist zwar lauffähig, zeigt aber dieselben Werte für Anfangszeit und Endzeit, wie man Bild 3.3 entnimmt. Bild 3.3 Anfangszeit und Endzeit sind infolge fehlerhafter Programmierung identisch Den richtigen Ansatz zeigt das Diagramm in Bild 3.4. Der dreigeteilte Rahmen ist eine Sequenz, die unter 'Funktionen' 'Programmierung' 'Strukturen' als 'Flache Sequenzstruktur' steht. Sie hat zunächst nur einen einzelnen Rahmen und wird in diesem Fall mit Hilfe des Kontextmenüs und 'Rahmen danach einfügen' auf drei Rahmen erweitert. Diese Rahmen werden zur Laufzeit des Programms stets von links nach rechts abgearbeitet. Bild 3.4 Richtiger Ansatz zur Zeitmessung: Verwendung einer flachen Sequenz Der Ansatz ist jetzt zwar richtig, doch liest man bedauerlicherweise auf dem Panel nach dem Start des Programms immer noch die gleichen Millisekundenwerte für Anfangszeit und
3.2 Sequenz 53 Endzeit ab. Das ist kein Programmierfehler, sondern liegt einfach an der hohen Leistungsfähigkeit von LabVIEW und modernen PCs. Innerhalb einer Millisekunde kann die Reihenberechnung nebst der wesentlich zeitintensiveren Anzeige mehrfach durchgeführt werden. Deshalb erweitern wir das Programm im Vorgriff auf Abschnitt 3.4 um eine For-Schleife, die n-mal durchlaufen wird, siehe Bild 3.5. Bild 3.5 Korrektes Programm zur Zeitmessung Folgende Änderungen wurden vorgenommen: Um die Summenberechnung wurde eine For-Schleife gelegt und an den Anschluss links oben mit der Inschrift 'N' ein Bedienelement 'n' per Kontextmenü (mit 'Bedienelement erstellen') angeschlossen. Man findet die For-Schleife unter 'Funktionen' 'Programmierung' 'Strukturen'. Anfangszeit und Endzeit werden nicht mehr angezeigt. Dazu links in der Sequenz einen Rechtsmausklick auf das Terminal 'Anfangszeit' ausführen und im Kontextmenü 'Anzeigeelement ausblenden' wählen. Entsprechend im Rahmen 2 mit 'Endzeit' verfahren. Natürlich hätte man in diesem Beispiel auch die entsprechenden Anzeigeelemente löschen können. Die interessierende Rechenzeit wird als Differenz von Endzeit minus Anfangszeit gebildet. Man kann diese Zeitmessungsaufgabe auch mit Hilfe der platzsparenden gestapelten Sequenz lösen (LabVIEW-Gurus rümpfen hier allerdings die Nase wegen der 'Verdeckung von Code', siehe Abschnitt 17.1). Das VI dazu ist in Bild 3.6 bis Bild 3.8 dargestellt. Dabei sind folgende weitere Änderungen nötig: Die flache Sequenz wird durch eine gestapelte Sequenz ersetzt. Dazu am Rahmen der flachen Sequenz mit Rechtsmausklick Kontextmenü aufrufen und anklicken: 'Durch gestapelte Sequenz ersetzen'. Die drei Rahmen der ursprünglichen Sequenz liegen jetzt Platz sparend übereinander und können über die Selektorbeschriftung am oberen Rand, welche die Nummern 0, 1 oder 2 anzeigt, mit Hilfe der kleinen Pfeile rechts und links durchgeblättert werden. Mit Hilfe einer 'Lokalen Sequenzvariablen', die man im Kontextmenü der gestapelten Sequenz findet ('Lokale Sequenzvariable hinzufügen'), wird die Anfangszeit im Rahmen 0 in den Rahmen 2 weitergeleitet (siehe dazu Bild 3.6 und Bild 3.8).