This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
gefundenen Objektes. Hat ein VI z.B. an 10 verschiedenen Stellen einen Plusope:rator, kann man diese einen nach dem anderen aufsuchen
4. <Strg>+
Schaltet Kontext-Hilfe an oder aus
5. <Strg>+
öffnet Fehlerliste
6. <Strg>+
Ordnet Panel und Diagramm nebeneinander an
Dateioperationen 7. <Strg>+
öffnet ein neues leeres VI
8. <Strg>+<W>
Schließt ein VI
9. <Strg>+<S>
Speichert ein VI aufFestplatte (häufig anwenden!)
Allgemeine Edltleroperatlonen 10. <Strg>+ 11. <Strg>+<Shift>+ 12. <Strg>+<X>
Nimmt letzten Schritt beim Programmieren zurück Hebt das letzte <Strg>+ auf
Schneidet ein selektiertes Objekt aus (und speichert es intern)
13. <Strg>+
Kopiert das selektierte Objekt
14. <Strg>+
Ausgeschnittenes oder kopiertes Objekt einfilgen
14. <Strg>+
Entfernt alle gestrichelten, d.h. ungUltigen Verbindungsli nien im Diagramm
Eine vollständige übersicht findet man im LabVIEW-Startfenster oder von jedem VI aus unter 'Werkzeuge' -'Optionen' - 'Menü-Verknüpfungen'. Dort kann man auch die Vorein stellungen ändern und sich Shortcuts nach eigenem Geschmack zulegen.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
2
Einstellungen, Sprachenwahl, Paletten
Lernziele 1. Einige wichtige Voreinstellungen für die Gestaltung von Panel und Diagramm kennen und nach persönlichem Bedarfverändern können.
2. Sich auch in englischsprachigen Versionen von LabVIEW zurechtfinden. 3. Mehr Details über Werkzeug-, Funktionen- und Elemente-Palette kennen. 4. Palettenansicht an Benutzerwünsche anpassen können. Die Abschnitte 2.1 und 2.2 können von eiligen Lesern übersprungen werden.
2.1
Einstellungen
Das Beispiel in Kapitel 1 wurde unter einer Reihe von Bedingungen entwickelt, die dem Anwendet zunächst vermutlich unbewusst geblieben sind. Sie betreffen das Erscheinungs bild der Tenninals als quadratische Symbole oder 'Icons' im Diagramm, das Raster auf dem Panel während der Erstellung der Bedienoberfläche und vieles andere mehr. Die Parameter dafür sind voreingestellt ('Defaultwerte'), doch kann der Anwender sie verändern. Dazu gibt es zwei Wahlmöglichkeiten:
1. 'Werkzeuge' - 'Optionen. . .' (Einstellungen von LabVIEW) 2. 'Datei' - 'VI-Einstellungen. . . ' (Einstellungen des aktuellen VI) Wir befassen uns hier mit der ersten Wahlmöglichkeit. Öffnet man vom Panel oder vom Diagramm aus das Optionsangebot, erhält man (voreingestellt) eine Ansicht, wie sie Bild 2.1 zeigt. Der Titel lautet:
2.1.1
'Neu und geändert in 8.x'
Wählt man hier in der linken Spalte per Mausklick z.B. die Option 'Blockdiagramm', erhält man rechts eine übersicht der Optionen zur Einstellung des Blockdiagramms, siehe Bild
2.3. Dort sieht man rechts n i der Mitte einen Haken vor der Eintragung 'Frontpanel Elemente als Symbole darstellen'. Mit Symbol ist hier das kleine quadratische lcon gemeint, das wir schon aus dem Diagramm in Bi l d 1.10 vom letzten Kapitel her kennen. Man kann diese Symbole in kleinere Rechtecke umwandeln, indem man individuell für jedes Symbol mit Rechtsmausklick das Kontextmenü aufruft und in der vorletzten Zeile 'Als Symbol an zeigen' den Haken entfernt. So geschah es zum Beispiel in Bi l d 1.20 bei den Tenninals für 'Frequenz' und 'Signalverlaufs-Graph'. Will man sich diesen Aufwand für jedes einzelne lcon ersparen, entfernt man einfach generell den Haken für 'Werkzeuge' - 'Optionen. . .' - 'Neu
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
2
36
Einstellungen, Sprachenwahl, Paletten
und geändert in 8.x' - 'Blockdiagramm' - 'Frontpanel-Elemente als Symbole darstellen'. Das
kann nützlich sein, wenn der Platz im Diagramm eng wird. Bereits gesetzte Terminals sind von der generellen Umstellung nicht betroffen. Sie behalten ihr ursprüngliches Aussehen. I>
Optlon�n
Fron'�
�-�
A"",""'''''9bnsVef�ollXlg FeIlIef>:Oe
..,..,
5c",n
",�
Vef�",ie Mern-Vekcoietffi b« EIemed«1 on '''�>t''«1 Posborlffi e;n r Be5cr.ttlSJ9ffi >tioridarOp-Yerte Besc"'ttlX"lQSl� 17 Front�e oIs Syrrbole dat-stelef1
17 ACChlrle< frillef", 1«_. ,.B lrlOf VefSirn 6.1 �e,. o.kdrq; ""'" ITon dert die frootr.reHiem07"""" nrnt "" S). Beim Positionieren muss man in die Mitte des Objektes zeigen, beim Verändern der Größe auf irgendeine Ecke,
dann
linke
Maustaste
drücken
und
ziehen.
In
Bild
2.7
ist
dieses
Element gerade angewählt und deshalb grau gefarbt. •
Erste Zeile rechts (Buchstabe A): Texteingabe. Anklicken einer beliebigen Stelle m i Panel
oder Diagramm erzeugt ein rechteckiges Feld, in das man Text eingeben kann, z.B. als Kommentar. Damit lassen sich aber auch Namen und Wert eines Bedien- oder Anzeige eJements ändern.
•
Zweite Zei l e links (Drahtrolle): Verbinden von Objekten m i Diagramm mit Datenpfa den.
•
Zweite Zei l e Mitte (Pfeil mit Schubkasten): Ermöglicht Öffnen des Kontext-Menüs des angeklickten Objekts mit der linken Maustaste.
•
Zweite Zei l e rechts (Hand mit ausgestreckten 5 Fingern): Bewegen aller Objekte in einem Fenster.
•
Dritte Zeile links (rote Stopptaste): Setzen/Löschen von Haltepunkten ('Breakpoints') bei der Fehlersuche, dem so genannten Debugging.
•
Dritte Zeile Mitte (gelber Kreis mit P): Anzeigen von Probedaten ('Probes') an Drähten zum Debuggen. Wirkt auch im Normalbetrieb, nicht nur im Debug-Modus.
•
Dritte Zeile rechts (Pipette) und ganze vierte Zeile: Kolorieren, d.h. Farbe setzen und Farbe übernehmen. Damit kann man Panel und Diagramm nach eigenem Wunsch um farben oder auch einzeJne Elemente wie LEDs, Tankfüllung usw.
Benutzt man die Automatik der Werkzeugpalette nicht (grüne Anzeige oben aus), gelten folgende nützliche Hinweise: •
Leertaste (Space Bar) bewirkt Werkzeugwechsel zwischen 'Position/Größe/Auswahl' und 'Verbinden' (Drahtrolle).
•
Tab-Taste stellt um aufAutomatik.
Weitere wichtige Hinweise dienen dem Positionieren und Kopieren von Objekten: •
<Strg> + Bewegung mit links gedrückter Maustaste schiebt alle umliegenden Objekte auseinander, je nach Bewegungsorientierung in horizontaler oder n i vertikaler Richtung.
•
Cursortaste bewegt markiertes Objekt (gekennzeichnet durch gestrichelten Rand) um jeweils ein PixeJ.
•
<Shift> + Cursortaste bewegt markiertes Objekt um einen Gitterabstand.
•
Bewegen des Objektes mit der Maus und <Steg> vor dem Loslassen kopiert das Objekt.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
2
44
Einstellungen, Sprachenwahl, Paletten
Elngabe4Ausgabe-Elemente
2.3.2
Wie bereits in Abschnitt 1.4 erwähnt, ist beim Aufruf von LabVIEW 8.2 die Palette für die Bedienelemente entsprechend Bild 1.9 voreingesteUt. Bi l d 2.8 zeigt das nochmals.
� � � �
�
,. [;]�
Alny. M.>trix .. ,
liste & Tobele
�
R..... &Erun
""�
� � � �
-"
�isch
Ccrl_
� lIfJ '" � � '""
str.... &f'fod
"'"
'tc
DD v",,,,,,,, lXld KI", C>e+o.Ctem
• K�>isch • Ex>USwi!hle1/0
I iiI i!I M m � [QJ
10 '_ .. Au>,-.. .. """""", n ..
,..,,,_..... OITrJ""l"[r"" .. �.�
!;;]
"o..t.r,,�
�
m .
" "..� --
�
Auo,,,tdoto... " ...., ... .... . .
�
pt", ... ".,
[!l '
"""."n'tn ...
rn:J
Q! O""'crkbcn •
�
""'_...
� -'I � ''''·>tre-., 0-=00.... Ff..o=""."
I
�
[n'_'''�
o""m."on. ..
Bild 2,11 Unterpalette 'Datei-VO' in der Funktionenpalette (Zeile 2 Mitte), Rubrik 'Programmierung'
-_.
""•. ,m",... __""
-"","",... ""0' ood"... '�,,""on
� � !2l [l[l em �
-,""""... D""9ö/1or, -",-
,--
"O�.O '.§
""0''''' Sequenz Ze,tverbrauchOv, Blockd",gramm "
1illM--t[ J8l0kl-------r, kl� -'----' J
�
Bild 3.1 Erster Schritt zur Pro
grammentwicklung für die Mes sung des Zeitbedarfs bei der Berechnung einer Reihe aus fünf Summanden
Die Konstante 1,00 erhält man aus 'Funktionen' - 'Programmierung' - 'Numerisch' als 'Nu merische Konstante' links in der vorletzten Zeile. Das ist eine Integerzahl, die man wegen der zu berechnenden Brüche der Einheitlichkeit halber n i DBL umwandeln sollte. Dazu ist das Kontextmenü mit der rechten Maustaste aufzurufen und im Untermenü 'Darstellung' auf 'DBL' zu klicken. Ferner wurden im Kontextmenü 'Format & Genauigkeit...' auf 'Fließ
komma' und 2 KommasteIlen umgestellt sowie der Haken vor 'Abschießende l Nullen unter drücken' entfernt. Die 5 Summanden werden mit der Funktion für Mehrfacharithmetik (zweite Zeile von 'Numerisch', zweites Element von rechts) addiert. Diese ist hier auf 5 Käst chen aufzuziehen. Anschließend folgen ein Rechtsmausklick auf den Ausgang dieses Opera tors und die Auswahl von 'Erstellen' - 'Anzeigeelement'. Das Label des so gebildeten Ele ments wurde in 'Summe' umbenannt. Für die Zeitberechnung nutzt man eine Funktion, welche die Millisekunden zählt, die seit dem Einschalten des Rechners vergangen sind. Sie steht unter 'Funktionen' - 'Programmie rung' - 'Timing' rechts n i der dritte Zeile und dort ganz links oben. Bezeichnung: 'Timerwert auslesen (ms)'. Die Programmierung der Zeitmessung nach dem Muster von Bi l d 3.2 schlägt fehl! Wegen der Parallelverarbeitung in LabVIEW könnte z.8. zuerst die Endzeit ennittelt
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
3
52
Programmstrukturen
werden, dann die Anfangszeit und erst danach die Summe. Auch eine andere Abfolge wäre möglich. Sie hängt von der Reihenfolge der Programmierschriue ab, die das fertige Lab VIEW-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 l d 3.2 ist zwar lauffahig, zeigt aber dieselben Werte für Anfangszeit und Das Programm in Bi Endzeit, wie man Bi l d 3.3 entnimmt.
"""'" 1'.283
1 + 1/2 + 1/3 + 114 + 115
ArI_
'14548180
(lehn i'l 1I15)
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 Se quenz, die man unter 'Funktionen' - 'Programmierung' - 'Strukturen' und dort in der dritten Zeile links als 'Flache Sequenzstruktur' findet. Sie besteht zunächst aus einem 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
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
3.2
Sequenz
53
Endzeit ab, Das ist kein Programmierfehler, sondern liegt einfach an der hohen Leistungsfa higkeit von LabVIEW und modernen PCS. Innerhalb einer Millisekunde kann die Reihenbe rechnung mehrfach durchgeführt werden. Deshalb erweitern wir das Programm im Vorgriff aufAbschnitt 3.4 um eine For-Schleife, die n-mal durchlaufen wird, siehe Bi l d 3.5.
Bild 3.5 Korrektes Programm zur Zeitmessung Folgende Änderungen wurden vorgenommen: •
Um die Summenberechnung wurde eine For-Schleife gelegt und an das Kästchen links oben mit der Inschrift 'N' ein Bedienelement 'n' per Kontextmenü (mit 'Bedienelement erzeugen') angeschlossen. Man findet die For-Schleife bei 'Funktionen' - 'Programmie rung' - 'Strukturen', links oben.
•
Anfangszeit und Endzeit werden nicht mehr angezeigt. Dazu links in der Sequenz einen Rechtsmausklick auf das Tenninal 'Anfangszeit' ausführen und im Kontextmenü 'Anzei geelement verbergen' wählen. Entsprechend im Rahmen 2 mit 'Endzeit' verfahren. Natür lich hätte man in diesem Beispiel auch gleich 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 dazu Abschnitt 17.1). Das VI dazu ist in Bild 3.6 bis Bild 3.8 dargestellt. Dazu 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, I oder 2 anzeigt, mit Hi l fe der kleinen Pfeile rechts und links durchgeblättert werden.
•
Mit Hilfe einer 'Lokalen Sequenzvariablen', die man ebenfalls im Kontextmenü zum Rahmen der Sequenz findet, wird die Anfangszeit im Rahmen 0 in den Rahmen 2 durch geschleift (siehe dazu Bild 3.6 und Bild 3.8).
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
3
54
Programmstrukturen
Bild 3.6 Rahmen 0 der Sequenz: Ermittlung der Anfangszeit und deren Weiter leitung Ober eine lokale $equenzvariable (kleines Quadrat unten am Rand) 1 0.. 2
;"" N_ I!� 13
[j]
0-�
�
0-� 0-�0-� ,��
�
Bild 3.7 Rahmen 1 der Sequenz: n-fache Berechnung der fünfgliedrigen Summe und Anzeige der Ergebnisse. Der Anwender muss den Zahlen wert von n auf dem Panel einstellen, wie Bild 3.9 zeigt
Bild 3.8 Rahmen 2 der Sequenz: Ermittlung der End zeit und Bildung der Differenz zeit Ober die im Rahmen 0 festgelegte lokale Sequenz variable Bild 3.9 verdeutlicht das Ergebnis nach Ausführung der Rechnung. J>
Sequen2_"e.tvetbtauchZ VI front pan,,1
'"
Bild 3.9 Das Programm braucht für die einmillionen fache Berechnung und Ergeb nisanzeige der fünfgliedrigen Reihe nur 134 ms
Bild 3.9 zeigt unmittelbar nach dem Laden die Parameter Rechenzeit = Summe = 0 sowie
n = I Mio. Diese Werte wurden nach der Erstellung des Programms zusammen mit diesem gespeichert. Dazu muss man zunächst die Werte n i den drei Feldern eintragen und dann 'Bearbeiten' - 'AktueUe Werte als Standard' wählen. Zuletzt ist das so modifizierte Programm zu speichern. Der Vorteil: Beim späteren Laden des VI von der Festplatte müssen diese Daten nicht erneut eingegeben werden.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
55
3.2 Sequenz
Merke: In einer Sequenz läuft zuerst Rahmen 0 ab (der Rahmen ganz links in der flachen Sequenz), dann Rahmen I usw. Rahmen 0 übergibt die Steuerung erst dann an Rahmen I, wenn er alle seine Funktionen, die ihrerseits quasiparallel ablaufen, beendet hat. Sinngemäß das Gleiche gilt für die anderen Rahmen.
Merke: Die Datenübergabe zwischen verschiedenen Rahmen einer gestapelten Se quenz kann über lokale Sequenzvariablen erfolgen, die man im Kontextmenü des Sequenzrahmens erzeugen kann.
Merke: In Bedien- oder Anzeigeelementen eingetragene Daten kann man zusammen mit dem VI auf Festplatte speichern. Dazu vor dem Speichern 'Bearbeiten' -
'Aktuelle Werte als Standard' klicken (oder selektiv für jedes Element einzeln).
Lokale Variablen Eine weitere Möglichkeit, Daten zwischen den verschiedenen Rahmen einer gestapelten Sequenz auszutauschen, ist die Verwendung von lokalen Variablen. Bild 3.10 zeigt das Dia
gramm des nochmals modifizierten Zeitmessungsprogramms während seiner Entstehung. 2 0 . .2 ..
'I
-
*" '$@+
1Ies
Addl.Y, Frontpanel
ö
� �
•
7
b
·3
c-a+b •
Bild 3.23 Panel des modifizierten VI aus Bild 3.22 Im übrigen kann man die While-S
Md-ot·OCER
�-b�...
l!>
I.Hl (Pt,�...
lf>
ODER (Afray. • .
Iill
"..
IV IV
-." "'"
ZaN nach bo. . •
(Y!J
Bild 4.6 Verschiedene logische Funktionen zur Verknüp fung boolescherVariablen. Ferner gibt es in den zwei letzten Zeilen die booleschen Konstanten TRUE und FALSE
FAl.5E4 I ,..-..-
.........
0A20 6861 6CH:. 61'21
-
i'II;QdI I' ...
Bild 4.14 Verschiedene Möglichkeiten, ein und denselben String 'abcd .. .' anzuzeigen
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
4.4 Arrays
73
Für den Datentyp String gibt es weder den Begriff der Genauigkeit noch eine Eigenschaft, die dem booleschen Schaltverhalten entspricht. Jedoch lässt sich ein String auf dem Panel auf sehr unterschiedliche Art darstellen.
Bi l d 4.14 zeigt die vier Möglichkeiten. Man wählt eine dieser Darstellungsoptionen m i Kon textmenü zum Bedien- oder Anzeigeelement einer Stringvariablen auf dem Frontpanel bzw. auch im Kontextmenü einer Stringkonstanten im Diagramm.
Merke: Für Stringdatentypen kann man keine Genauigkeit definieren. Dafür hat man folgende Auswahl bei der Darstellung: - Normale Anzeige - '\'-Code-Anzeige Passwortanzeige - Hexadezima1anzeige
4.4
Arrays
Wie alle höheren Programmiersprachen kennt auch LabVIEW die Datenstruktur 'Feld' oder 'Array'. In einem Array werden mehrere Datenelemente eines bestimmten Datentyps unter einem Namen zusammengefasst. Alle Elemente müssen vom gleichen Datentyp sein. Verschiedene Elemente eines Arrays werden durch h i ren Index unterschieden. Arrays können mehrere Dimensionen haben: •
•
I-dimensionale Arrars: Hier läuft der Index von 0 bis (n-l), wenn das Array aus n Datenelementen besteht. Man nennt ein solches Arrayauch Vektor. 2-dimensionale Arrays: Der Index ist ein Zahlenpaar, das von (0,0) bis (rn-I, n-I) läuft. Ein 2-dimensionales Arrayheißt auch Matrix.
•
Man kann in LabVIEW in entsprechender Weise auch höherdimensionale Arrays der Dimension 3, 4 usw. bilden. Doch ist ihre praktische Bedeutung geringer.
4.4.1
Definition und Inltlallslerung eines l--dlmenslonalen Arrays
Man kann Arrays nicht nur mit numerischen Datentypen bilden, sondern auch z.B. mit Daten vom Typ boolesch oder String. Deshalb verläuft der Prozess der Definition eines Arrays stets mehrstufig: zuerst das Symbol für Array wählen, dann ein Bedien- oder An zeigeelement, das den gewünschten Datentyp repräsentiert:
1. Unter 'Elemente' - 'Modern' - 'Array, Matrix & Cluster' (zweite Zei l e links) das winkel artige Symbol 'Array' inks l oben anklicken und mit der Maus aufs Panel ziehen. Man sieht dann ein Quadrat, an dessen linker Seite ein kleines Indexfeld angeheftet ist. Das Symbol ist so noch nicht funktionsfahig. 2. Bedienelement oder Anzeigeelement des gewünschten Datentyps unter 'Elemente' suchen, anklicken und ins Innere des Array-Symbols ziehen. Dieses ändert dabei seine Gestalt. Bild 4.15 zeigt einige Beispiele.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
4 Datentypen
74
3. Nach diesen zwei Schritten ist ein I-dimensionales Array defmiert. Man kennt seinen Typ, aber noch nicht den Inhalt. Die Festlegung des Inhalts heißt lnitialisierung. Sie geschieht entweder durch manuelle Eingabe der Werte von n Datenelementen oder mit Hi l fe von speziellen Arrayfunktionen. Bild 4.16 zeigt Artays mit verschiedenen Daten typen nach manueller Initialisierung. Bei Arrays von AnzeigeeJementen müssen die Daten per Programm erzeugt und zugeordnet werden. Das Programm Arrays.vi in Bild 4.15 ist nicht ausführbar, weil dem Array-kon links oben noch kein Datentyp zugeordnet wurde. Darunter sieht man auf korrekte Weise angelegte I-dimensionale Arrays vom Datentyp numerisch, boolesch und Steing. Links erscheinen sie n i komprimierter Form, rechts aufgezogen zu drei, vier oder zwei Elementen. Diese Arrays sind definiert, aber noch nicht initialisiert. Das heißt, sie haben noch keinen Inhalt.
--
IG --
_ _, IoOnIOIUI ...,...
Bild4.15
Verschiedene 1-dimensionale Arrays. Links oben das Symbol. mit dem die Bildung eines Arrays gestartet wird Die manuelle Initialisierung erfolgt, indem man über die Tastatur Werte für jedes Element des Arrars eingibt. Bei einem aufgezogenen Array klickt man einfach das entsprechende Element an und gibt dessen Wert entweder über die pfeiltasten inks l am Element ein oder über die Tastatur, nachdem man den Mauszeiger ins Feld gesetzt hat. Ist das Array nicht aufgezogen, d.h. besteht es nur aus einem einzigen Datenfeld, muss man zuvor links den entsprechenden Index einstellen.
Wie zieht man ein Array auf? Man macht die verschiedenen Variablen eines Arrars sichtbar ('zieht das Array auf), indem man mit dem linken Mauszeiger die rechte obere oder untere Ecke packt und nach rechts zieht (horizontal aufziehen) oder indem man nach oben oder unten zieht (vertikal auf-
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
4.4 Arrays
75
ziehen). Bild 4.15 und Bi l d 4.16 zeigen das Ergebnis. Das Aufziehen ist nur bei kleineren Arrays sinnvoll. Im Falle größerer Arrars bekommt man Platzprobleme auf dem Panel Bei noch größeren Arrays, etwa mit 100 Elementen, ist komplettes Aufziehen unmöglich. Im Umgang mit größeren Arrays ist auch die manuelle lnitialisierung nicht praktikabel. Man nutzt in diesem Fall 'Funktionen' - 'Programmierung' - 'Array' - 'Array initialisieren' (zweite Zei l e rechts). Dabei wird das Array mit n gleichen Werten für den gewählten Daten
typ gefüllt, z.B. mit 1000 Nullen beim Typ numerisch oder mit 2S-mal TRUE für den boole schen Datentyp usw. Bild 4.17 zeigt ein Beispiel.
, "
_._�
Bild 4,16 Initialisierte Arrays mit verschie denen Datentypen. Stellt man einen Index wert ein wie z.B. links oben 2 für den nume rischen Vektor, so wird der Wert des ent sprechend indizierten Datenelements angezeigt. Ist das Array aufgezogen, steht das indizierte Datenelement ganz links bzw. ganz oben
Bild 4,17 Programmierte Initialisierung eines l-dimensionalen Arrays mit 1000 Datenelementen vom Typ numerisch (DBL) mit dem Wert 0,00 Die manuelle Initialisierung muss nicht bei jedem Aufruf des VIs erneut durchgeführt werden. Man kann alle Initialisierungsdaten speichern, indem man 'Bearbeiten' - 'Aktuelle Werte als Standard' wählt und anschließend das VI mit diesen Werten abspeichert.
4,4,2
Definition und Inltlallslerung eines 2-dlmenslonalen Arrays
Die ersten beiden Schritte sind die gleichen wie beim I-dimensionalen Array. Danach packt man das kleine Indexfenster inks l mit dem Mauszeiger an der unteren Kante und zieht es nach unten. Nun öffnet sich ein zweites Indexfenster unter dem ersten. Es zeigt den Spalten index, während das obere Fenster den Zeilenindex enthält. Auf dieselbe Weise kann man auch 3- oder höherdimensionale Arrays erzeugen.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
4 Datentypen
76
Eine Erhöhung der Dimension ist auch per Kontextmenü möglich ('Dimension hinzu fügen'). Wie beim I-dimensionalen Array kann man auch hier das Datenfenster aufziehen, damit alle Datenelemente sichtbar werden. Doch ist das natürlich aus Platzgründen nur bei sehr kleinen Arrays sinnvoll. Die Initialisierung erfolgt wie beim I-dimensionalen Array. Bild 4.19 zeigt verschiedene Beispiele 2-dimensionaler initialisierter Arrays vom Typ numerisch, boo lesch und String. Auch hier ist die Initialisierung per Programm möglich, siehe Bild 4.18.
Bild 4_18 Programmierte Initialisierung eines 2-dimensionalen Arrays mit 1 000 x 200 Datenelementen vom Typ numerisch (DBL) mit dem Wert 0,00. Die Anzahl der Dimensionen kann durch Aufziehen der Funktion 'Array initialisieren' eingestellt werden
IAufgabe
4.3
Schreiben Sie ein VI mit einem Panel wie in Bild 4.19. Speichern Sie das Programm so ab, dass beim nächsten Laden des Programms von der Festplatte wieder die gleichen Werte angezeigt werden.
---
Bild 4,19 Beispiele verschiedener 2-dimensionaler Arrays, hier Matrix genannt
4.4.3
Rechnen mit Arrays: Addition
VieJe Funktionen von LabVIEW sind polymorph. Das bedeutet, der Typ der Eingangsdaten
kann vari ieren, ohne dass man als Anwender jewei l s eine andere Funktion wählen muss. Ein typisches Beispiel ist der Plusoperator, den wir bereits in Abschnitt 1.4.1 verwendet haben. Er ist zu finden unter 'Funktionen' - 'Programmierung' - 'Numerisch' in der linken oberen
Ecke und hat die Bezeichnung 'Addieren'. Diesem Operator kann man zwei Summanden
n i jeder Form der zwölf numerischen Datentypen zuführen, z.B. als zwei Integerzahlen mit 32 Bit, 16 Bit oder 8 Bit, mit Vorzeichen oder ohne Vorzeichen. Ebenso lassen sich mit dem
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
4.4 Arrays
77
gleichen Operator Gleitkommazahlen addieren und auch komplexe Zahlen mit beliebiger Genauigkeit. Die Polymorphie des Plusoperators reicht sogar noch weiter: Man kann auch Matrizen be iebiger l Dimension addieren, wie Bi l d 4.20 und Bild 4.21 zeigen.
;
. •
_ 3 .. _ I + _ Z ,�
•
.,
•
•
p.,
Bild 4,20 Addition zweier Matrizen mit Hilfe des polymorphen Plusoperators. Siehe Bild 421
Bild 4,21 Diagramm zur Matrizenaddition in Bild 4.20 Es folgen Erläuterungen zur Matrizenaddition im Programm MatrAdd.vi. MatrAdd.vi in Bild 4.20 und Bild 4.21 kann wie folgt entwickelt werden: •
•
Definition und Initiaisierung l von 'Matrix I' als Bedienelement, Definition und Initialisierung von 'Matrix 2' als Bedienelement. Die einfachste Methode besteht im Kopieren von 'Matrix 1 '. Diese dafür so anklicken, dass sich ein gestrichelter Rahmen um die ganze Matrix bildet. Das lässt sich z.B. erreichen, indem man mit der linken Maustaste nach Festlegung des Auswahl-Werkzeugs einen Rahmen rund um die Matrix aufzieht. Dann mit <Strg>+ kopieren, mit der linken Maustaste eine andere Stelle im Panel anklicken und zuletzt die Kopie mit <Strg>+ dort absetzen.
•
Die Kopie von 'Matrix I' erhält automatisch den Namen 'Matrix 2'. Man kann ihn bei Bedarf unter Benutzung der Werkzeugtaste 'A' beliebig ändern.
•
Entsprechend erhält man 'Matrix 3'. Sie ist im Kontextmenü in ein Anzeigeelement um zuwandeln!
•
Im Diagramm ist nun noch der Additionsoperator abzusetzen und entsprechend Bild
4.21 mit den Terminals zu verbinden. Nach Start des Programms berechnet er
matrix 3(i](k] = matrix I(i](k] + matrix 2(i](k] für alle Indexpaare [i](k]. Das bedeutet
bei einer Matrix mit m Zei l en und n Spalten, dass (i](k] von [0](0] bis [m-I](n-I] läuft.
Äußerlich erkennt man den Unterschied zur Addition von einzelnen Zahlen nur an den doppelt ausgezogenen Verbindungsinien l der Datenpfade in Bild 4.21. •
Startet man das Programm m i Modus 'Wiederholt ausführen', kann man die Elemente n i den Eingangsmatrizen Matrix 1 und Matrix 2 ändern und dabei unmittelbar die Sum menbildung in Matrix 3 beobachten.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
4
78 4.4.4
Datentypen
Rechnen mit Arrays: Multiplikation
Bekanntlich verläuft die Multiplikation von zwei Matrizen A, B mit C = A x B nicht nach der Formel
Vielmehr gilt
= L aij . bil< jal •
ciJr
i = l, ...,m; k = I,..., 1 und j = l, ..., n
(4.1)
wobei A eine Matrix mit m Zeilen und n Spalten ist und B eine Matrix mit n Zei l en und 1 Spalten. Das heißt, die Spaltenzahl der im Produkt links stehenden Matrix A muss gleich der Zei l enzahl der rechts stehenden Matrix B sein. Andernfalls ist das Produkt nicht defi niert. Am einfachsten ist die Multiplikation zweier quadratischer Matrizen mit n = m = 1. Versucht man nun einfach, den Additionsoperator n i Bild 4.21 durch den Multiplikations operator zu ersetzen, erhält man m i Falle n = m = 1 zwar wiederum eine quadratische Matrix, jedoch nicht das Matrizenprodukt im mathematischen Sinne. Bild 4.22 zeigt ein Beispiel. Hier wird eine 2 x 4-Matrix A mit einer 4 x 2-Matrix multipliziert. Die elementweise Multi plikation mit dem Multiplikationsoperator ('Funktionen' - 'Programmierung' - 'Numerisch' - 'Multiplizieren') ist nur für die ersten beiden Zeilen und Spalten möglich. LabVIEW er kennt das und berechnet automatisch nur diese vier Produkte. Das Matrizenprodukt nach Formel (4.1) dagegen besteht hier aus vier Skalarprodukten:
CIl = all -bll an -b2l � an -b)l � al4 -b41 1
bzw. weil die Indizes n i LabVlEW nicht mit I, sondern mit 0 beginnen:
Coo = aoo boo � aOI �o � a02 -b20 � a03 -� COI = . .. Bild 4.22 zeigt das Panel, Bild 4.23 das Diagramm eines VI, das beide Arten der Produkt bildung durchführt. Die Berechnung der Skalarprodukte muss nicht expiz l it vom Program mierer vorgenommen werden. LabVIEW hat eine eigene Funktion zur Bildung des Matri zenprodukts, die man unter 'Funktionen' - 'Mathematik' (vierte Zeile unter 'Program mierung') - 'Lineare Algebra' (rechts oben) als 'A x B' (zweite Zeile rechts) findet. Diese Funktion bildet nicht nur ein einziges Skalarprodukt, sondern alle, die für eine spezielle Matrizenmultiplikation erforderlich sind. Außerdem ordnet sie die Einzelergebnisse in der richtigen Reihenfolge als Matrix an.
Bild 4.22 Multiplikation der Matrizen A und B, elementweise und gemäß mathematischer Definition
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
4.4 Arrays
79
A
� C - A m�18, elementweise n U8� b I:---r�
4.4.5
Bild 4.23 Multiplikation der Matrizen A und B: oben elementweise, unten entsprechend der korrekten mathema tischen Definition
Steuerung von FOR�Schleifen mit Arrays
In Abschnitt 3.3 wurde die FüR-Schleife eingeführt. Die Zahl der Schleifendurchläufe wurde durch Anschluss des N-Eingangs an das Terminal eines Bediene1ements bestimmt. Beispiele finden sich in den Bildern 3.17 und 3.18. Auch der Anschluss einer Konstante ist möglich. Fehlt der N-Anschluss, ist das VI fehlerhaft und kann nicht gestartet werden. In vielen Fällen ist es eleganter, die Zahl der Schleifendurchläufe mit Hilfe eines I-dimensionalen Arrays festzulegen. Bild 4.24 und Bi l d 4.25 zeigen ein Beispiel, bei dem die Quadrate der Arrayelemente addiert werden und anschließend die Wurzel gezogen wird. Deutet man das Array als Vektor, erhält man so dessen Länge.
I�
3-chensIonaWveM:or , , J , ,
-......
17,07107
, , -,
5
Bild 4.24 Berechnung der Länge eines 3-dimensionalen Vektors im Programm 'Vektorlänge.vi'
{oBi
III
Bild 4.25 Implizite Bestimmung der Anzahl der Durchläufe einer FOR-Schleife durch ein Array vom Typ Vektor (l-dimensionales Array)
Bemerkungen zu Bild 4.24 und Bild 4.25 •
•
•
Der Anschluss N wird nicht benötigt. LabVIEW entnimmt die Zahl 3 der Schleifendurch läufe der Zahl der Elemente im Array '3-dimensionaler Vektor'. Wichtig ist, dass beim Eintritt des Datenpfades vom Array in die FüR-Schleife die Indi zierung aktiviert ist. Falls das nicht automatisch geschieht, im Kontextmenü des Eintritts symbols (kleines Quadrat) 'Indizierung aktivieren' aufrufen. Die Verbindungslinie im Innern der FüR-Schleife wird so dünner. Das bedeutet, dass nicht alle Daten des Arrays transferiert werden, sondern pro Schleifendurchlauf nur jeweils ein Datenelement: Da tenelement 0 beim ersten Durchlauf, Datenelement 1 beim zweiten Durchlaufusw. Im Beispie1 wird also über das Eingangstenninal zuerst der Wert 3 vom Panel geholt, quadriert und zum Initialisierungswert 0 des Schieberegisters addiert. Beim zweiten Durchlauf kommt über das Schieberegister der Wert 9 = 3� zurück. Aus dem Array wird das EJement -4 entnommen, ebenfalls quadriert und dann zu 9 addiert. Das Ergebnis ist
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
4 Datentypen
80
25. Im dritten Durchlauf wird 25 = 5' gebildet und zu 25 addiert, Ergebnis SO. Die
Schleife wird nun verlassen, die WurzeJ von 50 gleich 7,07107 gebildet und aufdem PaneJ in Bi l d 4.24 angezeigt.
Weitere Ergänzungen zum Programm Vektorlänge.vl •
Dieses Programm kann nicht nur die Länge eines 3-dimensionalen Vektors, sondern
eines n-dimensionalen Vektors mit beliebigem n = 1 , 2, 3, 4, . . . berechnen. Man muss im Array nur die entsprechende Zahl von Feldern initialisieren.
•
Will man z.B. die Länge eines 5-dimensionalen Vektors berechnen, zieht man das I-dimensionale Array auf fünf Elemente auf und initialisiert die letzten beiden Kom ponenten, indem man r i gendwelche Zahlen einträgt. Anmerkung: Vektoren sind stets I-dimensionale Arrays. Die Zahl ihrer Komponenten heißt Dimension des Vektors (nicht des Arrays!).
•
Hat ein Vektor bereits fünf initialisierte Komponenten und möchte man ihn auf zwei Komponenten reduzieren, wählt man für die nicht mehr erwünschten Bestandteile mit den Indizes 4, 3 und 2 das Kontextmenü und dort 'Datenoperationen' - 'Element löschen'.
Frage: Was geschieht, wenn
man
in einer FüR-Schleife die Zahl der Durchläufe zweifach
bestimmt, nämlich a) direkt durch Anschluss des N-Eingangs und b) indirekt durch impli zite Bestimmung mit Hilfe eines Vektors der Dimension n?
Antwort: Der direkte N-Anschluss bestimmt das Verhalten der Schleife, wenn N < n ist, sonst der indirekte.
IAufgabe 4.4
Schreiben Sie ein VI, das ein I-dimensionales Array mit den Quadratzahlen Jl, i, . . . , n1 initialisiert und anschließend die Summe dieser Quadratzahlen berechnet. Verwenden Sie dazu die implizite Festlegung für die Zahl der Schleifendurchläufe.
IAufgabe 4.5
überzeugen Sie sich vom Vorrang der direkten Festlegung der Zahl der Sdlleifendurch
läufe für N < n, indem Sie ein VI schreiben, bei dem eine FüR-Schleife sowohl durch einen konstanten N-Eingang von 2 bzw. 4 als auch durch einen 3-dimensionalen Vektor gesteuert wird. Testen Sie das VI im Debug-Modus.
IAufgabe 4.6
Schreiben Sie ein VI für die Inversion einer Matrix mit Hilfe der eingebauten LabVIEW
Funktion. Es sollte den Namen MatrInv.vi erhalten. Die Funktion zur Berechnung der Inversen einer quadratischen Matrix ist unter 'Funktionen' -'Mathematik' - 'Lineare Algebra' unter der Bezeichnung 'Inverse Matrix' zu finden.
Anleitung: Es muss gelten A x A-1 = E. Dabei ist E die Einheitsmatrix, deren Elemente alle
o sind mit Ausnahme der Hauptdiagonalen (von links oben nach rechts unten), n i der
nur Einsen stehen. Das soUten Sie n i Ihrem Programm überprüfen!
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
4.4 Arrays
IAufgabe
81 4.7
Schreiben Sie ein VI für die Berechnung des Skalarprodukts zweier n-dimensionaler
Vektoren. Siehe dazu Abschnitt 4.4.4.
Allgemeine Hinweise 1. Bekommt man Schwierigkeiten bei der Platzierung neuer Elemente auf dem Panel oder m i Diagramm, kann man sich Platz verschaffen, n i dem man <Strg> drückt und an
schießend l mit der linken Maustaste ein kleines Rechteck aufzieht. Alle Objekte werden dann automatisch verschoben.
2. Terminals für Punktionen kann man automatisch erzeugen, indem man das Kontext menü aufruft und dort 'Erstellen' - (Bedien- )'Element' bzw. 'Erstellen' - 'Anzeigeelement' wählt.
4.4.6
Behandlung einzelner Arrayelemente
Die Initialisierung größerer Arrays mit der LabVIEW-Punktion 'Array initialisieren' führt dazu, dass alle Elemente denselben Wert haben. Das ist nicht m i mer erwünscht. Wie kann man z.B. programmgesteuert eine Einheitsmatrix erzeugen, bei der alle Elemente der Haupt diagonalen den Wert 1 und alle anderen den Wert 0 haben? In Bild 4.26 und Bild 4.27 wird eine mögliche Lösung gezeigt: Zunächst wird eine noch namenlose quadratische (n,n)-Matrix mit 0 initialisiert. Das Ergeb nis wird einer Schleife zugeführt, welche der Reihe nach die n Zei l en 0,
1, . . .
(n-I) durchläuft. In der i-ten Zei l e wird nun mit Hilfe der Punktion 'Teilarray ersetzen' (aus 'Punktionen' - 'Programmierung' - 'Array', erste Zeile rechts) die 0 in der i-ten Spalte mit einer 1 überschrieben. Beachten Sie, dass eine Sequenzstruktur hier nicht nötig ist. Die Sequenz wird durch die Datenabhängigkeit erzwungen. Die PüR-Schleife wird erst ausgeführt, wenn die von inks l � kommende Doppellinie alle n Nullen aus 'Array initialisieren' zur Verfügung stellt. . •
, ,
n
,... .... .. IIII: ... ft"'Z CI' ,!bIhl
, 0
[
' I;" ....
'
,
[
,
0
Erzeugung und Anzeige einer 3-reihigen Einheitsmatrix vor dem Start und nam dem Ende. Das Diagramm ist inBild 427 zu sehen
Bild 4.26
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
4 Datentypen
82
Bild 4.27 Programm zur Erzeugung einer Einheits matrix, siehe auch Bild 4.26
Wichtig ist ferner, dass Eingang und Ausgang des Datenpfades aus der FüR-Schleife auf 'Indizierung aktiviert' stehen. LabVIEW stellt noch viele andere Funktionen zur Bearbeitung von Arrars zur Verfügung, wie Bi l d 4.28 zeigt. Wir werden einige davon später bei Bedarferklären.
'�5o.>:he= 180 Grad'. Im Diagramm von Bild 5.3 ist von all dieser Funktionalität nichts zu sehen. Geht man jedoch mit einem Doppelklick auf das Dreieckssymbol, dann öffnet sich ein Unterprogramm, das n i Bild 5.4 bis Bi l d 5.6 dargestellt ist. Hier werden alle Rechnungen und Entscheidungen durchgeführt, von denen das aufrufende Programm profitiert.
•
5,on13
•
17,7186
D.";j= �lr:... � Bild 5.s
•
•
•
TRUE·Teil des Unterprogramms: Winkel- und Seitenberechnung
Zur Berechnung des Sinus wird eine eingebaute LabVIEW-Funktion verwendet, die unter 'Punktionen' - 'Mathematik' - 'Grund- und Spezialfunktionen' - 'Trigonometrische Funktionen' links oben zu finden ist. Sie benötigt den Winkel im Bogenmaß, deshalb auch die Division 1t!180 m i Diagramm von Bi l d 5.5. Die Berechnung von r ergibt sich aus der Beziehung r= 180-(a+ß), die Berechnung von a und b aus dem Sinussatz für Dreiecke: a
sma
b
Sillb
c
smr
c
smr
Bild 5.6
FAL$E-Teil des Unterprogramms: Fehlermeldung, wenn Winkelsumme a+� lBO"
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
5
96
Unterprogramme
Vorgehen bei der Entwicklung des Drelecks-Unterprogramms 1. Programmieren wie ein gewöhnliches VI, 2. Verknüpfen der Bedien- und Anzeigeelemente auf dem Panel mit dem Anschlussfeld (siehe nachfolgende Bemerkung), 3. Gestaltung des VI-Symbols. Hier: Dreieck.
4. Speichern. Anschließend im Diagramm des aufrufenden Programms platzieren mit
'Funktionen' - 'VI auswählen' (unterste Zeile) und Öffnen des gewünschten VI n i dem Verzeichnis, in dem es zuvor gespeichert wurde. Bemerkungen zu Punkt 2 Klickt man mit der rechten Maustaste aufdas Symbol in der rechten oberen Panel-Ecke eines VI, das so genannte Anschlussfeld. erhält man zunächst das Menü links n i Bild 5.7. _ I:I �
�= " I - :l=I
'
i.OJ
,
,
' A
Bild 5.7 Kantextmenüs für die Festlegung der Anschlüsse
Wählt man dort 'Anschluss anzeigen', bi l det sich eine Unterteilung des Anschlussfelds wie in der rechten Hälfte von Bild 5.7 angedeutet. Die Aufteilung hängt von der Zahl der Bedien und Anzeigeelemente ab, die sich auf dem Panel befinden. In unserem Beispie1 mit dem Dreiecks-SubVI erhält man eine Unterteilung gemäß Bi l d 5.8 .
Bild S.8 Anschluss·Symbol, geeignet für drei Bedien-und vier Anzeigeelemente
Die Bediene1emente aufdem Pane1 sind nun eins nach dem anderen mit den anfangs weißen Kästchen des Anschlussfelds zu verbinden. Dazu das Werkzeug 'Verbinden' (Drahtrolle) wählen. Nicht verbundene Anschlüsse bleiben weiß. Verbundene Anschlüsse werden entsprechend ihrem Datentyp farblich dargestellt. Die Anschlussbelegung kann auch nach träglich bearbeitet werden. Bemerkungen zu Punkt 3 Im Kontextmenü des Anschlussfeldes 'Symbol bearbeiten .. .' wählen. Man erhält das Stan dardsymbol gemäß Bild 5.9, das man mit Hilfe der links davon angebrachten Werkzeuge ändern kann.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
5.2 Erstellen von Unterprogrammen
97
eJ 'lW
o
'001«'"
""l:
-,- I
'" ,..ben
..,,,,*,'00""'_"
�.
Bild 5.9 Editor zum Verändern des
Standardsymbols
IAufgabe 5.1 Bauen Sie das in Bild 5.4 bis Bild 5.6 dargestellte Programm von Anfang an neu auf, ebenso das aufrufende Programm von Bild 5.2 und Bild 5.3.
IAufgabe 5.2 Versuchen Sie, das Symbol für das Unterprogramm als kleines Dreieck oder in anderer sinnfaIliger Weise darzustellen.
Merke:
In der Regel kann jedes VI sowohl als Hauptprogramm als auch als Unterpro gramm (SubVI) verwendet werden (Ausnahmen bei Referenzen als Eingangs variablen, siehe Kapitel 7).
Merke:
Das SubVI unterscheidet sich vom �ewöhnlichen VI im Regelfall durch die
Merke:
Ein SubVI wird im Diagramm des aufrufenden VI platziert mit
Fesdegung von Anschlüssen für Eingabe- und Ausgabedaten im Ansch1ussfeld.
'Funktionen' - 'VI auswählen' (letzte Zeile) und Öffnen unter seinem Namen.
Merke:
Das Symbol eines VI zeigt zunächst das Standardbild (Gerät, Pluszeichen und fortlaufende Nummer). Der Anwender kann es nach eigenen Wünschen um
gestalten.
5.2.2
Weitere Hinweise für die Erstellung eines Unterprogramms
Das Anschlussfeld kann - unabhängig von der automatischen Systemvorgabe - für jedes Unterprogramm individuell angelegt werden. Die Anzahl der Anschlüsse sollte bereits vor der Verwendung des Unterprogramms ausreichend überlegt werden, denn Änderungen an der Anordnung der Anschlüsse ziehen das Neueinbinden der betroffenen Vb an jeder ver wendeten Stelle nach sich. Dies kann man umgehen, n i dem man einige Dummy-Anschlüsse vorsieht, die nicht be1egt sind. Verwendet man diese nachträglich, entfallt das Neueinbinden. LabVIEW bietet eine große Auswahl an vordefinierten Mustern für die Anordnung und
Anzahl der Anschlüsse, siehe Bild 5.10. In der Praxis hat sich das dick umrandete Muster für die meisten Fälle als ausreichend erwiesen. Man wählt es per Kontextmenü mit 'Muster' aus. Ab LabVIEW 8.0 ist es übrigens das Standardanschlussfe1d.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
5
98
Unterprogramme
Man kann den gewählten Anschluss per Kontextmenü auch nachträglich noch an eigene Bedürfnisse anpassen. Zum Beispiel lassen sich die Anschluss-Symbole n i 90-Grad-Schritten drehen oder horizontal und vertikal kippen. Außerdem kann man zusätzliche Anschlüsse einfügen oder bestehende entfernen.
Bild 5.10 Vordefinierte Auswahl 'Anordnung der AnschlOsse' Mit dem Werkzeug 'Verbinden' (DrahtroUe) wählt man einen freien Anschluss aus und
verknüpft ihn durch einfachen Mausklick mit einem Bedien- oder Anzeigeelement des
Frontpanels. Die umgekehrte Reihenfolge ist auch möglich. Hat man bereits mehrere An schlüsse verknüpft, kann die übersicht verloren gehen, weil die Verknüpfung nicht durch Linien markiert wird. Man kann aber durch Anklicken eines bereits eingefärbten Kästchens m i AnschlussfeJd das Panel-Element finden, mit dem es verbunden ist. Dieses Element wird mit einem gestrichelten Rahmen markiert. Will man einen Anschluss anders belegen, muss man vorher die bestehende Verknüpfung trennen. Dazu m i Kontextmenü den Punkt 'Diesen Anschluss trennen' oder 'Alle Anschlüsse trennen' auswählen. Ausgänge werden zur Unter scheidung von den Eingängen mit einem dickeren Rahmen im Anschlussfeld dargestellt. Bei der Verknüpfung sollte darauf geachtet werden, dass Eingänge den linken/oberen und Aus gänge den rechten/unteren Anschlüssen zugeordnet werden. Dies ist zwar nicht notwendig, verbessert aber die Lesbarkeit des Programms. Im Kontextmenü zu einem Kästchen m i Anschlussfeld findet man bei 'Diese Verbindung ist' drei Kategorien: •
Erforderlich
•
Empfohlen
•
Optional
Erklärt man eine Verbindung für erforderlich, erzwingt man später im aufrufenden Pro gramm die Verdrahtung des betreffenden Eingangs. Dies erleichtert die Fehlersuche, da die fehlende Verdrahtung des Eingangs sofort als Fehler angezeigt wird. Jeder Eingang, der für das ordnungsgemäße Funktionieren des Unterprogramms notwendig ist, sollte als 'Erforder lich' definiert werden. Das machen z.B. alle LabVIEW-Arrayfunktionen so, die ein Arrar als Eingang benötigen. Für Ausgänge steht diese Einstellung nicht zur Verfügung. Erklärt man eine Verbindung für empfohlen oder optional, kann das aufrufende Programm arbeiten, auch wenn die Anschlüsse fehlen. In diesem Fall werden keine Fehlenneldungen ausgegeben. Für das Bedien- bzw. AnzeigeeJement wird ein vom System festgeJegter Stan dardwert eingesetzt. Anzeigeelementen kann man nur eine dieser beiden Möglichkeiten zuordnen.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
5.2 Erstellen von Unterprogrammen
99
Im Frontpanel kann ein Standardwert für Bedien- und Anzeigeelemente eingegeben und über 'Datenoperationen' - 'Aktuellen Wert als Standard' aus dem Kontextmenü des entspre chenden Elements dauerhaft festgelegt werden. Bei 'Empfohlen' und 'Optional' sollte der Standardwert zusätzlich n i der Beschriftung angegeben werden, damit der Anwender des SubVIs informiert ist. Unterprogramme lassen sich auch direkt aus Teilen eines bestehenden LabVIEW Programms erstellen. Mit der Maus wird der Teil, der als Unterprogramm gespeichert wer den soll, markiert und aus dem Menü des Diagramms die Funktion 'Bearbeiten' - 'SubVI erstellen' aufgerufen. LabVIEW erzeugt automatisch ein neues VI und ersetzt damit den markierten Bereich. Alle Eingänge und Ausgänge werden selbständig ermittelt, als Bedien
bzw. Anzeigeelemente m i neu erstellten Unterprogramm eingetragen und mit entsprechen
den Anschlüssen verknüpft. Das Frontpanel lässt sich durch einen Doppelklick anzeigen.
Der Benutzer kann jetzt die Ein- und Ausgänge nach Wunsch beschriften und die Verbind ichkeit l (erforderlich, empfohlen, optional) der einzelnen Anschlüsse angeben.
Einstellungen für Programme und Unterprogramme
5.2.3
Für jedes VI lassen sich unterschiedliche Einstellungen wählen. Wir besprechen hier die für die Art der Ausführung und die Darstellung des Frontpanels wichtigsten. Der Dialog wird über 'Datei' - 'VI-Einstellungen.. .' aus dem Menü oder aus dem Kontextmenü des An schluss-Symbols des VI mit 'Eigenschaften für VI' geöffnet. In die interessierende Ansicht kann über 'Kategorie' gewechselt werden. Die folgenden Bilder zeigen die Standardeinstel lungen für ein neues VI. Diese Einstellungen gelten nur für statische Bindungen. Wird ein SubVI dynamisch einge bunden, muss
man
diese Angaben mit Hilfe von Eigenschafts- oder Methodenknoten für
jedes VI einzeln machen.
cp; ':i:= , ---------" ",,"," "'6
C _·POhtrutffiSt'"
J; .1i4'im Ii""",.....-..."
r locd,..""I_' Arpoo ...... ..
8 p" """ 111.......
t,='. v,.v
"'� I"'�I
I
�
I
Bild $.11 Dialog für die Einstellungen des
Frontpanel-Erscheinungsbilds
Bild 5.11 zeigt den Dialog zum Einstellen des Erscheinungsbi l ds des Frontpanels bei der Ausführung des VI. Hier kann zunächst der Fenstertitel eingegeben werden. Alles andere ist voreingestellt. Außer 'Voreinstellung' kann man 'Haupt-Applikationsfenster', 'Dialog' und 'Benutzerdefiniert' wählen. Nur über die Schaltfläche 'Anpassen...' lässt sich das Erschei nungsbild nach eigenen Vorstellungen gestalten. Bild 5.12 zeigt die Auswahl, die sich bietet, wenn man von 'Benutzerdefiniert' aus 'Anpassen. . . ' aufruft.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
100 I>
5 -
F.,n�tere<s
! E! ; :;��w., I
�T_....,I
•
.
-
.�
0
"""" ld o.t Ho: _ ' �
-,
.
�... ..
Bild 5,14 SubVl mit internem Zustand: Initialisierungsteil, der ausgeführt wird, wenn entweder manuell 'Initialisieren' aufTRUE gesetzt wird oder wenn es sich um den ersten Aufruf des SubVls han delt
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
102
5
Unterprogramme
Bild 5.14 zeigt den Aufbau des Programms 'InternerZustandSub.vi', das seinen internen Zustand zwischen den einzelnen Aufrufen speichern kann Wichtig ist dabei, dass die Schie .
beregister nicht initialisiert werden, weil sonst das VI bei jedem Aufrufvon einem definierten Grundzustand ausgehen würde. Ferner muss die Abbruchbedingung konstant auf 'TRUE' stehen, damit die Schleife nur genau einmal durchlaufen wird. Da die Schieberegister nicht initialisiert werden dürfen, ist dafür zu sorgen, dass sie wenigstens beim ersten Aufruf sinn volle Werte enthalten. Mit der Funktion 'Punktionen' - 'Datenkommunikation' -
'Synchronisierung' - 'Erster Aufruf?' kann überprüft werden, ob ein SubVI oder ein Ab schnitt des Blockdiagramms zum ersten Mal (nach Start des aufrufenden Programms) aufge rufen wird. Ist das der Fall, iefert l die Funktion TRUE zurück, sonst FALSE. Der FALSE-Teil
des Diagramms ist in Bild 5.15 dargestellt. Damit das Unterprogramm nachträglich zurückgesetzt werden kann sollte es einen zusätzli ,
chen Eingang (hier: 'Initialisieren (False)') haben. Nur wenn 'Erster Aufruf?' oder 'Initialisie ren' TRUE ist, wird das VI n i itialisiert. Sonst wird der Inhalt der Schieberegister durchge schleift. Bild 5.16 zeigt das aufrufende Programm. Es erzeugt eine zufällige Wartezeit zwischen 0 und 1000 Millisekunden und ruft das Unterprogramm auf. Bei jedem Schleifendurchlauf werden die Rückgabewerte des Unterprogramms ausgegeben. Das Programm wird über die 'Stopp' Taste beendet.
liEl !I Bild 5.1 5 FALSE-Teil desVls aus Bild 5.14 fürAufrufNummer 1 (zweiter Aufruf)
Bild 5.16 Aufrufvon 'Intemer ZustandSub.vi', dessen Diagramm in Bild 5.14 und Bild 5.15 dargestellt ist
IAufgabe 5.3 Bauen Sie die Vls aus Bild 5,14 bis Bild 5.16 von Beginn an auf. Sehen Sie im Hauptpro gramm eine grafische Ausgabe vom Typ 'Signalverlaufsdiagramm' vor.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
5.2 Erstellen von Unterprogrammen 5.2.5
103
Erstellen von polymorphen Unterprogrammen
Polymorphe Unterprogramme bündeln mehrere SubVIs, die gleichartige Funktionen aus führen, sie aber auf verschiedene Datentypen anwenden. Beispiel: Der eingebaute Plusopera tor ist polymorph. Er addiert Integerzahlen ebenso wie Gleitkommazahlen oder Vektoren. Dieser Operator addiert aber keine Strings, seJbst wenn diese nur Zahlen darstellen. Man kann nun ein eigenes polymorphes Unterprogramm erzeugen, indem man von der Menü zeile aus 'Datei' - 'Neu.. .' - 'Polymorphes VI' aufruft (oder 'Anzeigen' - 'Startfenster . . ' - 'VI aus Vorlage. . . ' - 'Polymorphes VI') und in der so aktivierten Tabelle die Namen von zwei verschiedenen Unterprogrammen einträgt, von denen das eine die Addition von Zahlen, das andere die Addition von Strings ausführt. Es gibt keine LabVIEW-eigene Funktion zur Stringaddition, also muss man sie selbst als SubVI schreiben. Wir geben ihr den Namen 'AddString.vi'. Dieses VI wandeJt die Eingabe strings in Zahlen um, addiert diese und verwandeJt das Ergebnis zurück in einen String. Anschließend wird die TabeJle unter dem Namen 'Poly_Add.vi' gespeichert. Ein sokhes VI präsentiert sich nicht mit Frontpanel und Diagramm, sondern zeigt sich entsprechend Bild 5.17. Es dient als Container für die beiden gewöhnlichen VIs 'AddNumerisch.vi' und 'AddString.vi'. I> Poly_Add v, Polymorphes VI
=���S�II� lostonz·VI, \1.N.Yroe
MeoJ·N.Yroe
AddStr...... . ,;
fWliCqffi. ..
5eIe+1eJ.>s",,.HD
�
_ " 4 ' 85% " m .. .
lbo,9'O'd-rle> ' I
- BeiT_cer"lOLl
,
1!!Jl .
!I
"
Bild 6.21
Vereinfachte Version des Löschens bei Programrnende durch Nutzung von 'Standard verwenden, wenn nicht verbunden'. Der TRUE Teil der Alternative ist also leer
Man ersetzt den Methodenknoten 'Reinit To Dflt' in der Case-Struktur rechts durch die von dieser Struktur gelieferte A1ternative 'Standard verwenden, wenn nicht verbunden'. Hier wird m i Falle 'FALSE' die Leitung einfach durchgezogen und im Falle 'TRUE' als Ausgang dieser Standardausgang verwendet, der bei einem Array m i mer das leere Array bedeutet. Im Folgenden werden wir immer diese elegantere Methode verwenden.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
6 Prozessvisualisierung
126
6.3.2.2
Darstellung von zwei oder mehr Kurven In einem Graphen
Zwei oder mehr Kurven lassen sich in einem Graphen darsteUen, wenn man aus den Vekto ren, wekhe für die einzelnen Kurven in der FüR-Schleife angelegt werden, ein Array zweiter ürdnung aufbaut. Bild 6.22 zeigt drei Kurven, die in dieser Weise gebildet wurden. Die Ar raybildung ist dem Diagramm n i Bild 6.23 zu entnehmen. Zu beachten ist, dass die Bildung des 2-dimensionalen Arrays außerhalb der FüR-Schleife erfolgen sollte. Das Symbol dafür findet man unter 'Funktionen' - 'Programmierung' - 'Ar ray', dort in der dritten Zeile links mit der Bezeichnung 'Array erstellen'. Diese Funktion macht aus drei Vektoren mit jewei l s 'n' Elementen eine Matrix mit drei Zeilen. Verwendet man denselben üperator im Ionem der Schleife, erzeugt er bei jedem Schleifen durchlauf einen Vektor mit drei Elementen. Man erhält außerhalb der Schleife eine Matrix mit 'n' Zeilen von je drei Elementen. Um die gleiche Matrix wie in Bild 6.22 zu bekommen, muss man diese Matrix transponieren. Das ist in Bild 6.25 zu erkennen. Beachten Sie die auf den Panels in Bi l d 6.22 und Bild 6.24 dargestellten Matrizen. Diese Matrizen entstehen, wenn man außerhalb bzw. innerhalb der FüR-Schleife von den Vekto ren zum 2-dimensionalen Array übergeht. Sie sind zueinander transponiert, d.h., Zeilen und Spalten sind vertauscht. '
,
''''
_.. ,
I
I
i: V)(X "-
I'tIt O
EI
,
-,
-,
I
11. •
..�
i\t.i "�
m
-w
',00 ',00
100 200 :lCXI
I>< / .. '"
soo 600 100 8C()
!:.�,05 _�3,M _!:.3,36
I"·v� _ le,73111 117,�5m
126, 16111 1)4,9I)n 1999,96m j999,85m 1999,6611\ Im,39m
Bild 6.22 Panel eines VI, das drei verschiedene Kurven in einem Graphen darstellt: Sinus, Kosi nus und den natürlichen Logarithmus.. Achtung: Die X-Achse zeigt nur Indizes, keine x-Werte oder Zeitwerte! Die Vektoren im Array sind zeilen weise angeordnet. vgl.. Bild 6..24
Bild 6.23 Dia gramm für das VI in Bild 6.22
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
6.3 GrafischeAusgabe
�
127
Cl
Pioto
W
0,00
r· ',.
',00
0,00
�,.
�·
X
·1.00
·1.5()
fi
·2.00 , 0
I',D 1o,'
'00 = = � SOO 600 700 800 ,.
1.0,'" I�,� I",,'" I-,'�
Bild 6.24 Panel eines VI, das drei verschiedene Kur ven in einem Graphen darstellt: Sinus, Kosinus und den natürlichen Logarithmus. Achtung: Die X-Achse zeigt nur Indizes. keine x-Werte oder Zeitwerte! Hier sind die Vektoren im Array spaltenweise angeordnet. vgl. Bild 6.ll
Bild 6.25 Dia gramm zum Erzeugen der in Bild 624 gezeig ten Ausgabe Die Funktion zum Transponieren findet man unter 'Funktionen'
'Programmierung'
'Array' n i der Mitte der siebten Zeile unter der Bezeic.hnung '2D-Array transponieren'.
IAufgabe 6,9 Was geschieht, wenn Sie im Diagramm von Bild 6.25 die Funktion zum Transponieren weg lassen? Verändern Sie das Programm entsprechend und beobachten Sie die entstehenden Kurven. Haben Sie eine Erklärung für das seltsame Ergebnis?
6.3.2.3
Skallerung der Abszisse In einem Graphen
Voreingestellt sind die Beschriftung 'Zeit' und eine automatische Skalierung ('Autom. Skalie rung X', siehe Bild 6.26), wie man das Z.B. in Bild 6.15 sehen kann. Dort wurde eine Histo rienlänge von 26 vorgegeben. Das heißt, man sieht zu Beginn die Zahlen 0 bis 25 als Ac.hsen beschriftung. Das sind die Indizes der ersten 26 Bildpunkte. Danach springt die Beschriftung auf 25 bis 50, dann auf 50 bis 75 usw. Bild 6.15 zeigt die Beschriftung 75 bis 100 nach drei Bi l dwechseln. Will man die Zeit anzeigen und nicht die Indizes der auszugebenden Bild punkte, muss man im Kontextmenü zum Graphen auf 'x-Achse' - 'Formatieren . . .' gehen (Bild 6.26) und 'Formatieren. . .' anklicken. Damit öffnet sich das Fenster von Bild 6.27.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
6 Prozessvisualisierung
128 - ....... """'" irl Bedoo.... , . . t�
,
E'..,..... Ersetzen
� • •
lIesd"O'eltng ....t TIPP. ,.
Dltemperalionen
��""�� � .... Fensterbetedl ..,.assen
.
•
-....
.
• •
,/ I>d:om. � X
� FctIMi:..-.:I � t
Pb,
J GIIInnIete ArpasRng
Bild 6.26
,f Sicl'd:>are �brIQ
Graphen
I�IC
.. for
r
.""....,.
"""04'
2 Groph EIgenschaften Er>c�
I
Fcnr"" lX1d �
I
Plot,
�
Z� (X·Achse)
_
I ClXse< I �
"Iz�:;------
'" AchseIIverIatI ••.
�
�5q1 ..
DiQitoief 5q1 ..
DoteH!O (5io '"o"",�....n .on "'on'" ,""','..... l _""'., "on"".....]
I"""'"
3
"'-I"od)
... ... .."'�)
110"
-�
r
O�� -...cq,n
Iö ' " '" "� Iö
,. " �".__'
,
.I.bt"''''9"'' "",s.w-.o.l,""j
lI(m
1,00
r. Rebt� "'" stoot ..,, _......
(" TlrlroJfrx"'f..""" ....n..
'"' ...."""' . ':)
-IF68 ;F21 COJA 5761 7120 6973 H:l' COJA
-
. ..
Bild 8.1 VI zum Testen verschiedener EOL-Darstellungen und Lesemodi
Das Diagramm dazu findet sich in Bild 8.2 und wird später erklärt. Vorerst muss man nur wissen, dass die unter 'Text' eingegebenen ASCII-Zeichen n i eine Datei auf der Festplatte geschrieben und anschießend l von dort auf verschiedene Weise gelesen und dargestellt wer den. Wird EOF nicht beachtet, erhält man eine Fehlermeldung.
Bild 8.2 Diagramm zum VI von Bild B.l, wird später erklärt
IAufgabe 8.1
Testen Sie die verschiedenen Möglichkeiten von 'EOL_EOF_Test.vi' Sie werden erken nen, dass Sie bei ungünstiger Parameterwahl (z.B. von 'Offset n i Bytes') Fehlermeldungen erhalten. Das geschieht immer, wenn Sie versuchen, über die EOF-Grenze des Daten satzes hinaus Zeichen von der Festplatte zu holen.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
8
150
Dattntransfer von und zur Festplatte
Die Dateifunktionen von LabVIEW nutzen beim Lesen einen Lesezeiger. Die Funktion 'Dateiposition festlegen' in der Mitte von Bi l d 8.2 setzt ihn mit Hi l fe des Offsets und des Bezugswerts 'start' oder 'rurrent' oder 'end'. Das Lesen beginnt an der durch den Lesezeiger gegebenen Stelle und erkennt von dort an 'Bytezahl' Zeichen. Bi l d 8.3 zeigt das Prinzip. Setzt man etwa in 'EOL_EOF_Test.vi' die Parameter 'Bezüglich' ='start', 'Offset in bytes' = 6 und 'Bytezahl' = 2 ein, so werden ab 'start' + 6 =1 + 6 = 7 die zwei Zeichen 'Wa' gelesen. Dasselbe Ergebnis erzielt man, wenn man sich auf die Marke 'end' bezieht und 'Offset in bytes' = -8 setzt CBytezahl' = 2 wie bisher). Denn das setzt den Lesezeiger auch auf7 = 15 - 8 ='end' - 8.
Oho ! <EOL>Was i s t ? <EOF> I 2 3 4 5 6 /7 8 9 10 11 12 13 14 lS
\ �
8.1.2
._-,_.. ,
t
,"d
Lesezeiser - start + 6 - end - 8
Bild 8.3 Speicherung von ASCII-Zeichen auf der Festplatte. EOL nicht konvertiert. daher zwei Zeichen
Menüs
i1
LabVIEW ermöglicht alle Dateioperationen, die man von anderen Programmiersprachen (z_R C) her kennt Bild 8A und Bi l d 85 zeigen die entsprechenden Menüs. , ""
�
.
§� � ""'� �" � .� _ f.f .
_.
� �,' ,�
,,-
� � ' iil � �' .
_... ru
W llil l1ll ilIl ,-I
'�"d
�1"'''''''', '"1"'�,,,",
........,"'"
w__'"
""' •• " ... InT",' ''''� -�-, _.l!O ""_��l!O d _''' .• ' �..""",," ....''''"''' �
--
''
[Illl [In b'l � il
"�_,� n "
,...��....
�-,,,,,"
.... ,,� "".
� "'�""�
�.. ""''''"
"_��,.�
... . . . do
Opt,on�n
"�
!lockdlqorrm
Iiusrd�lXlQ
,",",m,nl
Wder_Vmro
0.92
Sep,.-atoc Tob
1
R'OO:
Unt�ed
Unt�ed 1
���End_c 084 1 lIPD ..tel v' froRtpaR,,1 erojeOl Bushhen
_ ..
--
erdWi.
•
,.. ...
r;:.;nl
,
�
-" -"
�
Bild 8A1
VI, mit dem man beliebig viele Dateien in einem Archiv mit frei wählbaren Namen kom primieren kann. Die Dateien und das Archiv müssen allerdings im selben Verzeichnis liegen wie das Programm '0841-ZIPDatei,vi'
FAlSE �
:::�al Bild 8A2
Pi
'e
P r oJekt E xp lorer - Unbenilnntes ProJekt
1
e . M4Me.e;Ztli
!- V _'M -'io
BUId-�a.en Bild 9A
Neues, daher leeres Projekt, noch unbenannt
Eine neue LabVIEW-Datei wird dem Projekt unter dem Punkt 'Mein Computer' automa tisch zugeordnet. Jede Eintragung kann auch über das Kontextmenü von 'Mein Computer' hinzugefügt oder später aus dem Projekt entfernt werden. Die betreffende Datei wird dann aber nicht gelöscht, sondern verbleibt auf der Festplatte. Die Rubrik 'Abhängigkeiten' n i Bild 9.5 enthält alle externen LabVIEW-Dateien (z.B. aus vi.lib), die innerhalb des Projekts aufgerufen werden. Unter 'Build-Spezifikationen' sind Einstellungen für den Application Builder aufgeistet, l der n i Abschnitt 9.3 besprochen wird. Wie sinnvoll die Nutzung von Projekten sein kann, zeigt das Beispiel des flexiblen Automa ten aus Kapitel 8: Wir legen ein neues Projekt nach Bild 9.4 an und speichern es mit 'Projekt' - 'Projekt speichern'. Man erhält dann ein Auswahlfenster, in dem man Namen und Pfad für das Projekt angeben kann. Hier wählen wir einen der zu Kapitel 9 gehörigen Ordner sowie den Namen 'FlexiblerAutomat.lvproj'. Dann fügen wir zum Projekt zuerst mit Hilfe des Kontextmenüs von 'Mein Computer' und 'Datei hinzufügen. . .' das VI 'FlexiblerAutomat.vi' hinzu. Anschießend l ergänzen wir in gleicher Weise das Projekt mit allen Dateien, welche dieses VI benötigt. Bild 9.5 zeigt den Projekt-Explorer nach Abschluss der Arbeiten. Die Anordnung der Dateien ist beiebig. l Der Anwender kann eine alphabetische Ordnung wählen oder eine sachliche. Steht eine Datei in Bild 9.5 am falschen Ort, packt man sie ein fach mit Linksmausklick und zieht sie nach oben oder unten. In der Projektdatei sind nunmehr alle nötigen Bestandteile versammelt, die man zum Aufruf des Hauptprogramms, hier 'FlexiblerAutomat.vi', benötigt.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
9.3 Erstellung von EXE-Dateien
179
Verschiebt man das Projekt n i einen anderen Ordner, kann man auch von dort aus das Pro gramm 'FlexiblerAutomat.vi' aufrufen. Die Pfade aller Dateien sind im Projekt gespeichert. Das heißt aber nicht, dass die verschiedenen PNG- und WAV-Dateien an beiebiger l Stelle stehen dürfen. 'FlexiblerAutomat.vi' erfordert infolge seines Aufbaus gemäß Bi l d 8.48, dass sich alle diese Dateien im selben Ordner befinden! Dafür muss der Programmierer sorgen. I>
Prolekt EKl'lo.er fleK,blerAutomat.lvl',ol
"-al:e1 lI'Wbd:en anzeiOen �ojo;1 &usfihen � � tlfe
: . � t3 "
e � fTo)e�: F�xblerAo..tom.!ot.lvprol
� �
ffil
..
tl
"
s· 1
� � :,���
. �. � ZiQafettefl,pno � Totenit' usw. zur Verfügung stellt. Das Lab VIEW-System ist nun aber nicht ganz billig. Es ist daher naheiegend, l LabVIEW Programme, die für einen Kunden entwickelt wurden, ohne überflüssigen Ballast auszulie fern, d.h. ohne LabVIEW-Editor und alle anderen Werkzeuge, die der Kunde zur Ausfüh rung allein nicht benötigt. Dazu dient die Umwandlung in das EXE-Programm (auch: EXE-Datei), das vom ganzen LabVIEW-System nur noch die LabVIEW-Runtime-Bibliothek benötigt, die der EXE-Datei ohne Zusatzkosten beigefügtwerden kann. Nach dem oben Erwähnten ist klar, dass ein LabVIEW-EXE-Programm im Wesentlichen nicht schneller und nicht langsamer abläuft als das zugehörige VI, denn auch dieses VI bestand ja schon aus unmittelbar ausführbarem Code.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009.07.31 21:42:39 +02'00'
9 LabVIEW-Kurzilberblick
180 9.3.2
Erstellung einer EXE-Datel
Die Erstellung einer EXE-Datei konnte bis LabVIEW 7.1 vom VI aus gesteuert werden ('Werkzeuge' - 'Applikation erzeugen'). Ab Version 8.0 geht das nur noch über ein Projekt. Wir wollen hier zum besseren Verständnis auf das Beispiel des Programms 'DreieckMain.vi' mit dem SubVI 'DreieckSub.vi' aus Abschnitt 5.2.1 zurückgreifen. Folgende Schritte sind auszuführen: 1. Erzeugen eines Projekts, das 'DreieckMain.vi' und 'DreieckSub.vi' enthält (sofern nicht bereits geschehen), siehe dazu Abschnitt 9.2. Der Projekt-Explorer hat dann das Aus sehen von Bild 9.6.
B
..JgJ2!I �jekt &JsI(tnn � 'I !ii . 1'"
Projekt ; ��' ''ProJ
e. f-
_CcotrW.. il Dreiei eJ- Y il �"" ·· -
L tt 11f$i?8"m Bild 9.6
Projekt zur Dreiecksberechnung
2. Im Projekt-Explorer Kontextmenü von 'Build-Spezifikationen' aufrufen und 'Neu' 'Applikation (EXE)' wählen, siehe Bi l d 9.7. Nun öffnet sich ein Fenster gemäß Bild 9.8.
Hle . "
Bild 9.7 Wahl der Bildung einer Applikation, d.h. einer EXE-Datei
3. Die voreingestellten Werte werden bei 'Name der Build-Spezikation', 'Zieldatei-Name', 'Produktname' und 'Interner Name' wunschgemäß geändert. Man erhält dann Eintra gungen gemäß Bild 9.9. Achtung: Name der Build-Spezifikation und Zieldateiname müs sen verschieden sein! 4. Die bisherigen Eintragungen erfolgten unter der Kategorie 'Angaben zur Anwendung'. Weitere Kategorien sind 'Ausgangsdateien', 'Ziele' usw. bis 'Sprachen des Laufzeit systems' (linke Spalte des Fensters). Wichtig ist die Kategorie 'Ausgangsdateien' nach Bild 9.10. Hier muss man das später beim Aufruf zu startende VI angeben und mit dem Pfei l nach rechts ziehen, in unserem Fall 'DreieckMain.vi'. 5. Die anderen Kategorien kann man überspringen, d.h. mit den voreingestellten Werten arbeiten. Man kann aber auch die Sprachen des Laufzeitsystems, die unterstützt werden, begrenzen, z.B. aufDeutsch.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
9.3 Erstellung von EXE-Dateien
ISI
6. Schließlich ist noch eine Vorschau möglich. 7. Zuletzt Taste 'Build' betätigen. Es erscheint ein kleines Feld, das den Build-Status anzeigt. Nach kurzer Zeit sollte dort stehen 'Build komplett'. Dann Taste 'Fertig' quittieren. Das EXE-Programm steht nun in unserem Fall unter 'D:\LabVIEW_Einfuehrung, 4. Auflage \Auflage_4\Kapite109\bui l ds\Dreie
�"",,,,'eo
"'''"''
"'oToeo
•
I!l D .LI'5ES·O"�
18.00.2008 15,,.
270IottruI rID-'=,
r .......
r: NIH,,_,�W-< 9,0 r r r P
NI l""\'I[W ",,_ ",on>< 8.5 "I l..,\'I'W ""'_,....,,,,no7,0
""..,\'I'W ""'_,.... '",no 7,',' ""..,\'I'W ""'_I.... '",no ",0 r: """"�'" ""'_I.... '",no ",>,I r: "' l"""''' "'''_I.... '''''''' ".•. [ .. [ ."".....""'" r: "' l_...".IC"'· r: "1 "'''''' '' ''- a """"''''' "pt:tl'd.., _..
pe"""""." pIot�...
_.
Bild 9.24 Die LLBs in 'examples' - 'analysis'
Öffnet man hier die erste LLB 'dspxmpl.Ub' mit dem LLB-Manager, sieht man, dass diese Bibliothek aus 15 verschiedenen Vls besteht, die u.a. auch mit der Fouriertransformation FFT zu tun haben (Bi l d 9.25 oben). Die Endung 'llb' ist das äußere Kennzeichen einer LLB.
��� CI c!
""'"
r
, - ",.
1"'1
llJ
"'t:ro0
\l4b�!EW 8.�\ono/y< \ c:IfrUb> il 1mogeCorrv=ion ..... OCl.yj il P"""",I. n....... ... .yj
=
zto Nyqo.i LLB Manager
Bild 9,33 'dspxmpi.iib' wird umgewan delt in die Sicherungs-lLB ·dspxmpl.llx' und ein Verzeichnis 'dspxml', das die einzelnen Vls als Dateien enthält
".0'3.2"""22." ".l1.= lZ:";
Bild 9,34 Testordner nach der Umwandlung der llB in ein gewöhnliches Verzeichnis 'dspxmpl'
Das Quellverzeichnis 'dspxmpl. lb' wurde gelöscht, dafür allerdings die Sicherungskopie l 'dspxmpl.llx' angelegt, ebenfalls eine LLB mit den ursprünglichen Einträgen. Außerdem sieht man das Verzeichnis 'dspxmpl', das die VIs der LLB als Einzeldateien enthält. Auch der umgekehrte Weg ist möglich. Man kann verschiedene VIs zu einer LLB zusam menfassen. Dabei gilt: VI-Bibiotheken l dürfen ausschließlich Dateien enthalten, die aus LabVIEW heraus erzeugt wurden. Der Versuch, eine andere Datei einzufügen, führt zur Fehlermeldung. Außerdem können Bibliotheken keine anderen Bibliotheken oder geschach telten Verzeichnisstrukturen enthalten. Einzelheiten sind der LabVIEW-Hilfe zu entneh men, und zwar unter dem Stichwort 'Umwandeln von Verzeichnissen in Bibliotheken'.
IAufgabe 9.4
Experimentieren Sie mit der Umwandlung von LLBs in Verzeichnisse und umgekehrt. Versuchen Sie es speziell mit dem Beispiel von Bild 9.34.
Bemerkung: Man kann sich auch von vornherein alle LLBs im Windows-Explorer anzeigen lassen, n i dem man unter 'Werkzeuge' - 'Optionen' aufruft 'Umgebung' und dort 'Anzeige von LLBs im Windows Explorer möglich' ankreuzt. Dies wird allerdings erst wirksam nach Neustart des Computers: Beim Doppelklick aufeine LLB-Datei erscheinen die Symbole aller dort gespeicherten VIs, die sich mit einem weiteren Doppelklick sofort öffnen lassen.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009.07.31 21:42:39 +02'00'
9 LabVIEW-Kurzilberblick
194
9.7
Einbindung von (-Programmen unter Windows
Unter LabVIEW lassen sich auch C-Programme aufrufen: Wir zeigen hier die Einbindung einer OLL (Dynamic Link Library) mit Hilfe eines CLF-Knotens (Code Library Function oder aufDeutsch: 'Knoten zum Aufrufexterner Bibliotheken').
9.7.1
Programmieren einer eigenen OLL In C oder C++
Es soll die Berechnung der Reihe I
Summe= s� = J2 + 22 + 32 + ... + � I
I
I
(9.3)
programmiert werden. In LabVIEW könnte das gemäß Bild 9.36 erfolgen. Um die Zeit zu messen, gibt es dort noch die Sequenzrahmen 10] und 12], die hier nicht dargestellt werden. Wenn man 1000-mal die Berechnung der Reihe bis zum 25000sten Glied durchführt, ergibt sich aus Bild 9.35 eine Gesamtrechenzeit von 0,953 Sekunden. Können wir das mit einem eigenen C++-Programm verbessern? I> ReiheOhneUF v,
I�� .. s.- _ I/I�:.I/r:." , N�_
.. _ m·�
-
lliI
I/Ir":
Bild 9.35
Zeitbedarf fOr die l000fache Berechnung der Reihe mit n '" 25000
-
1 0. . 2
"' E �
[j]
...
5
-m!
'" '"
Bild 9.36 Programmierung der Formel (9.3)
Wir erstellen mit dem Microsoft Visual C++ 6.0 Compi l er einen Quelleode entsprechend Bi l d 9.37. Alle Einzelheiten der Programmierung können hier nicht besprochen werden, erwähnenswert ist aber, dass nur der untere Teil ab 'double WINAPI . . . ' selbst geschrieben werden muss. Der obere Teil wird vom Editor automatisch erzeugt. Ferner ist zu beachten: •
Dem Microsoft Visual C++ 6.0 Editor ist mitzutei l en, dass man eine 'Win32 Dynamic Link Library' erstellen möchte.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
9.7 Einbindung von C Programmen unter Windows
195
-
Bi Reihe Bild 9.45 Alphabetisch orientierte LabVlEW+tilfe
3. Tiefer gehende und systematischere Hilfe erhält man mit 'Hilfe' - 'LabVIEW-Hi l fe durchsuchen. . . ' unter der Rubrik Inhalt. Damit kommt man zu den schon oben n i Ab schnitt 9.5 erwähnten pdf-Dateien, die im LabVlEW-System unter 'manuals' gespeichert sind.
4. In vielen Fällen heJfen Erklärungen allein nicht weiter. Beispiele sind notwendig. Man kann mit 'Hilfe' - 'Beispiele suchen . . . ' ein Fenster öffnen, in dem sich geeignete Vls fin den lassen, geordnet nach Sachzusammenhang (Thema) oder nach Verzeichnis. Bild 9.46 zeigt dieses Fenster, das zur so genannten 'NI-Suchmaschine' gehört. Ihre Handhabung ist selbslerklärend.
5. Wertvolle Hilfe besonders zu tiefer liegenden Problemen erhält man auch von Benutzer kreisen m i Internet, z.B. wenn man n i Bi l d 9.46 links auf 'Anwendergruppen' oder auf 'Diskussions-Foren' klickt. In beiden Fällen geJangt man n i die 'NI Developer Zone', in der man weitere Wahlmöglichkeiten hat, siehe Bild 9.47.
6. Schließlich kann auch die Analyse von Express-Vls hilfreich sein: dazu im Symbol Kontextmenü 'Frontpanel öffnen' wählen, n i Standard-SubVI konvertieren und danach Blockdiagramm studieren.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
9.8 Hiljenzu LabVIEW
199
Ci! m,"', tlr)' '0 """anoed trmniog. Leam more..
""".n to 00' Podc.....
...., � on ...... .� . »ftdffi •
-" .... ' '"
�-
� m--W
•
•
'o�
lIl!I !II
"
1\USf(h 0ll
�"=
=tldIiJ
�. ,. ,
"" .. " l:'V�_ft"t
� m--W
"'"
I
III
•
,
�
J AuSchslfeüifherunnmiZwegstzueinituteennrasbchhäiendgliicgheeWhn ile Bild 14.5
ili
geführt BeideWhile-Schleifenwerden unterschiedlich oftaus· Bild 14,6
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- 2009_07_31 21:42:39 +02'0 ' u
14.2 Grundbegriffe der Parallelverarbeitung
245
Das Panel in Bild 14.6 zeigt, dass jetzt beide Schleifen verschieden oft ausgeführt werden. Wir können uns vorstellen, dass die Wartezeiten Rechnungen unterschiedlichen Umfangs simu
lieren.
Möglicherweise ist es erwünscht, dass diese Rechnungen trotz abweichenden Zeit
bedarfs gleich oft ausgeführt werden. Wie das obige Beispiel zeigt, geschieht das nicht auto matisch. Man benötigt Werkzeuge zur Synchronisierung, auf die wir in den nächsten Abschnitten eingehen werden. Wartezeiten innerhalb einer Whi l e-Schleife sind auch aus einem ganz anderen Grund sehr nützlich: Sie setzen die Priorität eines Threads herab. Befindet sich nämlich ein Thread im Wartezustand, verbraucht er keine Prozessorzeit. Die frei gewordene Rechenkapazität kann dann anderen Tasks oder Threads (z.B. anderen parallel laufenden Schleifen) zugewiesen werden.
IAufgabe 14.1 Schreiben Sie ein Programm mit einer While-Schleife ohne Wartezeit. Betrachten Sie die Systemleistung (CPU-Auslastung) der LabVIEW-Anwendung im Task-Manager. Setzen Sie dann eine Wartezeit von 100 Millisekunden ein. Wie verändert sich die Belastung des Prozessors?
Merke: LabVIEW-Programme laufen stets (quasi-)parallel, wenn sie nicht durch eine
Sequenzstruktur oder durch Datenabhingigkeiten daran gehindert werden. Achtung: Auch der mehrfache Aufruf desselben SubVIs verhindert die Parallelausführung (falls das SubVI nicht als reentrant ausgeführt wird)!
14.2
Grundbegriffe der Parallelverarbeitung
Die bisher genannten Beispiele setzen moderne Betriebssysteme, wie Windows 2000 oder Linux, voraus. Diese unterstützen Multiprocessing, Multitasking
und Multithreading. Was
heißt das genau?
14.2.1
Multlprocesslng, Multltasklng, Multlthreadlng
Multlprocesslng Hat ein Computer zwei oder mehr Prozessoren und ist das Betriebssystem in der Lage, sie verschiedenen Programmen oder Teilen eines Programms zuzuordnen, sprechen wir von
Multiprocessing.
Die Prozessoren arbeiten dabei wirklich parallel. Heutzutage hat ein PC
aber normalerweise nur einen Prozessor. Wird seine Rechenleistung vom Betriebssystem vertei l t, nennen wir das
Multftasklng Multitasking bezeichnet die Möglichkeit des Betriebssystems, die Prozessorleistung nachein· ander auf verschiedene
Anwendungen (Tasks) zu verteilen. Jede Anwendung bekommt für
eine kurze Zeit den Prozessor zugewiesen. Ist die Zeit abgelaufen, wird der Prozessor an eine
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- 2009.07.31 21:42:39 +02'0 ' u
14
246
Parallelverarbeitung, Ereignis-. Zeitsteuerung
andere Task vergeben. Der Wechsel zwischen den Tasks verläuft so schnell (im Milisekun l denbereich), dass der Benutzer den Eindruck hat, verschiedene Anwendungen würden si multan bearbeitet. Bild 14.7 zeigt den Task-Manager unter Windows 2000, der die gerade laufenden Tasks auflistet. !2 Wmdo... look Managor
\\INWORO,EXE
lt,e,e et,exe "Il'>"d,e,e ,,&.o",e,e
esm,exe msvc32,e,e =,","" et,ex.
0
WI'O":
+6
-, -,
00
00
-, -,
SVSTfM
00 00
"srEM
00 00
S\'5TfM SVSltM
00 00
-, -,
00 00
,"STEM
00
S\'5TtM
00
lOKAlER DIE�T
SVSTtM ""TZW!:RKDIEN;ST S\'5TtM SVSTtM
""
""
S\'5TtM
�: l"'o
00 00
00
00 00
00
00
, ,,'"
62.2% r
" ". 37.5OO K 30.68'1 K lQ.,," < 0.]7" K 6.2% K
S,g'ln
5,1OH 5,0'18 K '1.972 K ',,"8K '1,688 K '1.\32 K ',,,,,," K '1,360 K
U20K
U 16K � P=ese"""" I ','00 K
k,. \90 sicheftef� hef: 3� "
WiBi(aimulsndgTad1eows4fOsk.h7-MrtTaansakg-zMeurar'nPZeraogzieterwesuner'tdegeernnanTat)sks 2000,
46
Eine Anwendung lässt sich nun ihrerseits in kleinere Einheiten zerlegen, die ebenfalls quasi parallel verarbeitet werden. In diesem Fall sprechen wir von
Multlthreadlng Das Programm wird hier n i einzelne 'Fäden' (Threads) aufgeteilt, denen der Prozessor zuge wiesen wird. Bei Vls übernimmt nicht das Betriebssystem diese Unterteilung, sondern Lab VIEW selbst.
Dies geschieht unter Berücksichtigung der Datenabhängigkeiten im
Diagramm des VI. Die zwei While-Schleifen in Bi l d 14.3 oder Bild 14.5 laufen z.B. als ver schiedene Threads innerhalb einer einzigen Anwendung, nämlich der Anwendung Lab VIEW.
14.2.2
Synchronisation von Prozessen
Parallel laufende Prozesse müssen oft synchronisiert werden. Man denke etwa an die Daten erfassung von Messwerten, die anschließend einer Fouriertransformation unterzogen wer den. Am einfachsten macht man das mit der alten sequenziellen Methode: Das Programm stößt eine Datenerfassungskarte an, 1024 Messwerte zu erfassen. Dann wartet es, bis die 1024 Messwerte aufgezeichnet und in einen Speicherbereich geschrieben sind. Anschließend führt das Programm die Fourieranalyse durch und stellt das Ergebnis auf dem Bi l dschirm dar. Damit ist ein Zyklus durchlaufen und der Prozess kann wiederholt werden. Allerdings nutzt diese Methode den Prozessor nicht optimal. Während die Datenerfassungskarte Daten sam melt, wartet der Prozessor untätig. Das muss nicht sein. Er kann parallel die Fourieranalyse durchführen. Doch erfordert das eine Synchronisation beider Prozesse. Die Fourieranalyse kann erst beginnen, wenn 1024 Messwerte eingelesen sind und in einem Speicherbereich bereitstehen. Die Datenerfassungskarte darfauch nicht in diesen Speicherbereich schreiben,
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- 2009.07.31 21:42:39 +02'0 ' u
14.3 Parallelverarbeitung unter LabVJEW
247
während die Fourieranalyse läuft. Sie benötigt einen anderen Bereich. Am Ende muss sie dem Prozess zur Fourieranalyse mitteilen, dass neue Daten bereitstehen. Umgekehrt muss der Prozess der Fourieranalyse dem Datenerfassungs-Prozess mittei l en, wenn die Analyse des einen Bereichs abgeschlossen und der Speicher dort wieder frei zur Aufnahme neuer Daten ist. Man kann dieses Problem allgemein so formuieren, l dass mehrere Prozesse sich einen Spei cherbereich tei l en, der stets nur von einem Prozess genutzt werden darf. Die Standardlösung für dieses Problem sind die von dem Holländer Edsger Wybe Dijkstra 1965 eingeführten Semaphoren, die man mit den Verkehrszeichen am Anfang und Ende eines wegen Bauarbei ten einspurig geführten Straßenabschnitts vergleichen kann.
Verwendung von Semaphoren Semaphor bedeutet Zeichen oder Zeichenträger. Zwei parallel laufende Programme, die sich beim Zugriff auf eine Ressource, z.B. einen Speicherbereich oder ein Peripheriegerät,
wechselseitig ausschließen sollen, können dies durch Zugriff auf einen Semaphor tun, ein
kleines Stück Code, wie es unten stehend skizziert ist: P (Semaphor s) wait until 5
·1 I'atomar, war
;. Prozess kann er5t weiterlaufen,
> 0,
sobald 5
brochen werden!
V (Semaphor {
s
:= s+l;
5)
I·
)
5
:= v;
I
•
> 0
: = s-l;
erkannt,
I·
ProzeS5 sperrt andere Prozesse,
d.h.:
falls 5 = 1
s : =5-1 darf durch keinen Proze5S unter
ProzeS5 gibt den ;,ugriff für andere Proze55e frei .;
;. muS5 atomar 5ein
Init(Semaphor s,
{
then 5
wenn s > 0 ist .;
Integer v)
I·
·1
Initiali5ierung des Bemaphor5
;. v i5t eine positive Integerzahl,
·1
im einfach5ten Fall gleich 1
·1
Eine Befehlsfolge kann man auf verschiedene Weise 'atomar' machen, z.B. durch Sperrung von Interrupts oder durch Verwendung spezieller Befehle im Instruktionssatz des Prozes sors. Der Wert 'v' des Semaphors ist die Zahl der Benutzer, denen man gleichzeitig Zugriff auf die Ressource erlaubt. Ist es z.B. nur ein Benutzer, der drucken darf, verwendet man einen 'binären Semaphor'. Dieser kann nur den Wert 0 (Drucker belegt) oder 1 (Drucker verfügbar) haben. Von diesem Begriffdes Semaphors ausgehend hat LabVIEW verschiedene Möglichkeiten zur Prozess-Synchronisation entwickelt.
1 4.3
Parallelverarbeitung unter LabVIEW
LabVIEW kennt verschiedene Funktionen zur Prozess-Synchronisation. Man unterscheidet zwischen der reinen Synchronisation der Abläufe von Threads und der Synchronisation mit zusätzlicher Datenübertragung. 'Semaphor' und 'Rendezvous' (auch 'Occurrences', aber veraltet) dienen der reinen Synchronisation. Sie werden n i Abschnitt 14.4 behandelt. Zur zweiten Kategorie gehören 'Melder' (Notifications) und 'Queues', siehe Abschnitt 14.5. Nutzt man diese Funktionen, hat man generell wie folgt vorzugehen:
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- 2009.07.31 21:42:39 +02'0 ' u
14
248
Parallelverarbeitung, Ereignis-, Zeitsteuerung
•
Erzeugen des Betriebsmittels (auch 'Ressource' genannt), z.B. eines Semaphors,
•
Nutzen der Ressource (synchronisieren, Daten übertragen, Status abfragen usw.) und
•
Freigeben oder Schließen.
Erzeugen und Schließen sind in aUen Fällen recht ähnich. l Sie werden deshalb zuerst in Ab schnitt 14.3.1 und 14.3.2 behandelt. Die Nutzung der Ressourcen ist vielfältiger. Diese wird in Abschnitt 14.4 und 14.5 besprochen. Unter 'Funktionen' - 'Datenkommunikation' - 'Synchronisierung' findet man folgende Elemente, die in nachstehender Tabelle zusam mengefasst sind: Tabelle 14.1
+-.. a>
:
'
r" � �'I +-..
.++
IB• • •
Synchronisation von Prozes en:velWendete Palet en Palet e 'Synchronisierung' Palet e 'Melder-()perationen' Palet e 'Queue-Operationen' Palet e'Semaphor' Palet e 'Rendezvous' Palet e 'Oc ur ences'
In der Palette 'Synchronisation' von Tabelle 14.1 findet man fünf Unterpaletten, die alle auf bestimmte spezielle Zwecke hin ausgerichtet sind. Die Grenzen sind fließend. Man kann manche Probleme auf die eine oder andere Art lösen, aber bestimmte typische Aufgaben wird man zweckmäßigerweise mit den Funktionen der Unterpalette bearbeiten, die dafür besonders geeignet sind. Schauen wir uns die Unterpaletten von unten nach oben an, so können wir sie vereinfachend wie folgt beschreiben: Synchronisation 0 h n e Datenübertragung zwischen den Threads: Occurrences:
(Occurrence = Ereignis) Methode zur Synchronisation zweier Threads.
Merke: Ab LabVIEW 7.0 wird empfohlen, diese Funktion durch Melder zu ersetzen.
Semaphor:
Schützt gemeinsam genutzte Daten vor zu früher Verwendung. Semaphor bedeutet griechisch 'Zeichenträger'. Man denke an eine Baustelle, bei der eine Fahrbahn gesperrt ist und die andere jeweils nur auf ein Zeichen hin freigegeben wird.
Rendezvous:
Synchronisation der Ausführungszeitpunkte verschiedener Threads (Ren dezvous = Verabredung, Zusammentreffen).
Synchronisation m i t Datenübertragung zwischen den Threads: Melder:
(Notification) Wirkt wie Occurrences, aber mit zusätzlicher Datenübertra gung zwischen den Threads.
Queues:
Warteschlange für mehrere Datenpakete nach dem FIFO-Prinzip (First In, First Out). Im Gegensatz zum Melder, der nur ein Datenpaket übermittelt,
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00. ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- 2009_07_31 21:42:39 +02'0 ' u
14.3 Parallelverarbeitung unter LabVJEW
249
das auch überschrieben werden kann, puffert die Warteschlange beliebig viele Datenpakete. Ist der Puffer voU, kann erst wieder geschrieben werden, wenn das älteste Datenpaket (First In) ausge1esen wurde. überschreiben ist hier nicht möglich. Alle diese Unterpaletten enthalten verschiedene Funktionen. Bi l d 14.8 zeigt dies für die Un terpalette 'Occurrences' mit den Funktionen 'Occurrence erzeugen', 'AufOccurrence warten' und 'Occurrence setzen'. Die Auswahl bei den anderen Unterpaletten ist reichhaltiger, ent hält aber auch stets eine Funktion, die mit 'Erzeugen', 'Erstellen' oder ähnlich bezeichnet wird. Sie dient der Erzeugung und Freigabe der Ressourcen für die Prozesskommunikation.
Occ.... enc ee
14.3.1
I>J Oco.nlln.. . Oco.nence s...
(von links nFaucnhktrieocnhetns)'EinrzdeeurgUnent',eWarpalretetne''uOncdu'Sreetznecne's' Bild 14.8
Erzeugen von Ressourcen für die Prozesskommunikation
In Tabelle 14.2 sind die Funktionspaleuen aufgelistet, mit denen man Ressourcen für die Prozesskommunikation erste1lt. Sie haben, abgesehen von 'Occurrences', hinsichtlich der Funktion identische Ein- und Ausgänge, die aber teilweise verschieden beschriftet sind. Sie werden deshalb gemeinsam beschrieben. Abweichungen sind m i entsprechenden Unter kapitel erklärt. Das Erzeugen von Ressourcen wird im Symbol der zuständigen Funktion mit einem Stern angedeutet. Die Eingänge und Ausgänge in TabeUe 14.2 haben folgende Bedeu tung: 'Name (unbenannt)' Ober diesen Eingang kann man der Ressource (dem reservierten Speicherplatz) einen Na men geben. Wird an verschiedenen Stellen innerhalb derselben Anwendung derselbe Name verwendet, erhält man Referenzen aufdieselbe Ressource (vereinfacht: Adressen auf densel ben Speicherplatz). Allerdings kann man n i nerhalb einer Anwendung den gleichen Namen für Elemente von verschiedenem Ressourcentyp verwenden. Das heißt, man kann Z.B. ei nem Semaphor und einem Rendezvous den gleichen Namen 'Fritz' geben. Lässt man den Eingang für den Namen unverdrahtet oder übergibt man einen leeren String, erste11t Lab VIEW bei jedem Aufruf eine andere Ressource. Intern bedeutet das Erzeugen einer Ressource die Festlegung einer eindeutigen Speicher adresse und die Reservierung des betroffenen Speicherplatzes. Das Prinzip wurde schon in Abschnitt 7.1.2 im Zusammenhang mit Referenzen beschrieben. Das VI in Bild 14.9 und Bi l d 14.10 zeigt diese1be Vorgehensweise am Beispie1 eines Semaphors. Das VI enthält eine Schleife. Wird dem Semaphor kein Name zugeordnet, werden ständig neue Referenzen erzeugt, Speicherplätze reserviert und zusätzlich nummeriert. Gibt man dagegen einen Na
men vor, m i Beispiel 'Emil', erzeugt die Schleife nur eine einzige Referenz und reserviert auch nur Speicherplatz für einen Semaphor namens 'Emil'. Das Erste1len einer Ressource mit Namen hat also den Vorteil, dass die Referenz auf die Ressource nicht jedem VI oder SubVI als Parameter übergeben werden muss. Das SubVI kann sich die Ressource selbsterzeugen, sofern es nur den Namen kennt.
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427d592981cf089d91b1gecaOOaO. Zentral- 2009.07.31 21:42:39 +02'0 ' u
14
250 für
Parallelverarbeitung, Ereignis-. Zeitsteuerung
Funktionen das Erzeugen von Res ourcen die Prozes kommunikation Ereignis ��J-� (Engang,
Tabelle 14,2
für
[§I-
Name (..-benan>') GrOße (l) vortwldenes ausgeben (F) ...., km FI!I*r) ,
r- �IM
Semapho< Neu erstelt Lfelier (Aus9ang)
Weitere Eingänge und Ausgänge sind: 'Vorhandenes ausgeben (F)' bzw. 'Erzeugen, wenn nicht gefunden? (T)' Dieser Eingang muss für unbenannte Ressourcen auf jeden Fall auf den entsprechenden Standardwert gesetzt werden oder unverdrahtet bleiben, anderenfalls tritt ein Laufzeitfehler auf. Allgemein gibt man hier an, ob eine bereits existierende Ressource verwendet oder eine neue erstellt werden soll. 'Neu erstellt' bzw. 'Neu erzeugt?' Liefert TRUE, wenn eine Ressource neu erzeugt wurde, sonst FALSE. Semaphor, Rendezvous usw. Alle Funktionen liefern hier die Referenz auf die jeweilige Ressource, die für nachfolgende Aufrufe von Funktionen verwendet wird. 'Fehler (Ausgang)' Sollte aufjeden Fall überprüft werden.
IAufgabe 14.2
Starten Sie das Programm SemaphocBeispieC1.vi mit und ohne Namensgebung und beobachten Sie das Verhalten in beiden Fällen. Kopieren Sie das VI unter dem Namen Semaphor_Beispiel_2.vi und lassen Sie beide VIs paralleJ laufen. Was geschieht, wenn Sie n i beiden Programmen denselben Namen 'Emil' für den Semaphor vergeben?
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- 2009_07_31 21:42:39 +02'0 ' u
14.3 Parallelverarbeitung unter LabVJEW
251
Bild 14.9
Semaphor_Beispiel_1.vi, Panel
Iä§" m�1 � �
I!lirl lfj
[j]
Bild 14.10
14.3.2
DiagrammzuBild14.9
Freigabe von Ressourcen der Prozesskommunikation
Generell gilt, dass alle Ressourcen einer Anwendung auch wieder freigegeben werden müssen. Für jede Ressourcenart existiert eine eigene Funktion, siehe Tabelle 14.3. Nur die 'Occurrences' müssen nicht vom Programmierer freigegeben werden. Sie verschwinden automatisch bei Beendigung des VI. Das Freigeben von Ressourcen wird m i Symbol der zuständigen Funktion mit einem Kreuz angedeutet. Tabelle 14.3
Funktionenfürdas Freigeben von Res ourcen für die Prozes kommunikation Semaphor
�
Gfl
Rendezvous ---j
-...........
,- (..."..".l
Rend
ezvous
-Name
li LJ. - F�er (Ausgang) ,_ hoo" bei. . • Sema!>hoo" Ire...
[;0]
FunktionenPalet enansicht: 'Semaphor'
�-$I..
Bild 14.12
Bi l d 14.12 zeigt die Semaphor-Funktionen. Sie arbeiten im Prinzip wie folgt: Mit 'Semaphor belegen' und 'Semaphor freigeben' (erste Zeile, zweites Element von links) entnimmt man eine Marke aus einem Topf, der beim 'Semaphor erzeugen' (siehe Tabelle 14.2) standard mäßig mit einer Marke gefüllt wird. Man kann durch Eingabe eines Wertes größer I für den Parameter 'Größe
(I)'
anfangs auch mehrere Marken in diesen Topf geben. Jeder Pro
grammteil, der auf einen schützenswerten Datenbereich zugreifen will, muss nun mit 'Sema phor belegen' eine Marke entnehmen. Isl keine Marke im Topf, wird dieser Programmteil nicht ausgeführt, weil ein anderer Programmteil im Besitz der Marke ist. Am Ende eines solchen Programmteils müssen die Marken mit 'Semaphor freigeben' (erste Zeile, drittes Element von inks) l zurückgelegt werden. Eine einzige Marke (Standardwert für 'Größe
(I)') genügt, um das in der
Informatik wohl
bekannte Beispiel vom Produzenten und Konsumenten und zu behandeln. � �p",� " ,
,
l �· i:!L "
�
Cl Fm"..".,.1..
ITl
. -m
=t.'-.J
�
0----{]] � ..,.....,
�OL I '
� . M. ,
,
11:k" , 1:u\·!Sdnlt,.. ,
il C
I!\iil bl 5oe � (
I
Bild Haupt eil desDiagrammsvon'$erieI PC'_VI$A.vi' 15.5
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- 2009.07.31 21:42:39 +02'0 ' u
15 Serielle Eingabe/Ausgabe
272 Die Wirkung des Diagramms in Bild 15.5 ist folgende:
Öffnen der seriellen Schnittstelle und Schließen sollten eigentlich ganz links bzw. ganz rechts im Diagramm stehen. Diese Abschnitte wurden nach unten gezogen, damit die Be schriftung n i der Abbildung noch lesbar bleibt. Der Kern des VIs ist eine While-Schleife, die nur mit 'Stopp' beendet werden kann oder wenn ein Fehler aufgetreten ist. Sie enthält zwei Case-Strukturen, deren Selektoren nicht wie üblich mit booleschen Variablen verbunden sind. Vielmehr ist die Gase-Struktur links mit einem Steing verbunden. Der Standardfall tritt ein, wenn der Steing Zeichen enthält. Die Alternative ist der leere Steing. Ähnlich bei der Gase-Struktur rechts: Hier ist der Selektor mit einer Integervariablen verbunden. Der Standardfall tritt für Integerwerte ungleich 0 ein, die Alternative für den Wert O. Bild 15.6 zeigt diese Alternativen.
[, _ffil : - Go" ...,,", "
•
,
"L �
���enl
� �.
B ill!
Bild Aus chnit aus Bild 15.5:dieAlternativenderbeiden Case-Strukturen 15.6
Die Verbindung einer Stringvariablen mit dem Selektor der Gase-Struktur wird in folgender Weise hergestellt:
1) 2)
Case-Struktur von der Funktionenpalette ins Diagramm ziehen, String-Bedienelement mit dem Gase-Selektor verbinden. Die SeJektor-Beschriftung zeigt dann einmal ' "False", Standard' und n i der A1ternative ' "True" '.
3)
Diese Bezeichnungen abändern in 'Standard' bzw. in ' "" " wie das in Bild 15.5 und Bild 15.7 zu sehen ist.
Die Case-Struktur links in Bi l d 15.5 prüft nun, ob der String 'Texteingabe' Zeichen ent hält. Das ist erst dann der Fall, wenn der Anwender nach Eingabe von Zeichen mit der Maus neben das Eingabefeld geklickt hat. Bis dahin ist der String leer. Die Gase-Struktur schaltet auf "". Dieser Teil (Bild 15.6) ist leer. Die nächste Abfrage betrifft die Gase Struktur rechts. Hier wird geprüft, ob Bytes m i seriellen Puffer aniegen. l Auch das ist zu nächst nicht der Fall, denn da noch nichts gesendet wurde, konnte das VI auf PC 2 noch nicht reagieren, hat also keine Kontrolldaten an PC 1 geschickt. Hier schaltet die Case Struktur aufden leeren O-Rahmen. Solange also der Anwender noch nichts definitiv ein gegeben hat, läuft das VI leer in der While-Schleife. Um eine überlastung des Prozessors vermeiden, wurde eine Wartezeit von 100 ms einprogrammiert. In beiden Sequenzen wird der schon in Abschnitt 12.2.1 besprochene Rückkopplungs knoten verwendet. Das spart lokale Variable. Löst der Anwender durch Mausklick neben das Texteingabe-Fenster in Bild 15.4 die übertragung aus, schaltet zuerst die Case-Struktur links auf 'Standard' (keine leere Zei chenkette). Dort wird der neu eingegebene Text mit dem Gesamttext verkettet und mit 'VISA: Schreiben' an PC 2 gesendet. Außerdem wird die Texteingabe gelöscht. Nun läuft das VI wieder so lange leer, bis PC 2 die Kontrolldaten gesendet hat. Sobald Bytes m i Puffer der seriellen Schnittstelle angekommen sind, schaltet die rechte Gase-
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zenlral- 2009_07_31 21:42:39 +02'0 ' u
15.3 Die USB-Schnittstelle
273
Struktur auf 'Voreinstellung' (Standard). Die Zahl der angekündigten Bytes wird gelesen und dem Kontrolltext hinzugefügt. Das Programm auf PC 2 arbeitet ähnlich, nur mit umgekehrter Reihenfolge der Abfragen. Für das Funktionieren der VIs sind auch noch Initialisierung und Schließen wichtig. Sie sind, was die serielle übertragung betrifft, bei den Vls aufpC 1 und PC 2 identisch.
�""I
Bild 1 5.7
Haupt eil desDiagrammsvon'$erieI PC2_V1$A.vi'.
IAufgabe 15.1 Versuchen Sie, 'SeriellPC2_VISA.vi', vom Diagramm in Bi l d 15.7 ausgehend, zu vervoll ständigen.
IAufgabe 15.2
Bauen Sie auch 'SeriellPC1_VISA.vi' von Beginn an neu auf und testen Sie die Kommu nikation zwischen zwei verschiedenen PCs. Merke: Die serielle Schnittstelle RS-232 wird heute mit VISA-Funktionen program miert. VISA bedeutet 'Virtual Instrument Software Architecture'. VISA ver einheitlicht die Programmierung verschiedener Schnittstellentypen.
1 S.3
Die USB-Schnittstelle
USB ist die Abkürzung von 'Universal Serial Bus', einem modernen schnellen Bus, der mehr und mehr die bekannte RS-232-Schnittste1le verdrängt. In letzter Zeit wird er auch zur über· tragung analoger Messwerte verwendet, nachdem ein AD-Wandler, auch Analog-Digital· Konverter (ADC), diese in eine Bitfolge umgewandelt hat. Das kann man im Prinzip auch mit der RS-232 machen. Nur ist das für Echtzeitdaten meist nicht möglich, wei l die übertra gungsrate dort normalerweise bei 9600 bitls und maximal bei 128000 bitls iegt, l während
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- 2009.07.31 21:42:39 +02'0 ' u
15 Serielle Eingabe/Ausgabe
274
USB l.l bis zu 12 MbitJs gewährleistet, also das 100- bis lOOOfache, und USB 2.0 sogar 480 Mbit/s . Manche Finnen liefern bereits die erforderlichen USB-LabVIEW-Treiber zusammen mit ihrer Hardware. Andere stellen DLLs bereit, welche die erforderlichen Funktionen zur An steuerung der Hardware enthalten. Im letzteren Fall können wir mit elF-Knoten nach dem Muster von Abschnitt 9.7 arbeiten. Um die Programmierung (Abschnitt 9.7.1) brauchen wir uns dabei nicht zu kümmern. Wir geben ein Beispiel: Conrad Elektronik bietet unter dem Namen 'USB EXPERIMENT INTERFACE BOARD' eine sehr preiswerte Platine zum Expe rimentieren mit der USB-SchnittsteUe an. Darin enthalten ist eine DLL mit dem Namen 'K805SD.dll', die alle Funktionen zur Ansteuerung der Platine enthält. Die Platine selbst hat zwei analoge Eingänge, zwei analoge Ausgänge, einige digitale I/Os und verschiedene andere Funktionen, die hier nicht interessieren. Der AD-Wandler arbeitet mit 8 Bit. Das ist nicht überwältigend, reicht aber für erste Versuche. Daher auch der Name 'Experimentier. . . '. Bild 15.8 zeigt die Platine. Um mit der Software K8055D arbeiten zu können, braucht man natür ich l eine Auflistung der darin enthaltenen Funktionen mit Namen und Kurzbeschreibung. Diese ist vorhanden und wird auszugsweise in Tabelle 15.1 wiedergegeben.
Bild 1 S.B
Experimentierplatineder Firma Veleman , 20 8vertrieben von Conrad Elektronik
Eine ausführlichere Beschreibung findet man im Handbuch auf der mitgelieferten CD unter K8055_VMII0 USB Board\Software Manual\MAN_UK_K8055_DLLpdf. 15.3.1
Programmierung unter Wlndows
Bi l d 15.9 zeigt die Ausgabe von Analogwerten, die von einem Funktionsgenerator erzeugt, auf die Experimentierplatine von Bild 15.8 geleitet (Anschluss links oben im Bild) und von dort über den USB-Stecker (vorn rechts m i Bild) als Bitstrom per Kabel an den PC weiterge geben wurden. Das Diagramm dazu ist n i Bild 15.10 bis Bild 15.12 dargestellt.
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00. ID:7ac0427dS929S1cf089d91b1gecaOOaO, Zentral- 2009_07_31 21:42:39 +02'0 ' u
15.3 Die USB-Schnittstelle
275
Kern des Programms ist die Konfiguration von drei ClF-Knoten unter Verwendung der in TabeUe 15.1 aufgeführten drei Funktionen 'Open Device', 'ReadAnalogChannel' und 'Close Device'. Sie erfolgt nach dem n i Abschnitt 9.7.2 besprochenen Verfahren. Tabelle 15.1 'ifdef
exte�n 'endif
InhaltderDatei K805 D.h cplu�plu�
ftcft (
__
'define FUNCTION
decl�pec ( dllimpo�t)
__
FUNCTION long
�tdcall OpenDev1ce(long CardAddre��);
nmCTION long
�tdcall ReadAnalogChannel (long Channe l ) .
nmCTION
�tdcall Clo�eDevice ( ) ;
FUNCTION
�tdcall ReadAllAnalog (long ·Datal,
long ·Data2 ) ;
FUNCTION
�tdcall OutputAnalogChannel (long Clu>.nnel,
FUNCTION
�tdcall ClearAnalogChannel (long Channe l ) ;
�tdcall OutputAIIAnalog(long Datal,
FUNCTION
long Data ) ;
long Data2 ) ;
�tdcall ClearAllAnalog ( ) ;
FUNCTION
�tdcall 3etAnalogClu>.nnel(long Channel) ;
FUNCTION
�tdcall 3etAIIAnalog ( ) ;
nmCTION
�tdcall WriteAIIDigital(long Data ) ;
nmCTION
�tdcall ClearDigitalChannel (long Clu>.nnel ) ;
FUNCTION
�tdcall ClearAIIDigita l ( ) ;
FUNCTION
�tdcall 3etDigitalChannel(long Channei ) ;
FUNCTION
FUNCTION
�tdcall
3etAIIDigital ( ) ;
FUNCTION bool
�tdcall ReadDigitalChannel (long Clu>.nnel ) ;
nmCTION long
�tdcall ReadCounter(long CounterN r ) .
FUNCTION long nmCTION
�tdcall Re�etCounter(long CounterN r ) ;
FUNCTION 'ifdef
�tdcall ReadAIID1g1tal ( ) ;
�tdcall
3etCounterDebounceTime(long CounterNr,
long DebounceTime) ;
cplu�plu�
__
)
'endif
beerziedeugrtAuenfPSnaiannhuemsl-deeSceshinPweriornggmiruatnmgemsinveomnUSeFBtuw_nAnaktiaolongsg_eChnearrta.tvoir Bild 15.9
7 Hz
Es genügt übrigens, als DLL die Datei 'K8055D.dll' (mit Pfadangabe) zu benennen. Die Namen aller dort verfügbaren Funktionen kann man dann aus dem Menü zu 'Funktions name' entnehmen, siehe Bild 15.13. Es enthält eine Kurzfassung der n i Tabelle 15.1 aufgelis teten Namen. Trotzdem kann man auf diese Tabelle nicht verzichten, weil man auch die Datenty pen wissen muss. Das Programm beginnt in Rahmen [01 der Sequenz mit dem Öffnen der USB-$chnittstelle. Dazu ist die Kartenadresse entsprechend der Anordnung von zwei Jumpern einzugeben, wie dem Kommentar n i Bild 15.10 zu entnehmen ist. Der Funktionsprototyp muss am Ende des
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- 2009.07.31 21:42:39 +02'0 ' u
15 Serielle Eingabe/Ausgabe
276
Konfigurationsprozesses 'Iong OpenDeviceOong argl );' oder 'Iong OpenDevice(long CardAddress};' sein. Das Symbol ist gemäß Bild 15.10 anzuschießen. l Wichtig ist besonders, den oberen Ausgang anzuschießen. l Findet das VI die richtige Kartenadresse, liefert es die am Eingang angegebene Kartennummer zurück, andernfalls -I. Der untere Eingang liefert immer zurück, was links eingegeben wurde, unabhängig davon, ob die Kartenadresse existiert oder nicht. Es wurde schon erwähnt, dass beim elF die links stehenden Größen, abgesehen vom obersten Ausgang, einfach durchgereicht werden. o 0., \ ..
oder Ertfemen von z"";
e.tleQen der K....e< .ten.D .... AbMngig vom
zen l..o1l*n lJ Karte � es doo Acressen 0 bis 3. Zieo't beide billef, gil Messe3, oie tJ dem
.......
Bild 15.10
.-den...,.•.
'Open Device' in Rahmen desVI.Dazu istdieKartenadres eerforderlich [0]
1 0,,1 ..
FAlSE ..
[j]
Bild 15.11
•
Einlesenderim 8-Bit-AD-WandlergebildetenWertevonderU$B-$chnit stele
In Rahmen [1] wird im FALSE-Teil der Gase-Struktur ein umgewandelter Analogwert nach dem anderen eingelesen und aufeinem Chart ausgegeben. Man erhält Daten zwischen 0 und l den kann. Es ist eine 255, weil ein 8-Bit-AD-Wandler nur 2' = 256 verschiedene Werte bi Besonderheit der Vellemann-Karte, dass sie nur positive Spannungen akzeptiert. In unserem BeispieJ wurden deshalb am Funktionsgenerator ein Offset von 2,5 V und eine ebensolche Ampitude l eingestellt. Man erhält so eine Sinusfunktion, die zwischen 0 und 5 V schwankt. Die Anzeige soll n i Volt erfolgen, also muss man umrechnen mit 5/255.
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00. ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- 2009_07_31 21:42:39 +02'0 ' u
15.3 Die USB-Schnittstelle
277
Nach dem Stopp muss die USB-S 3,5 V) und für den logischen Pegel I den Wert 0 V «
1,5 V) vor. Der logische Wert 0 ist dominant, d.h. legt ein Knoten diesen Wert aufdie beiden Busleitungen, überschreibt er den logischen I-Wert eines anderen Knotens, der zufällig zur gleichen Zeit auf den Bus zugreift. Das ist die Grundlage des prioritätengesteuerten Bus Zugangs, der Kollisionen im Ansatz vermeidet. Im Gegensatz dazu steht das CSMNCD Prinzip beim Ethernetprotokoll (siehe Abschnitt 20.1. 1 ), das Kollisionen erkennt, die gestör ten Sendungen verwirft und sie nach einem zufallsgesteuerten Zeitintervall wiederholt, not falls auch mehrmals. Bild 15,4 lilustriert für drei Knoten und in Anlehnung an [7] das Prin zip des prioritätsgesteuerten Zugangs, wenn alle drei Knoten zufällig zur gleichen Zeit mit einer Datenübertragung beginnen wollen. Hier 'gewinnt' Knoten 3, der seine Sendung unge stört und ohne jeden Datenverlust überträgt. Er beginnt mit dem 'Identifier'
0 I, = 2'0 + 2' + 2' +2'+2' + 2 = 1625
'
Knoten 1 dagegen hat I, = 1663 und Knoten 2 den Wert I) = 1695
J.v.ntificr
CcmJrol-FcId
,1IlIi
l-By
1_" �"'"
•
.. " .. ..
"""_d U""" ,, : , ,,,,
'",n ""oe"*,,
-a
• DAt.,,,,,,,,
• """_",,,, h� · �,
'-
' ,-
•
"
• c"",_,..,.",."
e
-'- .JOl-'"
�
-
0
�
•
�
'I
..
",
0 0 0 0 0
0 0 0 0 0
,�
,
'"
0 ••
.0) 00 lO0000OJ 0000
�"
Z' 1 O , o m 73 01 I,>5
"
'..rlAt· lod %
r::::::
C.
E300 00 00 E9 020000 E200 00 00 E8 020000
:"'tz� •
:"'.
tffiSt'" t)f,
.... ::!t. n.
ITr�tf
1STOPP! -..,...-,�-r-..:;::;-
- LOO-. ......
-"'-�
""""'00
"""
""'" ,,,..,
,,=
�
"""
,.
Bild 15.46 VI zur Steuerung der Datenerfassung von zwei Temperaturen in einem Netz nach Bild 15.45: Die blaue Temperatur wurde in einem Kochtopfgemessen, der gerade erwärmt wird, die rote im TIef " kühlfach eines Kühlschranks, beginnend unmittelbar nach der Ablage des Sensors dort. Bei ca. 9S C wurde der Sensor aus dem Kochtopf entfernt. weil er auf Dauer nurfOr so"e ausgelegt ist
Ausleihe: 31 _07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981 cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
15 Serielle Eingabe/Ausgabe
298
I� �
"""
•.
l!lll
" I�
�
� ..
=ruii
1'=
Bild 15.47 Ausschnitt aus dem Diagramm zum VI in Bild 15.46
•
11-
i�
"1
Erklärung Auch dieses VI wurde aus 'CAN_Beispiel IXXAT.vi' (Bi l d 15.18) abgeleitet. Das Diagramm wurde um eine While-Schleife erweitert. Die Receive-Schleife wird erst ausgeführt, nachdem zwei Arrays für Echtzeitwerte und ein Cluster für die beiden Temperaturen angelegt sind. Jedes Mal, wenn einer der beiden Sensoren einen Temperaturwert empfangt, wird der Iden tifier der Botschaft ('Arbitration ID') abgefragt. Im Beispiel haben die Sensoren die Sensor IDs lOh und I I h, so dass sie den Wert 400 = 190h = 180 h + 10 h bzw. 401 = 191 h liefern.
Davon abhängig wird ein Wert nach 'Temperaturl' oder 'Temperatur2' gespeichert und in einem Signalverlaufsdiagramm dargestellt. Trifft eine Sendung mit einem anderen Identifier als 400 oder 401 ein, stellt das Programm den Wert -100 im Signalverlaufsdiagramm dar.
Nach Stopp werden die Echtzeit-Temperaturwerte in einem XY-Diagramm dargestellt. Dazu
wird die Funktion 'Cluster-Array erstellen' aus 'Funktionen' - Programmieren' - 'Cluster &
Variant' benutzt. Die verschiedenen Senderaten kann man an der unterschiedlichen Häufig keit der Punkte im XY-Diagramm erkennen.
Merke: Der CAN-Bu. war ursprOnglich nur ftlr dieAutoindtutrievorgeaehen. hat .ich aber heute zu einem allgemein verwendbaren Werbeq der Indtutrieautomati
.ierung entwickelt.
Merke: Der CAN-Bu. ist eine Zweidrabdeitung,. die eine Botschaft mit Spumuogen ent gegengesetzter Po1aritit enthllt. Du erhOht die St6ru.nempfindlichkeit. Merke: Die CAN-Botschaften .ind durch einen ldentifier gekennzeichnet. Senden in einem aufdem CAN-Bus aufgebauten Netz mehrere Teilnehmer zuflIlig
gleichzeitig, wird die Sendung mit dem niedrigsten Identifier ungelt6rt weiter geleitet, die Ibrigen Teilnehmer brechen ihre Sendeversuche ab. sobald .ie featstellen. claN ihre Iclentifier einen hOheren Wert haben. Diese Feststellung folgt atu der Dominanz der logischen Null (phy.ikaliJcb: Ditrerenupumuog > 3,5 V)
Merke: Die Bedeutung der aufdem CAN-Bus versandten Datenpaketewird aufhoberer
Ebene (Schicht 7: Application Layer) geregelt. Die entsprechenden Normen sind unter dem Begriffdea CANopen-Prototou. zuaamem ngefult.
IAufgabe 15.11
Programmieren Sie das komplette VI, das in Bild 15.47 nur auszugsweise dargestellt ist.
Ausleihe: 31_07_2009 00:00:00 -08_08_2009 00:0 :00, ID:7ac0427dS929S1cf089d91b1gecaOOaO, Zentral- 2009_07_31 21:42:39 +02'0 ' u
15.5 Der byte-serielle GPIB-Bus 1 5.5
299
Der byte-serielle GPIB-Bus
Der GPIB-Bus (General Purpuse Interface Bus) ist eines der ältesten Bussysteme überhaupt. Er wurde n i den 70er Jahren von der Finna Hewlett Packard entwickelt und hat deshalb auch die Bezeichnung HP-Bus. Später wurde er unter IEEE 488.2 genonnt. Er sollte den Anschluss mehrerer Messgeräte an einen Bus ermöglichen, wobei die Messdaten mit hinreichender Geschwindigkeit zu übertragen waren. Die serielle RS 232-Schnittstelle war dafür nicht ge eignet, einmal weil sie nur eine Verbindung zwischen Sender und Empfanger vorsieht (siehe Abschnitt 15.1), also keinen Bus (lateinisch 'omnibus' für alle) darstellt. Zum anderen ist die bitserielle übertragung zu langsam. Der GPIB-Bus nutzt deshalb 8 Leitungen zur parallelen Übertragung von 8 Bits oder I Byte. Man spricht deshalb auch von Byte-serieller übertra gung. Diese 8 Bits allein reichen jedoch nicht. Zur Steuerung des Busses, an den bis zu 30 Messgeräte angeschlossen werden können, sind weitere Leitungen erforderlich. Insgesamt nutzt der GPIB-Bus 16 Leitungen, siehe Bild 15.48. Die Frage, ob ein so altehrwürdiges System von Interesse ist, muss mit 'ja' beantwortet wer den. Die Ausrüstung vieler Unternehmen enthält auch heute noch GPIB-Bus-f ahige Messge räte, deren Lebensdauer wesentlich größer ist als die durchschnittliche Lebensdauer einer pe-Generation. Deshalb fördert auch National Instruments heute mehr denn je LabVIEW in Verbindung mit dem GPIB-Bus. Gerät 1
(Computer)
Messgerät 2
Computer
Messgerät J
Computer
Messgerät 4
Computer
Handshake Busmarlllgcment
Daten (8 Bits)
Bild 15.48 GPIB-Bus-Konfiguration
Die Programmierung des GPIB-Busses mit seinen 8 Steuerleitungen DAV, NRFD,
bis
EOI im Zusammenhang mit Handshake und Bus-Management ist nicht ganz einfach und recht fehlerträchtig. Umso größer ist deshalb der Vorteil der VISA-Programmierung, die diese Detailarbeit weitgehend eliminiert. Ein einfaches Beispiel soll das zeigen. Es verwendet zwei GPIB-Bus-fähige Keithley-Instrumente: das '230 Programmable Voltage Source'-Gerät, das die Ausgabe einer programmatisch festzulegenden Analogspannung erlaubt, sowie das '2000 Multimeter', mit dem man diese Spannung messen kann. Beide Geräte sind über den GPIB-Bus miteinander verbunden. Die Verbindung zum Laptop erfolgt über das KabeJ 'GPIB-USB-A' von National Instruments, siehe Bild 15.49.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
15 Serielle Eingabe/Ausgabe
300
SlCder Gl'lH-USB-A GPIB Kab 1
Keithley 230 Programmable Voltage Source
Laptop -' _ _ _ _ '--_
u'"
GP1B_ An«;hluss
Keithley 2000 Multimeter
Bild 15.49 Verbindung zweier GPIB-Bus-fahiger Keithley-Instrumente mit einem Laptop
Die Ausgänge der 230 V-Spannungsquelle ist mit dem Eingang des 2000 Multimeters durch Bananensteckerkabel nach Bild 15.50 verbunden. •
__
SENSE ,,,PVT
Keithley 2000
Multimeter (Frontpancl)
•
1 11
w' )
( , ",',lOV.., •
-
� -
""SE
"NSE
c_o......
Kcithley 230
Programmablc Voltagc Source (Riickscite)
Bild 15.50 Der Genauigkeit halber sollten auch die SENSE-Buchsen am Keithley 230 mit verbunden werden
Bevor man ein VI für den GPIB-Bus entwickeln kann, sind Treiber zu n i stallieren. Dies wird im nächsten Abschnitt beschrieben.
15.5.1
Installierung der Software
Folgendermaßen geht man bei der Installation der GPIB-Software vor:
I. Download der entsprechenden NI-Webseite in eigenes Verzeichnis, z.B. 'C:\Download LabVIEW'. 2. Als Administrator anmelden und dort ni488222.exe ausführen. Das führt zum Entpacken und zur Installation von 'NI-488.2' in 'C:\Nationai Instruments Downloads\NI488.2\2.2'. 3. Es erscheint ein Assistent, bei dem man 'InstaU Software' wählt. Man folgt den Vorschlä gen und wählt als InstaUationsverzeichnis C:\Programm\Nationai Instruments\. Im 'Hardware Wizard' unter 'Plug and Play Interface' wählt man 'GPIB-USB-A'. Danach 'Shutdown' und 'Finish'. 4. Nach dem Neustart des PC meJdet sich ein 'Assistent für das Suchen nach neuer Hard ware'. Von ihm Software nstallieren i lassen und mit 'FertigsteJlen' beenden. Dann den MAX aufrufen. Zunächst ist unter 'Geräte und Schnittstellen' nur 'GPIB (GPIB-USB-A) zu finden. Daher Rechtsmausklick und 'Scan for Instruments'. Dies hat keinen Erfolg, so lange der USB-Stecker von GPIB-USB-A nicht eingesteckt und das oder die Geräte noch nicht eingeschaltet sind! Bringt man jedoch die Keithley-Geräte 230 und 2000 (unser Bei spiel) ans Netz, zeigt der MAX zwei neue Instrumente, siehe Bild 15.51.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
15.5 Der byte-serielle GPIB-Bus
301
_GPIBInt..!",, """"
>lT
IiII'slnrrlhY_cf>on "',",,"n. !>iI>
,..... "'*"""" "'-61 ""'-"'" . . ''' ''''"''
IbO�''''''
","""",
-
� Hlbn SIe ..... \IIorheron ........ .. K..aIe oder
<Shft>QDOdt. ( ZtJIiri.
Vi.... )
0 �
1
I,
IiIJ
AbbMich der Tas!< AusfChl.\"lg de, VI, DAQmx . Tas!< ,;ti>ftffi ode< DAQmx . 5c"� befand. der E...... Auto.ta,t de, VI, eJ: TRLl' 9"setzt ....de. ..
3
4
beSÜlme
5 Bild 16.14 Die fünf wichtigsten Funktionen zum Aufbau eines Vls, das Analogwerte einliest
Wählt man 'Simuliert_SpannungTask_1Sample' als Task für das in Bild 16.12 dargestellte VI 'EinfachsCLesenMehrfach.vi', erhält man Bi l d 16.15. Wählt man dagegen 'Simu iert_NSpannungenTask_NSamples' l als Task, erhält man die Anzeige von Bild 16.16.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
314
16
- .. � ...'" .. ,.•
c •
"",",
""''''''' - .... -
Messdllten-Eingabel-Ausgabe
----
-'"
--
i
" ",,,"', ..
IsTOP" EI
,
50'rUi0rtflSparn.Tn,)on MI\..�
,
"
-
,
v
•
-10
,
I
02.LO,ZIDI
az.lO,ZIDI
08:19:53,307
08:19:S3,1S() ,.
Bild 16.16 Das VI liest innerhalb der Schleife Bild 16.15 Frontpanel zu Bild 16.12, diesmal mit einem anderen Task. jeweils N mal vier verschiedene Analogwerte mit vier verschiedenen Amplituden von vier Das VI liest innerhalb einer Schleife jeweils nur einen Analogwert von einem Kanal. Es liest hier verschiedenen Kanälen. Historienlänge 1 024, aber zu schnell, d.h. denselben Wert mehrfach. Skalierung von x- und y-Achse erfolgt automa Die Historienlänge beträgt 1 024, die Skalierung tisch der x-Achse erfolgt automatisch
Wählt man schließlich 'Simuliert_NSpannungenTask_Kontinuierlich', sieht man die vier Kurven von Bild 16.17. •
• , Cl!:23:S5,111 (1;2.10.2008
,.
08:2'1:0'5,3'9:2 (1;2.10.=
Bild 16.17 VI bei Auswahl eines Tasks, der vier simu lierte Spannungen kontinuierlich einliest. Historien länge 400, automatische Skalierung der x-Achse
Das Ergebnis von Bild 16.15 ist nicht befriedigend. Das VI sollte
um
eine veränderliche
Wartezeit pro Schleifendurchlauf ergänzt werden. Außerdem sollte die Stoppfunktion genutzt werden, die Rücksetzfunktion zur Freigabe nicht mehr genutzter Hauptspeicher bereiche und eine Fehleranzeige. Das so verbesserte VI ist in Bild 16.18 dargestellt. Bei Wahl von 1 ms Schleifen-Wartezeit entsteht aus der Kurve von Bild 16.15 die geglättete Kurve in Bild 16.19. Die Darstellungen in Bild 16.16 und Bild 16.17 ändern sich dagegen mit dem neuen VI nur unwesentlich. Doch wird das VI durch 'DAQmx - Task zurücksetzen' gestoppt und alle vom Task benötigten Ressourcen im Hauptspeicher werden freigegeben.
Bemerkung Die n i Bild 16.16 dargestellten vier Kurven haben Unterbrechungen. Das liegt daran, dass in dem 'Simuliert_NSpannungenTask_NSamples' zugeordneten Task N Sampies eingelesen werden. Das N wird im virtuellen Kanal eingestellt, der bei der Taskauswahl definiert wurde.
In unserem Fall sind es 'N Sampies', 'Zu lesende Sampies' = 100 bei einer Scanfrequenz
(Rate) von 1kHz, der Schaltungsart 'Differentiell' und dem 'Signaleingangsbereich' +-10 Volt
für alle vier Kanäle.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
315
16.2 Allgemeines
Das bedeutet, dass jeweils 100 Analogwerte geJesen und dann im Signalverlaufsdiagramm auf dem Frontpanel ausgegeben werden. Wegen der While-Schleife (die für diesen Modus im Prinzip überflüssig ist) wiederholt sich das Ganze mit einem kleinen Zeitversatz von
�I
geschätzten 20 ms. , ,
""'
. � '
' 0
..
1,.Ion*,> 1DWfm
...:",iIo NS......
[TI
�
-"
o.!...J '�OooI ..�
�,
l.�
� • "',,,,.,,"',, 00."'",,""
:n1O.lOO3
�
,
.
2O.IO.J:Oj '"
"" ""',
2O, lO,i'OClI
Bild 16.46 Auslesen des USB-6251-Pufferspeichers in den RAM des Laptop erfordert durchschnittlich 5 ms o h n e Anzeige im Signalverlaufsgraph und 7 ms mit Anzeige. Das Diagramm dazu findet sich in Bild 16.47
Bild 16.47 Diagramm zu Bild 16.46: Zeitbestimmung für Puffer lesen und Anzeigen in einem Graph.Die Verzögerung von 1000 ms links dient dazu, dass das Gerät USB-6251 erst seinen Pufferspeicher füllen kann, ohne dass der Laptop daraufwarten muss
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
328
16
MesscL1ten-Eingabel-Ausgabe
Auch das Speichern der zunächst in das RAM des pe übertragenen Daten auf die Festplatte benötigt Zeit. Bei 100000 Analogwerten wie in Bi l d 16.46 sind es 13 bis 14 ms, bei 1 Million Analogwerten wächst die Zeit überproportional auf ungefähr 280 ms an. Das liegt daran, dass das Windows-Betriebssystem diese Datenmenge stückweise, d.h. ebenfalls gepuffert, übertragen muss, worauf der Anwendet keinen Einfluss hat.
IAufgabe 16.7
Schreiben Sie ein VI, etwa nach dem Muster von Bild 16.47, das die Zeit rur die Umspei
cheruog der Daten aus dem RAM des pe aufdie Festplatte ermittelt.
Die Frage ist nun, ob man bei Verwendung einer Schleife die Daten rechtzeitig zum pe transferieren und dort auch auf Festplatte speichern kann. Zunächst zeigt Bild 16.48 ein VI, das Auskunft über den Stand des Ringpuffers im USB-6251
gibt. Denn während die Datenübertragung zum pe erfolgt, wird m i Modus 'Kontinuierlich' weiter in den Ringpuffer geschrieben. Der Eigenschaftsknoten 'VerfügbSampProKanal' (siehe Bild 16.48) gibt darüber Auskunft.
rnt
mt-�I
...... i-j, �
"'� chonne.
• /'I '� �
I�
S
..
s..-.pe·Tekt �
I
�10 DEI.
1 --e> �,t.oJ yY1 �
I KionOI�,
.1
oO DIIQm ·les.1
--
_.•
-'• ---
Bild 16.52 Die 'Anzeige Fourier' stehtjetzt auf aus. Die Fouriertransformation von 5 Datensätzen (von anfangs 12) wurde bereits angezeigt 7 weitere Elemente in der Queue sind noch abzuarbeiten
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS929S1cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
16.4 Altere NI-Karte PCI-MIO-16E-4 Qot�
, � �iiil(L ';'�mft...
..- _
"'_ "',,.u
." """
. :."
.... :1:.
•
�
�
•
-
�,[;
-
.� . 9"'
,
J' � •
___ (0OC'_A'''.,,, _..ot _Ao""" :;"t�A."""
'-"-","LW (I,W-'"'d-" c.c30140C1:J (I,{)� ,� C ,
_
G"....""",.. ... , üboi9' Fl K�)'I) �Ger!/:eruome S G«!/:en.xrmer �Ger!/:e+anaI
"'@,ou "'@ ,o1_2 "l!l OU
"'II1II
Ioij-Ii' G,,"" . lj')j ",mo:l"� iiIi 1iiI NI·D�Qmx· Ge
iiIi 1iiI TrdOnere NI·DAQ·Iief!/:,
Bild 16.70
Konfiguration mit vier virtuellen Kanälen (eigentlich Tasks in neuerer Bezeichnung), deren Namen willkürlich vom Anwender festgelegt werden können
• KH1j:)·I6E·'I (Gof!/: I) i/ii Q 5k.!iieflrQffi 1Ii- 51 Soft,,,,,e
i/ii- . IVI ["',.ers iOi O Netzwer�
In entsprechender Weise verfahren wir mit dem Digitalausgang 00_1. Unter 'Daten umgebung' findet man jetztvier virtueJle Kanäle entsprechend Bi l d 16.70. Sobald alle Ein- und Ausgänge richtig konfiguriert sind, kann man sie in eigenen Vls ver wenden. Bild 16.71 und Bild 16.72 zeigen PaneJ und Diagramm eines solchen VI. Es handelt sich um eine Minimalversion, die nur einen Analogeingang verwendet.
'--1-1"'������!'�11 ,�
l�
I �
" ", ..
0 ", •
0
,'
.�.
..
...
'.'
Bild 16.71
Ausgabe des Programms 'Analog_Simple.vi'
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009.07.31 21:42:39 +02'00'
338
16
MesscL1ten-Eingabel-Ausgabe
Bild 16.72 Einlesen von Analogwerten über einen Kanal, der auf dem Panel unter der Bezeichnung 'Kanal (0)' einge stellt werden kann
Auch wird hier der Kanal weder spezifisch neu konfiguriert noch bei Programmende geschlossen. Es wird einfach mit den recht sinnvoll eingestellten Standardwerten gearbeitet. Nur den Kanal (channel (0» , die Abtastrate (sampie rate/sec) und die Anzahl der Scans (number of sampies) kann der Anwendet beeinflussen. Das Gerät steht in unserem Fall auch fest (Gerätenummer 1), wei l der pe nur eine Datenerfassungskarte enthält. Merke: Ältere Datenerfassungskarten werden häufig mit einer Signalkonditionie rungseinheit verbunden. Merke: Mit Hilfe des Measurement & Automation Explorers (MAX) kann man auch ä1teren Messdatenkanä1en symbolische Namen geben, die sich später in Vis verwenden lassen.
16.5
TEDS
Bisher haben wir nur mit Spannungen gearbeitet, ohne uns um die physikalischen Größen zu kümmern, die durch Spannungen ausgedrückt werden, z.B. Temperaturen, Dehnungen, Widerstände. Eine Liste dieser Optionen erhält man, wenn man m i MAX einen neuen Task mit 'Datenumgebung' - 'Neu' - 'NI-DAQmx-Task'- 'Signale erfassen' gemäß Bild 16.73 erstellt. Wir werden m i Folgenden nicht näher darauf eingehen. Die Online-Hilfe sagt hierzu das Nötigste. Vielmehr werden wir uns mit den sogenannten TEDS beschäftigen. Dies bedeutet 'Transducer Electronic Data Sheets'. Gemeint sind intelligente Sensoren, die Informationen in Datenblättern (electronic sheets) speichern, Damit kann ein Messgerät den Sensor (unter mehreren) identifizieren, die gelieferten Messwerte empfangen und korrekt interpretieren. Die IEEE-Nonn 1451.4 definiert, in welcher Weise die Datenblätter zu kodieren sind. Herkömmliche Sensoren liefern ein Signal, häufig z.B. eine Spannung, deren Bedeutung als physikalische Größe erst noch im MAX oder im zugeordneten Verarbeitungsprogramm festgelegt werden muss. Das ist mühsam, wenn es sich nicht um einige wenige, sondern um viele Sensoren handelt. Ein TEDS-Sensor sagt dagegen dem Anwender sofort, dass eine Spannung bestimmter Größe, z.B. 1 Volt, eine Beschleunigung von 35,6 mJs� bedeutet, denn diese Kalibrierungsdaten sind im Sensor-Datenblatt abgelegt. TEDS sind besonders dann von Vorteil, wenn viele gleichartige Sensoren benötigt werden. Man denke etwa an Belastungsversuche an der Tragfläche eines neu entwickelten Flugzeugs,
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
16.5 TEDS
339
wo das Schwingungsverhalten an Dutzenden oder Hunderten von Messstellen gleichzeitig aufzunehmen ist. Für die folgenden Versuche wurde der Beschleunigungsmesser 4507 B sln 30124 Theta Shear Delta Tron mit 10 mV/ms·) von Brüel & Kjaer verwendet. Er hat eine Leitung, die im 'mixed mode' betrieben wird. Das heißt, die Leitung kann sowohl Digitalwerte (die Eintragungen n i den 'data sheets') als auch Analogwerte (die Messdaten) übertragen. Die Umschaltung er folgt über ein Relais. Man kann sich dieses Datenblatt im MAX anschauen, siehe Bi l d 16.74. ","',,,,, n "' �,,,,, ,."'_
Measurement & Automation Explorer
...... _ - - ,,-- ..... -....,...---_ .... _ ..... .. _ .__... ... .a ..._ -= .....Io� ... T.kt· . T_ � . "" _• ............, ...,....,, -_.
. ... "_oT.... _ _ _ "'"""""- -........... _ - ��o "
§ M i -IrM i,H iI !i .. rn'CHIO-'''-'.",",'"
" ,jJ 'Cl-'''', 'o"ß
...,,"""
""-'>-ln-.....
Fluo-ln-IiI-OAQ-",iJe
�"' 51-.01""-"V"" �51 Sol",,,, �. mDm""
Bild 16.78
BNC-2096 mit PCI-4474 verbinden
1i () ....ZW«� -l:. IJ'( 20 96 (An.
•
111
•
-J
"""" L1 ,Ke.--.. Kene
I
Ii!ll
...no """" La :
r:;,;t"" ,,,,,,,,bton
r"PC! MD '6E--!
","no
Ii!ll 111
•
• • • • •
11 2D>6--.d.·".,
i L
��
�
,-"
Bild 16.79
Suchen des hardwaremäßig angeschlossenen TED$-Sensors, hier an Kanal 0
Der MAX bringt jetzt eine Anzeige gemäß Bi l d 16.80. Nun muss ein Task erstellt werden. Dazu im Kontextmenü von 'NI PCI-4474' anklicken 'Task erstellen. . .' - 'Signale erfassen. . .' - 'TEDS'. Wählen 'AI: Beschleunigung', dann einen Task-Namen eintragen und beenden. Im MAX werden N Sampies, 2k Sampies und 20k Rate vorgeschlagen. Im Beispiel wurden diese Werte übernommen, siehe Bild 16.81.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009.07.31 21:42:39 +02'00'
342
MesscL1ten-Eingabel-Ausgabe
16
Bi l d 16.82 und Bi l d 16.83 zeigen ein sehr einfaches VI, das n i der Lage ist, ein simuliertes Erdbeben (Tritt an den Labortisch) mit dem Brüel & Kjaer-Sensor aufzunehmen und n i einem Diagramm darzustellen. , ,-; ,, = ,.",: ,: . : :. c :c: x_ = � � � � � � � � -
", 0 ",n""' ffi Wi lil """ �
"-
ii "' ''''ot,,,,,scr-r.tt;,",..,
E]c___,cr."" E]C___LO
iii � NI-C"q., - Gote "" '" KI-MD-'''''', '"",,'
-"
El c___"""",__
'" "" 'HG·tI": 'De,,'
"' �"""'" , ....,.. �.
-
!!ll ill
I
!IJ.,
'"
j
n;j
Bild 16.82 Diagramm eines einfachen VI zum Auslesen der Werte des TED$ Beschleunigungssensors
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
343
16.6 IVI-GeriUNI USB-513
;.. ""----------------".;"';.. ;� ""�
...
0 ..
....= ..
Bild 16.83 Aufzeichnung eines simulierten Erdbebens (Tritt gegen den Labortisch) mit dem TEDS Beschleunigungssensor von Brüel & Kjaer
". "";,.,"'" "'"".'000 '"
1 6.6
lVI-Gerät NI USB-S 13
Dieses Gerät wird ebenfalls über einen USB·Anschluss am Rechner betrieben. Es ist ein sehr kleines Gerät, das zusammen mit dem PC ein Oszilloskop ersetzen kann. Bild 16.84 zeigt dies inks. l Rechts sieht man die Anschlüsse für zwei Analogkanäle und einen Triggereingang. Zusammen mit der zugehörigen Software 'NI-SCOPE' und dem PC kann man damit ein vollwertiges virtuelles Oszilloskop aufbauen.
Bild 16.84 lVI-Digitizer neben Laptop
IVI-Gerät mit zwei Analogeingängen und einem Triggereingang
'lVI' bedeutet 'Interchangeable Virtuel Instruments. lVI-Treiber sind einer der drei von National Instuments unterstützten Gerätetreibertypen : VISA, DAQmx und IVI. Der Zweck von lVI und seine Vorteile sind:
Erleichterter Austausch von Messgeräten. Man kann ein Gerät einer Klasse (z.B. aus der Multimeter-Klasse) durch ein anderes Gerät der gleichen Klasse ohne oder höchs tens mit geringfügigen Änderungen des LabVIEW-Programms ersetzen. Gerätesimulation auf dem Pe. Die Hardware für ein Oszilloskop z.B. ist stark redu· ziert. Alle Bedien· und Anzeigelemente befinden sich aufdem Frontpanel des zugehö· rigen LabVIEW-Programms.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
344
16
MesscL1ten-Eingabel-Ausgabe
Es gibt zur Zeit 8 Geräteklassen: Digitalmultimeter, Oszilloskope, Funktionsgenerato
ren, Gleichspannungsgeneratoren, Schalter, Leistungsmesser, Spektrum-Analysato ren und RF-Signalgeneratoren. Zertifizierte lVI-Treiber werden von National Instruments technisch unterstützt. Zur Festlegung der Ziele und Standards für gängige Prüfgeräte hat National Instruments 1998 die lVI Foundation gegründet, der momentan (Stand 7/2008) 25 Mitglieder angehören. Installation Achtung: Zuerst muss LabVIEW installiert sein, danach hat man die NI-SCOPE Software zu installieren und zuletzt die Hardware. Die Schritte m i Einzelnen sind: I. DVD mit NI-SCOPE-Instrumententreibern einlegen und in der übichen l Weise die Soft ware installieren. 2. Damit der PC später nicht Messungen abbricht, wenn er automatisch in den Ruhezu stand geht, n i der Systemsteuerung 'Energieoptionen' aufrufen und bei 'Energieschemas' für Netzbetrieb 'Festplatten ausschalten' und 'Standby' auf'nie' setzen. 3. Hardwareinstallation durch Verbinden des Geräts NI USB-5133 mit dem Laptop über das beiliegende USB-Kabel starten. Dann erscheint ein Assistent (Wizard), der den An wender durch den weiteren Installationsprozess führt. Dabei wird Software für das Gerät bereitgestellt. Zuletzt wird automatisch der Measurement and Automation Explorer (MAX) aufgerufen. 4. Wählen 'Dieses Gerät konfigurieren und testen'. Damit wird das lVI-Gerät im MAX automatisch unter 'Geräte und Schnittstellen' - 'NI-DAQmx-Geräte' eingetragen. Die 'Datenumgebung' verändert sich dabei nicht. 5. Seriennummer aufschreiben (die auch auf der Rückseite des Geräts steht). In unserem Fall war das OxE9CEFC. Sie wird später bei der LabVIEW-Programmierung benötigt. 6. Selbsttest durchführen. Dieser muss positiv verlaufen. 7. Testpanel aufrufen. Im Beispiel wurden auf Kanal 0 eine Sinusspannung von 2 MHz angelegt, die zu folgender Anzeige führte, siehe Bild 16.85. ....00"'"'1
�
•. .m
:J3
--
.... M b'
-
id
J"" ""oo,oo iI
"""" � lO ' ::J .
!,
..... "
Bild 16.85 Testpanel bei der Installation. Von außen wurde auf Kanal Deine 2 MHz-Sinusspannung angelegt
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
345
16.6 IVI-GeriUNI USB-513
Eigene Oszilloskop-Programme Nun kann man LabVIEW-Programme unter Benutzung der lVI-Treiber erstellen, die unter 'Punktionen' - 'Mess-I10' -'NI-SCOPE' zu finden sind. Das verläuft prinzipiell so ähnich l wie in den vorigen Kapiteln beschrieben. Ein einfaches Beispiel der Datenerfassung auf zwei Kanälen erhält man wie folgt: Unter 'Punktionen' - 'Mess-I10' -'NI-SCOPE' die Funktion 'NI-Scope Express' auswählen und in ein leeres VI ziehen, siehe Bild 16.86. Nach einigen Sekunden erscheint eine Anzeige nach Bi l d 16.87. Hier wurden die Parameter gemäß Bild 16.88 verändert. Danach wurde noch eine grafische Ausgabe hinzugefügt. Außerdem wurden extern eine Dreiecksspannung auf Kanal 0 des lVI-Digitizers und eine Sinusspannung auf Kanal 1 dieses Geräts gegeben, beide mit einer Prequenz von 1,9 MHz. Damit man diese Kurven besser sehen kann, wurden 500 statt 2000 Sampies gewählt.
E x p r e s _ VI f ü r Mo s z i l o s k o pe , n a c h I n s t a l a t i o n de r z u g e h ö r i g e n S o f t w a r e , z u fi n d e n ' ' ' ' ' N I / O I $ C OP E e o e M e s k t t " ; : : ; � � : " " " " � F � : � : � " _ ;; � :' ;; ;; = :; �.�;;;;. ;:� Bild 16.86
� , ....,':"-
.. -
,-
t:
_. N o d. ..
,;,. .
...
- - -
....
�
-.
,;.
..
....
...
o ""'·ov
�;= :;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:==;;:-->-J :.;;;;_� I-------" '� ..z..
"
.J!..
. .....:...
Bild 16.87
Expres ·VI für IVI-Osziloskope
... .!.-
_.
Rebe100cidhMeteKaucmknsgeäplaAnesntezuuletnnigdgdee. DierwuiBneeeAbrrrdeietcanhsMHzmataruaftrekiwuerVtrudnedauf 3,3
Bild 16.88
�------� I=
-->-J """
0
1
10
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
346
16
MesscL1ten-Eingabel-Ausgabe
Startet man nun das so konfigurierte VI aus Bild 16.86, zeigen sich m i Frontpanel ähnliche Kurvenzüge wie in der Anzeige des Express-VIs, siehe Bild 16.89. Diesmal wurde mit Sinus und Rechteckkurven der Frequenz 1 MHz gearbeitet. Eine so hohe Auflösung wäre z.8. mit dem NI U58-6251 nicht möglich. Das virtuelle 'Oszilloskop' zusammen mit dem schnellen Digitizer verhält sich also tatsächich l wie ein 'Hardware-Oszilloskop'. Natürlich ist das Frontpanel dazu noch entsprechend auszubauen. ... � __ _ !:ft . :0' 100 0' ''' l:'V �>d
[=��']
l1lIilI
�·11'8
Q..tei �tdffi
anzei9ffi
,
� "'� J�
Pro;e+1
�J •
"
Mein �.. .
�
.
•
-'C
1
�
.
• 4
Bild 17.3 Der Weg des Datums 'Winkel im Bogenmaß' kann komplett verfolgt werden aufseinem Weg in das SubVl 'BogenlnNeugrad.vi'. wo es die Bezeichnung 'Bogen' annimmt. Diese Variable wird im SubVl in 'Neugrad' umgerechnet. Dessen Wert wiederum verlässt das SubVl und geht im aufrufenden Programm in das Terminal 'Winkel' Ober
Entsprechend kann man auch den kompletten Weg für die Alternative der Umrechnung in Grad zusammenhängend darstellen. Genau dies ist nun bei der gestapelten Sequenz nicht möglich. Hat sie mehr als einen Rah men, lässt sich nur ein Teil des Datenpfades im überbick l darstellen. Den Rest kann man nur sichtbar machen, indem man sich durch die Sequenz hindurchklickt.
Merke: Professionelle Programmierer verzichten aufdie gestapelte Sequenz. In diesem Lehrbuch haben wir uns meist, aber nicht ausnahmslos an die genannte Regel gehalten. Die Programmierung umfangreicherer VIs mit Hilfe der Sequenzstruktur hat einen schwer wiegenden Nachteil, auch wenn man sich aufdie flache Sequenz beschränkt: Die Reihenfolge der Schritte ist durch die Sequenz starr festgeJegt. Hat man z.B. den Rahmen 3 durchlaufen, folgt unweigerlich Rahmen
4. Ein Rücksprung zu Rahmen 2, wo möglicherweise eine Kor
rektur der eingegebenen Daten erfolgen könnte, ist nun nicht mehr möglich. Auch spätere Modifikationen am VI auf Grund neuer Anforderungen sind bei der Sequenzstruktur oft sehr aufwendig. Dies hat dazu geführt, dass in jüngerer Zeit meist eine andere Programm struktur bevorzugt wird, nämlich der Aufbau eines VI als Zustandsautomat.
1 7.2
Zustandsautomaten
Mit dem Begriff Automat verbindet man gemeinhin Geräte wie den Getränkeautomaten, eine automatische Ampelsteuerung im Straßenverkehr oder auch einen Roboter, der auto matisch seine Aufgabe erledigt. Im weiteren Sinn ist aber jeder Computer zusammen mit der
ihn steuernden Software ein so genannter endlicher Automat, auch EA oder FSM (Finite
State Machine) genannt. Wie der Name schon sagt, kann ein endlicher Automat nur endlich viele verschiedene Zustände annehmen, wenn auch deren Zahl häufig jedes Vorstellungs vermögen sprengt. SteJlen wir uns z.B. einen Computer mit dem winzigen Speicher von
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
350
17
Professionelle Programmentwicklung
100 Bit vor. Jedes Bit kann den Wert 0 oder 1 haben, was 2''''
==
10.10 Möglichkeiten der
Speicherbelegung erlaubt und damit die entsprechende Zahl verschiedener Zustände. 10'" ist eine Zahl mit 30 Nullen! Welche Möglichkeiten ein heutiger pe mit I GB == 8 Milliarden Bit Hauptspeicher bietet, lässt sich nur unzureichend erahnen. Die Sichtweise, die von den verschiedenen möglichen Zuständen eines Geräts ausgeht und die Frage stellt, unter welchen Bedingungen es von einem Zustand zu einem anderen gelangt, wird in der Automatentheorie schon seit längerem genutzt. Inzwischen hat sich herausge stellt, dass man sie auch mit Vortei l bei der Programmierung von Computern einsetzen kann. Besonders bei komplexeren Anwendungen ist das sinnvoll, weil es die übersichtlich keit der zu erstellenden Software erhöht. Die Architektur einer so entwickelten Software erlaubt außerdem eine einfache Anpassung an wechselnde Anforderungen.
17.2.1
Notation für Zustandsautomaten
Zustandsautomaten werden in Form von gerichteten Graphen dargestellt. Sie zeigen Zustän de, die durch Pfeile ('gerichtete Kanten') mit anderen Zuständen oder auch mit sich selbst verbunden sind. Um das Programm von einem Zustand in den anderen zu überführen, muss die mit dem Pfeil verknüpfte Bedingung ('Bedingung der Kante') erfüllt werden. Die Bedin gung an einer Kante kann auch fehlen, dann erfolgt der Zustandswechsel bedingungslos. Bi l d 19.1 zeigt das Zustandsdiagramm für einen Zähler, der zyklisch 0, 1, 2, 3,0, . . zählt, wenn ein Schalter auf dem Panel an ist, und 0, 1, 2, 0, . . . , wenn dieser Schalter aus ist.
Bild 17A Zustandsdiagramm eines zyklischen Zählers, der je nach
Schaltersteilung von 0 bis 2 oder von 0 bis 3 zählt
Das Zustandsdiagramm nach Bild 17.4 ist recht einfach. Wo bleiben hier die unzählig vielen Zustände des Computers, von denen einleitend die Rede war? Die Antwort lautet: Der schwarzer Kreis links oben bedeutet nicht, dass beim Programmstart der Computer in einem ganz bestimmten Zustand ist. Vielmehr sind unübersehbar viele verschiedene Zu stände denkbar, die sich daraus ergeben, dass neben dem hier allein interessierenden Pro gramm für den Zähler normalerweise noch viele andere Programme gespeichert sind. Jede dieser unzähigen l Kombinationsmöglichkeiten versetzt den Computer in einen anderen Zustand. Das wird im Diagramm nicht berücksichtigt. Im obigen Beispiel läuft der Zähler endlos. Bei anderen Zustandsautomaten ist ein Endzustand gewünscht, der durch einen Kreis mit schwarzem Innenpunkt dargestellt wird. Die durch Rechtecke angedeuteten Zustände eines Zustandsautomaten zeigen in den meis ten Fällen nicht einen, sondern eine Menge vieler Zustände an. Das Rechteck, das einen 'Zustand' darstellt, ist also häufig eine mehr oder weniger große Menge von Einzelzuständen, die ihrerseits wiederum als untergeordnetes Zustandsdiagramm dargestellt werden können. Damit lassen sich komplexe AufgabensteIlungen hierarchisch entwickeln, und zwar begin nend mit einer groben Aufgliederung n i der obersten Ebene. Anschließend verfeinert man die Beschreibung der einzelnen Zustände in den darunterliegenden Ebenen. Geht der Pro-
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
17.2 Zustandsautomaten
351
grammierer mit entsprechender übung und Geschicklichkeit ans Werk, kann er das Prob lem nach der bewährten Top-Down-Methode lösen.
Schalter
Bild 17.5 Programmablaufplan,äquivalent zum Zustandsdiagramm in Bild 17.1
Das Zustandsdiagramm in Bild 17.4 kann übrigens auch als Programmablaufplan gemäß Bi l d 17.5 dargesteUt werden. Man sieht daraus, dass Zustandsdiagramme in der Program mierung nicht etwa spezielle Funktionen sind, die erst ab einer gewissen Versionsnummer von LabVIEW bereitgestellt werden. Das Arbeiten mit Zustandsdiagrammen ist nur eine von verschiedenen Programmiermethoden, allerdings häufig eine sehr effektive, speziell bei komplexen AufgabensteIlungen. LabVIEW stellt dafür schon seit jeher geeignete Werkzeuge zur Verfügung. Damit werden wir uns m i nächsten Abschnitt befassen.
17.2.2
Umsetzung Zustandsdiagramm -7 LabVIEW-Programm
Zustandsdiagramme arbeiten nur selten rein sequenziell. Meist enthalten sie Verzweigungen, Rückführungen und Sprünge. Doch kann die Eins-zu-eins-Umsetzung eines Programmab laufplans nach Bild 17.5 leicht recht unübersichtlich werden, zumal wenn er nicht den Be dingungen der strukturierten Programmierung nach Abschnitt 3.1 genügt. Besser ist hier die Umsetzung des Zustandsdiagramms n i Bild 17.4 mit Hi l fe einer Whi l e-Schleife, die eine Gase-Struktur enthält. Jeder Zustand wird als eigener Rahmen n i nerhalb der Gase-Struktur implementiert und durch eine eindeutige Bezeichnung am Auswahlanschluss aufgerufen. Die umschließende While-$c.hleife erlaubt es, alle Zustände abzuarbeiten. Doch ist die Rei henfolge meist nicht sequenziell. Deshalb muss jeder Rahmen einen Rüclc.gabewert liefern, der angibt, welches sein Folgezustand ist. Dieser Wert wird über ein Schieberegister der While-Schleife zurückgeführt. Das Ende des Programms kann gemäß Bi l d 17.6 erfolgen, das den Standard-Zustandsautomaten von 'VI aus Vorlage. . .' im Startfenster von LabVIEW zeigt. Generell kann der Zustand mit jedem beliebigen Datentyp beschrieben werden, doch sind numerische Typen wenig geeignet, da sie oft nicht aussagekräftig sind. Besser nimmt man Datentypen, die mit Zeichenketten arbeiten. Dabei unterscheidet man üblicherweise zwischen 'String' und 'Enum'.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
352
17
Professionelle Programmentwicklung
� ,
�
,
,
,
,
,
,
I
[iJ
Bild 17.6 Standard Zustandsautomat aus der Rubrik 'VI aus Vorlage.. .' im LabVlEW-$tart fenster. Hier wird der Zustand in einer Enum-Variablen beschrieben
17.2.2.1 Strlngs für die Zustandsauswahl Strings können direkt mit dem Auswahlanschluss der Case-Struktur verbunden werden.
�
.�
VOf«cote
.
pot6hnll
I
5tot.str� ..
c::m .
[j]
� stot.SIr.....
,
..
[j]
,
.
Bild 17.7 Zustand SO mit Folgezu stand $1 des Zählersgemäß Bild 17.4. Dieses VI läuft unbegrenzt lange, weil der Schleifenausgang auf 'F' steht
1"" ,e5trinojI ;0
I
mi -lll
Bild 17.8 Zustand $1 mit Folgezu stand $2 des Zählersgemäß Bild 17.4
Bild 17.9 Zustand $2 mit Folgezu ständen $3 und SO in Abhängigkeit von der SchaltersteIlung 'Zähler zählt' des Zählers von Bild 17.4
Ausleihe: 31.07.2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
17.2 Zustandsautomaten
uw1IJ
353
.
".
I
stot.str..... ..
Ist>teStrnoI
•
m
mJ --II!
Bild 17.10 Zustand S3 mit Folgezu stand SO des Zählers nach Bild 17.4
Die Farbe des AnschlussfeJdes passt sich dann der Stringfarbe an. Nun versieht man jeden Zustand mit einer Stringkonstanten, wobei man auf eine möglichsl verständliche Beschrei bung des Zustandes achten sollte. Bild 17.7 bis Bild 17.9 verdeutlichen die Realisierung des Zustandsdiagramms aus Bild 17.4 mit Hilfe von Strings. Bild 17.11 zeigt das FrontpaneJ. l·fij"Nii sa " l ,$1 1 ,
�,,� �"beoten �,oq,n E"joIt �"Chen �ffiqeuoe 00."'"' tfle
--
Bild 17.11 Frontpanel des mit Strings arbeitenden Zustandsautomaten 'Zäh lerString.vi'
Ferner sollte man noch folgende Punkte beachten: Es kann passieren, dass man sich bei der Eingabe der Zustandsbezeichnung vertippt. Besonders Leerzeichen am Anfang und am Ende sind FehlerqueJlen, die nur schwer zu finden sind. Ändern sich die Zustände, müssen die Stringkonstanten angepasst werden. Wird eine Konstante vergessen, führt das zum Fehlver halten des Zustandsautomaten. Abhilfe kann man durch folgende Maßnahmen schaffen: •
•
•
Verwendet man für die Auswahl einer Case-Struktur den Datentyp String, kann man im Kontextmenü über den Punkt 'Groß/Kleinschreibung ignorieren' die Unterscheidung zwischen Klein- und Großschreibung aufheben, siehe Bild 17.12. Dann sind die Bezeich nungen 'ZUSTAND' oder 'Zustand' oder auch 'ZuStand' usw. gleichbedeutend. Die Vor einstellung der Gase-Struktur dagegen ist 'Gase sensitive', d.h., es wird die genaue Schreibweise beachtet. Eine weitere AJternative besteht darin, die Funktionen 'In Großbuchstaben' bzw. 'In Kleinbuchstaben' aus der Stringpalette zu verwenden und n i der Case-Struktur die Be zeichnungen ausschließlich groß- bzw. kleinzuschreiben. Will man Leerzeichen am Ende und Anfang der Zeichenkette ignorieren, kann man diese über die Stringfunktion 'Nicht darstellbare Zeichen trimmen' entfernen.
Mit diesen Vorkehrungen lassen sich bereits vieJe Programmierfehler vermeiden. Weiter sollte man zur Venneidung von Fehlern bei jedem Zustandsautomaten einen Rahmen 'Voreinstellung' gemäß Bild 17.12 vorsehen. Damit wird schon während der Programmentwicklung ein Dialog angezeigt, falls ein Zustand abgearbeitet werden soll, der nicht existiert.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
354
17
r-"�r.. �" '"" � ·=, >r · r, .n �
.. "*," .... ..... aesdub."II 1
r � W""e "', .. "
�.
"m
,
IO �
10
��
�
��
�
.on
,
, ,�
'00
,,�
�
Bild 17.25 Münzwerte in Eurocent
IAufgabe 17.2
Verfolgen Sie im Debug-Modus unter Verwendung einer geeigneten Probe, wie die Clusterkonstante 'Daten' schrittweise mit den Münzwerten gefüllt wird.
Erläuterungen zum Programm Wenn der erste Rahmen der Case-Struktur 'Initiaisiere l Münzwerte' ausgeführt wird, liest die FüR-Schleife im Inneren alle Münzwerte der Variablen 'Münzauswahl' mit Hi l fe des Eigen schaftsknotens 'StringsUndWerte[]', der m i Kontextmenü des Text- und Grafikrings zu
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
17.3 Milnzautomat
361
erzeugen ist. Er liefert ein Array von Clustern mit String und Wert (Value). Innerhalb der FüR-Schleife holt man sich die Werte mit der Clusterfunktion 'Nach Namen aufschlüsseln'. Diese Werte werden rechts unten mit der zweiten Clusterfunktion 'Nach Namen bündeln' in die Konstante 'Daten' eingefügt. Der Automat springt danach n i den Zustand 'Initialisiere Produktauswahl/Preise', in dem er die Bezeichnungen der Produkte und ihre Preise einliest, siehe Bild 17.26.
Bild 17.26 Übertragen der Preise in die Konstante 'Daten' und derWarennamen in den Menü-Ring 'Produktauswahl'
Diese sind in einer Arraykonstante von Clusterkonstanten gespeichert. Der Aufbau dieser Konstanten geschieht in folgenden Schritten: •
•
•
•
•
•
•
Clusterkonstante mit einem leeren String und einer Integerzahl (z.B. 9999) füllen. Stringrahmen etwas in die Breite ziehen, so dass dort später Worte wie 'Schokoriegel' Platz haben. Im Kontextmenü des Clusters 'Autom. Skaierung' l - 'Größe anpassen' wählen. Arraykonstante ins Blockdiagramm ziehen und die Clusterkonstante dort hineinziehen. Die Eintragungen sind anfangs angegraut, wei l die Arraykonstante noch leer ist. Mit dem Werkzeug 'Hand mit Zeigefinger' n i den leeren String gehen und mit 'Getränk' überschreiben. Entsprechend für die Integerzahl 'ISO' eintragen. Der Index der Array konstante muss dabei auf0 stehen. Index der Arraykonstante auf 1 stellen und entsprechend die Werte 'Schokoriegel' und '60' eintragen. Sinngemäß das Gleiche für die Indizes 2 und 3. Array der besseren übersichtlichkeit auf vier Felder aufziehen, siehe Bild 17.26.
i Rahmen 'Initialisiere Münzwerte' werden hier die Münzwerte in die Cluster Ähnlich wie m Konstante 'Daten' übertragen. Zusätzlich hat man die Warennamen 'Getränk', 'Schokoriegel' usw. mit dem Eigenschaftsknoten 'Strings(l' im Eingabeelement 'Produktauswahl' gespei chert. Dieses wurde als zunächst leerer 'Menü-Ring' auf dem Panel erzeugt (zu finden unter 'Elemente' - 'Modem' -'Ring & Enum').
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
362
17
Professionelle Programmentwicklung
Alternativ wäre hier auch die Verwendung von Konfigurationsdateien denkbar, siehe Ab schnitt 8.5.3. In diesem Fall könnte die Produkdiste angepasst werden, ohne die Anwendung selbst zu ändern.
IAufgabe 17.3
Versuchen Sie, das Programm 'Statemachine.vi' alternativ mit Konfigurationsdateien gemäß Abschnitt 8.5.3 zu gestalten.
Anschließend wird automatisch in den Zustand 'Zeige Produktauswahl' gewechselt. Hier werden die Elemente 'Produktauswahl' und 'Produkt kaufen' auf dem Panel sichtbar ge macht, dagegen 'Münzauswahl', 'Einwerfen', 'Rest' und 'Abbruch' unsichtbar, siehe dazu Bild 17.27. Außerdem ist 'Münz Rückgabe' zurückgesetzt. Das ist wichtig in dem Fall, dass vorher bereits eine Kaufaktion durchgeführt wurde.
".."",t.-.j
1'1"";01;"", ,,,,,,,," ,', ·1 liD
"'ooJil,; ere�te �
O!ij
Aus�abetad1 M:inz """,,.r.I
I!LJ
"'-fon
••"
"""oe"""
�=.� r:;;&,tb.�nt \tb:nt \'b:1
Bild 17.29 Zustand 'Zeige Münzauswahl'
Der Zustand n i Bild 17.30 enthält eine dreifache Verzweigung. Entspricht die Summe der eingeworfenen Münzen nicht dem Kaufpreis und wurde 'Abbruch' nicht gedrückt, dann wird der Zustand 'Warte auf 'Münze einwerfen" beibehalten. Drückt der Bediener während des Kaufs den Knopf 'Abbruch', wird in den Zustand 'Breche Kauf ab' gewechseJt. Wurde der vollständige Kaufpreis oder mehr Geld eingeworfen, dann wird der Zustand 'Berechne Münzrückgabe' abgearbeitet. Achtung: 'Berechne Münzrückgabe' besitzt eine höhere Priori tät als 'Breche Kauf ab'. Stimmt das eingeworfene Geld mit dem Kaufpreis überein und wird die Taste 'Abbruch' gedrückt, wird der Kauf trotzdem durchgeführt.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
364
17
Professionelle Programmentwicklung
Jede eingeworfene Münze wird innerhalb der Case-Struktur der 'Rückgabe' hinzugefügt und von 'Rest' abgezogen. Der Kaufpreis ist bezahlt, wenn der Rest kleiner gleich null ist. Der FALSE-Zweig leitet nur die unveränderten 'Daten' weiter. w ,
[I!I
stor'ru>tood . 1"..,,10',Q
:ifl
Bild 17.44 In der LabVIEW-Entwicklungsurngebung verfügbare Design-Muster (Patterns)
Dieses Angebot kann man nutzen, wenn man größere Programmsysteme entwickelt.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009.07.31 21:42:39 +02'00'
17.5
Programmierhiifen
17.5.2
371
Beurteilung Programmeffizienz und geeignete Werkzeuge
Man kann auch die Effektivität eines VI beurteilen. Als BeispieJ betrachten wir 'Sinus Graph_Schlecht.vi', 'SinusGraph_Gut.vi' und 'SinusGraph_Besser.vi'. Alle drei VIs haben dieselben Frontpanel gemäß Bild 17.45.
Bild 17.45 Frontpanel der drei Test-Vls '$inusGraph_Schlecht.vi', '$inusGraph_Gut.vi' und '$inusGraph_Besser.vi'
Die Diagramme aber sind verschieden. Bild 17.46 zeigt 'SinusGraph_S.Oef 62,S 0,0 i6,9 78,1 1-10"',", 125,0
Ge,orrtzd 62,S 125,0 1609,",
0,0
0,0
0,0
0.0
0.0
0.0
15,6 0,0 0,0
0,0 0,0 0,0
"�
15,6 0,0 0,0
Am. DixchI.We
xo
xo M'
xo xo
Mt,elweIaUoch VpeO:Oet rn AnschUss on die"" Dot_ 9!'>peicheft
" KM;e1.ctl
:' Y �ffi "i:; Buid-5peztMt�
18.2.2
--
I
"
I
Bild 18.5 Hinweis auf ungespeicherte Elemente innerhalb des Projekts
Private Eigenschaften der Klasse
Jede Klasse kann mehrere private Eigenschaften besitzen, die in einem Cluster zusammen gefasst werden müssen. Der Versuch, das Cluster durch ein anderes Bedienelement zu erset zen oder mehr als ein Cluster zu erzeugen, führt zu einem Fehler. Man bildet dieses Cluster durch Doppelkliek auf'Addition.ctl' und erhält ein Frontpanel gemäß Bi l d 18.6.
1]1 ' '
Bild 18.6 Cluster zur Definition privater Daten in einer Klasse
i das Cluster ein, ferner die konvertierten Wir fügen nun zwei 5tringelemente 'xs' und ys n DBL-Daten 'x', 'y' als Zwischenergebnisse und zuletzt das Ergebnis 'x+y'. 50 erhalten wir ein Kontrollelement entsprechend Bild 18.7.
Bild 18.7 Private Daten von Addition.lvdass. Später wird sich zeigen, dass dieVariablen 'x', 'y' und 'x + y' an dieser Stelle nicht notwendig sind
Während der Laufzeit sind hier die Funktionsparameter gespeichert. Auf sie können alle Methoden derselben Klasse zugreifen. Werden mehrere Instanzen der Klasse m i Programm erzeugt, können diese auch unterschiedliche Daten enthalten.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
18.2
Erstes Beispiel zur objektorientierten Programmierung
18.2.3
379
Methoden der Klasse
Methoden definieren die (öffentlichen) Schnittstellen der Klasse. Mit ihnen können Daten gelesen und geschrieben werden. I>
P,oJekt EHplo,., Test Ivp,o)*
Dotei rwctCqffi... Or
e
�
•
x
Pfojokt: Test,""'oj
B' . _c�.. • Adn.t.OO.
.. AddI;ion.o;tl
r Ol �_, ,
[� _tier"".,.;
L I!i llIllm'II il TestAdd."; y... 8J1k1.5pe>f� 0
Bild 18.15 Projekt-Explorer mit der Klasse 'Addition.lvclass' und ihren verschiedenen Methoden. Auch das Programm 'TestAdd.vi' ist bereits eingetragen
Mit 'Mein Computer' - 'Neu' - 'VI' im Projekt-Explorer öffnet man ein leeres VI m i Projekt, das man anschließend gemäß Bild 18.16 und Bi l d 18.17 als 'TestAdd.vi' programmiert.
Bild 18.16 Verwendung von Klassen methoden zur Programmierung einer Summe von Zahlenstrings als DBL-Wert. Diagramm I> TeslAdd.vl
------
Bild 18.17 Verwendung von Klassen methoden zur Programmierung einer Summe von Zahlenstrings als DBL-Wert. Frontpanel mit dem Beispiel einer Addition
IAufgabe 18.1
Programmieren Sie analog zu dem oben beschriebenen BeispieJ für die Addition die Subtraktion von zwei Zahlenstrings mittels OOP.
IAufgabe 18.2
Programmieren Sie das Additionsbeispiel ohne OOP. Vergleichen Sie Ihren Aufwand und den Speicherbedarffür die Software bei beiden Methoden.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
18.3
Weitere Beispiele zur OOP
Merke:
383
Die ob;ektorientierte Programmierung (OOP) beruht auf der Bildung von
Klassen. Sie entha1ten Methoden (dynamisches VI in LabVIEW), mit denen allein man auf die privaten Daten der Klassen zugreifen kann.
1 8.3
Weitere Beispiele zur OOP
18.3.1
Vererbung
Das Beispiel von Abschnitt 18.2 sowie Aufgabe 18.1 und Aufgabe 18.2 zeigen, dass es recht mühsam ist, mit den bisher benutzten OOP-Methoden alle vier Grundrechenarten zu behandeln. Auch ist das Ergebnis eher mager. Von den oben genannten Vortei l en der OOP ist hier nur das Prinzip der Kapselung zu erkennen: In Bild 18.16 sind die Eingabevariablen 'x-String' und 'y-String' sowie die Ausgabevariable 'x + y (Double)' zu sehen. Dagegen laufen die privaten Daten, für den Anwender nicht sichtbar, n i den Verbindungsdrähten von 'Setzen.vi' und 'Addieren.vi'. Weitere Vorteile von OOP werden erst deutlich, wenn man das Prinzip der Vererbung nutzt. In unserem neuen Beispiel werden wir damit die vier Grundrechenarten bearbeiten, nämlich
z = x + y,2 = x -y, z = x·y und z = xly.
Dazu benutzen wir eine übergeordnete Klasse mit dem Namen 'AbstrakteFunktion.lvelass'. Sie heißt so, weil wir von ihr keine Instanz bilden werden, wie wir das beispielsweise mit 'Addition.lvelass' in 'TestAdd.vi' getan haben. Sie dient lediglich als eine Art von 'Bauplan' für 'Addition.lvelass', 'Subtraktion.lvelass', 'Division.lvelass' und 'Multiplikation.lvelass', die
wir von ihr ableiten. Das wird eine gewisse Arbeitserleichterung mit sich bringen. Wir bilden ein neues Projekt 'Testl.lvproj' und dort zuerst 'AbstrakteFunktion.lvelass'. Das geschieht, wie in Abschnitt 18.2.1 beschrieben, einschließlich der Programmierung von Setzen.vi und Konvertieren.vi. Anschließend erzeugen wir jeweils neue Klassen für Addition, Subtraktion, Multiplikation und Division. Wir beginnen mit der Addition. Unter 'Mein Computer' im Kontextmenü 'Neu' - 'Klasse' wählen, in 'Addition.lvelass' umbenennen und speichern. Im Kontextmenü dieser Klasse kann man nun unter 'Eigenschaften' die Vererbung festlegen.
Bild 18.18 Eigenschaftsfenster für 'Vererbung'
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
384
18
Objektorientiertf Programmierung
Dazu wählt man die Kategorie 'Vererbung' gemäß Bild 18.18. Auf der rechten Seite ist die Klassenhierarchie der gewählten Klasse 'Addition' angezeigt. Jede benutzerdefinierte Klasse wird zuerst automatisch von 'LabVIEW-Objekt' abgeleitet und kann über die Schaltfläche 'Vererbung ändern. . . ' angepasst werden.
D:\l.I..!lW EW_�. I
3.
Atrooktoo.O--d", .. 5ct>troktoo.ctl � 5ct>trohiefffi.'; il Te>t.,; Y �ffi •borlffi . .i:; Bulj·SpezU
Bild 18..21 Zwischenstand nach dem
_
Einrichten einer abstrakten und zweier ge wöhnlicher Klassen für Addition und Subtrak tion. Auch das Testprogramm Test.vi wurde bereits eingefOgt
Die Klassen für Addition und Subtraktion enthalten weder die Methode 'Setzen.vi' noch 'Konvertieren.vi'. Sie erben sie einfach von 'AbstrakteFunktion.lvclass'. Dagegen sind die Methoden für 'Addieren.vi' und 'Subtrahieren.vi' individuell für die jeweilige Klasse bestimmt. Sie wurden nach dem Muster von Bi l d 18.14 geschrieben.
SUJtrolge\�\""\Gecon
--� -
P , o"lt
,-
-- -
" "
-- Fon"",
�
a ,
"
r
0-; .
10>11."",0'- cow..te< ,
",
Bild 18.30 'AbstrakteFunktion.ctl' benötigt nur die zwei privaten Variablen 'xs' und 'ys'
4. Man kann ziemlich einfach n i einem nach Abschnitt 18.3.2 strukturierten Programm
einzelne Module austauschen. Das wird in Abschnitt 18.3.3 gezeigt. 5. Die Hierarchie der bisher erstellten Klassen kann man sich anzeigen lassen, n i dem man
Projekt-Explorer m i Kontextmenü von 'AbstrakteFunktion.lvdass' m i 'Klassenhierarchie anzeigen', siehe Bild 18.31.
o 18.3.3
aufruft:
Bild 18.31 Klassenhierarchie im Projekt 'Test2.lvproj'. Man erhält dieses Fenster, wenn man im KontextmenO von 'AbstrakteFunktion.lvclass' aufruft: 'Klassenhierarchie anzeigen'. Der obersteWOrfel stellt die LabVIEW-Klasse dar, darunter kommt 'AbstrakteFunktion.lvclass' und wiederum eine Stufe tiefer folgen diezwei Klassen für die Grundrechenarten Addieren und Subtrahieren
Modulaustausch
Die Methode 'Konvertieren.vi' wandeJt Strings in Zahlen um, genauer: Sie wandelt, aus gehend von in arabischer Notation gebildeten Zahlenstrings, diese um n i DBL-Gleitkomma zahlen. Was kann man tun, wenn man n i römischer Notation geschriebene Zahlenstrings in DBL umwandeln will? Zunächst braucht man ein Umwandlungsprogramm etwa nach Bi l d 18.32. Es ist der Funkti on 'Bruch-/Exponential-String nach Zahl' in der Palette 'Funktionen' - 'Programmierung' 'String' - 'StringlZahI-Konvertierung' - 'Bruch-/Exponential-String nach Zahl' nachempfun den und besitzt dieselbe Schnittstelle. Römische Zahlen werden im so genannten Additions system dargestellt. Dabei wird die Wertigkeit einer Ziffer nicht durch h i re Stellung innerhalb
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
18.3
Weitere Beispiele zur OOP
391
der Zahl festgelegt, sondern in rec.ht komplizierter Weise durch verschiedene Buchstaben. Wir wollen hier daraufnicht näher eingehen und verweisen auf alte Schulkenntnisse. Das VI n i Bild 18.32 ist eine einfache Umsetzung dieser Schulkenntnisse, wobei fehlerhafte Angaben nicht vollständig abgefangen werden. Die Regeln heißen:
• • • • • •
'I' steht für I, 'V' für 5, 'X' für 10, 'L' für 50, 'e' für 100, '0' für 500 und 'M' für 1000 Zwei oder mehr Zeichen in Folge bedeutet die Addition ihrer Zahlenwerte Ein 'I' vor 'V' oder 'X' bedeutet Subtraktion 5 - 1 oder 10 - I, wobei weiter gilt
I steht nur vor X steht nur vor C steht nur vor
V L
X C oder M oder
oder
0
Im VI wird nun zuerst die römische Zahl (Zeichenkette) in ihre 'Ziffern' zerlegt. Ziffern können Grundzeichen (GZ: I, X, C, M), Hilfszeichen (HZ: V, L, 0) oder eine subtraktive
Kombination von GZ und HZ entsprechend den oben genannten Regeln sein. Die Zerlegung erfolgt schrittweise über einen regulären Ausdruck im oberen Bereich des Diagramms und
11 "'
11 •
1
I '" JiEl!Lt: @] �[g � ", ,
''''-J
,
�
-""
I
r
D�
)V ii
"
[I]
�I
1111 1
--lXldzei , cheQ iQnor;"r�n n
MOft"
,
R I
-A
Bild 18,32 Umwandlung einer römischen Zahl in eine Fließkommazahl
iefert als Ergebnis ein Array mit den römischen Ziffern. Die Zerlegung wird vorzeitig been l
det, wenn die Eingabe ein ungültiges Zeichen enthält. Dies wird erkannt, wenn der Ausgang 'vor übereinstimmung' der Funktion 'Regulären Ausdruck suchen' keine leere Zeichenkette
iefert l
.
Dann muss das letzte Element aus dem Ausgangsarray entfernt werden, da es bereits
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
392
18
Objektorientiertf Programmierung
die Ziffer nach einem ungültigen Zeichen ist. Liefert die Schleife ein leeres Array aus, war 'String' keine römische Zahl und das VI gibt 'Standard (0 DBL)' als 'Wert' zurück. Wurde eine römische Ziffer im Sinne der oben genannten Definition erkannt, erfolgt das Aufaddie ren. Dazu wird die Ziffer in ihre einzelnen Zeichen aufgespalten, wobei bei einem GZ oder HZ kein zweites Zeichen existiert, so dass die Funktion 'Teilstring' eine leere Zeichenkette iefert. l Auf diese Weise erhalten wir die dezimalen Werte für alle römischen Ziffern. ,,-otei �",tdffi •
[To;,+1
"
�
1 _'''''''''
&nzeiQfCh!!Xflz� r.. Qol. ��r . (;>
-."'.'_ "...0 ....
-
"
0,," �....
I
•
"....,,"'
,
�.
� '" '''''' �_ftort .
' 0'
rm ..•
..t()( �lm "'torl
�.-
.
;.,.
-."'.,_ ....
" ..
r'.i..
.
�
..",, "itün "
..
III
Bild 18AS Diagramm des Test-Vls für Berechnungen mit römischen und arabischen Strings
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
398
18
Objektorientiertf Programmierung
IAufgabe 18.5
Bauen Sie das oben beschriebene Projekt 'FvonX_Y.lvproj' von Anfang an auf.
IAufgabe 18.6
Schreiben Sie eine Rechenmethode für
Programm nach Aufgabe 18.5 ein.
F(x,y) = Jx1 + y2
und binden Sie diese in das
Merke: Die objektorientierte Programmierung (OOP) erlaubt in bestimmten Fällen eine sehr einfache Änderung bereits bestehender Prowamme zur Erweite rung ihres Funktionsumfangs.
Man kann sich die Hierarchie der verschiedenen Klassen anzeigen lassen, indem man im Kontextmenü von 'AbstrakteFunktion.lvelass' aufruft: 'Klassenhierarchie anzeigen'. Im Falle des Projekts 'FvonX_Y.lproj' erhält man eine Darstellung nach Bi l d 18.46.
1,"@ i ti W ii§..!i§fiii.!iJ
o
_
o1text
D x
e i>UI
Bild 18.46 Klassenhierarchie im Projekt 'FvonX_Y.lvproj'. Man erhält dieses Fenster, wenn man im Kontextmenü von 'AbstrakteFunktion.lvclass' aufruft: 'Klassenhierarchie anzeigen'. Der oberste Würfel stellt die LabVIEW-K1asse dar, darunter kommt 'AbstrakteFunktion.lvclass', dann die Klassen für die arabischen Grundrechenoperationen und ganz unten die für das Rechnen mit römischen Zahlen
1 8.4
Schutz einer Klassenbibliothek
In größeren Softwareprojekten wird oft auf bestehende Komponenten zurückgegriffen, die entweder selbst entwickelt oder von einem Drittanbieter zugekauft werden. Ein Drittanbieter wird seine Quellen dem Käufer nicht zugänglich machen, sondern sie vor unerlaubter VervielfaItigung schützen. Der Softwareentwickler kann aber anhand der bereitgestellten öffentlichen Methoden die Komponenten der im übrigen unbekannten Software nutzen und damit eigene Programme entwickeln. Das Erstellen von geeigneten Schnittstellen in der OOP, die eine einfache Nutzung erlauben, benötigt viel Erfahrung.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
18.4 Schutz einer Klassenbibliothek
399
In LabVIEW kann man die Quellen vor unerlaubtem Einblick schützen, indem man ein Passwort verwendet. Dazu im Projekt-Explorer unter 'Build-Spezifikationen' den Punkt 'Neu' - 'Quelleodepaket' m i Kontextmenü auswählen. Man erhält Bi l d 18.47.
Ph!:cpIion {! Ern""', Zo'N''''''''"",, r �",oho. z""..,""frio _ _." r.;. �"'''' p 6ennercel....'..
__oehoo
r
HiF.
Bild 18.47 EigenschaftsfensterfOr 'Quellcodepaket'
Dieses Bild zeigt das Eigenschaftsfenster für das neu erzeugte 'Quelleodepaket' mit seinen Standardeinstellungen. Im Eingabefeld 'Name der Build-Spezifikation' wird der Name des Quellcodepakets eingegeben. Die LabVlEW-Voreinstellung 'Einzelnes Zielverzeichnis' der 'Paketoption' muss unbedingt nach 'Einzelnes Zielverzeichnis - Hierarchie bewahren' geändert werden,
lobVlEW: Dieses dynonosche s..tNI km rm 0U0Q0f0.nt _den, da.., benötigtes VI dot,� V_ffi
("Irrne< i>JS>C_ (" Enbeziefoe'LI
_.
I> Te"E.«I .. Front,a.el
-
P;i: ' ===�:::::::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: �:: !:==��
.!::
•
.4
Bild 19.2 Diagramm und Frontpanel eines VI zum Schreiben in und Lesen aus eine(r) C$V-Datei. Vor dem Start
�_ �_eo &"ole<M'MIt_1 �",I
,
,
/
. + _....... .ecn
•
Bild 19.1B Öffnen von Excel und Anzeigen von 'Mappel' mit drei Tabellen, von denen Tabellel ange wählt ist. Nach Stopp wird mit Hilfe des 'Quit'-Methodenknotens Excel geschlossen Die Programmiermethode ist die folgende: Man erweitert zunächst, ausgehend vom VI n i l d 19.17, den linken Applikationsknoten um die Eigenschaft 'Workbooks' und erzeugt Bi dann mit 'Programmierung' - 'Konnektivität' - 'ActiveX' - 'Methodenknoten' einen Knoten,
der sich anpasst, wenn man ihn mit dem Ausgang der Eigenschaft 'Workbooks' verbindet. Danach wählt man m i Kontextmenü die Methode 'Add'. Damit wird beim Start des VI eine 'Mappel' geöffuet, die unten drei Reiter mit den Bezeichnungen 'Tabelle I' bis 'Tabelle3' aufweist. Man kann in dieser Excel-Mappe wie gewohnt arbeiten, z.B. die Tabelle wechseln, Zahlen eintragen usw. Sobald man Stopp drückt, wird ExceJ geschlossen. Dazu dient der Methodenknoten mit 'Quit' rechts im Diagramm. Es reicht nicht aus, einfach nur die Refe renz zu schließen. Excel würde dann im Hauptspeicher verbleiben, wie man im Task Manager sehen kann. Es ist nicht notwendig, nicht einmal üblich, Excel während der Bearbeitung sichtbar werden zu lassen. Doch ist das bei der Entwicklung eines LabVIEW-Programms unter Umständen nützlich. Ist die Entwicklung abgeschlossen, macht man Excel unsichtbar, n i dem man ein fach die boolesche Konstante am linken Applikationsknoten Bi l d 19.17 bzw. Bild 19.18 zu rück aufden voreingestellten Wert 'FALSE' setzt.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
19
412
LabVIEW: Tabellenlmlkuultion, Datenbanken
Ll ... " .,oft , ..., ... . ... '
"
,
•
, , , m " n .. . . .. Tobdl'" �.
. - (} �
,
•
,
,
t-
+ + + +
nf'
�
Bild 19.19 Excel-Tabelle. automatisch erzeugt mit dem VI von Bild 19.18
19.3.3
Eintragen von Daten In eine Excel·Tabelle
Eine wichtige Aufgabe ist das Eintragen von Daten in die Zellen einer Tabelle (Excel-Sheet). Wir wollen dabei zunächst den Weg verfolgen, den die Entwickler von LabVIEW n i einigen ihrer Beispielprogramme vorgegeben haben.
19.3.4
Verwendung von SubVls
Würde man weiter wie bisher einen Methodenknoten oder Eigenschaftsknoten an den nächsten fügen, wäre das VI bald nicht mehr überschaubar. Man muss also wiederkehrende Aufgaben in Unterprogrammen zusammenfassen. Einige dieser nützlichen SubVIs, die zur LabVIEW-Installation gehören, sind: 'Open Excel and Make Visible.vi', 'Open New WorkBook.vi', 'Open Specific WorkBook.vi', 'Open New WorkSheet.vi', 'Open Specific WorkSheet.vi', 'RowCol To Range Format.vi', 'Set Cell Value.vi', 'Set Cell Valuewith Range.vi'. Man findet diese Vls n i der LLB C:\Programme\National Instruments\LabVIEW 8.2\examples\comm\ExcelExamples.Ub. Für spezielle Aufgaben kann man die VIs n i ein eigenes Verzeichnis umspeichem und modi fizieren. Zum Beispiel wurde in diesem Sinne aus 'Open Excel and Make Visible' ein VI mit entgegen gesetzter Funktion 'Open Excel and Make Invisible' abgeleitet. Mit einigen dieser SubVIs arbeitet das Programm 'WriteTableToXL_Test.vi', dargestellt in Bi l d 19.20 und Bild 19.21. Das Ergebnis ist in Bi l d 19.22 zu sehen. Später wollen wir auch eines der genannten SubVIs, nämlich 'Set Cell Value.vi', näher beleuchten, siehe dazu Bild 19.23 bis Bi l d 19.25.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
19.3
Beispiele zurAnwendungaufExcel
0_
413
"
,
....... --......�� ... o..en . _ � ..... ...
ii '
,
,
---
�� ....�� ..
_ ..
I
--
.... .....)
· � ' Ei r' r ::; 1 1l �-' I
I Bild 19.20 Panel eines Vls, das in eine Excel Tabelle (Spreadsheet) schreibt
T"
Bild 19.21 Diagramm desVl aus Bild 19.20
.Ca l1
"CO; ,
," ce
.' ------.'
;\--,
,
"
" "
CoC
'" " " "
w
"pT .'..
T'. 3. Man sieht nun eine Vorschau aufdie gewünschte Kurve der Quadratzahlen entsprechend Bild 19.31. Fortfahren mit 'Weiter >'.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
19.3
Beispiele zurAnwendungaufExcel
417
"1akto aufzeIChnen
Bild 19.29 Beginn der Aufzeichnung von
'Makrol'
•
Bild 19.30 Wahl von Linie
fl d?�::C;!� 1
,
,
,
,
,
1
,
,
�
Bild 19.31 Vorschau auf die ge wünschte Kurve
4. Im nächsten Diagramm nach Bild 19.32 kann man Titel, Achsen, Gitternetzlinien usw. eintragen. 'Weiter >' führt zur nächsten Ansicht.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
19
418
LabVIEW: Tabellenlmlkuultion, Datenbanken
U".,amm .... "stent "tr�t l v on . UoaorammooOooen na
I"'"oen I ".t�I leoordeI Merbe"f"f...".".,, I Ootert.tde I ......."....
�..-.-n:� 1c "... "h'zl>H
, 0
:e-
,
-
•
,
1�
• �
,
"' 'tJ. · � i � , � �- "."", ,..
".�
- ,
". �
>
" �-
�:t�:t-,e
oe-
,
•
,
+
-
-
'00
�
•
" "
-=
w
-
0
-
+
'w
-
"
2;1-,
+
QUldrotzahl.n
=
F E J.!J
,
" " "
H
"
. o.
,
--+-
--'-
" " "
06 1 ""
��
� ,
,
0
,
� ,
,
/
I R..,·,I
/" °
,
0
w
,
Bild 19.34 Grafik zur Reihe der Quadratzahlen in Spalte Ades Excel·Blatts
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
19.3
Beispiele zurAnwendungaufExcel
419
7. Es folgen 'Extras' - 'Makro' -'Aufzeichnung beenden'. Damit ist ein Visual-Basic
Programm erzeugt worden, das man sich mit 'Extras' - 'Makro' - 'Makros. . .' - 'Bearbei ten' anschauen kann, siehe Bi l d 19.35. Mit 'Extras' - 'Makro' -'Makros . . .' - 'Schritt' lässt sich das Makro debuggen. Über 'Extras' 'Makro' -'Makros . . .' - 'Ausführen' kann man die Grafik auch dann neu erzeugen, wenn man vorher die manuell erstellte Grafik gelöscht hat. Natürlich ist es auch möglich, das Visual-Basic-Programm von Hand zu verändern, zu er weitern und umzuschreiben. In den Programmiermodus gelangt man mit 'Extras' - 'Makro' -'Makros. . .' - 'Bearbeiten'. Doch benötigt man dann einige Kenntnisse über Visual Basic, aufdie hier nicht näher eingegangen werden kann. �
.,.., . .
S"" 1 '' ' r' 01 1 ) JOo."'ol JOo.rro
"0«0
""
" . � ' . "'DI
von '1'"0rq1 .u'q" " o'.�t
.
Chorto >.dd >.ctinCho.rt.CMrtTypo - xHino >.cti....Cho.rt . SotSouoo.hto Souoo. , _Shoot. I "T_ Uo' ") , �onq. 1 "H, HO") .
,·.1C01,..,,,,, �ti...OC""rt.LocotiDn
_hon ,_xHoc.tia"" ""lo"t,
P10tBy
..... ,_"Tabo 1101"
U
ChorlOn" 1. , ChOr""",,", ,Tox" - "w""r�uah1.n" ".,(,lCat.""'T, ,lP"�a'T I . "',Titl� Tr,.,
-
.
bo, Ix1Vd1=, .lPri>'"ry) hi,Tit 10 ,Chonctoro. Toxt _ "x',,, 'r.d Uith e .. , TCP: v..tnd...
1'iIl lSl
�
�
ml!
�
TCP: �
III
C�·AI, ..
TCP: � ", TCP: Ao.t t"'. ..
_0
-..... -- ,
� � -
:" , �o--,�,� �C"� M�"�Mo-"C:t ,.
"3
:�
El
' A
Bild 20.9 $elVer TcpSelVerMitEinemClient.vi'. erzeugt sinusförmige Daten und zeigt sie zur Kontrolle an
Panel und Diagramm von 'TcpServerMitEinemClient.vi' sind aus Bild 20.9 und Bild 20.10 ersichtlich. Der Server erzeugt zunächst einen Listener (Hörer), der auf dem vom Anwendet genannten Port auf die Anmeldung des Client wartet. Entsteht dabei ein Fehler, z.B. wei l dieser Port bereits von einer an deren Anwendung belegt ist, wird in der Case-Struktur der TRUE-Zweig durchlaufen, der leer ist. Anderenfalls, also wenn kein Fehler entstanden ist, wird im FALSE Zweig die von der Ethernet-Karte kommende Leitung auf Anmeldung eines Clients mit seiner IP-Adresse abgefragt. Solange sich kein Client meldet, wird die Funktion 'TCP: Auf Listener warten' nicht verlassen. MeJdet sich aber ein Client, erhält der Listener im Server dessen IP-Adresse. Die Funktion 'TCP: Auf Listener warten' liefert am unteren Ausgang eine eindeutige Verbindungs-ID vom Typ RefNum für die erstellte Verbindung, auf die sich nun alle anderen TCP-Funktionen beziehen. Danach werden in der While-Schleife vonBild 20.10 Sinusdaten erzeugt und mit der TCP-Schreibfunktion solange abgesetzt, bis der Anwender das Programm stoppt. Diese Daten werden zur Kontrolle auch auf dem Server angezeigt. Der Client wird nach dem Server gestartet. Er verhilft diesem zur Aufnahme der Daten produktion. Panel und Diagramm des Client sind in Bild 20.11 und Bild 20.12 dargestellt. Solange der Server noch nicht läuft, bleibt auch der Client in seiner oberen Schleife (siehe Bi l d 20.12) hängen. Wenn er aber läuft, übermittelt er dem Client eine Verbindungs-ID, welche dieser nutzen kann, um Daten vom Server zu empfangen. In der unteren Schleife arbeitet der Client mit der TCP-Lesefunktion. Es gibt verschiedene Modi (siehe Online Hilfe). Hier m i Beispiel wird der Modus 'CRLF' verwendet. Das heißt, es werden maximal so viele ASCII-Zeichen gelesen, wie am Eingang 'Bytes zu lesen' angegeben sind. Im BeispieJ sind das also 15. Das Lesen wird jedoch vorher beendet, wenn die Zeichen CR und LF direkt nacheinander vorkommen, im ASCII-Hex-Code also 'ODOA'. Beide Zeichen werden noch mit übertragen. Die restliche Aufgabe der unteren Schleife besteht nun darin, CR und LF
abzustreifen, den String in eine DBL-Zahl umzuwandeln und der Reihe nach als Funktions kurve auf einem Chart auszugeben. Bild 20.11 zeigt das Ergebnis.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
20.4
443
Programmieren mit TCP/IP
Bild 20.10 Diagramm von 'TcpServerMitEinemClient.vi'.
"""'"'
-
""'..ES
,
"' .....
:� I E1
, , o
, 0
.- - - - -
...
••
Bild 20.11 Anzeige der vom Client 'TcpEinClient.vi' empfangenen Daten
Bemerkungen Lässt man die Programme 'TcpServerMitEinemClient.vi' und 'TcpEinCient.vi' l zusam men auf einem PC mit 1,8 GHz laufen, genügen Wartezeiten von jeweils I ms in den Diagrammen von Bild 20.10 und Bi l d 20.12. Auf verschiedenen Rechnern braucht man mehr Zeit. Da diese von der Art der Netzver bindung abhängt, wurde beim Server (Bi l d 20.10) eine variable Wartezeit vorgesehen. Auf den hier benutzten Rechnern genügen 10 ms. Beide BeispieJprogramme sind sehr einfach. Sie behandeln nicht den Fall, dass zwei oder mehr Cients l Daten von einem Server abrufen wollen. Auch werden die Clients im Nor maifall Parameter an den Server senden. Zum Beispiel möchte Client I eine Sinusfunkti on von 10 Hz mit der Amplitude 2,5 und Client 2 eine Kosinusfunktion mit 50 Hz und der Amplitude 0,7 erhalten. Dieses Problem wird n i Abschnitt 20.5 behandelt.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009.07.31 21:42:39 +02'00'
444
20
Internet, Se",er und Client
" lcpEonClcnt" Iloc�d,.g,am",
[j]
Bild 20.12 Diagramm des (Iient von Bild 20.11
IAufgabe 20.1
Versuchen Sie die Funktionen in Bild 20.12 in der LabVIEW-Funktionspalette zu finden und analysieren Sie diese mit der Online-Hilfe.
IAufgabe 20.2
Testen Sie mit einem Rechner, ob die beiden Beispielprogramme bei Ihnen laufen. Falls nicht alle Daten korrekt übermittelt werden, erhöhen Sie die Wartezeiten.
IAufgabe 20.3
Machen Sie den gleichen Versuch wie in Aufgabe 20.2 mit zwei Rechnern und passen Sie
gegebenenfalls die variable Wartezeit des Servers an.
Merke: Server-Client-Paare für das Internet können aufeinem einzigen Rechner
entwickelt werden. Dazu arbeitet man mit der IP-Nummer 127.0.0.1, auch 'Iocalhost' genannt. Merke: Die Wartezeiten hängen von der Leistungsfahigkeit der Prozessoren und der
Internet-Verbindung ab. Man sollte also variable Wartezeiten vorsehen.
Merke: Bei Windows-Rechnem kann man mit der DataSocket-Methode arbeiten.
Allerdings laufen diese Vis nicht unter UNIX bzw. Linux.
20.5
TCP/IP-Server und mehrere Clients
20.5.1
Vorüberlegungen
Das Programm in Abschnitt 20.4.2 zeigte ein vereinfachtes Beispiel zur ClientlServer Verbindung über TCP/lP, das nicht den Anforderungen realer Anwendungen genügt. Ein Server sollte nicht einfach jedem Client denselben Dienst erweisen (in Abschnitt 20.4.2: Übertragung einer Sinuskurve konstanter Frequenz, Amplitude und Phase.). Vielmehr sollte er auf Anfragen des Cients l reagieren können, also z.B. die vom Client gewünschte Frequenz
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
20.5 TCP/IP-Server und mehrere Cfients
445
oder Amplitude ausgeben. Alle Einstellungen für eine Anfrage müssen folglich vom Oient bereitgestellt werden. Deshalb erweitern wir das Programm aus Abschnitt 20.4.2 um die Möglichkeit der Para metereingabe. Die Parameter werden nach erfolgreichem Verbindungsaufbau an den Server als Berechnungsgrundlage für die Kurve gesandt. Abschnitt 20.7.1 zeigt die übertragung der Parameter vom Client zum Server. Ferner sollte der Server gleichzeitig auf Anfragen mehrerer Cients l reagieren können. Daher muss er für jede eingehende Verbindung die Berechnung in einem eigenen Thread ausfüh ren, während er parallel auf weitere Verbindungen reagiert. Die Bildung der Threads erwei tert die Ansätze aus Abschnitt 5.3.2 zum dynamischen Aufruf von VIs. Dies wird in Abschnitt 20.7.3 erläutert. 20.5.2
TCP/lp·5ubVls
Wir beginnen mit der Beschreibung der Vls für die TCP/lP-Kommunikation, die in den folgenden Programmen verwendet werden. Dabei soll der Datenaustausch zwischen Server und Client über ein einfaches, selbst definiertes Protokoll erfolgen. Es besteht aus einem Kommando, gefolgt von den Daten (falls vorhanden). Beide Teile sind durch einen Doppel punkt voneinander getrennt. Folgende Kommandoswurden entwicke1t: Unkown Unbekanntes Kommando. Wird vom Server und Oient gleichermaßen ignoriert. Hier werden keine Daten übertragen. SetData übennittlung des vom Server berechneten Werts an den Oient. Die Daten enthalten den aktue1len Funktionswert der gewählten periodischen Kurve. SetParams übennittlung der Parameter für die Kurvenberechnung. Die einzelnen Parameter wer den als Daten, wiederum durch einen Doppelpunkt voneinander getrennt, übertragen. Es handelt sich um: Frequenz, Phase, Amplitude, Offset und Kurventyp (Sinus, Dreieck, Rechteck oder Sägezahn), siehe unter Bild 20.24. Disconnect Unterbrechung der Verbindung. Das Kommando wird als strikte Typendefinition 'TCP_CommandType.ct1' in Fonn einer Enum-Variable umgesetzt, siehe dazu Abschnitt 17.2.2.2. Merke: Für die Programmierung komplexer Systeme kann es nützlich sein, eigene Kommandos zu entwickeln.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
446
20
20.5.3
Internet, Se",er und Client
Schreiben über TCP/IP
Das VI in Bild 20.13 zeigt das Schreiben über TCP/IP. Dieses VI muss wegen der gleich zeitigen Verwendung durch Server und Client innerhalb derselben LabVIEW-Instanz (bei Benutzung von 'localhost', siehe Tabelle 20.3) als ablaufinvariant definiert sein. Vor dem Schreiben prüft es, ob der Eingang 'ConnectionID' eine gültige Referenz enthält. Achtung: Die Funktion 'Keine ZahUPfadJRefnum?' liefert bei ungültiger Referenz TRUE zurück. Eine gültige Referenz hat also den Wert FALSE.
l
FAlSE �
lI:lIII
C<J:1lllKtion!D Errar "
W�
� -- 'C=M J
I
....1
,.�
Bild 20.13 Diagramm von TCP_write.vi': Schreiben überTCP/lP
Im Fall einer gültigen Referenz werden 'Command' und 'Data ("")' mit Hi l fe der Funktion 'In String formatieren' zu einer Zeichenkette verbunden. Vor der übertragung wird die Länge dieser Zeichenkette ermittelt und über die Funktion 'Typenformung' in einen String umgewandelt, welcher der zu übertragenden Zeichenkette vorangestellt wird. Damit kann der Empfanger die genaue Zahl der Zeichen ermitteln, die er lesen muss. Er benötigt nicht mehr das Spezialzeichen 'CRLF', das n i Abschnitt 20.4.2 verwendet wurde. 20.5.4
Lesen von TCP/IP
Der Empfänger verwendet das VI aus Bild 20.14, um die Daten über eine TCP/IP Verbindung einzulesen und sie in 'Command' und 'Data' aufzutrennen. Auch dieses SubVI muss ablaufinvariant sein, weil es ebenfalls von Server und Client in einer LabVIEW-Instanz aufgerufen werden kann. Enthält 'ConnectionID' eine gültige Referenz, werden die vier Zei chen (Byte) der Längeninformation gelesen, die das VI aus Bi l d 20.13 den eigentlichen Daten vorangestellt hat. Sind diese 4 Byte nach der Wartezeit 'Timeout ms (25000)' nicht verfügbar, bricht die Funktion 'TCP_read.vi' mit einem Fehler ab. Tritt kein Fehler auf, wird die Län geninfonnation in 132 umgeformt und die Funktion 'TCPJead.vi' ein zweites Mal aufgeru fen, um die eigentlichen Daten zu lesen. 'AlSE �
rt"
.rn.. !Ell-� C!lI--, �
Kcin ,eHe, -
lJJ .
.rn.. .
,
= mw
§'J. .
. ,
•
Bild 20.14 Diagramm von TCP_read.vi': lesen über T(P/IP
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
20.6
Server und Client als Zustandsautomaten
447
Die Aufspaltung in 'Command' und 'Data' erfolgt über die Funktion 'In String suchen'. Als Standardwert für den Platzhalter des 'Fonnat-String' wird eine Konstante der strikten Typendefinition 'TCP_CommandType.ctl' verwendet, die die automatische Umwandlung der Zeichenfolge vor dem Doppelpunkt in den entsprechenden Enum-Wert liefert. Wird keine übereinstimmung mit einem der oben definierten Kommandos gefunden, erhält der Ausgang den Standardwert 'Unknown'. Die Zeichenfolge nach dem Doppelpunkt wird als 'Verbleibender String' dem Ausgang 'Data' zugeordnet.
20.5.5
Anwendungsbezogene Fehlerbehandlung
In Abschnitt 20.5.4 wurde bereits gezeigt, dass der Aufrufder Funktionen unter 'Funktionen' - 'Datenkommunikation' - 'Protokolle' - 'TCP' zu unterschiedlichen Fehlern führen kann. Zuwei l en ist es sinnvoll, bestimmte Fehler, wie z.B. die Zeitüberschreitung in Bild 20.14, zu ignorieren, während andere Fehlermeldungen an das aufrufende VI zurückgegeben werden sollten. Tritt z.B. während des Lesens in Bild 20.14 eine Zeitüberschreitung auf, kann dies als gewolltes Verhalten interpretiert werden. Daher ist es sinnvoll, diesen Fehler abzufangen.
�
"' Illll-t---t I
Bild 20,15 Fehlerbehandlungs VI TCP_handleError.vi'
Bi l d 20.15 zeigt ein einfaches VI für die Behandlung gewollter und nicht gewollter, 'fataler' Fehler. Während fatale Fehler an das aufrufende VI zurückzuliefern sind, da keine Möglich keit der Fehlerbehebung besteht, sollen einfache Fehler unterdrückt werden. Zeitüberschrei tungen (Fehlercode: 56) beim Polling sollten das aufrufende VI nicht beeinträchtigen. Dazu wird der Wert 'code' des Fehler-Clusters 'Error in' mit einer Case-Struktur verbunden, die
für jeden Fehler, der unterdrückt werden soll, einen Rahmen besitzt. Diese liefern den Standardwert, was 'kein Fehler' bedeutet. Dagegen wird m i Rahmen 'Voreinstellung' der Wert von 'Error in' einfach durchgeschleift. Ein fataler Fehler verbirgt sich Z.B. hinter dem Fehlercode 57, der anzeigt, dass eine Netz werkverbindung (Kombination aus IP-Adresse und Port-Nummer) bereits anderweitig benutzt wird. Dies geschieht z,B., wenn auf demselben Computer andere Netzwerkdienste wie FrP (Port 21) oder ein Web-Server (Port 80) gestartet wurden. Hier hi l ft es meistens, wenn man aufeine andere Port-Nummer ausweicht.
20.6
Server und Client als Zustandsautomaten
In Anlehnung
an
Kapitel 17 wollen wir Server und Client als endliche Zustandsautomaten
programmieren. Beim Münzautomaten genügte es, über die Queue nur die unterschied ichen l Zustände zu übertragen. Hier dagegen müssen wir zusätzlich Daten weiterleiten. Da deren Typ differieren kann, die Queue aber immer denselben Typ erwartet, übertragen wir alle Daten als Typ 'Variant'. Bild 20.16 zeigt die strikte Typendefinition des Queue-Elements
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
448
20
Internet, Se",er und Client
der Client-Anwendung. Für den Server gilt Entsprechendes, abgesehen davon, dass 'State' abweichende Zustandsnamen enthält.
� �""
an:- erojelt Aust(hen
I- Stri<J;o Typ-()d.
•
l�
tt '
- ..
--
...
Bild 20.16
Queue-Element als strikte Typendefinition, bestehend aus einem Variant 'Data' und einer Enum 'State' Bi l d 20.18 und Bild 20.19 zeigen exemplarisch zwei VIs aus der Client-Anwendung für die übertragung von Zustandsänderungen ohne und mit Daten. Entsprechende VIs existieren
für jeden Zustand gleichermaßen im Client und Server. Der Eingang 'Queue' und der Ausgang 'Queue out' werden dabei wie folgt erstellt: Die beim Aufruf von SubVIs erforderlichen Referenzen auf Queues können weder über die 'Punktionen'- noch über die 'E1emente'·Palette direkt erzeugt werden. Sie sind immer in direkt über 'Queue anfordern' zu bilden. Diese Punktion wird in ein Diagramm eingefügt. Danach muss der Eingang 'Element-Datentyp' mit dem gewünschten Datentyp, hier der strikten Typendefinition aus Bild 20.16, verbunden werden. Jetzt kann an 'Queue (Ausgang)' das gewünschte Element über 'Erstelle' - 'Element' bzw. 'Anzeigeelement' aus dem Kontext menü gebildet werden. Bild 20.17 zeigt die Symbole der Referenzen m i Panel und Dia gramm. Das obere Anzeigeelement im Panel bzw. 'Queue (Ausgang) Konstante l' im Dia gramm zeigen die Standardansicht. Dagegen stellen das untere AnzeigeeJement und die zweite Konstante erweiterte Ansichten dar. Man erhält sie, wenn man in der entsprechenden Standardansicht aus dem Kontextmenü 'Bedienelement anzeigen' auswählt. Zurück zur Standardansicht kommt man, wenn man
am
Queue-Symbol inks l oben das Kontextmenü
öffnet und 'Symbol anzeigen' wählt. In der erweiterten Ansicht kann das Queue-Element
einfach über 'Ersetzen' durch ein anderes ausgetauscht werden. Jedes VI, das auf eine Queue schreibt, haben wir durch ein 'send' im Namen kenntlich ge macht. Bild 20.18 zeigt die übertragung des Zustands 'Stop', der den Client beendet. Hier genügt es, eine Konstante in die Queue zu schreiben. Wollen wir zusätzliche Daten übertragen, müssen wir sie zuerst als 'Data' in die Cluster konstante schreiben. Dazu konvertieren wir den Wert 'Params' mit der Funktion 'Nach Va
riant'. Diese Punktion findet sich unter 'Punktionen' - 'Cluster & Variant'. Der Empf anger muss die Daten in den richtigen Typ zurückwandeJn, siehe dazu Bild 20.21. Wir haben für jedes SubVI, das Elemente der Queue bearbeitet, einen Namen gewählt, der den zu bearbeitenden Zustand bezeichnet. Sie besitzen alle dasselbe Anschlussfeld, siehe Bi l d 20.20.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
Server und Client als Zustandsautomaten
20.6
�ot�
�.,bol""
0
"
l�iI.�mtt
-•
,
,,"0;.# """eh""
!!n> """'"
449
� p
.. ..
--
• w. -
g ...
,,,
"""' C�'" •
.
' 4
Bild 20.17 Darstellung von Referenzen auf Queues im Panel und im Diagramm Ke;n Feillef �
Erre< ..,
�
".. �
.� rre< Bild 20.18
Diagramm von 'ClienLsendStop.vi' zur Queue-Übertragung ohne Daten
_ F_ �
,
".. �
·5etP""", �
F"" ""'"
.-
-
-
...
-
"'"'
..
r:-
,-
-
,,--
/Jj
-
-•
�"'. -
"
,
�-
�-
•
Bild 20.19
Diagramm von 'ClienLsendSetParams.vi' zur Queue-Übertragung mit Daten
-
�-
'-
-
D�,l
--
-
bOO'
F.'&IT
'
Bild 20.20 Frontpanel
'ClienLsetParams.vi'. Alle Vls, die Queue Elemente bearbeiten, haben dasselbe An schlussfeld
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
20 Internet, Se",er und Client
450
Der Eingang 'Data' und der Ausgang 'Data out' sind vom Typ 'CienCDataType.ctI', l einer strikten Typendefinition. Sie dienen zum Datenaustausch zwischen dem Zustandsautomaten und den SubVIs. Das SubVI kann 'Data' beliebig verändern oder über 'Data out' unverändert an den Zustandsautomaten zurückgeben. Sofern das SubVI weitere Zustandsänderungen bewirken soU, kann es sie über die Referenz 'Queue' schreiben. Dabei muss 'Queue out' un bedingt auf die unveränderte Referenz gesetzt werden. Der Eingang 'Queue Data' enthält die zu verarbeitenden Daten. 'Error in' und 'Error out' dienen der Rückgabe von Fehlern, die innerhalb des SubVIs auftreten können, und - sehr wichtig - dem sequenziellen Datenfluss.
Bild 20.21
_ 1CIIi P.., � 0IA
Diagramm von 'ClienCsetParams.vi' zum Empfang von Daten über die Queue
Die Rückkonvertierung der Variant-Daten n i ihren ursprünglichen Typ erfolgt über die Punktion 'Variant nach Daten' aus der Unterpalette 'Punktionen' - 'Cluster & Varian". Die empfangenen Parameter werden n i 'Params' von 'Data' geschrieben und stehen somit dem Zustandsautomaten n i 'Data out' zur Verfügung. Besteht zu diesem Zeitpunkt bereits eine gültige TCP/lP-Verbindung, werden die Parameter außerdem zum Server gesendet.
20.7
(Iient/Server-Anwendung
Abschnitt 20.6 diente der Erklärung der verschiedenen SubVIs, Ctls und der Struktur des geplanten Programmsystems. Jetzt wenden wir uns der Beschreibung der damit aufgebauten Programme zu. 20.7.1
Client-Anwendung
Das Frontpanel des Client-VI ist in Bild 20.22 dargestellt. In der oberen linken Ecke sieht man die Eingabefelder für die Verbindungsdaten zum Server. 'IP Address' und 'Port' sind n i einem Cluster zusammengefasst, gespeichert als 'Clien'-ConnectionlnfoType.ctl' n i strikter Typendefinition. Entsprechendes gilt für die Zusammenfassung von 'Frequency', 'Phase', 'Amplitude', 'Offset' und 'Type'. Bei erfolgreicher Verbindung von Client und Server sind die Eingabefelder von 'IP Address' und 'Port' deaktiviert. Sie werden erst wieder aktiviert, wenn die Verbindung aufgelöst wurde. über die Schaltfläche 'Connect' rechts davon wird eine neue Verbindung aufgebaut, wobei die Beschriftung zu 'Disconnect' wechselt. Eine erneute Betätigung der Schaltfläche trennt die Verbindung. Beim Erstellen der Verbindung wird das Cluster 'Parameter' zum ersten Mal an den Server übertragen, später nur noch bei einer Änderung. Im numerischen Eingabeelement 'IntervaI' kann der Benutzer den zeitlichen Abstand (in ms) zwischen den 'Chart'-Aktualisierungen wählen. 'Stop' schießt l die Anwen dung. Besteht noch eine Verbindung, wird diese vorher geschlossen. l d 20.23 zeigt das Diagramm der Client-Anwendung. Nachdem die Queue erstellt wurde, Bi werden sofort zwei Zustände eingetragen. 'Init' übernimmt die Initialisierung der Elemente des Prontpanels und der 'Data'-Konstanten im Diagramm. Danach werden im Zustand 'SetParams' die aktuellen Parameterwerte über die Queue übertragen und in 'Data' kopiert.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
20.7
Client/Server-Anwendung
451
Die obere Whi l e-Schleife in Bild 20.23 schreibt für jede Benutzereingabe eine entsprechende Zustandsänderung in die Queue. Nach erfolgreicher Verbindung bewirkt auch das Ereignis 'Timeout' eine Zustandsänderung. Die untere While-Schleife reagiert auf neue Elemente in der Queue, führt die geeigneten Aktionen aus und verändert die Daten der Anwendung.
-
....... : 1
[ Bild 20,22 Frontpanel des Zustandsautomaten 'Clientvi' •
_1IilI
.,
..-
� L.!ooI �.
�r
F
� I�
*
.""
"... ,
1
.
I
.
3 "P .._..·: �
-
J. �I
..,
_ .,
n
IIJ
ru .
l�
I
IIJ
�.
... ,--
ru
Bild 20,23 Diagramm des Zustandsautomaten 'Clientvi'
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
20 Internet, Se",er und Client
452
Nachstehend betrachten wir den Ablauf des VI bei Parameteränderungen etwas genauer. Bevor der Benutzer Eingaben machen konnte, wurden die aktuellen Parameter bereits nach dem Programmstart automatisch in 'Data' geschrieben. Ändert der Benutzer später einen dieser Werte, wird Rahmen (3] der Ereignisstruktur in der oberen While-Schleife ausgeführt und der neue Wert mittels 'CiencsendSetParams.vi' l an die untere While-Schleife geschickt, siehe Bild 20.19. Die untere While-Schleife reagiert auf das neue Element und ruft ihrerseits das SubVI 'Cient_setParams.vi' l auf, das die neuen Parameter nach 'Data' überträgt und bei einer bestehenden Verbindung an den Server verschickt, siehe Bild 20.21. Dazu muss zuvor das Cluster in Bild 20.24 n i eine Zeichenkette umgewandelt werden. Dies übernimmt das VI in Bild 20.25, das von 'ClienCwriteParams.vi' aufgerufen wird. Die erzeugte Zeichenkette wird zusammen mit dem Kommando 'SetParams' über die TCPIIP-Verbindung an den Server gesandt, siehe Bild 20.13. Der Server verwandeJt die Zeichenkette zurück in ein Para meter-Cluster, siehe Bild 20.27 und Bild 20.28. Die untere While-Schleife wartet so lange, bis die Queue ein neues Element enthält. Dann führt sie den entsprechenden Rahmen für 'State' aus. Das neue Queue-Element wird damit dem VI 'CliencsetParams.vi' für die weitere Bearbeitung zugeführt. �eI �bet.., � �ojokt
;- Slriote r)'f>-Oef,
cl ·r '
.
..-
-
_ C""l"I:er •
-
' ,d
Bild 20.24 Parameter-Cluster TCP]aramsType.ctl'
Bild 20.25 Diagramm von TCP_ParamsToString.vi': wandelt 'Params'-Cluster in eine Zeichen kette Das VI in Bild 20.25 wandelt den Wert eines jeden Elements im Cluster 'Params' n i einen String um, der die Teilstrings zusammenfasst und die einzelnen Werte durch einen Doppel punkt trennt. Theoretisch kann somit jeder Elementtyp bearbeitet werden. Wir haben uns
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00. ID:7ac0427d592981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
20.7
Client/Server-Anwendung
453
hier auf die Elemente beschränkt, die n i 'Params' enthalten sind, nämlich 'Digital' und 'Enum'. Für andere Typen kann die Gase-Struktur entsprechend erweitert werden. Bi l d 20.26 zeigt ein Beispiel m i Frontpanel, Bild 20.27 das Diagramm dazu.
..-
....
0,01 :0: 1 :O:5ne\r1n
0,01 "
"'_:
,
......
"
T_
...
.... "
,
....
""
�
, ,
,
"' "" "
�
..J
..J
..J
..J
Bild 20.26 Stringrepräsentation der eingestellten Parameterwerte
Im Einzelnen geschieht Folgendes: Für ein Element vom Typ Enum wird die Eigenschaft 'Strings!]' ausgelesen, siehe Bild 20.27. Sie enthält ein Array mit den Bezeichnungen der Werte. Dann wird 'Wert' von 'Variant' nach '132' konvertiert und der indizierte Wert aus 'Strings [r zurückgegeben. Für numerische Elemente erfolgt die Umwandlung über die Funktion 'ln String formatieren', wobei der Eingang 'Format-String' direkt mit der Eigen schaft 'FonnatString' des Elements verbunden wird. Damit ist z.B. gewährleistet, dass eine hexadezimale Zahl nicht als Dezimalzahl, sondern mit h i ren Hex-Zeichen n i den String um gewandelt wird. Bild 20.26 zeigt das Ergebnis dieser Umwandlungen im Anzeigeelement 'String', das auf'\'-Code-Anzeige eingestellt ist.
Im""-
'"
.fhl -
p
m
.�
"
k. f l;!5
�� 1 i1ii
Bild 20.27 Diagramm 'TCP_StringToParams.vi': ROckwandeln einer Zeichenkette nach 'Params'-Cluster
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
20 Internet, Se",er und Client
454
Bi l d 20.28 zeigt das Ergebnis des Umkehrprozesses: die Wandlung eines Strings mit Daten
für 'Frequency', 'Phase', 'Amplitude', 'Offset' und 'Type' in ein Cluster dieser Parameter.
IAufgabe 20.4
Analysieren Sie 'TCP]aramsToString.vi' und 'TCP_StringToParams.vi', indem Sie ge eignete Parameter einstellen und die Vb im Debug-Modus durchlaufen. 00
�,
_�ffi
f$
•
�"
,.,
.- Eeo>te< L,tei ßei>ftd«1
I>
Projekt EHplorer T[P IvproJ
�E!Ii1
E:roie+1 I\ldlhffi
x B ra Pro,.... : TCP,�OI s. . Mffi COOV-tOl B f:) EmD : il clont,,; ii O""Uornecl.';
'\!llii E
,,-.tei �",tdffi AnzeiQffi Pro;e+1 AusfChen
:'.. [tl CIe
in
Projekt EHPIoo� T[P Ivproj --- --
s e 5emf_��1eC1ern il ""'vO!'_�Clbn",v;
L.. [U 5t.
r ... d�..< .. cin<m t.omdon 5....,', r ___ -.a
Bild 21.26 Auswahl der Module NI 9215 und NI 9401 fOr die FPGA-Programmierung. Das
System hat entdeckt. dass NI 9215 in Siot 1 steckt und NI 9401 in Siot 2
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
21.3
Programmierbeispiele
475
7. Nun muss man entscheiden, welche der verschiedenen Ein-/Ausgänge der Module NI 9215 und 9401 man verwenden will. Dazu nochmals m i Kontextmenü von 'FPGA Target (RIOO . . . )' auswählen, diesmal 'Neu' - 'FPGA I/O'. Man erhält ein Fenster entsprechend Bild 21.27, in dem die benötigten Leitungen zu markieren und mit 'Add' nach rechts zu transferieren sind. Danach mit 'OK' bestätigen. Der Projekt-Explorer hat nun ein Ausse hen entsprechend Bild 21.28. "'
....... ..."'".. -(h=\01)
DiQltoi POft IrvJ: ond CVp<J:
B E) NI '>\m .. D103:0 (NI '>\01) .. DI07:-I (NI '>\01) e E) Ar'J.>Iog IrvJ: B E) NI9215 .. AIO (NI 9215) � "'0 � C>robo.Yd Oxk L il AU>:),'; .. NI 9215 (Siot 1)
' � ==�
: .i:; Buid-5peztMtünef1 "l �lffi , .i:; Buid-5peztMtünef1
Bild 21..28 Projekt-Explorer nach Abschluss der Vorbereitungen für die Programmierung
8. Nun sind 'AufruCFPGA.vi' und 'AI_DO.vi' zu erstellen. Bild 21.29 und Bild 21.30 zeigen Diagramm und FrontpaneJ von 'AufruCFPGA.vi'. Man erkennt, dass dieses Programm Daten an 'AI_DO.vi' überträgt, und zwar 'AI Scan Rate (uSec)', 'Schwelle', 'Signal' und 'FPGA Stop'. Dazu braucht man Funktionen, die unter 'Functions' - 'FPGA Interface' (letzte Zeile) zu finden sind, nämlich: 'Open FPGA VI Reference', 'ReadIWrite Control' und 'Close FPGA VI Reference'. Im Kontextmenü des zunächst noch leeren Symbols für das Eröffnen der Referenz wählt man 'SeJect VI'. Dann erhält man ein Fenster, das alle im Projekt unter 'FPGA Target...' verfügbaren Vls anzeigt. In unserem Fall ist das lediglich 'ACDO.vi'. Man markiert es und quittiert mit 'OK'. Man bekommt nun ein Symbol wie
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
476
21
Compacl RIO-System und FPGA
n i Bild 21.29. Entsprechend verf ahrt man mit der Schreib-/Lesefunktion n i der Mitte des Diagramms. 'ReadlWrite Control' holen und zuerst mit 'Open FPGA VI Reference' ver binden, dann aufziehen auf vier Kästchen mit der Inschrift 'Unselected'. Dort m i jeweili gen Kontextmenü 'Controls' sowie die gewünschte Variable wählen. Angezeigt werden alle existierenden Bedien- und Anzeigeelemente von 'AI_DO.vi'. Das Programm 'Auf
ruCFPGA.vi' kann 'AI_DO.vi' starten und stoppen. Der Start erfolgt im TRUE-Rahmen der Case-Struktur. Wird der Schalter 'FPGA' auf'AUS' gestellt, durchläuft das VI den na hezu leeren FALSE-Rahmen. In ihm ist lediglich eine lokale Variable von 'Stopp' zu fin den, damit man das Programm auch stoppen kann, wenn 'ACDO.vi' gerade nicht läuft.
Bild :n.29 Diagramm von 'AufrufJPGA.vi'
"'''- ''-1-)
." ., .... ,- , �
iAooo "'_
-
E3
.-
� - �
.= .�
i ::-: -
"
,,,..
Bild21.30 Frontpanel von 'AufrufJPGA.vi', zeigt Sinuskurve des Funktionsgenerators von knapp 300 Hz an. Die Kurve ist unregelmäßig, weil die Übertragung per Internet nicht schnell genug ist 9. Bild 21.32 zeigt das Diagramm von 'AI_DO.vi'. Bei der Entwicklung dieses Programms ist zunächst zu beachten, dass beim Erstellen des VI nur eine eingeschränkte Funktions palette nach Bi l d 21.23 erscheint. Dort hat man n i 'FPGA 1/0' eine Auswahl nach Bild 21.31.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
21.3
Programmierbeispiele
477
FPGA l/ONode FPGAl/OPro• . • FPGAl/OMot.••
Bild 21.31 Auswahl für FPGA-Programme unter 'Functions' -' Programming' - 'FPGA 1/0'
Man zieht nun einen 'FPGA 1/0 Node' ins Diagramm und findet n i dessen Kontextmenü unter 'SeJect FPGA 1/0' - 'Analog Input' - '9215' den Analogeingang 'AIQ'. Bestätigt man dies, erhält man ein Symbol für den Analogeingang wie in der Mitte von Bild 21.32
zu
sehen. Entsprechend findet man '0100' als Ausgang. Das Setzen der Datenrichtungen der digitalen Leitungen 0 bis 7 ganz links m i Diagramm bewirkt man mit dem Methoden
knoten 'FPGA 1/0 Method Node'. Im Kontextmenü wählt man 'SeJect Item' - 'NI 9401' und dann 'Select Method' und 'Set Line Direction'. Wir hatten die Leitungen 0 bis 3 als Ausgänge und die restlichen Leitungen als Eingänge vorgesehen. Das ist willkürlich, doch kann nicht jede Leitung individuell gesetzt werden. Die Gruppierung n i Vierer-Blöcke ist von der Hardware vorgeschrieben, wie man dem Bedienungsheftchen entnehmen kann. Zu erwähnen ist noch, dass man das Metronom im linken Teil der Sequenz in Bild 21.32 unter 'Functions' - 'Programming' -'Timing' findet.
[��::�:::�!��!:�[�:;,]
m
�
�
.�
"
Bild 21.32 Diagramm von 'AI_DO.vi' 10. Nun schreibt man 'ACDO.vi' in das FPGA, indem man es wie ein normales VI startet. Damit setzt kommt ein übersetzungsprozess in Gang, der auch den Xilinx'"-Kompiler aufruft. Wie schon eingangs erwähnt, dauert diese Software-Hardware-Transformation auch bei einem einfachen VI wie dem unseren fünf Minuten oder mehr. Zwei Fenster er scheinen, die über den Fortschritt des Prozesses informieren (Bild 21.33 und Bild 21.34). I>
[ompol.,g VI fo, FPGA
Bild 21.33 Erstes Fenster, das sich beim Start eines noch nicht übersetzten FPGA-Vls öffnet Bei erfolgreicher Kompilierung öffnet sich ein drittes Fenster mit dem n i Bild 21.35 dar gestellten Schlussprotokoll. Mit 'OK' schließt man dieses Fenster. Einige Sekunden da nach verschwindet automatisch Fenster 1. Gleichzeitig wird das Programm 'AI_DO.vi' gestartet. Auf dem Oszilloskop sieht man nun die eingelesene Sinusspannung und die erzeugte Rechteckspannung, die von 000 über Pin 14 des Steckers des 940 1 auf Kanal 1 dieses Geräts gelangt, siehe Bild 21.36.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
478
21
Compacl RIO-System und FPGA
I> lob."," 'PGA (o"'.�o S.."", 0.2 -----SI.." ...
11\.os 2001 G9:53:'II l", �ote Tne
1\.(15 2001 09:55:01 00'...
Fa'
Ili'!ztJg E,Uy
"'" do r
Hl f -7,2011
Bild 21.38 Frequenz der ein gelesenen $inusfunktion zu hoch. Bei 50 kHz funktioniert die Trigge rung nicht mehr korrekt
IAufgabe 21.2 'ACDO_ParalleJ.vi' von Anfang an programmieren, ebenso das aufrufende Programm zum Starten dieses FPGA-VIs. Beide Programme starten und Ergebnis am Oszi l loskop beobachten.
Merke: FPGA-Programme für das cRIO-9012-System zeigen eine eingeschränkte Funktionspalette. Es gibt z.B. keine Umgebungsvanablen. Auch die Gleit kommaarithmetik existiert nicht. Dafür gibt es spezielle ElWeiterungen, z.B. für sehr schnell arbeitende echtzeitgesteuerte Schleifen oder für anaJoge und digitale Ein-'Ausgabe. Diese Funktionen fehlen in der Funktionspalette �ewöhnlicher VIs, auch
wenn sie aufdem cRIO-9012 Iaufen. Nur unter 'Functions' - 'FPGA Interface'
(und unter 'Functions' - 'Real-Time') findet man Funktionen zum Aufruf der FPGA-Routinen (und zur Zeitsteuerung).
Merke: Bei der Übersetzung eines FPGA-Programms für das cRIO-9012-System legt der Kompiler unterhalb des aktuellen Verzeichnisses ein Unterverzeichnis 'FPGA Bitfiles' an, in dem er den bei der Übersetzung erzeugten Binärcode als so genanntes Bitfile mit der Erweiterung 'lvbit' ablegt.
21.3.3
FPGA-Anwendung auf dem cRI0-9012 ohne LaptopunterstOtzung
Wir woUen nun die Anwendung aus dem vorigen Abschnitt autonom auf dem cRIO-9012 laufen lassen, d.h. auch nach Lösen der TCP/IP-Verbindung zum Laptop. Außerdem soll diese Anwendung automatisch starten, wenn wir das RIO-System mit Spannung versorgen. Folgende Schritte sind zu gehen: 1. Am einfachsten kopieren wir das Projekt 'RIO_FPGA.lvproj' unter dem neuen Namen 'RIO_FPGA_Autonom.lvproj', siehe Bi l d 21 .39.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
21.3
Programmierbeispiele
481
AIO(N1921S)
-1Q""'�d doc'
Al..ooy........,; NI9215(SIotl)
NI 91(11 (Slot 2)
-� fIoAd.5pe�
Bild 21.39 Projekt für ein autonom auf dem cRI0-9012 arbeitendes FPGA VI. Beginn der Entwicklung
2. Wir benötigen nun das Bitfile von 'ACDO_ParaUe1.vi'. Am besten noch einmal über setzen und dann das BitfIle direkt hinter 'AufruCFPGA_Parallel.vi' m i Projekt-Explorer platzieren. Der Projekt-Explorer verändert sich damit entsprechend Bild 21 .40.
�"" �·"" " n... .. "" , "
Do;ll�lhelrw mOl1W DQt� PEh� ,,"",·�,fi.<J""'o
Bild 21.40 Projekt-Explorer mit Bitfile von 'AI_DO]araliel.vi' (markierte Zeile)
3. Im Projekt-Explorer ganz unten Rechtsklick auf 'Build-SpezifIkationen' und wählen
'Neu' - 'Real-Time Application'. Nach einigen Sekunden sieht man ein Formular mit verschiedenen Kategorien. Wir ersetzen zunächst unter 'Application Information' die Eintragung 'startup.rtexe' rechts durch 'AufruCFPGA_ParaUe1.rtexe', wählen einen ge eigneten lokalen Ordner auf dem Laptop und schalten dann weiter zur nächsten Katego rie 'Source Files'. Vor dem Umschalten erscheinen Eintragungen gemäß Bild 21.41.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
21
482
i�
""�,*,,"..,.., 1"' __T "' Ap� ", . ",n
Compacl RIO-System und FPGA
I
t""",,.., I ib->on:
c.JM '''''' ,..... �.'"
Bild :n.41 Eintragungen zur Bildung einer autonomen (Standalone-JAnwendung. Erster Schritt: Bestimmung der Startup-Datei unter 'Executable filename'
4. Unter 'Source Files' werden in der Mitte zwei VIs angezeigt, nämlich die, die m i Projekt Explorer unter 'cRlO-9012 ( . )' zu finden sind: 'AufruLFPGA]aralleLvi' und das Bit file von 'ACDO_ParalleLvi'. Das erste VI ist mit dem blauen Pfeil nach rechts unter die 'Startup VIs' zu ziehen, das zweite unter 'Dynamic Vb and Support Files'. Wir haben dann Eintragungen gemäß Bild 21.42. ..
"
• •
Bild 21.42 Zweiter Schritt: Bestimmung Startup-Datei und Eintragung bei 'Dynamic Vis
..•
'
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
21.3
Programmierbeispiele
483
5. In der Kategorie 'Destinations' brauchen wir in diesem Beispiel nichts zu ändern. Dage
gen machen wir unter 'Source Fi l e Settings' oben rechts einen Haken bei 'Startup VI' und n i dem Fenster rechts unten einen Haken unter 'Value' für 'Run When Opened' n i der zweiten Zei l e. Wir erhalten so eine Liste gemäß Bild 21.43. 6. Zuletzt gehen wir zur Kontrolle zur Kategorie 'Preview' und rufen 'Generate Preview' auf. Wir sollten nun unter dem Verzeichnis 'c:\ni-rt\startup' die beiden Dateien 'AufruCFPGA_Parallel.aliases' und 'AufruCFPGA_Parallel.rtexe' sehen und insgesamt Eintragungen entsprechend Bild 21.44. Ist das der Fall, drücken wir den Knopf'Build'. Nach einigen Sekunden öffnet sich ein kleines Fenster und informiert über die erfolgreiche übersetzung (hoffentlich!). 7. Im Kontextmenü von 'Build-Spezifikationen' im Projekt-Explorer 'set as startup' an
klicken. Schalter 'NO APP' am cRIO-9012 auf ON! Danach im Kontextmenü von 'cRIO9012 ( . . . )' aufrufen: 'Alle vertei l en'. Nach der Verteilung 'NO APP' zurück aufOFF.
r. ".,"'" Y!
("" �'I
("" i"dJde "'*' t "f«';"'-'zed
�,� r
• • • • • • •
I=�
�
n •
� �
n
� � � •
n 'l
Bild 21.43 Eintragungen zur Bildung einer autonomen (Standalone-JAnwendung. Dritter Schritt: Bestimmung der Eigenschaften der Startup-Datei
8. Die Verteilung befördert die beiden VIs auf das cRIO-System und startet sie. Am Oszil loskop sollte man also eine Darstellung entsprechend Bild 21.36 sehen. Zieht man das Kabel zum Internet, darf sich daran nichts ändern. Auch das Herunterfahren des Laptops darfkeinen Einfluss mehr haben. 9. Das Abschalten und Wiedereinschalten der Spannungsversorgung am cRIO-9012 lässt zunächst die Rechteckkurve für einige Zeit verschwinden. Keine Sorge! Nach ca. einer Minute ist das RIO-System (das ja ein ganz nonnaler Rechner ist, der Zeit zum Hochfah ren benötigt) wieder angelaufen, und man sieht erneut die Rechteckkurve. Geschieht das allerdings auch nach zwei Minuten noch nicht, sollte man sich aufFehlersuche begeben.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
21
484
Compacl RIO-System und FPGA
10. Will man die automatische Ausführung des FPGA-Programms nach dem Einschalten der Spannungsversorgung vermeiden, muss man den Schalter 'NO APP' am cRIO-9012 auf ON stellen. Anderenfalls bleibt dieser Schalter stets aufOFF! , "w1e."O" InfOffn""'" s.ou.c. Filo.
�_ fie. SUc \_I"'� �fl '.t,
Ei
i
RIO_�_""orDm.""7-"PGA r.,,,,,,_AU'O_P.,>IoI,�,f,bl
....rct_""""-" .. .....lolo;sos
m MJreJ_Ff'GA_P","'lrtox.
C�
I
Het>"*" '
Bild :n.44 Eintragungen zur Bildung einer autonomen (Standalone-JAnwendung. Dritter Schritt: Vorschau auf die Zusammensetzung der Eigenschaften der Startup-Datei(en)
IAufgabe 21.3 'ACDO_ParalleLvi' von Anfang an für Standalone-Anwendung programmieren und ver teilen. cRIO-9012 ausschalten, wieder einschalten und kontrollieren, ob das System wirk lich ohne Laptop lauffahig ist. Merke:
Bei einer Standalone-Anwendung ist zu beachten: I.
I m MAX TCP/IP-Verbindung stets s o einstellen, dass eine Unter brechung dieser Verbindung dascRIO-System nicht stoppt (siehe Abschnitt 21.2, Schritt 4 der Installation).
2.
Bitfde des FPGA-Vb mit in das Projekt aufnehmen.
3.
Schalter 'NO APP' aufON. Nach Verteilen der Dateien aufdas cRIO System zurückstellen aufOFF.
4.
Beim Hochfahren des cRIO-9012 eine Minute warten. Erst dann kann die Standalone-Anwendung starten.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
21.4
Eine regelungstechnische Anwendung
2 1 .4
485
Eine regelungstechnische Anwendung
AufgabensteUung: Eine Spannungsversorgung soll auch bei starken Störungen der erzeugten Spannung und bei Belastungsänderungen möglichst gut die konstante Ausgangsspannung
von u. = 5 V halten. Dazu gibt es preisgünstige Hardwarelösungen, doch kann man natürlich auch Mikroprozessoren einsetzen. Wir zeigen deshalb hier zwei Lösungen mit dem cRIO System: Bild 21.45 verdeutlicht die Schaltungsidee. Den Aufbau sieht man in Bild 21.46. Störspannung durch Funktionsgenerator SnIl� 1 .,
cRJO·9012 als Regler
r
I AO
I
Regelstrecke
C, ��
I
".
....L
Bild 21,45 Schema zur Regelung einer Spannung mit dem cRI0-9012
Bild 21,46 Aufbau zur Spannungsregelung. lm Vordergrund die Regelstrecke, hinten links die Span· nungsversorgung, in der Mitte der Funktionsgenerator zur Erzeugung der Störsignale und rechts das Oszilloskop. Es zeigt auf Kanal 1 das Störsignal und auf Kanal 2 das erstrebte Gleichspannungssignal u. Der Einfachheit halber ist die Schaltung so aufgebaut, dass der Spannungssollwert per Soft ware vorgegeben wird. Die Störungen kommen von einem Funktionsgenerator, der perio-
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
21
486
Compacl RIO-System und FPGA
disch rechteckige Spannungswerte erzeugt. Die Regelstrecke kann durch das Stecken ver schiedener Kombinationen von ohmschen und kapazitiven Widerständen geändert werden. Obwohl es hier nicht erforderlich ist, das RIO-System im Standalone-Betrieb zu fahren,
wollen wir das dennoch tun. Wir zeigen dabei eine Möglichkeit, den cRIO-9012 automatisch
beim Einschalten starten zu lassen, ohne dabei den kleinen Schalter 'NO APP' für jede neue Anwendung an- und auszuschalten. Dies gelingt mit Hilfe des auf dem eRIO-System verfüg baren FrP-Servers. Die AnmeJdung erfolgt n i unserem Fall gemäß Bi l d 21.47 über den Windows Internet-Explorer mit 'ftp:I/141.69.60.661'.
fo,P-Stammn-rzeichni s auf 141.69.60.66
'>1""'0' 0';'"'''''' "",,,... 1>/» /"0'
'''0' .0 ,0. ."" 0"0'
Bild 21.47 Nutzung von FTP im Windows lnternet Explorer.Man sieht dann die Struktur aufder Fest platte des cRIQ-9012
Besser arbeitet man allerdings mit dem Windows-Explorer, da man hier die Dateien wie n i einem gewöhnlichen Verzeichnis behandeln kann, also lesen, schreiben, löschen, verschie ben. Dazu geht man in der Symbolleiste des Internet Explorers auf 'Seite' und wählt m i Pull down-Menü 'FTP-Site in Windows-Explorer öffnen'. Man kommt so zu einer Darstellung nach Bild 21.48. a nu
1