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 pC>Oi>v,exe nmxs,exe "cho
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>+
Nimmt letzten Schritt beim Programmieren zurück Hebt das letzte <Strg>+
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"",""'''''9<'>l''' Polottffi ..Elemerte"lrJd .FlTIktüneo" Vef>bnsVef�ollXlg FeIlIef><>:Oe
..,..,
5c",n
",�
Vef�",ie Mern-Ve<,r..:p : h....J9!',
-
EnQtie Fe. �l'Vi" ","� VI-5
PIeue Optioneo rür �
17 AU:orrJ.3I:isch 5icOe:hd>kcoie<1 � r v", Au>fChlXlg de, VI, >peichorn ro v'" VI-I.usfCh"", lXld pe
lS""""3 �ffi
�_en: Versiortsyer" WN
'Ieoj-VlflrW!me!J
"""'"
t i 'Beo,t zOf;;wtf VI-Serv
najneMLmaetwJ:;v,,� E
17 Be5c"'� ,,>tffi b« Anschl.is"", i>'1 V"'�>t"ffi Poslone<1 e;n r Be5cr.ttlSJ9ffi >t.nda"nilßio< fixleft r KoostonteofollXlQ von V
PIeue front�-�
17 Be5c"'� r,>tffi b« EIemed«1 on '''�>t''«1 Posborlffi e;n r Be5cr.ttlSJ9ffi >tioridar
r,,-......
:::J
Optionen rür P_te Elemeoote!fuMctionen
-
r P.I"tl"""";'+<" >O
_1.1 gelinderte Y<>O"einst�
Bild 2.1 Optionen zur Gestaltung von Panel und Diagramm: eine Auswahl Die Optionen n i Bild 2.1 zeigen verschiedene Möglichkeiten der Parameteränderung. Man kann nicht nur 'Blockdiagramm' einstellen, sondern auch:
• • • •
Pfade, Frontpanel, Blockdiagramm, Ausrichtungsgitter usw.
Wir wollen uns hier etwas näher mit dem Frontpanel, dem Blockdiagramm und dem Aus richtungsgitter befassen.
2.1.2
Frontpanel
Die generellen Frontpanel-Einstellungen erreicht man mit 'Werkzeuge' - 'Optionen . . .' 'Frontpanel'. Bild 2.2 zeigt das zugehörige Fenster. Interessant ist hier die zweite Zeile rechts mit 'Lokales Dezimalzeichen verwenden"" . Ist sie angekreuzt, nutzt LabVIEW dasjenige Zeichen als Dezimalpunkt, das unter Windows in der Systemsteuerung bei 'LändereinsteUungen' - 'Zahlen' eingetragen wurde. Ist dort der Punkt das Dezimaltrennzeichen, übernimmt LabVIEW diese Einstellung. Ist das Komma Dezimal trennzeichen, geschieht Entsprechendes.
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'
2.1
Einstellungen
37
Ist aber die Zeile 'Lokales Dezimalzeichen verwenden""' nicht angekreuzt, arbeitet LabVIEW generell mit dem Dezimalpunkt. Das kann zu Fehlern führen, wenn ein LabVlEW
Programm z.B. mit Microsoft Excel zusammenwirken soll. Haben beide Programmsysteme
verschiedene Dezim altrennzeichen, lesen sie wechselseitig ihre Daten falsch. I> Opt,on�n _ tnJ 9"iO"Jdeft "lobVIEW 8.x
"�
llIIIIm Au"""'uno"" "' PoIettffi ..Elemerte"lrJd .FlTIktüneo" V«sbnsv«�oluno FeIlIe<"-,,,,"
_ Eief=Jt·Editc< <»ch Dopp«l
P" lokale, Dezimlzeic� v«�' P" �stretffi on Front�·Ob;e
P" Trorr;p.yerte Beschrttl...)oJS!� P" Bem� rostef1 bei Eief=Jten on VCf�""ffi fb,borJ
EnQtie Fe. L.Ovebo.x1;r;Vi" ociffi VI·5ofvOf'
r. ""*,,n
•
Ii.nde,,,,,,,, __ «SI be< eonem flevsti>ft von lotNIEW """om.
-I
01(
I.bt
I
-I
�e
Bild 2.2 Optionen speziell zur Gestaltung des Frontpanels
2.1.3
Blockdiagramm
Die allgemeinen Einstellungen im Blockdiagramm werden erreicht mit 'Werkzeuge' - 'Opti onen .. .' - 'Blockdiagramm'. Bild 2.3 zeigt das entsprechende Fenster. Besonders interessant sind hier: •
'Verbindungspunkte an Kreuzungen' (rechts oben). Hier sollte ein Haken stehen. Er sorgt
dafür, dass man Verbindungslinien im
Diagramm, die sich nur kreuzen, von sol
chen unterscheiden kann, die miteinander gekoppelt sind. Im letzteren Fall werden dort nämlich dicke Punkte gesetzt. Siehe dazu Bild 2.4 und Bild 2.5. •
'Transparente Beschriftungsfelder' in Bil d 2.2 ist angekreuzt. Das bedeutet, dass Kom mentare, die man mit der A-Funktion der Werkzeugpaleue schreibt, keinen Rand erhal ten. Auch die Namen von Eingabe- und Ausgabefeldern werden zunächst randlos darge stellt. Ist dagegen das Kontrollkästchen nicht angekreuzt, wird im Diagramm automa
tisch ein schwarzer Rand gezeichnet, auf dem Panel erscheint die Schrift als Relief. Man
kann das individuell für jeden Kommentar und jedes Terminal mit dem Farbpinsel für
Vordergrund und Hintergrund in der Werkzeugpaleue ändern. Transparenz erhält man, wenn man bei der Farbwahl das große T wählt, siehe Bild 2.4 und Bild 2.5.
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'
2
38
•
Einstellungen, Sprachenwahl, Paletten
'Automatisches Routing aktivieren' heißt, dass Verbindungen zwischen zwei Funktionen nicht n i jedem Fall vom Programmierer gezogen werden müssen, sondern sich bei ent sprechend geringer Distanz von seJbst bi l den (wenn auch nicht stets in sinnvoUer Weise).
•
•
'Frontpanel-Elemente als Symbole darsteJlen' wurde bereits erklärt.
wischen zwei Funktionen nicht n i jedem Fall vom Programmierer gezogen werden müs
sen, sondern sich bei entsprechend geringer Distanz von selbst bilden (wenn auch nicht stets n i sinnvoller Weise).
•
•
'Frontpanel-Elemente als Symbole darsteJlen' wurde bereits erklärt. zunächst als Relief dargesteJlt. Ist dagegen das entsprechende KontroUkästchen ange kreuzt, wird im Diagramm kein Rand gezeichnet, auf dem Panel erscheint die Schrift randlos. Man kann das n i dividueU für jeden Kommentar und jedes Terminal mit dem Farbpinsel für Vordergrund und Hintergrund in der Werkzeugpalette ändern. Transpa renz erhält man, wenn man bei der Farbwahl das große T wählt, siehe Bild 2.4 und Bild
2.5. •
'Automatisches Routing aktivieren' heißt, dass Verbindungen zwischen zwei Funktionen nicht n i jedem Fall vom Programmierer gezogen werden müssen, sondern sich bei ent sprechend geringer Distanz von seJbst bi l den (wenn auch nicht stets in sinnvoUer Weise).
•
'Frontpanel-Elemente als Symbole darsteJlen' wurde bereits erklärt.
I> Opt,on�n
�
17 �«brrlxq;,...e .-,kt iIf1 Kr� l" s.tt"""" � Artschj)s""" s.treh<1 V«� 17 Lht«tlel fiX 5ctWI·
�
IC Be;m ErlCQ«1 5cCJ�I·N.Yrie<1 onzeioen
17 P",.-.j-ElemefJ/:e von Di.>o7..-.m i>US kchefifl-opiefeo
!;7 Ex><m-�I, >Ofe
I'
Sicherhef:
EnQtie fe. �;r;v",,,,"1ef1 �I-5
�
r�
{; Trort>p-Yerte Besc"'ttlX"lQSl� 17 Front�e oIs Syrrbole dat-stelef1
17 A<.tan. Fe!-Jief� '"' neoe<1 1I, oktMefffi l" A<.tan. "e!-Jief�oioge oItMefeo 17 A<.tCfMtische, Roo..thg oktMefffi
l" "�"",*ffi ..--;,.h . '"' "'_ffi ""'*'"
5cCJ\,!, oIs od_e [6:..
l" A<.tan.,lj>Cho "'öße�,,,,,,,, bei stnJ<.hron
17 Rote Kreuze od lX"JOiil9on lef:lX"J9Of1 onzeioen l" ",,«h� ''"''"'' bo< .l.r>
_ Be,ddtlX"J9Of1 s.t.n:l."Jmlol';'. fixiert
�e<Ms:""""
Sot...-.d.o-" d- "
:::J
_ <"""'_..-.fot"", von ."'� ON"""
_ K"""'onterloluno '000 stru
Bild 2.3 Optionen speziell zur Gestaltung des Blockdiagramms
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.1
Einstellungen
39
�: DiIS 11 ...:xde i>CChlrle< frillef", 1«_. ,.B lrlOf VefSirn 6.1 �e,. o.kdrq; ""'" ITondert die
frootr.reHiem
Bild 2.4 Diagramm ohne Verbindungs punkte an Kreuzungen
9 <$ . "
.,.'"I r:;< ht " ...."" �: DiIS 11 ...:xde i>CChlrle< frillef", 1«_. ,.B lrlOf VefSirn 6.1 �e,. o.kdrq; ""'" ITon dert die frootr.reHiem
2.1.4
Bild 2.5 Diagramm mit Verbindungs punkten an Kreuzungen
Ausrichtungsgitter
Ab LabVIEW 7.0 (LabVIEW 7 Express) erhält das Panel während der Phase des Editierens (Erstellen des Programms) ein Gitter. Es dient der besseren Ausrichtung der Eingabe- und
Ausgabesymbole. Auch hier lassen sich einige Parameter ändern. Dazu 'Werkzeuge' - 'Opti onen . . . ' - 'Ausrichtungs-Gitter' wählen. Man erhält ein Menü gemäß Bi l d 2.6.
Man kann auf die Anzeige des Frontpanel-Gitters verzichten, andererseits lässt sich aber
auch zusätzlich ein Gitter auf dem Blockdiagramm erzeugen. All das trifft nur für die
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'
2
40
Einstellungen, Sprachenwahl, Paletten
Editierphase zu, d.h. für die Entwicklung des Programms. Zur Laufzeit verschwindet das
Gitter automatisch. Damit die Ausrichtung am Raster wirksam wird, muss man zusätzlich ankreuzen 'Ausrichtung an Gitter aktivieren' bzw. 'Ausrichtung an Diagrammgitter aktivie
ren', Ferner kann man die Feinheit des Gitters verstellen sowie den Kontrast Gitter - Hinter
grund erhöhen oder abschwächen. I> OptlOn�n
EnQtie für Lmo;eb.xq;v",oom VI-5
Y]_5o
VI-5
r � Obie+1eon Gttefl;rWe..--= 0.." ....... ... ",t.."
E
::I
Cle 5/!ofld.yd-Gl'eflTc& ...d n<X b« neoffi VI! ven;e<Jde/:, ZIX Ärt:IeflXlg der GltOfITCße b
YI> müHen s;e .." Menü
Dootei» Yl-E�"'>>I'_-�ioooen ,"'_, e,;>t",ondon
Bild 2.6 Optionen zur Gestaltung des Ausrichtungsgitters
Hat man ein Raster eingestellt, an dem sich die Elemente auf dem Panel ausrichten, gibt es
im Zweifelsfall m i mer noch die Möglichkeit, ein nicht gut passendes Objekt in kleineren
Schritten zu verschieben. Dazu das Objekt mit der pfeiltaste der Werkzeugpalette anklicken und anschließend mit Hilfe der pfeiltasten der PC-Tastatur verschieben. Drückt man gleich zeitig die Umschalttaste am PC, verschiebt man das Objekt schrittweise im Gitterabstand.
2.1.5
WIederherstellungen
Unter 'Werkzeuge' - 'Optionen . . . ' - 'Umgebung' ist 'Anzahl Wiederherstellungen pro VI' auf 8 voreingestellt. Bedeutung: Bemerkt der Programmierer einen Fehler bei der Entwick lung eines VIs, kann er maximal 8 Programmierschritte mit 'Bearbeiten' - 'Rückgängig . . . ' bzw. mit dem Shortcut <Strg>+
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'
2.2
Sprachenwahl
2.2
41
Sprachenwahl
Wir gehen davon aus, dass der Leser mit einer deutschsprachigen Version von LabVIEW arbeitet. Er soUte aber auch dann dieses Buch mit Gewinn lesen, wenn er nur Zugriff auf die englische Version hat. Deshalb sind hier einige wichtige übersetzungen zusammengestellt. Weitere Hilfe wird nicht gegeben, denn dieses Buch wendet sich in erster Linie an Anwender, die eine deutsche LabVIEW-Version nutzen wollen.
2.2.1
Menüpunkte
File
Datei
Edit
Bearbeiten
Ope:rate
AusfUhren
Tools
Werkzeuge
Browse
Durchsuchen
Window
Fenster
Help
Hilfe
2.2.2
Werkzeuge - Optionen
Tools - Options. . . - New and Changed in LabVIEW 8.x Place front panel terminals as kons
Werkzeuge - Optionen - Neu und geändert n i LabVIEW 8.x Frontpanel-E1emente als Symbole darstellen
Paths
Pfade
Front Panel
Frontpanel
Use localized decimal point Block Diagram
Lokalen Dezimalpunkt verwenden B10clcdlagramm
Show dots as wire junctions
Verbindungspunkte an Kreuzungen
Delete/Copypanel terminals from diagram
Panel-Elemente vom Diagramm löschen! kopieren
Enable auto wiring
Automatische Verdrahtung aktivieren
Maximum undo steps per VI
Anzahl Wiederherstellungen pro VI
Alignment Grid
Ausrichtungsgitter
ControlsiFunctions Palettes
Paletten 'Elemente' und 'Funktionen'
Debugging
Fehlersuche
Colors
F""'n
Fonts
Schriftarten
Printing
Druclcen
Revision History
Versionshistorie
Misceßaneous
Verschiedenes
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
42 Datel - VI-Einstellungen
2.2.3 File -
Einstellungen, Sprachenwahl, Paletten
VI-Prope:rties
Datei - VI-Einstellungen
General
Allgemein
Memory Usage
Speicherauslastung
Documentation
Dokumentation
Revision Hislory
Versionshistorie
Editor Options
Editor-Optionen
Security
Schutz (Sicherheit in Version 8.0)
Window Appe:arance
Fenstererscheinungsbild
Window Size
Fenstergröße
Execution
AusfUhrung
Print Options
Druck-Optionen
2.3
Paletten
In Kapitel 1 wurden bereits die wichtigsten Paletten genannt, die man zum Programmieren in LabVIEW braucht. Sie sollen nun ausführlicher besprochen werden.
2.3.1
Werkzeugpalette (Tools Palette)
Beim Starten von LabVIEW erscheint die Werkzeugpalette automatisch, falls sie beim vorhe rigen Aufruf bereits geöffnet war. Ist das nicht der Fall, holt man sie mit dem Aufruf der Menüs 'Anzeigen' - 'Werkzeugpalette' vom Frontpanel oder vom Blockdiagramm. Siehe dazu auch den Begleittext zu Bild 1.6 m i ersten Kapitel. Bi l d 2.7 zeigt nochmals diese Palette.
Bild 2.7 Werkzeugpalette
Die Werkzeugpalette enthält 1 1 Felder. Das oberste dient zur AktivierunglDeaktivierung der automatischen Werkzeugwahl. Es erscheint dann n i Grün, anderenfalls in Schwarz. Bei automatischer Wahl versucht das System ein geeignetes Werkzeug zu finden, sobald man mit dem Mauszeiger über die Symbole im Panel oder Diagramm f ahrt. Es schaltet z.B. aufdie Drahtrolle um (zweite Zei l e unter dem Automatiksymbol, links), wenn man sich Tenninals oder Funktionen nähert, die man verbinden möchte. Doch ist mancher Programmierer mit
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'
2.3 Paletten
43
der speziellen Arbeitsweise der Automatik nicht einverstanden und verzichtet deshalb auf die Bequemichkeit l der automatischen Werkzeugwahl. Will man ohne Automatik arbeiten, muss man die Kästchen darunter mit der linken Maus taste anklicken. Im Einzelnen haben sie folgende Bedeutung: •
Erste Zei l e links (Hand mit gestrecktem Zeigefinger): Dateneingabe, etwa durch Ankli cken der Pfeile an einem Eingabesymbol oder durch Anklicken des Datenfeldes und Ein tippen aufder Tastatur.
•
Erste Zei l e Mitte (Pfei l nach links oben): Auswählen von Objekten zur Positionierung oder Vergrößerung, auch zum anschließenden Löschen mit <Entf>. 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.C
• Sy>tem
• K�>isch • Ex><"" • Rogiefde,q, lXld 5irrU.ot ün • Zusotzp.okete • E9ffie Elemente EIemert i>USwi!hle<1." •
,�T &ActrveX
Bild 2.8 Palette '(Bedien-)Elemente'. Diese Elemente velWendet der Programmierer zur Gestaltung des Frontpanels
Wir sehen hier eine Fülle von kleinen Symbolen, die man für die Ein- und Ausgabe auf das Panel ziehen kann. Dazu muss man aber zunächst eines der 12 Symbole anklicken, um das zugeordnete Untermenü bzw. Unter-Untennenü zu öffnen. Rezept: Bei angepinnter Palette und n i c h t gedrückter Maustaste so lange durch die sich bis das gewünschte Objekt gefunden ist. Dann linke Maustaste
öffnenden Menüs gehen,
drücken. Nun erscheint eine fiinffingrige Hand, die das Objekt hält. Dieses an die vorgese hene Stelle im Panel ziehen und dort loslassen.
Es ist nicht nötig, jedes Mal den ganzen Weg von der obersten Palette durch alle Unterpalet ten zu verfolgen, bis man das gewünschte Element gefunden hat. Will man mehrere Elemen te aus einer Unterpalette ins Panel ziehen, fixiert man diese mit dem kleinen ReißnageJ links oben. Holt man die Palette nicht mit der rechten Maustaste, sondern über 'Anzeigen' - 'Ele mentepalette', ist die Fixierung bereits automatisch erfolgt. Bi l d 2.9 zeigt die Unterpalette, die zum oben links stehenden Symbol 'Numerisch' gehört. Dazu zählen Elemente für die Ein- und Ausgabe von Zahlen (oben links, erstes und zweites Element), daneben entsprechend für Zeiteingaben und -ausgaben. Die zweite Zeile enthält verschiedene Formen vertikaler Schieberegler, die dritte horizontale Schieberegler. In der vierten Zeile findet man manometerähniche l runde Anzeigeinstrumente, die aber auch zur Eingabe verwendet werden können. In der fünften Zeile sind ein Tank (links), ein Thermo meter und ein FarbfeJd angebracht.
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.3 Paletten
45
�
lITil
,,,. .�
�
, ,
Aony. M.>trix..
t-I..me
�ische A ... Zef:>t�'E .. Zef:�·A..
R...... &Eno.xn
Schie!,e«ve< ..
Schiet>ef � .. Ve<�,onzei ..
Ve
""
Schiet>ef (hc
Schiet>ef � .. Ve<�,onzei ..
Messle;ste (h..
�
�
Syst"",
K�>isch
Rogiefde>ig1l.O; lusotzp.ok
Element "",,,W ,�T &Act�eX
,', I
� •
:c
,', �
�� •
,
I
�
, ! o�
�
r::
c.oIo"hol..
:c-
"�-
c."""....', ... ..
Rundn<',�
•n
Thefroornete<
Hc<�ont* Bi..
Ve
:�
C
:Ci
....
F«bfeid
j "
Bild 2.9 Unterpalette 'Numerisch'
In ähnlicher Weise findet man auch unter den anderen Symbolen der Palette Eingabe- und Ausgabeelemente. Ausprobieren!
in
Bild 2.8
Zusammenfassend kann man die Bedeutung der Symbole wie folgt beschreiben:
'Numerisch', erste Zeile links: Elemente zur Ein- und Ausgabe numerischer Zahlentypen. 'Boolesch', erste Zeiie Mitte: Elemente, die nur zwei Zustände annehmen können, wie Schalter oder LEDs, Schaltflächen oder der Stopp-Knopf. 'String & pfad',ersteZeile rechts: Ein- und Ausgabe von Text, wobei die einzelnen Zeichen im ASCII-(ode verschlüsselt werden. LabVIEW unterscheidet die Datentypen 'String' und 'pfad'. 'Array, Matrix & Cluster', zweite Zeiie links: Ein- und Ausgabe von Vektoren, Matrizen oder höher dimensionalen Feldern. Die einzelnen Elemente müssen vom gleichen Datentyp sein. Ferner Cluster, entsprechend den Strukturen in C. Hier dürfen die einzelnen Elemen te auch von unterschiedlichem Datentyp sein.
•
'liste & Tabelle', zweite Zeile Mitte. 'Graph', zweite Zeiie rechts: grafische Darstellung von Funktionen und Relationen. 'Ring & Enum', dritte Zeile links: zyldische Bedienelemente zur Steuerung von Fall unterscheidungen.
'Container', dritte Zeile Mitte: zum Beispiel Registerkarte oder Trennbalken Frontpanel. '1/0', dritte Zeile rechts: Eingabe/Ausgabe (Input/Output) von Signalen.
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'
2
46
Einstellungen, Sprachenwahl, Paletten
'Refnum', vierte Zeile links: zur Bildung von Referenzen auf verschiedene LabVlEW Objekte, z.B. Applikationen, V1s. Bedienelemente usw.
'Variant und Klasse', vierte Zeile Mitte: erlaubt die Ausgabe beliebiger Datentypen auf dem Frontpanel, I.B. von numerischen, booleschen oder Stringdaten, ferner 'LabVlEW Objekt'
' 06. OD
'Dekorationen' (in Version 8.0: 'Gestaltungselemente'J, vierte Zeile rechts: zur grafischen Kommentierung eines V1s. z.B. durch Hinweispfeile, Kästchen oder Kreise mit Kommen taren.
Weitere Frontpanel-Elemente findet man n i den unterhalb der Rubrik 'Modem' befindlichen Zeilen 'System', 'Klassisch' (Elemente früherer LabVIEW-Versionen), 'Express', '.NET & ActiveX' U$W. Wir werden auf einzelne dieser Elemente näher eingehen, sobald wir sie in einem derspäter folgenden Beispielprogramme benötigen.
Funktionenpalette
2.3.3
Die Programmierung m i engeren Sinne findet im Blockdiagramm statt, in dem der Entwick ler des Vls je nach AufgabensteUung verschiedene Funktionen zu platzieren und mit 'Dräh ten' zu verbinden hat. Diese Funktionen sind der Funktionenpalette nach Bi l d 2.10 zu ent nehmen. Siehe dazu auch Kapitel l, Bild 1.10. � :::'",d<.
� "''''' '''''';'- ''''
� � :&1 � � 'm � � � [1;1 ' lliii1I � � � �
,,-
�>
-�
""'><10
'm
y.."","
,o..bo&B
.�
�'"
• • '\'f
AOOoJ ", . , n
" � ",,,
",,,",�y,,,, "
'
,
· ,' .." • '''''''Pb'' • '".. 'm
. ,,,..,. _.....,
Bild 2.10 Funktionenpalette mit der Rubrik 'Programmie rung'. Die Elemente dieser Palette bzw. ihrer Unterpaletten verwendet der Entwickler eines Vls zum Aufbau des Pro gramms im Diagramm
Wie schon bei der Elementepalette sind die dort zusammengestellten Symbole nicht unmit telbar zu verwenden. Sie verweisen vielmehr auf Unterpaletten sowie Unter-Unterpaletten. Die Staffelung ist in einigen Fällen tiefer, so dass man die gewünschte Funktion unter Um ständen erst nach drei Suchschritten findet. Bild 2.11 zeigt ein Beispiel: Will man eine Datei auf der Festplatte löschen, benötigt man die Funktion 'Löschen' n i der Unter-Unterpalette 'Funktionen' - 'Programmierung' - 'Datei-I/O' (vierte Zeile inks) l - 'Dateifunktionen (Fort geschritten)' (siebente Zeile rechts) und dort in der vierten Zei l e rechts. Bild 2.10 bis Bild
2.12 zeigen diese Paletten.
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'
2.3 Paletten
47
- �: ",""", ' � p"",,,",,",,,, ,,,, l ""0.110 ''''''' ''' '''' ''' o ' �'''-V
[;J llJ ll,?J � t!il ffil rn Dl rn �
---
ll� := -,
I
"�....",,, ..
LO"'>1/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'''''<=1...
... ""'- ....� ... Or"� ..,..;... ""'''''. '
�
m
�
""..... cl> 0... """""' '''-.. PI"" ..,,,, �
,.,.",, �hP =
Potnon ",,"
rn
""'.�".,�
O� dd
=
PI"""..n."
oe
.�. ., "',.,,"�
=
...., � ,,"
EJ.
"8'
pf""f�'.....
Bild 2,12 UnterUnterpalette 'Dateifunktionen (Fortgeschritten)' in der Datei-l/oUnterpalette (Zeile 7 rechts)
Es folgt ein überblick über die Bedeutung der Symbole der Funktionenpaleue: 'Strukturen', erste Zeile oben links: wichtige Programmstrukturen wie Sequenz. Case Struktur, Schleife, Ereignis; ferner lokale und globale Variable. 'Array', erste Zeile Mitte: Funktionen zur Bearbeitung von Feldern (Arrays) wie Vektoren und Matrizen. Arraykonstante. 'Cluster & Variant', erste Zeile rechts: Funktionen zur Bearbeitung von Clustern wie Auf schlüsseln und Bündeln, Umwandlung in Array und umgekehrt. Clusterkonstante. Ferner Datenumwandlung in variablen Typ und umgekehrt. 'Numerisch', zweite Zeile links: Operatoren und Konstanten für numerische Datentypen wie Addieren, Multiplizieren, Dividieren usw. 'Datei-lO', zweiteZeile Mitte: Funktionen zum Lesen von und Schreiben in Dateien auf der Festplatte. Dateikonstanten wie pfad zum momentan laufenden LabVIEW-V1. 'Boolesch', zweite Zeile rechts: logische Operatoren und Konstanten für boolesche Daten wie Und, Oder, Negation. 'String', dritte Zeile rechts: Operatoren und Konstanten für Strings und pfade, z.B. String länge, Stringverkettung, Umwandeln String nach pfad und umgekehrt. 'Vergleich', dritte Zeile links: Vergleich von Daten, z.B. a < b. 'Timing', dritte Zeile Mitte: Zeitfunktionen wie Warten, Verzögern, Abfrage Momentanzeit.
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
48
Einstellungen, Sprachenwahl, Paletten
'Dialog & Benutzeroberfläche', vierte Zeile rechts: Funktionen fOr den Dialog Benutzer Computer, Fehlermeldungen u. a.
'Signalverlauf, vierte Zeile Mitte: behandelt Waveforms', Das sind Datenpakete, die aus Messwerten, der Anfangszeit und dem Zeitschritt zwischen der Erfassung zweier Mess werte bestehen.
'Anwendungssteuerung', vierte Zeile rechts: Steuerung von Vls und anderen Anwendun gen, z.B. Microsoft ExceL 'Synchronisierung', ftl.nfte Zeile links: Synchronisierung paraliei laufenderVls oder von Teilen von Vls. 'Audio & Grafik', filnfte Zeile Mitte: Funktionen, mit denen man Töne erzeugen und Au diodaten abspielen kann. Ferner Funktionen zur Programmierung bewegter Animationen, z.B. zur Darstellung einer schwingenden Feder. 'Erstellen von Reports', fIlnfte Zeile rechts: Funktionen zur programmgesteuerten Erzeu gung eines Berichts, z.B. in Zusammenhang mit einer Messdatenerfassung. Weitere Funktionen findet man in den unterhalb der Rubrik 'Programmierung' befindlichen Zeilen 'Mess-I/O', 'Instrumenten-I/O', 'Bi l derkennung und Motorensteuerung' usw. Wir werden auf einzelne dieser Elemente näher eingehen, sobald wir sie in einem der später fol genden Beispielprogramme benötigen.
IAufgabe 2.1
Öffnen Sie ein leeres VI, ändern Sie über 'Werkzeuge' - 'Optionen' einige der oben in Ab
schnitt 2.1 besprochenen Einstellungen und testen Sie diese n i h i ren Auswirkungen auf ein einfaches Programm, Z.B. das aus Aufgabe 1.1. Welche Einstellungen sind für Sie be sonders ansprechend? Achtung! Notieren Sie sich Ihre Änderungen, damit Sie in der Lage sind, den ursprüngli chen Zustand wiederherzuste1len.
IAufgabe 2.2
Experimentieren Sie mit Eingabe-/Ausgabe-Elementen aus der Palette 'Modern'. Beson ders die Unterpaletten 'Numerisch' und 'Boolesch' sind fürs Erste interessant. Verschaf fen Sie sich einen Überblick über die dort bereitgestellten Symbole. Verknüpfen Sie Ein
gabeelemente (z.B. einen 'Schieber') mit Ausgabeelementen (z.B. einem 'Tank'). Starten Sie dann das Programm mit 'Wiederholt ausführen' und ändern Sie die Eingabedaten während des Programmlaufs.
IAufgabe 2.3
Experimentieren Sie mit Funktionen aus der Funktionenpalette. Auch hier sollten Sie
sich zunächst nur in der Unterpalette 'Numerisch' umsehen. Versuchen Sie z.B., eine Zu fallszahl (Würfelsymbol) nach dem Prinzip des VI in Abschnitt 1.5, Bild 1.18, zur Anzei ge zu bringen. In Abweichung von dieser Vorgabe sollten Sie allerdings ein 'Signalver laufs-Diagramm' und keinen 'Signalverlaufs-Graphen' als Anzeigeelement wählen.
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'
3
Programmstrukturen
lernziele 1. Gedanken der strukturierten Programmierung verstehen. 2. Flache und gestapelte Sequenzen programmieren, mit lokalen Sequenzvariablen und lokalen Variablen arbeiten können.
3. Mit Hilfe der Case-Struktur Alternativen und Mehrfachalternativen programmieren können. 4. Fot-Schleifen programmieren können, auch unter Zuhilfenahme von Sdlieberegistern.
5. While-Schleifen programmieren können, u.a. zum Ersetzen der Startoption 'Wiederholt ausführen'.
3.1
Strukturiertes Programmieren
Im Laufe der Entwicklung der Programmiertechnik erkannte man, dass sich jedes Programm prinzipiell aus drei Bausteinen oder Strukturblöcken aufbauen lässt. Diese Bausteine heißen
•
Sequenz,
•
Alternative,
•
Schleife.
Beschränkt man sich bei der Programmentwicklung konsequent auf diese drei Elemente, spricht man von 'strukturierter Programmierung'. Strukturierte Programme lassen sich mit Hilfe von Struktogrammen leicht grafisch veranschaulichen. Tabelle 3.1 zeigt die Paletten von LabVIEW 8.2, welche die Strukturen Sequenz, Alternative und Schleife enthalten. Tabelle 3.2 gibt einen überblick über diese Strukturen. Tabelle 3.1 Strukturblöcke in LabVIEW, Version 8.2
Palette 'Programmierung' - 'Strukturen'
I!I ·
• • •
· ·
I!I ·
• • •
· ·
111- - ·
CD
D
Flache 5eque ... Gestapete 5...
D
Case·strul
�
For-5chIefe
'Flache Sequenz' und 'Gestapelte Sequenz'
'Case-Struktur'
!;!
'Mlie·5chlefe
'For-Schleife' und 'While-Schleife'
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
so
Programmstrukturen
Tabelle 3.2 Grundtypen von Strukturblöcken und ihre Darstellung. Links Programmablaufplan, in der
Mitte Struktogramm, rechts C-Notation
1
I
I
I
SI
I
11
Sequenz
I
I
1
52
I
SI 52
Besteht SI nur aus einer einzelnen CAnweisung, wird sie stets durch ; abgeschlossen. Beispiel; ' '
k = D; Alternative
� �i"� erffi llt
SI
151)
152)
I
I
I
I
I
S2
1
ja
nein
erfiillt
S2
SI
if(bedingung) 151) d,.
152)
Schleife
J
� I" 1
erfli llt
s
�
1
Solange Bedingung erffillt s
while(bedingung) 15)
Die Frage ist natürlich, inwieweit das Konzept der strukturierten Programmierung von kon
ventionellen Programmiersprachen auf LabVIEW übertragbar ist bzw. welche Modifikatio nen erforderlich werden. Im Prinzip besteht jedenfalls die Möglichkeit der übertragung.
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'
3.2
Sequenz
3.2
51
Sequenz
Wie n i Abschnitt 1.6.2 erwähnt, wird ein Knoten, d.h. eine Funktion wie z.8. das Addieren, genau dann ausgeführt, wenn alle seine Eingabe-Tenninals mit Daten versorgt sind. Danach versorgt dieser Knoten alle seine Ausgabe-Terminals mit Daten. Funktionen, die voneinan der bezüglich der Versorgung mit Daten unabhängig sind, werden n i LabVIEW parallel ausgeführt. Ein sequenzieller Ablaufist n i LabVIEW-Programmen also keineswegs selbstver ständlich. Diejenigen Funktionen, die zuerst alle notwendigen Daten über die Verbindungs leitungen erhalten, werden als Erste ausgeführt. Werden Leitungen parallel zu verschiedenen Funktionen geführt, ist nicht vorhersagbar, welche Funktion zuerst abäuft. l In vielen Fällen ist das auch gleichgültig. Manchmal ist aber eine gewisse Reihenfolge unabdingbar. Dann ist die Sequenzstruktur nützlich. Ein einfaches Beispiel für den Gebrauch der Sequenz ist die Aufgabe, den Zeitbedarf für eine gewisse Zahl von Operationen zu bestimmen. Wir wollen Z.B. wissen, wie lange LabVIEW auf einem gegebenen pe braucht, um die Reihe Sj
I 1 I I =1+-+-+-+2 3 4 5
zu berechnen und das Ergebnis anzuzeigen. Ein erster einfacher Ansatz zur Summenbi l dung besteht in der Entwicklung eines Programms gemäß Bild 3.1. I> 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
--
.-
,
��J :. ���.. ����:::�
Bild 3.10 Hier wird die Anfangs
zeit für die eben 'inks erzeugte lokale Variable gewählt
Man kann lokale Variablen für jedes bereits existierende Anzeige· oder Bedienelement erstellen. Dazu 'Funktionen' - 'Programmierung' - 'Strukturen' - 'LOCAL' (fünfte Zeile Mitte) wählen und im Diagramm platzieren. Man erhält dann ein kleines doppelt gerahmtes Kästchen mit Fragezeichen. Dessen Kontextmenü enthält in der dritten Zeile 'Objekt aus wählen'. Wir wählen 'Anfangszeit' und erhalten zuletzt das in Bild 3.11 dargestellte Resultat.
2 0 . . 2 ..
Bild 3.11 Hier werden keine
lokalen Sequenzvariablen ver wendet, sondern nur eine lokale Variable für die Anfangszeit Folglich fehlen auch die kleinen Quadrate am Rande der Rahmen O bis2 Jede lokale Variable kann geschrieben oder gelesen werden. Voreingestellt ist 'Schreiben'. Will
man
den Anfangswert lesen und weiterverarbeiten, ist im Kontextmenü 'In Lesen
ändern' anzuklicken. Das Ergebnis ist an dem etwas dickeren Rahmen zu erkennen, aber auch am Anschluss oder Hinweisstreifen ('Tip strip'), der jetzt an der rechten Seite erscheint.
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'
3
56
Programmstrukturen
Merke: Lokale Sequenzvariablen kann man durch lokale Variablen ersetzen. Sie sind zu finden unter 'Funktionen' -'Programmierung' - 'Strukturen'. Lokale Vari ablen werden verwendet, wenn Quellen- oder Zielterminals nicht zu sehen sind (wie z.B. in einer gestapelten Sequenz) oder wo die Verbindungslinie einen zu unübersichtlichen Verlaufnehmen würde.
IAufg.bel., Programmieren Sie das Beispielprogramm zur Zeitmessung von Anfang an, aber unter Verwendung von lokalen Variablen und einer gestapelten Sequenz.
IAufg.bel.2 Wie Aufgabe 3.1, aber diesmal mit einer flachen Sequenz.
3.3
Alternative, Case-Struktur
Tabelle 3.1 zeigte nur ein Muster für die Alternative: die Ja-Nein-Entscheidung. Theoretisch genügt das auch. Eine Entscheidung, die eine von drei oder vier oder mehr Möglichkeiten zulässt, kann stets aufeine Folge von 'a-Nein-Entscheidungen zurückgeführt werden. In der Praxis ist es aber günstig, wenn eine Programmiersprache außer der Ja-Nein-Entscheidung auch Mehrfachalternativen unterstützt. LabVIEW sieht nur die Case-Struktur vor, d.h. die Mehrfachalternative, wobei die gewöhnliche Alternative einfach der Sonderfall einer Case Struktur mit genau zwei Fällen ist. Die folgenden Beispiele erläutern die Case-Struktur. Bild 3.12 zeigt das Panel des Programms Case2.vi, das kommunizierende Röhren simuliert. Wenn das Ventil geöffnet ist (boolescher Wert gleich AN bzw. 'Auf oder TRUE), soll sich bei beliebigem Anfangsstand der Flüssigkeiten in beiden Tanks der Mittelwert einstellen. Ist das Ventil geschlossen (boolescher Wert AUS bzw. 'Zu' oder FALSE), darf sich am Flüssigkeits stand in beiden Behältern nichts ändern. Dies erreicht man mit dem Programm in Bild 3.13.
Es nutzt die Case-Struktur mit zwei Fällen, die Alternative. �ei e.e�beler; � f10lekt �er; i!lerO;zeuQe �
11
lJpt: �sct.rfurt
Tri I
'"
....
•
t:,.
T... 2
Bild 3.12 Beispiel einer Alternative. Der Anwender stellt beliebige Flüssig keitsniveaus in beiden Tanks ein und startet dann das VI. Ist das Ventil geschlossen, geschieht nichts. Ist es geöffnet, gleichen sich die Flüssig keitsstände aus
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.3 Alternative, Case-Struktur
57
Man findet die Case-Struktur unter 'Funktionen' - 'Programmierung' - 'Strukturen' in der zweiten Zei l e links. Sie ist voreingestellt für zwei Fälle, die als TRUE und FALSE bezeichnet werden. TRllE
...
FALSE ...
't'ertl
I:!i:!
Bild 3,13 TRUE-Teil (links) und FAL$E-Teil (rechts) einer Case-Struktur mit zwei Fällen Das Fragezeichen im Rahmen der Case-Struktur ist im Fall der Alternative mit einem Termi nal zu verbinden, das einer booleschen Variablen, d.h. hier einem Schalter auf dem Panel, zugeordnet ist. Es handelt sich um den 'Ventil' genannten Schalter auf dem Panel von Bi l d 3.12. Steht dieser Schalter auf 'Auf (gleich AN oder TRUE), wird der MitteJwert der Behälterstände von Tank 1 und Tank 2 gebildet und in gleicher Weise zu den lokalen Variab len von Tank 1 und Tank 2 geleitet. Eine zusätzliche Sequenzstruktur ist hier nicht nötig, weil die Speicherung erst erfolgt, nachdem der Multiplikationsknoten seine Arbeit abgeschlossen hat. Dann erst werden nach dem Prinzip von Abschnitt 1.6.2 die alten Werte von Tank 1 und Tank 2 überschrieben.
Bemerkungen zur Programmierung von Case2,vl •
Die Tanks aufdem Panel von Bild 3.12 sind unter 'Elemente' - 'Modern' - 'Numerisch' in der Mitte der sechsten Zeile zu finden.
•
Beide Tanks erhalten der genaueren Ablesbarkeit wegen rechts eine digitale Anzeige, und zwar durch Anklicken von 'Sichtbare Objekte' - 'Zahlenanzeige' im Kontextmenü.
•
Ab Version 7.x hat die ZahlendarsteIlung m i Normalfall 6 signifikante Stellen, wobei abschließende Nullen unterdrückt werden. Im Beispiel wurde das über das Kontextmenü
der Tanks und die Festlegung von 'Ponnat & Genauigkeit' auf 2 KommasteIlen und Nichtunterdrückung abschließender Nullen umgesteJlt. •
Der rechte Tank hat keine Skala. Man erreicht das im Kontextmenü auf dem Frontpanel mit 'Skalierung' - 'Darstellung' und Wahl des leeren Fensters n i der Mitte rechts.
•
Die zwei Tanks sind auf dem Panel durch eine Art von Rohrleitung verbunden. Das ist reine Dekoration und hat keinen Einfluss auf die durchgeführten Rechnungen. Solche Dekorationen stehen unter 'Elemente' - 'Modern' rechts unten. Von dort wurde ein 'Quadrat' (erste Zeile, viertes Element) auf das PaneJ gezogen und mit dem Farbpinsel der Werkzeugpalette blau gefarbt. Zu beachten ist, dass man Vorder- und Hintergrund der Box blau färben muss. Andernfalls sieht man einen feinen Rand.
•
Die voreingestellten Bezeichnungen AN und AUS am Ventil kann man sichtbar machen,
wenn man im Kontextmenü 'Sichtbare Objekte' und 'Boolescher Text' wählt. Sie lassen sich mit der 'Text bearbeiten'-Funktion in der Werkzeugpalette durch Bezeichnungen ei gener Wahl (hier 'Auf und 'Zu') ersetzen.
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
58
Programmstrukturen
Programmierung von Case3.vl Das Programm Case3.vi enthält eine Case-Struktur, die nicht nur zwei, sondern fünf Fallun terscheidungen aufweist. Das Panel in Bild 3.14 zeigt drei Behälter. Tank 3 ist tiefer angeord net. Damit soll daraufhingewiesen werden, dass die Flüssigkeitsströme nur von Tank I und Tank 2 ausfließen können. Die Gestaltung der Oberfläche erfolgt m i Prinzip wie n i Case2.vi. Der wesentliche Unterschied besteht darin, dass 'Ventil' von Bi l d 3.12 durch das (Bedien-) Element 'Wahl' ersetzt wurde. Sein Datentyp ist 'Enum' oder 'Aufzählung'. Man findet
'Enum' unter 'Bedienelemente' - 'Modern' - 'Ring & Enum' (dritte Zeile links). Enum ist per Voreinstellung eine 16-Bit-Integerzahl, die mit Texten verknüpft werden kann. Dazu wählt man in der Werkzeugpalette den Buchstaben 'A', setzt den Mauszeiger n i das BedieneJement und schreibt einen Text. Im Beispiel lautet die erste Eintragung 'Kein Zufluss'. Im Kontext menü wählt man anschießend l 'Objekt danach einfügen' und schreibt die zweite Eintragung, m i Beispiel 'Zulauf Tank 1 '. In dieser Weise fährt man fort mit 'Zulauf Tank 2', 'Mischen Tank 1 und Tank 2' und zuletzt 'Leeren Tank 3'. ,,-otei �i>fbdffi !\nZei9ffi [To;e+1 !\USfChffi \,!:e
j;[_---.:�������������=-__.:;;l:: � • .4
Bild 3.14 Case-Struktur mit fünf ver schiedenen Fällen: kein Zufluss, Zu fluss nur von Tank 1, Zufluss nur von Tank 2, Mischen von Tank 1 und Tank 2 nach Tank 3 und Leeren von Tank 3. Die Steuerung erfolgt Ober die EnumVariable 'Wahl'
Verbindet man den zugehörigen Anschluss m i Diagramm mit dem Fragezeichen am Rand einer Case-Struktur, so werden die voreingesteJlten überschriften 'TRUE' und 'FALSE' n i den zwei Rahmen durch ' "Kein Zufluss", Standard' und "Zulauf Tank I" ersetzt. Um auch Rahmen für die restlichen drei Eintragungen zu schaffen, muss man die Case-Struktur ähn lich behandeJn wie die Enum-Variable. Das heißt: Rahmen "ZulaufTank 1" einstellen, dann m i Kontextmenü dreimal 'Case danach einfügen' aufrufen. Nun erscheinen automatisch die anderen Eintragungen "Zulauf Tank 2" usw. (Alternativ kann man auch m i Kontextmenü der Case-Struktur 'Case für jeden Wert' anklicken). Die Case-Struktur unterscheidet jetzt fünf Fälle und muss nur noch programmiert werden. Bild 3.15 zeigt das Diagramm für "ZulaufTank 2", Bild 3.16 für "Mischen Tank 1 und Tank 2".
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'
3.3 Alternative, Case-Struktur
;i �I''''31!
59
"ZU�i.I TrlZ"
W"'"'
d!.o
� ,... ,
•
IQ]
!I'
...
'I! Bild 3.15 Fall 3 der Case-Struktur
"t
..
Bild 3.16 Fall 4 der Case-Struktur
An diesem Beispiel kann man bereits erkennen, dass der Datentyp 'Enum' eine zyklische Struktur hat. Geht man am Bedienelement 'Wahl' die fünf Fälle der Reihe nach durch, er scheint automatisch wieder der erste Fall. Intern wird gezählt: 0,1, 2, 3, 4, 0, 1, 2, 3, 4, .
Merke: Die Case-Struktur ist aufzwei Fälle voreingestellt, die mit TRUE und FALSE überschrieben sind. Das Fragezeichen links am Rahmen der Alternative ist dann mit einem Schalter als (Bedien- )E1ement bzw. mit einem booleschen Wert zu verbinden.
Merke: Will man in der Case-Struktur mehr als zwei Fälle unterscheiden, benötigt: man zur Steuerung eine Variable. Hierfür ist der Datentyp 'Enum' geeignet. Aber auch andere Datentypenwie 'Text-Ring', 'Menü-Ring' usw. aus der Unter palette 'Ring & Enum' sind möglich.
Ergänzungen •
Das FeJd am oberen Rand einer Case-Struktur heißt Selektorfeld. Hier kann man auch mehrere Fälle zusammenfassen, indem man sie durch Kommas trennt oder mit '. .' ver
i t ein Beispiel. bindet. Letzteres bedeutet so viel wie 'von .. bis'. Bild 3.17 zeg
•
�::::":"�,,,,::, ::I
Bild 3.17 In den Fällen 2, 3 und 4 wird der Aus gabevariablen derselbe Wert 1 0 zugewiesen. Man benötigt dazu nur ein Teildiagramm an Stelle von drei
Führt man eine Variable aus einer Case-Struktur nach außen, so muss das aus allen Rahmen heraus geschehen. Andernfalls ist das VI nicht ausführbar, siehe Bild 3.18.
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'
3
60
Programmstrukturen
� HO'�d"� �:::'::: "::::::F Bild 3.18 Fehlerhaftes VI. Teildiagramm 1 liefert keinen Wert fOrdie Ausgabevariable •
Man kann nun entweder der Reihe nach in allen Rahmen einen geeigneten Ausgabewert programmieren oder man wählt generell einen Defaultwert, der n i diesem Fall gleich 0 ist. Dazu am Ausgabetunnel das Kontextmenü aufrufen und 'Standard verwenden, wenn nicht verbunden' anklicken. Diese Methode funktioniert natürlich nur, wenn auch die übrigen Rahmen ohne eigene Ausgabe den Defaultwert als Ausgabe übergeben sollen.
IAufg.be ...
Ergänzen Sie die Programmierung für die Fälle 1 , 2 und 5 des Beispiels Case3.vi.
IAufg.bel
.•
Schreiben Sie ein Programm Case4.vi, bei dem die Gase-Struktur durch eine Variable
vom Typ 'Text-Ring' aus der Unterpalette 'Ring & Enum' gesteuert wird. Im übrigen soU das Programm dieselbe Funktion wie Case3.vi haben. Anleitung: Nach Platzieren des Bediene1ements im Kontextmenü 'Objekte bearbeiten' aufrufen und die gewünschten Texte in die daraufhin erscheinende Liste eintragen.
3.4
Schleifen
Tabelle 3.1 kommt mit nur einem Schleifentyp aus, dem der Whi l e-Schleife. Die FOR Schleife kann auf eine Kombination von Sequenz und While-Schleife zurückgeführt werden. Doch wird sie so oft verwendet, dass alle bekannten höheren Programmiersprachen sie als eigenen Typ anbieten, so auch LabVIEW.
FOH-Schlelfe Ein erstes Beispiel wurde bereits in Abschnitt 3.2 in Zusammenhang mit der Sequenz für die Zeitmessung vorgestellt. Dabei handelte es sich um eine simple Wiederholung immer der gleichen Operationen, die dazu diente, die für die Zeitmessung minimal notwendige Re chenzeit zu erzeugen. Bild 3.19 zeigt ein anderes einfaches Beispiel. Hier wird die in der FüR-Schleife unten links verfügbare Variable i (i-Terminal) benutzt, um einen einfachen Zähler zu programmieren, der m i Sekundentakt aufwärtszählt, und zwar die n Schritte von 0 bis (n-l). Das Metronom im Diagramm sorgt dafür, dass der Takt für die Wiederholung der FüR
Schleife 1000 Millisekunden oder I Sekunde beträgt. Darin ist die übrige Rechenzeit, hier für das Hochzählen des Indexes und die Ausgabe des Zählerwertes, bereits enthalten. Man findet das Metronom unter 'Punktionen' - 'Programmierung' - 'Timing' (dritte Zeile rechts) in der
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'
3.4 Schleifen
61
obersten Zeile an dritter Stelle. Eine Alternative wäre die Funktion links daneben, die Arm banduhr. Doch wartet diese Funktion einfach die vorgegebene Zeit, so dass die Wiederho lungszeit für die Schleife aus Rechenzeit plus Wartezeit besteht. Das ist nicht korrekt, wäre aber n i unserem Beispiel akzeptabel, weil man hier die Rechenzeit vernachlässigen kann.
I>
F
\ VI
.... ----
: 100
Bild 3.19 Hundert Zählschritte im Sekundentakt von 0 bis 99
Die FüR-Schleife im Blockdiagramm weist rechts unten stets eine Art von Eselsohr auf (sie
he Bild 3.19). Das soll andeuten, dass man sich eine FüR-Schleife als Kartenstapel vorstellen kann, von dem m i Laufe der Rechnung eine Karte nach der anderen abgehoben wird. Die Karten sind nummeriert. Wekhe Karte gerade an der Reihe ist, zeigt die Variable i n i der linken unteren Ecke. Die Zahl der Karten kann, wie in unserem Beispiel geschehen, durch Verknüpfung des Eingangs N n i der linken oberen Ecke mit einer Variablen oder Konstan ten festgelegt werden. Häufig muss man bei der Schleife, wie auch bei der Sequenz die Variablenwerte von einer Karte zur nächsten transportieren. Warum das nötig sein kann, zeigt am besten das Beispiel Sequenz_Zeitverbrauch4.vi in Bild 3.20. Es geht darum, die Programmierung der Reihe I 1 1 I sl =1+-+-+-+ 2
3
4
5
aus Abschnitt 3.2 einfacher zu gestalten. Dazu ersetzt man den Rahmen 1 der Sequenz in Bi l d 3.7 durch die Struktur in Bi l d 3.20. Hier wird ein Schieberegister verwendet. Man erhält es im Kontextmenü am rechten oder linken Rand der FüR-Schleife durch Wahl von 'Schieberegister hinzufügen'. Die Bedeutung erschließt sich aus Bild 3.21. 1 0. . 2
...
Bild 3.20 Programmierung
der Summe von i", 1 bis n mit dem Schieberegister der FOR-Schleife
•
Anders als bei der früheren Methode der Programmierung ist die Zahl der Elemente der
Reihe hier variabel. Man ist nicht darauf festgelegt, nur 5 Elemente zu addieren. Ebenso gut
kann man im Panel n = 7 eingeben und erhält dann als Ergebnis die Reihe 1 1 1 1 1 1 s = 1 + - +-+-+-+-+1
2
3
4
5
6
7
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
62
Programmstrukturen
Zum Verständnis dieser FüR-Schleife ist das Bi l d des - auseinander gezogenen - Kartensta pels für den Fall n = 3 in Bi l d 3.21 hilfreich.
3 '-- N
�1 � 1
+
cY �
I
rII
1 .5
[9 fj!Y_
2
3
rII
+
0.33
1 .83
1 .83
181
Bild 3.21 Datentransfer bei der FQR-Schleife mit Hilfe von Schieberegistern Zum Beginn der Rechnung benötigt das Schieberegister einen Anfangswert. Im Beispiel erhält es diesen durch Programmierung der Konstanten O. Diese Initiaisierung l wirkt nur auf die oberste Karte des Stapels. Entsprechend wird das Ergebnis 'Summe' erst von der unter sten Karte ausgegeben, hier als 1,83, der Summe von 1 + 1/2 + 1/3.
IAufg.bel
.•
Bestätigen Sie den Datenfluss in Bild 3.21, indem Sie das entsprechende Programm ent wickeln und dann im Debug-Modus laufen lassen. Nützlich ist auch die Möglichkeit, ein Schieberegister mit mehr als einem Anfangswert ver sorgen zu können. Man kann das z.8. zur Bildung des arithmetischen Mittelwerts von Zah lenfolgen nutzen. Dies wird in Kapitel 4 m i Zusammenhang mit Datenfeldern, den so ge nannten 'Arrays', beschrieben. Schieberegister können übrigens alle Datentypen übertragen, nicht nur numerische. Ab LabVIEW 8.5 können For-Schleifen zusätzlich auch wie While-Schleifen, d.h. vorzeitig, beendet werden.
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.4 Schleifen
63
Whlle-Schlelfe Die einfachste Anwendung der While-Schleife besteht darin, den 'Wiederholt ausführen' Startknopf in der Symbolleiste
zu ersetzen.
Das Programm Add.vi in Bild 1.17 z.B. muss
man mit 'Wiederholt ausführen' starten, will man verschiedene Zahlenbeispiele testen, ohne
nach jeder Rechnung den Startknopf'Ausführen' ganz links betätigen zu müssen. Addl.vi in Bi l d 3.22 und Bild 3.23 zeigt eine Alternative. Die Programmierung beginnt damit, dass man Add.vi nach Addl.vi kopiert. Dann holt man sich die Whi l e-Schleife aus 'Funktionen' 'Programmierung' - 'Strukturen' und legt sie um das ursprüngliche Programm. In der rech ten unteren Ecke der Whi l e-Schleife sieht man einen roten Knopf (Standard-Abbruch bedingung), den man mit Hilfe von 'BedieneJement erzeugen' im Kontextmenü mit einem Stopp-Knopfverbindet. Nach Start des Programms wird die Schleife so lange wiederholt, bis der Bediener diesen Knopfbetätigt und damit aufTRUE umschaltet. Das Panel von Addl.vi unterscheidet sich vom alten Add.vi nur durch den zusätzlichen Stopp-Knopf. po Addl.y,lIlockd'''!lramm
DJ
Bild 3.22 Modifiziertes VI zur kontinuierlichen Addition von zwei Zahlen
I>
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<:hleife für alle Aufgaben verwenden, die sich auch mit der FüR-Schleife behandeln 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'
3
64
Programmstrukturen
IAufg.bel
.•
Modifizieren Sie das Programm von Aufgabe 3.5 unter Verwendung einer While Schleife. Anleitung: Die Whi l e-Schleife hat keinen Eingang für die Zahl N der Wiederholungen.
Der Abbruch muss daher durch einen Vergleich des Index 'j' in der linken unteren Ecke
mit einem vorgegebenen 'n' erfolgen. Auch hier kann 'n' entweder eine Konstante (z.B. 3)
sein oder eine Variable, die der Anwendet auf dem Panel eingibt. Der Vergleich erfolgt mit einem der Operatoren, die man unter 'Funktionen' - 'Programmierung' - 'Vergleich' (dritte Zeile Mitte) findet. Das Ergebnis des Vergleichs ist ein boolescher Wert (TRUE oder FALSE, grüner Verbindungsdraht), der mit dem roten Knopf unten rechts in der While-Schleife zu verbinden s i t.
Bemerkung Das Ausgangs-Symbol der While-Schleife ist auf das rote Haltzeichen als Standard-kon voreingestellt. Es hat die Bedeutung 'Stopp wenn TRUE', Im Kontextmenü kann man dieses Zeichen durch 'Bei TRUE fortfahren' ersetzen. Man erhält dann als kon ein gelbliches Quad rat mit gekrümmtem Pfeil m i Inneren. Manchmal ist die eine, manchmal die andere Aus
gangsbedingung bequemer zu programmieren. Im Prinzip würde aber eine einzige Art von Ausgangsbedingung genügen. Benötigt man die invertierte Bedingung, so kann man diese leicht durch den Invertierungsoperator 'NICHT' unter 'Funktionen' - 'Programmierung' 'Boolesch' (zweite Zeile rechts) selber erzeugen. In älteren LabVIEW-Versionen gab es tat sächlich auch nur die Ausgangsbedingung 'Weiter wenn TRUE'.
Merke:
Die FüR-Schleife wird genau N-mal durchlaufen, wobei der N-Eingang mit dem Terminal eines Bedienelements oder mit einer Konstanten
zu verbinden
ist. Innerhalb der Schleife können Daten mit Schieberegistem übertragen wer den. Der Index i links unten zählt die Zahl Durchläufe minus eins.
Merke:
zu verknüpfen.
Die While-Schleife wird so lange durchlaufen, bis eine Bedingung erfüllt ist. Diese ist mit dem Bedingungsterminal im Inneren rechts unten
Der Stopp-Knopfliefert die einfachste Bedingung. Der Index i zählt die Zahl
der Durchläufe minus eins. Eine While-Sch1eife wird aber mindestens einmal durchlaufen.
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
Lernziele 1. Datentypen 'numerisch', 'boolesch', 'String' und 'Pfad' unterscheiden und ins Programm einbeziehen können. 2. Darstellung und Genauigkeit numerischer Datentypen der jeweiligen Aufgabe anpassen können. 3. Arrays für verschiedene Datentypen anlegen und mit ihnen arbeiten können. Arrays in FüR-Schleifen, auch unter Zuhilfenahme von Schieberegistem, verarbeiten können.
4. Cluster anlegen, bündeln und aufschlüsseln können, interne Reihenfolge der Elemente beachten.
5. Verschiedene Typen aus 'Ring & Enum' nutzen können.
4.1
Numerische Datentypen
Bis jetzt haben wir hauptsächlich mit numerischen Datentypen gearbeitet, und zwar mit dem Typ 'DBL', d.h. mit Gleitkommazahlen doppelter Genauigkeit. Das ist die Standardein stellung in LabVIEW für variable numerische Datentypen. Auf dem Panel werden sie ab LabVIEW 7.0 mit 6 signifikanten Ziffern dargestellt, wobei nach dem Dezimalkomma keine Nullen am Ende der Zahl angezeigt werden. Sowohl den Datentyp als auch die Darstellung auf dem Panel kann man ändern. Dazu geht man ins Kontextmenü eines Bedien- oder Anzeigeelements und wählt 'Darstellung' für den Datentyp bzw. 'Format und Genauigkeit. . ' für die Art der Darstellung.
4.1.1
KontextmenO: Darstellung
Das Untermenü für 'Darstellung' n i Bild 4.1 zeigt vier Reihen mit •
•
Gleitkommazahlen in der ersten Zeile (Fragezeichen oben nicht mitgezählt),
ganzen Zahlen mit Vorzeichen in der zweiten Zei l e (1-Typen),
•
ganzen Zahlen ohne Vorzeichen n i der dritten Zeile (U-Typen),
•
komplexen Zahlen (Paaren von je zwei Gleitkommazahlen) in der vierten Zei l e.
Auf der linken Seite findet man jewei l s die genauesten, auf der rechten Seite die am wenigs ten genauen, dafür aber mehr Speicher sparenden Datentypen.
Holt man sich aus dem Untermenü 'Funktionen' - 'Programmierung' - 'Numerisch' links im unteren Teil eine 'Numerische Konstante', so ist deren Typ auf'I32' voreingestellt. Auch hier kann man den Konstantentyp wie bei den Variablen durch Aufrufvon 'Darstellung' m i Kon textmenü ändern. Bi l d 4.1 zeigt die Palette 'Darstellung'.
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
66 • gedeo.,..,( vwber90n In,..... , .. .. (� . ...... ...." IlesctTeb.ro;j o..ni Tipp, .. P*te� .-
�lItionen
-�
• . • .
PIs S)'niIoI......,;gen
-=-=--
4.1.2
��� �I � I��I I�:HI �I�II��I I��I ��El
Bild 4.1 Kontextmenü 'Darstellung' zu einem Bedien-oder Anzeigeelement, ähnlich auch bei einer Konstanten
Kontextmenü: Format und Genauigkeit
Bild 4.2 zeigt das Fenster beim Öffnen von 'Format und Genauigkeit'. Man erkennt hier vier verschiedene Arten der Darstellung von Gleitkommazahlen (auch 'Fließkommazahlen'): 'Fließkomma', 'Wissenschaftlich' (Exponentialdarstellung), 'Automatisch formatieren' und 'SI-Schreibweise'. Links in Bild 4.3 sieht man, von oben nach unten geordnet, die Aus wirkungen auf die Anzeige der stets gleichen Zahl 0.000060 I. Eine weitere Möglichkeit ist die Umwandlung einer gegebenen Zahl in das absolute oder relative Zeitformat. Die Zahl 0 im Format DBL (Gleitkommazahl) wird beim absoluten Zeit fonnat n i Datum und Uhrzeit 1.1.1904, 0 Uhr, 0 Minuten und 0 Sekunden verwandelt, vor ausgesetzt, es wurde die Zeitzone GMT (Greenwich Mean Time) eingestellt. Eine Zahl von
1000 zählt einfach um 1000 Sekunden weiter, liefert also Datum und Uhrzeit 1.1.1904,0 Uhr, 16 Minuten und 40 Sekunden. Bild 4.2 zeigt auch, dass die Auswahl von 'Hexadezimal', 'Oktal' und 'Binär' nicht aktiv ist (Graufarbung der entsprechenden Zeilen). Diese Wahlmöglichkeit ist für ganze Zahlen reserviert. In Bi l d 4.3 sieht man das FrontpaneJ von 'Zahlendarstellung.vi' als Beispiel für die Umwandlung der dezimal geschriebenen ganzen Zahl 1000 in das hexadezimale (Basis 16), oktale (Basis 8) und binäre (Basis 2) Zahlensystem. Schließl ich findet man auf der rechten Seite des Fensters in Bild 4.2 noch die Möglichkeit, statt der Zahl der signifikanten Stellen die Zahl der (Nach-)Kommastellen einzugeben. Auch
kann man die Voreinstellung 'Abschließende Nullen unterdrücken' aufheben. Unter der Zahl der signifikanten Stellen versteht man die Zahl der anzuzeigenden Stellen von der ersten Ziffer ungleich null an, gleichgültig, ob sie vor oder nach dem Dezimalpunkt stehen. Sie sagt etwas aus über die relative Genauigkeit, mit der eine Zahl dargestellt werden soll.
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.1 Numerische Datentypen
67
po EllI"nschaltefl fur numerlschesUement. Numerisch Er�
I
....ert� .
� ...-.d �
il
I
x
DoIo..me
I D«�
P" AbIctio6ende tden
r-.... � -.o.n
Bild 4.2 Eigenschaftsfenster 'Format und Genauigkeit' zu einem Bedien- oder Anzei gefeld. kann direkt nur vom Panel aus aufgerufen werden (indirekt allerdings auch vom Diagramm aus Ober 'Eigenschaften'). Bei Konstanten muss man das Diagramm wählen, weil diese nur dort angezeigt werden
: 0 00XI601
•
-
00,00:00 01.01.190+
� um
-,.. ---6,0IE-5
00:00
...
"'"
...
6,0IE-5
6O,lu
1I1110100J
Bild 4.3 Verschiedene Darstellungen der Zahl 0.0000601 mit Unterdrü ckung abschließender Nul len in der ersten und zwei ten Spalte. In der dritten Spalte Darstellung der Zahl 1000 1 kais Hexadezimal-, Oktal- und Binärzahl =
Es sei nochmals daraufhingewiesen, dass für Greenwich (GMT) der 1.1.1904, 0 Uhr als Null
punkt der Zeitzählung festgesetzt wurde. Jede positive Zahl zählt von da an n i Sekunden weiter. Die Zahl 60 entspricht also 1 min,
0,0000601 dagegen nur 0 Sekunden.
IAufgabe 4.1
Schreiben Sie ein kleines Programm, das eine Zahleneingabe m i DBL-Fonnat in eine ab
soluteZeitangabe umwandelt.
Tipp Die Umwandlung von Format und Genauigkeit bezieht sich immer nur auf ein einziges Bedien- oder Anzeigeelement. Will man mehrere solcher Elemente umwandeln, ist es
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
68
zweckmäßig, zuerst ein Element auf dem Panel zu platzieren, dann die Umwandlung durch zuführen und zuletzt dieses Element in der gewünschten Anzahl zu kopieren. LabVIEW vergibt automatisch neue eindeutige Namen, indem es die Kopien mit einer fortlaufenden Nummer versieht. Bei Bedarfkann man diese durch eigene Namen ersetzen. Numerische Funktionen für das Diagramm findet man unter 'Funktionen' - 'Programmie rung' - 'Numerisch'. Davon wurde bereits in Abschnitt 1.4.1 Gebrauch gemacht, siehe dazu auch Bild 1.8 und die Bilder 1.15 oder 1.16. Merke:
Für numerische Bedien- und Anzeigeelemente kann man mit Hilfe des Kon textmenüs 'Darstellung' Gleitkommazahlen, vorzeichenbehaftete und vor zeichenlose ganze Zahlen sowiekomplexe Zahlen (letztere als Paare von zwei Gleitkommazahlen) einstellen.
Merke:
Das Fonnat und die Genauigkeit der Darstellung von numerischen Daten typen aufdem Panel lässt sich im Kontextmenü 'Format und Genauigkeit. . . ' für jeweils ein Bedien- oder Ausgabeelement einstellen.
4.2
Bootesehe Datentypen
Man findet boolesche Datentypen für das Panel unter 'Bedienelemente' - 'Modern' 'Boolesch' in der Mitte der ersten Zeile, siehe Bild 4.4.
�I�·��::"",� t:���:·�";: t ::::::::::� . -
L """'h
G 1X...,lo:sI:haler
LED (•..-.dj
Kipps
KWs
..,
" , l..rnso:Mter (v...
l..rnso:Mter (h..
�
lfO (recH:ec�) Scl"iebesc� Scl"iebeschal, .
�
f<....1
OK·SchaItf\i
[]
""""'-
fud
stopp-SchoItf,.
Bild 4,4 Boolesche Bedien- und Anzeigeelemente. Es handelt sich im Wesentlichen um senkrechte und waagerechte Schalter verschiedener Ausführung sowie um Anzeige-LEDs. Auch gibt es Knöpfe für OK. (ANCEL und $TOP
Bei den booleschen Bedienelementen lässt sich im Kontextmenü 'Sdlaltverhalten' die me chanische Wirkung verschiedener Schaltertypen simulieren, siehe Bild 4.5.
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.2 Boalesche Datentypen
69 Bild 4.5 Mechanisches Schaltverhalten
eines booleschen Bedienelements: Sidltb.Ye �jel<.te AnschUss """",, In Anz� lXfJW_
Erste Zeile:
Beim DrOcken schalten Beim Loslassen schalten Bis zum Loslassen schalten
Bescr.eb.rJg lXld Tipp... Erst" Ersetzffi Dotenope
Zweite Zeile:
Latch (deutsch: verriegelt) beim DrOcken Latch beim Loslassen Latch bis zum Loslassen
�
5ch.ol:verh.ol:en
Wichtig: Zu booleschen Bedienelernen· ten, deren mechanisches Verhalten gemäß Zeile 2 eingestellt ist. lassen sich keine lokalen Variablen bilden!
Boolesche Punktionen für das Diagramm findet man unter 'Punktionen' - 'Programmie· rung' - 'Boolesch' in der zweiten Zeile rechts. Siehe dazu Bild 4.6. Boolesche Variablen wurden bereits im Zusammenhang mit der While-Schleife verwendet, z.B. in Bild 3.20 und Bild 3.21 der Stopp-Knopf. Bild 4.7 zeigt eine Endlosschleife, die mit der booleschen Konstanten 'TRUE' arbeitet.
•
"..�
'EI
' ..... .
[D �
f> NI01T
IV
E>
JE>
�
,�,
Mehrtachorl. • •
""'"""
[I JE>
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.5E
Bild 4.7 Endlosschleife. Die Ausgangsbedingung wurde
[j]
IiIJ IöI
im Kontextmenü auf 'Bei TRUE fortfahren' eingestellt und mit der booleschen Konstanten TRUE' verbunden. Genauso gut hätte man die Ausgangsbedingung auch auf 'Stopp wenn TRUE' einstellen und mit der Konstan ten 'FAL$E' verbinden können
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
70 Merke:
Boolesche Bedien- und Ausgabeelemente haben keine weiteren Untertypen wie die numerischen Variablen.
Merke:
Man kann jedoch mit Hilfe des Kontextmenüs 'Schaltverhalten' sechs ver schiedene mechanische Schaltarten bei den Bedienelementen simulieren. Stellt man eine der drei Schaltarten mit 'Latch...' ein, lässt sich mit dem betreffenden Bedienelement keine lokale Variable mehr bilden.
4.3
String und pfad
Unter einem String versteht man eine Kette von Zeichen, die zu einer Einheit zusammen gefasst und wie bei den numerischen oder booleschen Variablen mit einem Namen versehen wird. Beispiel: 'abc' (name!) oder 'Hans Meyer' (name_2) usw. Man findet den Datentyp String für das Panel unter 'Bedienelemente' - 'Modern' - 'String & Pfad' in der ersten Zeile rechts (Bild 4.8). Der Datentyp 'Pfad' (dort in der zweiten Zei l e der Unterpalette) wird erst später im Zusammenhang mit Lesen und Schreiben von der bzw. auf die Festplatte besprochen.
I�s..: hen t ::: Anoicht· t . -,
L StrtIQ e.pfDd
FIot.
Bild 4.8 Bedien-und Anzeigeelemente für String und pfad. Oben die Stringelemente, unten die pfad elemente. Letztere dienen zur Bezeichnung von Datei oderVerzeichnisnamen. Sie werden zwar auch als Zeichenketten geschrieben, z.B. 'Zahlendarstellung.vi' für das Programm in Bild 4.3., LabVIEW unterscheidet sie aber als verschiedene Datentypen
._
Stringfunktionen für das Diagramm findet man unter 'Funktionen' - 'Programmierung' 'String' in der dritten Zeile inks. l Siehe dazu Bild 4.9. Bild 4.10 und Bi l d 4.1! zeigen das Beispiel des Programms Zeit_String.vi, welches das aktu elle Datum einliest und mit verschiedenen Strings verkettet, damit ein voUständiger Satz ausgegeben werden kann. Außerdem wird die Länge des verketteten Strings bestimmt und angezeigt.
IAufgabe 4.2
Schreiben Sie ein Programm, das eine Zahleneingabe im DBL-Format in eine absolute
Zeitangabe umwandelt. Hinweis: In 'Timing' findet
man
die Funktionen 'Datum-/Zeit-String lesen' und
'Datum/Zeit fonnatieren', die als Eingabe auch numerische Werte akzeptieren (andere Zeitfunktionen benötigen Cluster, die später behandelt werden).
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.3 String und Pfad
71
FunktIonen "' Pfoq{[!!l@Y!jl
Lstrno
� � Fj !!!l t.[!3 W � Arfay�
str� _I
Weitere stm
Teistrno ers
� suchen. . .
� �
"'-'ster suchen Regulären Au• • . Oab.ln/Zeit fo...
[!3
� � strno·!Array..
strinQ/ZahH:... In strno suchen In
T�i"I. .
n&Ch T..
Im]
Nid"t �eI. .
Gl
strno form...
!il)
In
Groftu:hs..
.SJ ""
[n K�. .
leerzeil:hen-. .
stri"q-Konsta..
l_er strno · . W�. . .
EI
Zeilenvorschu... Zeh"Iend"""o
IIHel.te Ist der 12.08.2006, 15: [7: [0 � Zel:sIJTog ,.
l1J
TaWatorkon...
Bild 4.9 Funktionen 2ur Bearbeitung von Strings. ln der ersten Zeile von links: Stringlänge: ermittelt Zahl derZeichen in einem String Stringsverknüpfen: fügt zwei oder mehr Strings 2usammen 2U einem String (Verkettung). Verkettet auch die Elemente von Stringarrays Teilstring: bildet einen Teilstring, beginnend an einer vom Anwender vorgegebenen Stelle mit bestimmter Länge Wichtig sind ferner: a) weitere Stringfunktionen (zweite Zeile links), b) String-Zahlkonvertierung (vierte Zeile links) und cl String-/Array-lPfadkonvertierung (fünfte Zeile rechts). Einzelheiten sind zu entnehmen aus 'Hilfe' - 'Kontext-Hilfe anzeigen'. Konstanten: sind in den letzten drei Zeilen zu finden
Bild 4.10 Panel des Programms ZeiLString.vi, wei ches das momentane Datum und die Uhrzeit anzeigt Dazu wird im 2ugehörigen Diagramm in Bild 4.1 1 ein vollständiger deutscher Satz aus Teilstrings gebildet. Wichtig: Das Datumsformat muss bei den Einstellun gen des Betriebssystems entsprechend gewählt sein!
Bild 4,11 Verkettung von Teilstrings zu einem Satz. der in Bild 4.1 0 angezeigt wird. Man benötigt dazu die Stringkonstanten 'Heute ist der' und ', '. Datum und Zeitangaben werden auto matisch gebildet, sobald man die Funktion 'Datum-lZeit-String lesen' aus der Palette 'Timing' aufruft. Ferner benötigt man im VI noch 'DatumlZeit in Sekunden ermitteln' für das lesen der aktuellen Zeit und die zwei Stringfunktionen 'Strings verknüpfen' und 'Stringlänge'
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'
72
4 Datentypen
Ein weiteres Beispiel zu Stringfunktionen zeigen Bild 4.12 und Bild 4.13. Es handelt sich um ein VI zur übersetzung deutscher Worte in englische. Dazu werden die deutschen Bezeich nungen für die 12 Monatsnamen auf dem PaneJ in das Fenster für eine Enum-Variable geschrieben. Auf diese Weise sind sie automatisch mit den zwölf Zahlen 0 bis 1 1 verknüpft. Die deutschen Worte werden im Zuge der Programmierung n i die Enum-Variable 'Deutsch' eingetippt. Einzelheiten dazu kann man in Abschnitt 3.3 (Programmierung von Case3.vi) nachschlagen. Im Kontextmenü zum Bedienelement 'Deutsch' klickt man auf 'Sichtbare Objekte' - 'Zahlenanzeige'. Dann sieht man die Zahlen, die jewei l s den Monatsnamen zu geordnet sind. ,
Bild 4.12 Übersetzung der 12 deutschen Monatsnamen in englische Bezeichnungen
Bild 4.13 Diagramm zum Panel in Bild 4.12
In Bild 4.12 und Bild 4.13 sieht man weiter, dass die einem bestimmten Monatsnamen, etwa 'März', zugeordnete Enum-Zahl (2) der Stringfunktion 'Zeile auswählen' übergeben wird (zu finden unter 'Weitere String-Funktionen', erste Zeile, zweites Element von links). Diese Funktion holt sich aus dem Mehrzeilen-String links mit englischen Namen den mit der Nummer 2. Das ist 'March', da ja die Zeilennummerierung mit 0 beginnt. Der ausgewählte String wird an den konstanten String , heißt auf Englisch: ' angehängt und n i Bild 4.12 rechts m i Anzeigeelement 'Englisch' ausgegeben.
1-
II=! " ._.._.' _, 1Ilobcd\n\.nalc' . _. 11:'·· . _. 11:16263>4 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>+
•
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<1
�AnsO:ht
---'I [;1i] [i]
In Alny <Jrl", Aus Alny «1", Alnynit,*"",
Mox. &�, y",
� �
Alny cmfcnrJef1 lD-Arroy >e
lD-Arroy tellffi lD-Arroy lXfJk", lD-Arroy roti."
� 1!3
E'l �
lD-Arroy rle " 5c�t (", lD-Arroy, üb."
lD-Arroy de�" , 2O-Arroy tro" , Arroy-Konst " " Alny MCh CI", eWe< MCh"
M.>trix .., Alny
Alny '" Matrix
Bild 4.28 Palette 'Funktionen' - 'Programmierung' - 'Array'
Merke: Ein Array ist die Zusammenfassung mehrerer Datenelemente gleichen Typs unter einem Namen. Die einzelnen Elemente unterscheiden sich durch ihren Index.
Merke: I-dimensionale Arrays nennt man Vektoren. 2-dimensionale Arrays heißen Matrizen. LabVIEW kennt auch 3- oder mehrdimensionale Arrays.
Merke: Haben Arrays den Datentyp numerisch, kann man sie addieren und multipli zieren ähnlich wie einzelne Zahlen. Die Matrizenmultiplikation A x B erfolgt (anders als die elementweise Multiplikation) mit einem speziellen Programm aus 'Funktionen' - 'Mathematik' - 'Lineare Algebra'.
Merke: Mit Arrays lassen sich FüR-Schleifen steuern.
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'
4.5 Cluster
83
IAufgabe 4.8 Schreiben Sie ein VI, das aus einer quadratischen Matrix die Elemente der Hauptdiago nalen auswählt und als Vektor ausgibt. Hinweis: Verwenden Sie die Funktion 'Array indizieren' unter 'Funktionen' - 'Program mierung' - 'Arrar' in der Mitte der ersten Zeile.
4.5
Cluster
Auch Cluster sind Zusammenfassungen mehrerer Datenelemente unter einem Namen. Im Gegensatz zu Arrays können hier jedoch Datenelemente verschiedenen Typs vereinigt wer den. Die Verbindungslinie eines Clusters wird wie beim Arrays durch eine einzige Leitung dargestellt. Das macht das Diagramm eines VI sehr viel übersichtlicher. Man kann Cluster nicht indizieren, jedoch werden die Elemente intern nununeriert. Das wird wichtig, wenn man Operationen mit Clustern ausführt. Ein BeispieJ einer Funktion, die ein Cluster als Ausgabe iefert, l ist die LabVIEW-Funktion 'Einfacher Fehlerbehandler'. Sie ist zu finden unter 'Funktionen' - 'Programmierung' 'Dialog & Benutzeroberfläche' (vierte Zeile inks), l dort zweite Zeile inks. l Bi l d 4.29 zeigt die Panelanzeige. Sie erscheint, wenn man per Kontextmenü am Ausgang 'Fehler' der genannten Funktion ein Anzeigeelement erstellt. Das Cluster in Bild 4.29 enthält drei Elemente: • • •
Status, boolesche Variable, Code, Fehlercode vom Typ 132, Quelle, Beschreibung des Fehlers in Worten vom Typ String.
--
� :t -
4.5.1
I
C
Bild 4.29 Anzeige des Fehlerausgangs der Funktion 'Einfacher Fehler behandler' auf dem Panel
Erzeugung eines Clusters
Um ein Cluster wie das n i Bi l d 4.29 auf dem Panel zu erzeugen, sind folgende Schritte er forderlich: 1. Unter 'Elemente' - 'Modern' - 'Array, Matrix & Cluster' das Icon 'Cluster' oben in der Mitte anklicken und aufs Panel ziehen. Man sieht einen leeren Rahmen. Sein Aussehen entspricht nicht ganz dem des Rahmens n i Bild 4.29, der einen reliefartigen Rand hat. Möchte man aber genau diese aus einer früheren LabVIEW-Version bekannte Form haben, sucht man 'Cluster' unter 'Elemente' - 'Klassisch' auf.
2. Wie bei den Arrays muss man den Clusterrahmen mit Anzeige- oder Bedienelementen beliebigen Datentyps füllen. Dabei ist die gewünschte Reihenfolge einzuhalten. Cluster mit denselben Elementen, aber anderer Reihenfolge gelten als verschieden. Beim Auffül len mit Datenelementen (Bedien- oder AnzeigeeJementen) stellt man im Kontextmenü
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'
84
4 Datentypen des Clusterrahmens anfangs besser 'Autom. Skalierung' - 'Keine' ein. Das bedeutet, dass sich der Rahmen nicht automatisch auf die Größe des ersten eingefügten Elements zu sammenzieht. Man erweitert nun den Clusterrahmen auf eine passende Größe und füllt ihn mit aUen gewünschten DateneJementen. Bild 4.30 zeigt ein mögliches Ergebnis. Hier wurde aus 'Elemente' - 'Klassisch' gewählt: •
boolesches Anzeigeelement ('Leuchte (rechteckig)', zweite Zeile links) aus 'Boolesch (Klassisch)'. Der Name 'Boolesch' des Elements wurde mit 'Status' überschrieben.
•
numerisches Anzeigeelement ('Numerische Anzeige', erste Zeile, zweites Element) aus 'Numerisch (Klassisch)'. Der Name 'Numerisch' wurde überschrieben mit 'Code'.
•
String-Anzeigeelement ('String-Anzeigeelement', erste Zeile, zweites Element) aus 'String & Pfad (Klassisch)'. Der Name 'String' wurde mit 'QueUe' überschrieben.
Bild 4.30 zeigt das Ergebnis.
...
•
Bild 4.30 Cluster, dem eingebauten LabVlEW-Fehler-Cluster nachempfunden. Als Fehlercode wurde der Wert 0 (kein Fehler) eingegeben Man kann den so erzeugten Fehler-Cluster genauso wie den vom LabVIEW-System geiefer l ten an die Funktion 'Einfacher Fehlerbehandler' anschließen, siehe Bild 4.31. Startet man das VI mit Fehlercode 0 (kein Fehler), wird der Text in 'Fehlerquelle (" ")' im Clustere1ement 'QueUe' nicht angezeigt. Stellt man dagegen einen Fehlercode ungleich 0 ein, z.B. 1 oder 2, wird neben diesem Code m i Cluster auch der Text aus Clusterelement 'Fehler quelle (" ")' übertragen und in 'Quelle' angezeigt, siehe dazu Bild 4.32.
Bild 4.31 Diagramm zur Clustererzeugung in Bild 4.30
-
•
Bild 4.32 Cluster, dem eingebauten LabVIEW-Fehler Cluster nachempfunden. Als Fehlercode wurde der Wert 1 eingegeben. Jetzt wird der String 'liegt in Paris' aus der Fehlerquelle ins Cluster übertragen und dort angezeigt
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'
4.5 Cluster
85
Es gibt eine weitere Möglichkeit, Cluster zu erzeugen, nämlich durch Bündeln der einzelnen Komponenten: Man definiert auf dem Panel verschiedene Bedienelemente und vereinigt sie danach unter Verwendung der Funktion 'Bündeln', die unter 'Funktionen' - 'Programmie rung' - 'Cluster & Variant' in der Mitte der oberen Zeile zu finden ist. Im Beispiel von Bild 4.33 bzw. Bild 4.34 werden einige Personaldaten wie Name, Vorname, AJter, Geschlecht und Monatsgehalt auf diese Weise zu einem Cluster zusammengefasst. Die Funktion 'Bündeln' ist auf fünf Elemente aufzuziehen, damit die fünf Datenleitungen zugeführt werden können. Zuletzt wird im Kontextmenü dieser Funktion 'Erstellen' - 'Anzeigeelement' angeklickt, was nunmehr automatisch zur Bildung des Rahmens von 'Ausgangs-Cluster' und der fünf Anzei geeJemente darin führt (siehe Bild 4.33). Startet man das Programm, werden die einzelnen Eingabewerte auch m i Cluster angezeigt. �
-y.nomo ''''
-
F,l.
' ",
.......
,
..... ••
"00
r.::.. r IlII: I �oabo)I ''''' I
M
Bild 4.33 Erzeugung des Clusters rechts aus den fünf einzelnen Bedienelementen links
Bild 4.34 Diagramm zu Bild 4.33: Erzeugung eines Clusters aus einzelnen Bedienelementen
4.5.2
Clusterwerte ändern
Das Icon für 'BündeJn' in Bild 4.34 zeigt n i der Mitte noch einen weiteren Anschluss. Er kann mit einem bereits vorhandenen Eingangs-Cluster verbunden werden. Die von links der 'Bün del'-Funktion zugeführten Einzelwerte verändern dann die entsprechenden Werte im Ein gangs-Cluster. Will man einen einzelnen Wert oder einige wenige Werte ändern, verbindet man lediglich die entsprechenden Eingänge von 'Bündeln'. Bild 4.35 und Bild 4.36 zeigen ein BeispieJ. Man kann Bi l d 4.35 deuten als Eheschließung zwischen Fräulein Clementine Meier und Herrn Fritz Bauer. Sie ändert dabei ihren Namen und erhält durch Vennittlung h i res Man nes eine Stelle, bei der sie jetzt genauso vieJ verdient wie er. Die booleschen Variablen für das Geschlecht wurden auf dem Panel von Hand per Kontext menü umgestellt auf 'Sichtbare Objekte' - 'Boolescher Text'. Diesen wiederum hat man von den voreingestelJten Werten 'AUS' und 'EIN' auf 'weiblich' und 'männlich' geändert. Außer dem wurde die Schalterbezeichnung 'Boolesch' umgewandeJt in 'Geschlecht'.
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'
86
4 Datentypen
Bild 4.35 Änderung einzelner Elemente (Name und Monatsgehalt in Euro) im Eingangs-Cluster. Das Ergebnis wird im Ausgangs-Cluster angezeigt
Bild 4.36 Änderung einzelner Werte (Name und Monatsgehalt in Euro) im Eingangs-Cluster, siehe Bild 4.35
Neben der Funktion 'Bündeln' findet sich in der zweiten Zei l e links die Funktion 'Nach Namen bündeln'. Sie dient dem Zweck der Änderung einzelner Werte n i einem Cluster, eignet sich aber nicht zur Erzeugung eines Qusters, weil von oben ein bereits existierender Cluster angeschlossen werden muss. Ein weiterer Unterschied besteht darin, dass m i Icon jetzt nicht mehr die Typen der Eingangsdaten angezeigt werden, sondern deren Namen. Siehe dazu Bild 4.37, das die Programmierung von Bild 4.36 ersetzen kann. Schließich l dürfen keine unbenutzten Eingänge in dieser Funktion auftreten. Notfalls sind sie per Kontextmenü und 'Element entfernen' zu beseitigen.
Bild 4.37 Änderung einzelner Werte eines Clusters mit der Funktion 'Nach Namen bündeln'. Wirkt genau so wie 'Bündeln' in Bild 4.36
4.5.3
Aufschlüsseln eines Clusters
Rechenoperationen wie Addieren oder Multiplizieren lassen sich mit Clustern im Normalfall nicht ausführen. Nur wenn n i den zu verknüpfenden austern alle Elemente numerisch sind (Clusterterminal im Blockdiagramm ist im Falle einheitlicher Datentypen braun), ist das möglich. Enthalten aber Cluster nichtnumerische und numerische Daten (Terminal im Blockdiagramm rosa), mit denen man operieren will, muss man diese vorher aus den Clustern isolieren oder aufschlüsseln. Die zwei Funktionen dazu befinden sich im selben Untermenü wie 'Bündeln'. Sie heißen 'Aufschlüsseln' und 'Nach Namen aufschlüsseln'.
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.5 Cluster
87
Bi l d 4.38 gibt ein Beispiel, wie man die Gehälter einer dreiköpfigen Familie (Vater, Mutter und Sohn) aufschlüsseln und dann addieren kann. Bild 4.39 zeigt das Diagramm dazu.
Bild 4.38 Berechnung des Familien einkommens durch Aufschlüsseln der Einzelgehälter in den drei Clustem und anschließende Addition
Bild 4.39 Nach Namen aufschlüsseln. Diagramm zu Bild 4.38. 'Cluster2' und 'Cluster3' wurden in der Anzeige auf das allein wichtige Element 'Monatsgehalt in € reduziert
Bemerkungen zu Bild 4.39 1. Gewählt wurde hier die Funktion 'Nach Namen aufschlüsseln', zu finden unter 'Funktio
l e rechts), drittes Icon in der nen' - 'Programmierung' - 'auster & Variant' (erste Zei ersten Zeile. Ebenso gut hätte man aber auch 'Aufschlüsseln' wählen können.
2. Bei Clusterl wurde die Aufschlüsselfunktion ganz aufgezogen, so dass man alle Elemente des Clusters mit ihren Namen sehen kann. Nötig ist das jedoch nicht. Es genügt, die n i teressierende Variable 'Monatsgehalt in €' herauszuziehen. Das geschieht, indem man die Aufschlüsselfunktion auf eine Zeile beschränkt und dann im Kontextmenü über 'Objekt auswählen' die richtige Variable sucht.
3. Die Addition von drei Operanden könnte über zwei hintereinander gehängte Aufrufe des Plusoperators erfolgen. Einfacher ist es, unter 'Funktionen' - 'Programmierung' 'Numerisch' den Operator 'Mehrfacharithmetik' in der Mitte der vierten Zeile zu nutzen. Dieser kann per Kontextmenü und 'Modus ändern' übrigens auch aufMultiplikation und andere Operationen umgestellt werden.
IAufgabe 4.9 Schreiben Sie ein VI, das ein Eingangs-Cluster aus Personaldaten wie n i Bild 4.33 für eine Person bi l det. Auf dem Panel soll ferner eine Matrix (2-dimensionales Array) stehen, bei der in der linken Spalte die Erhöhung des Alters 'aplus' n i Jahren vennerkt wird und in der rechten die Prozentsätze p der Gehaltserhöhung. Der Einfachheit halber soll die
Matrix nur vier Zeilen haben. Ferner gibt es ein Bedienelement Index mit Werten von O bis 3. Das VI soll die i-te Zei l e aus der Matrix entnehmen und daraus das Alter be-
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
88
rechnen, ferner den Prozentsatz p und damit das um p Prozent erhöhte Gehalt. Das neue Alter und das neue Gehalt sind in einem Ausgangs-Cluster neben den gleich gebiebenen l Daten anzuzeigen. Hinweis: Verwenden Sie auch hier die Funktion 'Array indizieren' unter 'Punktionen' 'Programmierung' - 'Array' in der Mitte der ersten Zeile.
Merke: Ein Cluster ist die Zusammenfassung mehrerer Datenelemente von (in der Regel) verschiedenem Typ unter einem Namen.
Merke: Cluster erstellt man entweder manuell auf dem Panel durch Erzeugung eines Clusterrahmens, in den die einzelnen Bedienelemente gewgen werden. (Achtung! Reihenfolge ist wichtig), oder:
man erzeugt: sie per Prowamm aus einzelnen Bedienelementen (oder auch
aus Anzeigeelementen), indem man die Funktion 'Bündeln' verwendet.
Merke: Man kann einzelne Elemente eines Eingangs-Clusters verändern, indem man mit ihm den Eingang eines Ausgangs-Cluster steuert, dem man einzelne ge änderte Daten zuführt. Merke: Man kann nur mit den numerischen Elementen eines Clusters numerische Operationen durchführen. Dazu benötigt man die Funktion 'Aufschlüsseln'.
Umordnen der Elemente eines Clusters
4.5.4
Die Cluster links in Bi l d 4.40 dienen als Eingabe- und Ausgabeelement. Beabsichtigt ist die Übertragung der Werte m i Eingabecluster links an das Ausgabe<:luster rechts. Versucht man aber, beide Elemente im Diagramm zu verbinden, erhält man eine gebrochene Linie. ", ,
I
.......
.....
'""
3
-
......... ,
......
�
-..
.....
�
Bild 4.40 Versuch einer Datenübertragung, die misslingt, obwohl Struktur der Cluster gleich scheint Der Grund ist, dass die Reihenfolge der Elemente in den Clustern, d.h. ihre interne Numme rierung, verschieden ist. Davon kann man sich überzeugen, wenn man im Kontextmenü des Clusters 'Bedienelemente in Cluster neu ordnen. . .' anklickt. Die Reihenfolge der Cluster eJemente Numerisch, Boolesch und String ist 0, 1, 2 im Ausgabeduster, dagegen 1, 2, 0 im Eingabeduster, wie Bild 4.41 zeigt.
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.6 Ring & Enum
89
Bild 4,41 'Bedienelemente in Cluster neu ordnen' zeigt verschiedene interne Nummerierungen
Ändert man die interne Reihenfolge z.B. im Eingabeduster durch entsprechendes Anklicken der schwarzen Nummern unter Beachtung der Hinweise n i der obersten Zeile, werden beide Cluster bezüglich h i rer inneren Struktur angeglichen. Die Verbindung im Diagramm ist dann problemlos möglich. Das VI zeigt nach dem Start ein Frontpanel gemäß Bild 4.42. -
........ ,
3
4.6
Bild 4,42 Enthalten die beiden Cluster nicht nur gleiche Variablentypen, sondern ist auch deren interne Nummerierung die gleiche, kann man Eingabe- und Ausgabecluster im Diagramm miteinander verbinden. Das VI lässtsich starten und sorgt für die Datenübertragung von links nach rechts
Ring & Enum
Unter 'Elemente' - 'Modem' - 'Ring & Enum' (dritte Zeile links) finden sich die Elemente 'Text_Ring', 'Menü-Ring', 'Enum', 'GrafIk-Ring' und 'Text- & Grafikring'. Alle diese Elemente sind standardmäßig ganze vorzeichenlose Zahlen vom Typ U16, die aber folgende zusätzliche Eigenschaften aufweisen: 1. Sie können vom Anwender mit beliebigen Texten und/oder Bildern verknüpft werden. Das heißt, wenn man beim Programmieren z.B. drei Texte eingibt, werden diesen die drei Zahlen 0, 1 und 2 zugeordnet. 2. Die jewei l s verwendeten Zahlen sind zyklisch angeordnet. Das bedeutet, dass beim Hoch
zählen am Bedienelement mit der kleinen nach unten gerichteten Pfeiltaste die Zahlen und damit die zugeordneten Texte in der Folge 0, I, 2, 0, 1, 2, . . . durchlaufen werden. Arbeitet man mit der nach oben zeigenden Pfeiltaste, erhält man die Zahlenfolge 2, 1,0, 2, 1,0, . . . Der Typ 'Enum' wurde bereits n i Abschnitt 3.3 bei der Programmierung von Case3.vi vor gesteUt. Er diente damals zur Auswahl der verschiedenen Fälle einer Case-Struktur. Die anderen textorientierten Typen wie 'Text-Ring' und 'Menü-Ring' werden hier nicht bespro chen. Sie unterscheiden sich nur geringfügig von 'Enum'. Ihre Erkundung sei dem Leser in folgender Aufgabe überlassen:
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
90
IAufgabe 4.1 0 Bringen Sie die verschiedenen Ringtypen und 'Enum' aufdas Panel eines VI. Versuchen Sie, jewei l s drei oder vier Texte einzugeben. Am einfachsten wählen Sie dazu im Kon
textmenü die Vorgabe 'Objekte bearbeiten . . . '. Dann erscheint eine Tabelle, in die Sie die Texte schreiben können. Bei 'Enum' lassen sich auch die Vorgaben 'Objekt davor ein fügen' und 'Objekt danach einfügen' nutzen. In diesem Fall kann man die Texte direkt ins Bedienelement schreiben. Bei 'Text-Ring' und 'Menü-Ring' ist das nicht möglich. Gehen Sie ins Kontextmenü und wählen Sie 'Sichtbare Objekte' - 'Zahlenanzeige'. Sie erhalten rechts vom BedieneJement ein kleines Fenster mit der Zahl, die dem Text zu geordnet wurde. Versuchen Sie, mit den verschiedenen Ringtypen Gase-Strukturen zu steuern, und be obachten Sie die Anzeigen, die dort im SelektorfeJd auftauchen.
Bild-Ring Die Programmierung eines Bild-Rings erfordert zusätzliche Informationen. Deshalb folgt l s nach einer Sekunde auswechselt. Für die ein Beispiel, das zwei Bilder automatisch jewei Programmierung benötigt man Bilder, am besten PNG- oder JPG-Dateien, die nicht so spei cherintensiv wie BMP-Dateien sind. Auch sollten die Bilder nicht zu groß sein, weil sonst womöglich Vls mit unmäßig großem Speicherplatz entstehen. Folgende Schritte sind auszuführen:
1. Element 'Grafik-Ring' auf das PaneJ ziehen und der geplanten Bildgröße entsprechend aufziehen,
2. mit 'Bearbeiten' - 'Bild n i Zwischenablage einfügen . . .' erstes Bild von der Festplatte in den Arbeitsspeicher holen,
3. im Kontextmenü zum Grafik-Ring 'Bild aus Zwischenablage einfügen' anklicken. Das Bi l d erscheint nun in der freien Fläche des Grafik-Rings.
4. Nächstes Bild gemäß Punkt 2 holen, 5. im Kontextmenü zum Grafik-Ring 'Bild danach einfügen' anklicken (oder 'Bi l d davor einfügen'). Ist der Grafik-Ring als Bedienelement angelegt, kann
man
nun mit den Bedienpfeilen links
zwischen den zwei Bildern hin- und herblättern. Im Beispiel von Bild 4.43 bis Bild 4.45 wur de dagegen der Grafik-Ring als Anzeigeelement angeJegt, damit der Bi l dwechsel programm gesteuert ablaufen kann. Bild 4.45 zeigt den Bildwechselmechanismus. Die While-Schleife erhöht nach einer Warte
zeit von 1000 Millisekunden = 1 Sekunde den Indexzähler inks l unten. Er zählt nach dem Programmstart 0, 1, 2, 3, 4, . . . Dabei entsteht das Problem, dass bei zwei Bildern wie n i die
sem Beispiel wegen der zyklischen Natur der Zahlenfolge bei Ringen die Zahlen 2, 3, 4 usw. gar nicht vorkommen. Es würde dann nur noch das zweite Bild gezeigt und nie mehr das erste. Aus diesem Grunde muss man den Index durch 2 tei l en und den Bi l d-Ring mit dem Rest der ganzzahigen l Division steuern. Der Operator dazu steht unter 'Funktionen' - 'Pro grammierung' - 'Numerisch' als 'Quotient und Rest' in der Mitte der zweiten Zeile.
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'
4.6 Ring & Enum
IAufgabe
91
4.1 1
Erweitern Sie das Beispiel von Bild 4.43 bis Bild 4.45 aufdrei Bilder.
Merke: Ringe sind standardmäßig ganze Zahlen vom Typ UI6, die sich mit Texten und/oder Bildern verknüpfen lassen. Sind sie Bedienelernente, kann man da mit Case-Strukturen steuern. Sind sie Anzeigeelemente, kann man damit wechselnde Texte oder Bilder anzeigen.
"�". " "on"'.n.'
_
Bild 4A3 Erstes Bild fOr einen automatischen Bildwechsel nach jeweils einer Sekunde
Bild 4.44 Zweites Bild für einen automatischen Bildwechsel nach jeweils einer Sekunde
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
92
I Bild 4.45 Bildwechsel-VI. Es schaltet jeweils nach l000Milli sekunden von Bild 0 (Hund) zu Bild 1 (Katze)
4.7
Gestaltung von Panel und Diagramm
Wir haben versucht, die bisherigen kleinen Programmbeispiele ordentlich und übersichtlich zu gestalten, z.8. so wie in Bi l d 4.33 oder Bi l d 4.34: Die Eingabeelemente sind linksbündig angeordnet, haben gleichmäßige Abstände U$W. Werkzeuge dazu findet man in der Symbol
leiste eines VI unter 'TexteinsteIlungen' (Mitte der Menüleiste) und daneben unter 'Objekte ausrichten', 'Objekte anordnen', 'Objektgröße verändern' und 'Neu ordnen', siehe Bild 4.46. � Unbenannt I f rontpan el � �ei
�«beiten
ßnzeioen 11
�jeM
&Sehen
Werl=uoe
1J"'_K�ft.t[ .
Eenster
t:iilfe
:�. :;; . :11: .
.... .
Bild 4.46
Symbolleiste eines V1s: Rechts neben den zwei Startknöpfen, dem roten Stopp-Knopf und der Pausentaste befinden sich verschiedene Werkzeuge zur Gestaltung von Panel und Diagramm Damit kann man z.B. Symbole, die ungeordnet auf dem Panel oder im Diagramm stehen, linksbündig anordnen: Man umfahrt sie mit gedrückter linker Maustaste und markiert sie.
Es erscheinen dann gestricheJte Linien um die Symbole, die gemeinsam bearbeitet werden sollen. Nun 'Objekte ausrichten' aufrufen und das passende (hier zweite Zeile inks) l unter
den angebotenen Symbolen wählen, siehe Bi l d 4.47. •
1:;; ,1 :11: ,
Bild 4.47
Werkzeuge zum Ausrichten von Symbolen linksbündig, rechtsbOndig usw.
IAufgabe 4.12 Platzieren Sie einige Symbole auf dem Panel eines neuen VIs und machen Sie sich mit den verschiedenen Möglichkeiten der Ausrichtung, Anordnung und Gruppierung (unter 'Neu ordnen') vertraut.
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'
5
Unterprogramme
Lernziel. 1. Anschlüsse für eigene LabVIEW-Unterprogramme (SubVIs) erstellen können. 2. Polymorphe SubVIs entwickeln können. 3. SubVIs statisch ins aufrufende Programm einbinden können. 4. VI-Referenzen zum dynamischen Einbinden von SubVIs nutzen können. 5. SubVIs ablaufinvariant (reentrant) machen können. 6. Rekursiven Aufruf von SubVIs verstehen.
5.1
Wozu Unterprogramme (SubVls)?
Unterprogramme werden in allen Programmiersprachen verwendet. Sie dienen folgenden Zwecken: •
Code, der häufig benutzt wird, z.B. für die Berechnung eines Sinus, soll nicht jedes Mal neu programmiert werden ( . . .das Rad nicht ständig neu erfinden. . . '). Stichwort: '
Wiederverwendbarkeit. •
Der Code für einen Programmteil, der in einem größeren Programm häufig verwendet wird, soll nicht mehrfach gespeichert werden.
•
Speziell für die grafische Darstellung in LabVIEW gilt: Das (Block-)Diagramm auf dem Bildschinn darfnicht unübersichtlich werden. Heute hat sich eine Auflösung von 1280
x
1024 Bildschirmpunkten als Standard etabliert. Das begrenzt die Zahl der Symbole im Diagramm. Werden es zu viele, fasst man mehrere von ihnen in geeigneter Weise n i ei nem Unterprogramm zusammen, das durch ein einziges Symbol dargestellt wird. Wir haben in den bisherigen Kapiteln ständig Unterprogramme verwendet. Nur waren es
systemeigene LabVIEW-Unterprogramme. In diesem Kapitel werden wir lernen, eigene
Unterprogramme zu erstellen und anzuwenden.
Generell muss der Aufbau eines Programms gut geplant werden, d.h., es ist die Frage zu
beantworten, welche Unterprogramme sinnvoll sind. Dabei sollte darauf geachtet werden, redundante Entwicklungen zu minimieren. Ein guter Ansatz dazu ist die so genannte Top
Down-Methode zur Programmentwicklung. Einzelheiten zu diesem Verfahren sind der
einschlägigen Literatur zu entnehmen, etwa in [6].
LabVIEW bietet zwei unterschiedliche Methoden an, Unterprogramme in einem VI zu ver wenden. Die am häufigsten genutzte Art ist das statische Einbinden. Der Code für den Auf
ruf des SubVIs wird mit dem Programm abgespeichert. Diese Bindung kann während der
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
94
Unterprogramme
Laufzeit nicht mehr aufgeJöst und verändert werden. Das entspricht dem Einfügen eines Symbols aus der Funktionspalette in das Blockdiagramm. Neben dieser starren Bindung kann man Unterprogramme auch dynamisch einbinden, d.h., es wird erst während der Laufzeit festgelegt, welches Unterprogramm tatsächlich verwendet werden soll.
5.2
Erstellen von Unterprogrammen
5.2.1
Einführendes Beispiel
Vermessungsingenieure verwenden häufig eine bestimmte Fonn der Dreiecksbere<:hnung, um die Lage unzugänglicher Punkte (etwa eines Leuchtturms)
zu bestimmen. Gegeben sind
dann die Länge der Seite c eines Dreiecks und die angrenzenden WinkeJ a und ß. Gesucht sind der dritte WinkeJ r im Dreieck und die Längen der Seiten a und b. Eine Skizze der Situ ation findet sich in Bild 5.1.
Bild 5,1 Dreieck mit bekannten Werten für c, a und ß. Gesucht sind " 0 und b
,
Diese Berechnung kann man in LabVIEW sehr übersichtlich gestalten, wie Bild 5.2 und Bi ld 5.3 zeigen. Man sieht m i Panel sechs Bedien- und Anzeigeelemente sowie die Stopp-Taste, einen Fehlerausgang, eine Aufgabenbeschreibung und eine erläuternde Skizze. Das Dia gramm ist noch einfacher: sechs Anschlüsse und in der Mitte ein Symbol, das ein kleines Dreieck zeigt.
�I
�: �, beta lrd aamma a lrd b
Gesucht:
, ,
-,;nCir.t " .,
, � 10
�".. •
15,01713
�
Ö
---
f'ii .. """
"'"
I
[
Bild 5,2 Panel eines VI zur Dreiecksberechnung
[j]
� C
Blkl5.3 Diagramm zum Panel von Bild 5.2. Die Funktionalität steckt im Wesentlichen in dem durch das Dreieckssymbol dargestellten Unter programm. Die Wartezeit von 100 ms ist in Schleifen üblich. Damit wird verhindert, dass LabVIEW ununterbrochen rechnet und andere Tasks kaum zum Zuge kommen lässt
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
95
Beim Zahlenbeispiel von Bild 5.2 treten keine Fehler auf. Doch kann dies geschehen, wenn man versehentlich a und ßmit a+ß"2:. 1800 eingibt. In diesem Fall erscheinen auf dem Panel der Fehlercode 5001 und die Meldung 'WinkeJsumme >= 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<
Bild 5.4 Panel des Dreiecks·Unterprogramms in Bild 5.3
In Bild 5.5 ist der TRUE-Teil des Unterprogramms zu sehen. Er wird durchlaufen, wenn die Winkelsumme a+ß< 1800 ist. Der PALSE·Tei l in Bild 5.6 wird bearbeitet, wenn der Anwen der aus Versehen eine Winkelsumme a+ß"2:. 180" eingibt.
� � l !tl ...e 8> 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 _·P<>OhtrutffiSt'"
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
P Foonst.. hat Tl .... 17 � ....m;.en
r y..u:. �e ..........
r HorIzont. lIIkIoIeIIeo
"GI: ..... fÜ' nidlt
r 5,...tdeo1te bei AIIsfIJn.nQ � r ScholfIa
r Scr..tflkhe -ca.ousIitnof anzeiQon
-
- -
Utlterprogramme --;2<1
verl\al_ des fensters
a Ya_� (' 1'te;_sdW:bbIJr P e_
YIl
r F-.. transparent: OUO/ih...,
P' S
P sta-dordo:.ontextrnenJl; .... La
P' ff� ben AdnJ �
P" lMch .Qbarbet'".l �, ralsU'� �
P" Ff� M
Bild 5.12 Fenstererscheinungsbild anpassen Der obere Teil der Optionen auf der linken Seite legt die Sichtbarkeit der Titelzeile mit der dort enthaltenen Systemschaltfläche rechts oben für das Verkleinern, Maximieren und Schließen des Frontpanels fest. Das Fenster kann dann bei der Ausführung unter Umständen nicht mehr maximiert werden. Auch lassen sich hier Menüleiste, Bildlaufleiste und Symbol leisten ausschalten, wenn diese Optionen aktiviert waren. Die unteren Optionen inks l beziehen sich aufSubVls. Man kann wählen, ob das FrontpaneJ bereits beim Laden des aufrufenden VIs angezeigt werden soll oder nicht. Wenn nicht, kann man festlegen, ob das Frontpanel des SubVIs erscheinen soll, sobald es vom übergeordneten VI aufgerufen wird. Werden bei der Programmierung mehrere Instanzen desselben VIs verwendet, wird das Frontpanel genau einmal geöffnet, da sich alle Instanzen nacheinander das Fenster teilen. Die 'Verhaltensweise des Fensters' auf der rechten Seite kann einen von drei Werten anneh men. Bei 'Voreinstellung' kann das Fenster hinter einem anderen Fenster liegen, so dass es ganz oder tei l weise verdeckt ist. Wird der Wert 'Frei verschiebbar' gewählt, erscheint das Fenster über den anderen mit 'Voreinstellung' definierten Fenstern auf dem Bildschinn. Existieren gleichzeitig mehrere verschiebbare Fenster, wird das gerade aktive in den Vorder grund gebracht. Wird ein Fenster 'Modal' geöffnet, so sind nur dort Benutzereingaben zuläs sig. Erst nachdem ein modales Fenster geschlossen wurde, können wieder andere Fenster benutzt werden. Die folgenden Optionen verhindern oder erlauben das Schließen, die Änderung der Fenster größe und das Minimieren des Fensters durch den Benutzer beim Programmlauf. Hier kann auch festgelegt werden, ob die Kontextmenüs der FrontpaneJ-Elemente zur Laufzeit ange zeigt werden können. Wichtige Einstellungen findet man auch in der Kategorie 'Ausführung', siehe Bild 5.13.
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
Kot09O'�
101
rl--',O""fChO�;::----J-:J.
r .Abl><Jinv.._ i<Jsf(J)r"",
'" [ei stort Menis lI'..tor;rat ,ch ve,..ot",
r .... AU'rcJ' ...hol.,
r""' Wnß"",__• �,�
r"",,,,. ,,,,,, �rr«.
"'-� ""�"'"
'" IUmJO/:;,che F"*
co:
Bild 5.13 Dialog zur Einstellung der Ausführungseigenschaften einesVls
-1
I _I
....
Hier ist besonders die Option 'ablaufinvariante Ausführung' (reentrant) interessant. Wird diese Option gewählt, kann ein und dasseJbe SubVI erneut aufgerufen werden, noch bevor es vollständig abgearbeitet wurde, Für jeden Aufruflegt sich das SubVI einen eigenen Datenbe reich m i Speicher an, der die SteJle des Aufrufs markiert und die Werte der internen Variab len zum Zeitpunkt der Unterbrechung durch den nächstfolgenden Aufruf enthält. Pro gramme, die als ablaufinvariant deklariert sind, kann man z.B. für rekursive Aufrufe verwen den (siehe Abschnitte 5.3.2.4 und 5.3.2.5). Sie sind aber auch auf andere Weise nutzbar, wie Kapitel 12 zeigen wird. Ist dagegen die Option 'Ablaufinvariante Ausführung' deaktiviert, wird das SubVI erst vollständig abgearbeitet, bevor es erneut aufgerufen werden kann. Bis zur Version LabVIEW 7.1 hatte die 'Ablaufinvariante Ausführung' Nachteile: •
Die Ausgaben auf dem Frontpanel waren ungültig, weil sie nicht mehr aktualisiert wurden.
•
Debugging war nicht möglich.
Dieses Manko wurde ab Version 8.0 beseitigt, siehe Abschnitt 5.3.2.5.
Erstellen von Unterprogrammen mit Internem Zustand
5.2.4
Wenn man von einem Hauptprogramm aus mehrfach eines der nach den bisherigen Metho den erstellten Unterprogramme aufruft, geht dieses stets von einem festen Grundzustand aus. Will man diesen Grundzustand zwischen zwei Aufrufen ändern, kann man eine While Schleife mit uninitialisierten Schieberegistern (siehe Abschnitt 3.4) verwenden. Dort lassen sich durch das Unterprogramm Daten speichern, die beim nächsten Aufruf wieder zur Ver fügung stehen. Damit kann sich der Grundzustand von Aufruf zu Aufruf verändern. Als
BeispieJ zeigen wir ein Unterprogramm, das zählt, wie oft es aufgerufen wurde, und das die
Zahl der Aufrufe pro Millisekunde ab dem ersten Aufruf ausgibt. ,=.
..._T __t .
I
,�
_.
hfjd;...."" ('obol
""
,,,,,,,,",,,"",1
� "
.
•
E>
! 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+1e<.N.Yroe
5tr......
]
[b:�omm·Ersc�: r. S)"fI"OW de, PolyVI, onzeiQffi
r S)"fI"OW def lostonz onzeiQffi
Entfe
1
t-I.Yroef1 t.ei>ftdffi
17 5eIe+1e< ifrrnef onzeiQffi 17 PoIy·VI �"-'"'" on Dotertyp zo.MsSffi
.cd 1
..
o
Bild 5.17 Polymorphes VI als Container für zwei gewöhnliche Vls, deren Namen in den beiden oberen Zeilen eingetragen sind. Mit 'Symbol bearbeiten' wurde der Name 'Poly-Addieren' in das Icon des polymorphen VI ge schrieben
Tipp: Da polymorphe VIs als Container für andere Vls dienen, sollte man diesen VIs ähnli
che Namen geben, um die Zusammengehörigkeit anzuzeigen. Das erleichtert die Pflege des
polymorphen VIs und seiner SubVIs.
Die einzelnen Vls werden dem polymorphen VI über die Schaltfläche 'Hinzufügen' zuge
ordnet und im Fehlerfall mit 'Entfernen' wieder beseitigt. Für jeden Eintrag kann zusätzlich der 'Menü-Name' und 'Selektor-Name' angegeben werden. Fehlen diese Eintragungen ganz oder teilweise, wird als Menü-Name der VI-Name und als Selektor-Name der Menü-Name verwendet. Im Diagramm des aufrufenden Programms erscheint ein polymorphes VI mit dessen Symbol, sofern man bei der Konfiguration links unten 'Symbol des PolyVIs anzeigen' gewählt hat. Hat man rechts unten 'Selektor immer anzeigen' gewählt, erscheint m i Dia gramm unter dem VI-Symbol ein Selektor. Klappt man diesen mit Linksklick auf, sieht man die Menü-Namen der eingetragenen VIs sowie den Eintrag 'Automatisch'. Die Wahl dieser Option bewirkt, dass der zugeführte Datentyp automatisch das richtige Unterprogramm aus
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 Unterprogramme
104
dem polymorphen Container wählt. Eine manuelle Auswahl aus dem Menü ist ebenfalls möglich. Ist der SeJektor geschlossen, trägt er den Selektor-Namen des gewählten VIs oder falls keine Selektor-Namen angegeben wurden - dessen Menü-Namen. Siehe dazu Bild 5.18. Bei der Belegung des Anschlussfelds müssen einige Dinge beachtet werden. Alle VIs, die zum selben polymorphen VI gehören, müssen dasselbe Anschlussfeld aufweisen. LabVIEW quit tiert den Versuch, verschiedene Anschlussfelder zusammenzufassen, mit einem Fehler. Au ßerdem müssen Eingänge und Ausgänge an exakt derselben Stelle eingefügt werden. Wird der Anschluss nicht von jedem VI benötigt, kann er auch frei bleiben. Es ist nicht zulässig, einen Ausgang mit einem Anschluss zu verbinden, der bereits von einem anderen VI als Eingang verwendet wird. Entsprechendes gilt für die Eingänge. Bild 5.18 zeigt das Diagramm eines Hauptprogramms, welches das polymorphe VI für das Addieren von numerischen Daten und von Stringdaten verwendet. Man erkennt, dass das Symbol die gleich bleibende Bezeichnung 'Poly-Addieren' trägt, die Symbole m i Selektor darunter aber die Namen 'Numerisch' bzw. 'String'. Bild 5.19 zeigt das Panel des aufrufenden Hauptprogramms.
ltunerisch 1 ...
Bild 5.1B Doppelte Verwendung desselben poly morphen Unterprogramms mit verschiedenen Daten typen im aufrufenden Programm. Das Unterprogramm wird über den $elektor am unteren Rand des Symbols an seine Aufgabe entweder manuell oder automatisch angepasst
..
�
•
2,3 b
�
tot 57
2,3
14,57
c_a+b
16,87
I 16,87OOlO
Bild 5.19 Ergebnisse der Addition zweier numerischer Daten 'a' und 'b' und zweier Stringdaten 'as' und 'bs'
Bild 5.20 zeigt das Diagramm des VIs im polymorphen Unterprogramm, das die Strings addiert. Im anderen Unterprogramm wird lediglich der eingebaute LabVIEW-Plusoperator verwendet.
Bild 5.20 Diagramm des Additionsprogramms für Strings, die Zahlen darstellen. Dies ist das zweite der beiden Vls, die Teile des in Bild 5.17 gezeigten polymorphen Programms sind
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.3 Aufrufvon Unterprogrammen
105
IAufgabe 5A Schreiben Sie ein polymorphes VI, das die Multiplikation von Vektoren, Matrizen und Zahlenstrings realisiert. Entwickeln Sie ein Hauptprogramm, das alle drei Fälle ausnutzt.
5.3
Aufruf von Unterprogrammen
Unterprogramme können auf zwei verschiedene Arten aufgerufen - gebunden - werden. Wird ein VI über die Funktionspalette eingebunden, spricht man von statischer Bindung. Sie kann während der Programmlaufzeit nicht mehr geändert werden. Soll aber erst zur Laufzeit festgdegt werden, welches Unterprogramm zu verwenden ist, muss man die Metho de der dynamischen Bindung nutzen.
5.3.1
Statische Bindung
Eine statische Bindung wird gebildet, wenn man ein Unterprogramm aus der Funktionspa lette auswählt und ins Blockdiagramm einfügt. Es spielt keine Rolle, ob man dabei eine der vielen LabVIEW-Funktionen wählt oder ob man ein selbst geschriebenes VI aus 'Funktio nen' - 'VI auswählen. . . ' holt. Das Unterprogramm ist in jedem Falle fest mit dem aufrufen den Programm verbunden und kann nur noch im Blockdiagramm durch ein anderes ersetzt werden. Besteht kein Zugriff auf das Blockdiagramm, z.B. bei kompiliertem Code, hat man keine Möglichkeit, dieses Unterprogramm auszutauschen. Ein anderer Nachteil der statischen Bindung besteht darin, dass alle Programmtei l e, die ein geändertes Unterprogramm enthalten, als geändert angezeigt werden, was man am Stern n i der Titelzeile des Fensters erkennt. Das kann verwirren.
Lokale Einstellungen des Frontpanels I> �ubYl flnst�lIung"n
r Frontpanel bern l4>def, eIf-.
r Frontpanel bNn I>drol � r,...
ort.
...
r BfoI l>drol ........ ... u;
I
chIi
Abbrechen
I
...
Bild 5.11 Frontpanel anzeigen fOr lokale
Instanzen
Globale Einstellungen wurden bereits n i Abschnitt 5,2.3 beschrieben. Die Anzeige des Front pands lässt sich aber für jedes SubVI auch lokal einstellen, was über das Kontextmenü des im aufrufenden Programm platzierten SubVI-Symbols mit 'SubVI-Einstellungen...' erreicht wird. Diese Option öffnet einen Dialog zur Festlegung der Anzeige des Unterprogramm Panels während der Laufzeit. Bild 5.21 zeigt das. Die Wahlmöglichkeiten dort gelten für jeden Aufruf eines statisch gebundenen VIs. Sie überschreiben bei der Aktivierung dessen globale Einstellungen. Frontpanel beim Laden öffnen: Zeigt das SubVI-Frontpanel, sobald dasjenige Programm geladen wird, das es direkt (als Unterprogramm) oder indirekt (als Unter-Unterprogramm) enthält. Das passiert auch, wenn der Programmfluss noch nicht an dieser Stelle angekommen
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
106
Unterprogramme
ist. Haben mehrere Instanzen desseJben VIs diese Option, wird das FrontpaneJ nur einmal geöffnet. Frontpanel beim Aufruf anzeigen: Zeigt das Frontpanel des SubVIs erst an, wenn der Pro grammfluss beim Ablauf des aufrufenden Programms an der Stelle angelangt ist, an der das SubVI eingebunden wurde. Ist diese Option aktiviert, lässt sich zusätzlich auswählen, ob das Frontpanel nach Beendigung wieder geschlossen wird. Beide Optionen müssen gesetzt wer den, wenn man die Frontpanels von VIs sehen möchte, die als reentrant deklariert wurden, siehe Abschnitt 5.2.3. Bei Aufruf anhalten: Verhindert die Ausführung des Unterprogramms. Der Benutzer muss es manuell starten. Ändert man das Anschlussfeld eines Unterprogramms, kann es sein, dass die Symbole im Diagramm des aufrufenden Programms aufgehellt erscheinen und ein Fehler angezeigt wird. Das ist ein Indiz dafür, dass das Anschlussfeld des Unterprogramms geändert wurde, so dass es nicht mehr zum aufrufenden Programm passt. Das Unterprogramm muss überall, wo es aufgerufen wird, neu eingebunden werden. Dazu kann im Kontextmenü die Aktion 'Mit SubVI neu verbinden' gewählt werden. Tipp: Man kann das umgehen, wenn man vorher ausreichend viele Anschlüsse für eventuelle Erweiterungenvorgesehen hat. Dynamische Bindung
5.3.2
Die dynamische Bindung ist flexibler als die statische. Sie bietet dem Benutzer vor allem die Möglichkeit, ein Unterprogramm erst dann von der Festplatte in den Hauptspeicher zu ho len, wenn es gebraucht wird. Das aufrufende Programm wird dadurch schlanker und benö tigt weniger Speicherplatz. Unter 'Funktionen' - 'Programmierung' - 'Anwendungssteue rung' (vierte Zeile rechts) findet man eine Reihe von Funktionen. Für die dynamische Bindung von VIs sind die Funktionen in Tabelle 5.1 besonders wichtig.
�.
Tabelle 5.1
t" '1ll �" 'I�v�r :
Dynamischer Aufrufvon Unterprogrammen: wichtige Funktionen
Palette 'Anwendungssteuerung' Funktion 'VI-Referenz öffnen'
c�
Funktion 'Referenz schließen'
m '. • [H[J
�
5.3.2.1
Funktion 'Aufruf über Referenz'
VI-Referenz öffnen und schließen
Eine VI-Referenz ist eine Zahl, die das LabVIEW-System einem VI zuordnet, sobald man den Operator 'Funktionen' - 'Programmierung' - 'Anwendungssteuerung' - 'VI-Referenz öffnen' aufruft. Bild 5.22 zeigt die Kontexthilfe zu dieser Funktion.
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.3 Aufrufvon Unterprogrammen Typenbezeichner-VI-ReFnum ("
,
Applik.M:ionsreFerenz (1ok.!1) VI-prad
Fehler (Eingang, kein Fehler)
Passwort ("")
� -- 1'13
-
o�
107
VI-Referenz Fehler (Ausgang)
Bild 5.22 Kontexthilfe zu 'VI-Referenz öffnen' Man kann diese Zahl, die so genannte 'Refnum', auch sichtbar machen, indem man den Ausgang 'VI-Referenz' des Operators auf dem PaneJ ausgibt. Zwar erhält man zunächst nur ein Symbol, doch lässt sich dieses gemäß Bild 5.23 auch n i eine Zahl verwandeJn.
IAufgabe 5.5 Rufen Sie das VI n i Bild 5.23 mehrfach auf. Sie werden sehen, dass bei jedem Aufruf eine andere Referenz-Nummer angezeigt wird. Achtung: Die Funktion 'Aktueller Pfad des VI' kann erst aufgerufen werden, wenn das VI bereits auf Festplatte gespeichert ist! egt den Wert vcn RefI\um I e�sprect.ender Erutelu"lQ
He;c-Zo!hI51
Bild 5.23 VI, das die Referenz-Nummer (RefNum), die ihm selbstvom System zugewiesen wird, auf dem Panel als Hex-Zahl ausgibt
Hinweise •
Das Symbol für den Pfad zum eigenen VI findet sich unter 'Funktionen' - 'Datei-IIO' 'Dateikonstanten' (fünfte Zei l e rechts) unter der Bezeichnung 'Aktueller Pfad des VI' (Mitte zweite Zeile).
•
Das Symbol zur Umwandlung der Referenz-Nummer n i einen Zahlenstring steht unter 'Funktionen' - 'Programmierung' - 'Numerisch' - 'Cluster & Variant '(erste Zei l e rechts) unter der Bezeichnung 'Variant nach String' (fünfte Zei l e links).
•
Die Stringvariable 'Daten-String' auf dem Panel wird zunächst mit 'Normale Anzeige' wiedergegeben, wobei man keine Zahlen erkennen kann. Stellen Sie deshalb bitte im Kontextmenü auf'Hexadezimalanzeige' um.
Lässt man das Programm im Modus 'Wiederholt ausführen' laufen, sieht man, dass in großer Geschwindigkeit ständig Referenz-Nummern produziert werden. Sie sind alle verschieden und werden auch nicht gelöscht, damit immer eine eindeutige Zuordnung zum VI und sei nem jeweiligen Aufruf existiert. Das ist bei heutigen pes mit ihrem großen Hauptspeicher kein Problem, wenn man das Programm nur einige Minuten laufen lässt. Bei n i dustriellen Einsätzen mit Laufzeiten von Stunden oder Tagen wird sich jedoch der Rechner 'aufhängen', sobald ihm der Speicherplatz ausgeht. Solche Fehler sind später nur schwer zu finden. Des halb muss man jede geöffnete Referenz so bald wie möglich wieder schließen. Dazu verwen det man die Funktion n i Bild 5.24.
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'
108 Rererenz Fehler (Eingang, kein Fehler) Bild Sol4
===-rn
5
Unterprogramme
/ru
,." � C
�
Fehler (Ausgang)
Kontexthilfe zu 'Referenz schließen'
Merke: Jede Referenz aufein Objekt ist so bald wie möglichwieder zu schließen, damit bei länger laufenden Programmen ein SpeicherUberlaufdes Rechners vermie
denwird. Ab LabVIEW 85 können über diese Funktion gleichzeitig mehrere Referenzen geschlossen werden. Sobald man eine Referenz auf ein VI erzeugt hat, kann man mit dieser in vielf aItiger Weise aufdas VI einwirken. Man kann seine Eigenschaften abfragen oder sie ändern. Man kann das VI starten oder stoppen usw. In dieser Einführung müssen wir uns auf einige wenige Mög lichkeiten beschränken, die im Folgenden mehr oder weniger rezeptartig dargesteUt werden.
5.3.2.2
Aufruf eines VI über seine Referenz
Eine elegante Methode des dynamischen Aufrufs ist in Bild 5.25 dargestellt. Damit kann man nicht nur ein ganz bestimmtes SubVI aufrufen, sondern jedes beliebige kompatible Unter programm. 'KompatibeJ' heißt n i diesem Zusammenhang, dass zwei SubVIs das gleiche Anschlussfeld, die gleiche Zahl, die gleiche Anordnung und den gleichen Typ der Eingabe und Ausgabe-Variablen haben. Der Wechsel von einem solchen SubVI zum anderen kann sogar noch während der Laufzeit des aufrufenden VI erfolgen. Die Programmstruktur nach Bild 5.25 wird in folgenden Schritten erstellt:
1. VI-Referenz öffnen und am oberen Eingang 'Typenbezeichner VI-RefNum (nur für Typ)' im Kontextmenü mit 'Erstellen' - 'Konstante' das LabVIEW-Standardsymbol zu ordnen. Links am Eingang 'VI-Pfad' nach derselben Methode einen leeren Pfad erzeugen, in den man den Namen des SubVIs schreibt, das aufgerufen werden soll (hier: 'AddString.vi').
2.
Typ der VI-Referenz anpassen, indem man im Kontextmenü zum oben erstellten Lab VIEW-Standardsymbol 'VI-Server-Klasse auswählen' - 'Durchsuchen . . . ' aktiviert. Dann wird ein Verzeichnisbaum angezeigt, n i dem man das gewünschte Muster-SubVI sucht und öffnet. Im Beispiel wurde AddString.vi gewählt. Man könnte aber auch SubString.vi nutzen oder jedes andere VI kompatibler Struktur: Ein solches VI hat zwei Eingangsvari ablen und eine Ausgangsvariable, alle vom Typ 'String'. Im Symbol, das jetzt erscheint, ist das grafisch angedeutet. Die Farbe entspricht der für den Typ String.
3.
Symbol 'Aufruf über Referenz' im Diagramm setzen und den Ausgang 'VI-Referenz' des links stehenden Symbols mit dem Eingang des neuen Symbols 'Typenbezeichner VI RefNum (nur für Typ)' verbinden. Diese Verbindungsinie l ist grün.
4. Eingänge (hier 'a', 'b' und 'c') am Symbol der Funktion 'Aufruf über Referenz' anbringen,
am einfachsten ebenfalls über das Kontextmenü.
5.
'Referenz schließen'-Operator setzen und verbinden.
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.3 Aufrufvon Unterprogrammen
109
6. Die Fehlereingänge und -ausgänge gemäß Bild 5.25 verbinden. Das ist zwar nicht unbe dingt notwendig, gehört aber zum guten Programmierstil. Rechts per Kontextmenü ein Symbol für den Fehlerausgang setzen. Auf diese Weise werden Fehler, die irgendwo auf treten können, durchgeJeitet und dem Anwender mit einer Nummer angezeigt. 11.D)!m!ische Referenz öffnenl
@. At:lni Cber Referenzl
13. Referenz sdiessenI
Bild 5.25 Beispiel zum dynamischen Aufruf übereine VI-Referenz
Bemerkungen •
Während der Ausführung können Fehler auftreten. Häufig kommt es vor, dass das An schlussfeJd des geöffneten Vls nicht mit dem des Typ-Bezeichners übereinstimmt. Das kann geschehen, auch wenn scheinbar beide Anschlussfelder gleich sind. Sie sind aber n i Wirklichkeit nicht identisch, z.B. wenn Gleitkommazahlen unterschiedlicher Genauig keit angeschlossen sind. Sie werden nicht automatisch konvertiert, wie das sonst bei der statischen Bindung geschieht.
•
Die kurze relative Pfadangabe 'AddString.vi' genügt nur, wenn das VI im selben Ver zeichnis gespeichert ist wie das aufrufende VI. Andernfalls braucht man die vollständige absolute Pfadangabe.
•
Statt einer Konstanten als VI-Namen (hier: 'AddString.vi') kann man für die Funktion 'VI-Referenz öffnen' auch ein Bedienelement verwenden. Damit erhält man die schon erwähnte Möglichkeit, noch während des Programmlaufs das SubVI auszutauschen.
5.3.2.3
Beispiel für den SubVI-Austausch während der Laufzeit
Im Beispiel von Bild 5.25 wurde der Name 'AddString.vi' verwendet. Auf der Festplatte ste hen noch drei Unterprogramme mit gleichem Anschlussfeld. Sie heißen 'SubString.vi', 'MuIString.vi' und 'DivString.vi'. Ihre Funktion ergibt sich aus den Namen. Ersetzt man nun in Bild 5.25 den konstanten Namen 'AddString.vi' durch ein Bedienelement, kommt man zu einem Panel etwa wie n i Bild 5.26 und einem Diagramm gemäß Bild 5.27.
..I
--
Bild 5.26 Beispiel für dynamische Bindung: Panel eines Programms, bei dem man noch während der Laufzeitzwischen vier verschie denen $ubVls wählen kann, die sich auf der Festplatte befinden. Derzeit ist die Division aktiv
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 Unterprogramme
llO
Bild 5.27 Diagramm zum Panel von
[j]
Bild 5.26
IAufgabe 5.6
Entwickeln Sie drei weitere Programme nach dem Muster von AddString.vi, welche die drei anderen Grundrechnungsarten mit Zahlenstrings durchführen. Testen Sie damit, ob Sie wirklich während der Laufzeit des Programms von Bild 5.26 bzw. Bild 5.27 die Rechenoperation wechseln können.
5.3.2.4
Rekursiver Aufruf von Unterprogrammen
Unterprogramme können bei statischer Bindung nicht rekursiv aufgerufen werden. Ver sucht man, ein VI in sich selbst einzufügen, meldet LabVIEW einen Fehler. Jedoch lässt sich mit Hilfe der dynamischen Bindung zusammen mit der Eigenschaft 'ablaufinvariant' ('reentrant') ein rekursiver Aufruf realisieren. In Abschnitt 5.2.3 wurde gezeigt, wie man ein SubVI ablaufinvariant macht. Bild 5.28 und Bild 5.29 geben ein BeispieJ, das Informatikern geläufig ist: die rekursive Berechnung von nL
�,�Rofef=l E'WnJlberRefOfeflZ, Ber
L�
de�"",nn
d�. 1 ""'em'
..mrn
0
I llC
�il''' "
Bild 5.28 Rekursive Berechnung der Fakultät von 'n'; Case n ... 0
Bild 5.29 Rekursive Berechnung
der Fakultät von 'n'; Case n '" 0
Das Unterprogramm muss hier für die 'Ablaufinvariante Ausführung' aktiviert sein, sonst erzeugt LabVIEW gleich bei der ersten Verschachtelungstiefe einen Laufzeitfehler. Bemerkung: In Bild 5.28 Mitte verarbeitet der Multiplikationsoperator Daten verschiedenen Typs. Deshalb verwandelt er die Integerzahlen am unteren Eingang implizit in Daten vom Typ 'EXT'. Man erkennt die implizite Typumwandlung am roten Punkt an diesem Eingang.
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.3 Aufrufvon Unterprogrammen 5.3.2.5
111
Testen (Debugging) von ablauflnvarlanten SubVls
Ab Version 8.0 kann man auch ablaufinvariante Vls ohne Einschränkung wie normale VIs debuggen. Dazu muss man nur die Option 'VI-Einstellungen...' - 'Ausführung' - 'Automati sche Fehlerbehandlung aktivieren' setzen. Als Beispiel wurde in Bild 5.30 das VI vom vori gen Kapitel, Bild 5.28, gewählt. Man sieht hier in der Funktionsleiste das Highlight-Symbol, obwohl das VI nach wie vor als ablaufinvariant definiert wurde! Schaltet man dieses Symbol (fünftes von links) auf Gelb, kann man wie beim gewöhnlichen VI den Datenfluss auf den Leitungen beobachten. Man sieht allerdings nur den Datenfluss beim Aufruf der ersten Instanz von Fak-82.vi und danach das fertige Ergebnis. Den Prozess der Rekursion kann man so nicht verfolgen. Doch ässt l sich das beheben. Man kann nämlich auch die Diagramme und Frontpanels jeder ein zelnen Instanz anzeigen lassen. Dabei wird das VI 'geklont', d.h., es werden nicht nur die verwendeten Daten für jede Instanz getrennt gespeichert, auch das VI selbst wird von Lab VIEW vollständig kopiert, eben geklont. Die FrontpaneJs der Klone lassen sich z.B. dadurch sichtbar machen, dass man einen Haltepunkt (roter Kreis in der Werkzeugpalette) am Refe renz-Aufruf des VI n i der Case-Struktur von Bild 5.30 anbringt. Das VI hält nun bei jedem Erzeugen einer neuen Instanz infolge der Rekursion an und zeigt auf dem Frontpanel des Klons das gerade erreichte Zwischenergebnis für n! an. Die ersten zwei Zwischenergebnisse
n! sind unbrauchbar, weil wegen der Rekursion kein neuer Wert für n! angezeigt wird. Erst nachdem das SubVI dreimal rekursiv aufgerufen wurde, wird ein anderes Ergebnis für n! auf Klon 2, Klon I und dem originalen Frontpanel angezeigt: der Wert I! = I auf Klon 2 als Er
gebnis des FALSE-Teils der Case-Struktur, der Wert 2! = 2 ergebnis 3! = 3 x 2 x I ! aufdem FrontpaneJ.
x
I ! auf Klon I und das End
Bild 5.30 Rekursiv arbeitendes Programm zur Berechnung von n1 Der Wert für n steht immer auf 3, sofern man das VI zuvor mit n = 3 und n! = 0 über 'Bear
beiten' - 'AktueJle Werte als Standard' auf der Festplatte gespeichert hat. Wird das VI mit anderen Werten für n gespeichert, zeigen die Klone falsche Zwischenergebnisse für diese Größe. Bild 5.31 zeigt die Frontpanels der drei Klone in dieser Reihenfolge.
Ausleihe: 31.07.2009 00:00:00 - OS.OS.2009 00:00:00, ID:7ac0427dS929S1cfOS9d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
5 Unterprogramme
112
IAufgabe 5.7
Entwickeln Sie das Unterprogramm für die Berechnung von n! von Anfang an. Welche Fakultät können Sie maximal berechnen? Ist es 100! oder 200! oder . . . ?
"
: 3 P.
Zwischenergebnis 1! 1. Berechnung im FAL$E-Teil der Case Struktur =
fak-6Z....';1 (Klon)
"r.'..-----------------
"
3
,
•
P.
Zwischenergebnis 2!
=
2 x 1!
Fak-62."'I Frontpanel
Qatei
O;earbeiten
�
&1ZeiQer1 11
ero;ekt
&JSflilren
�
13P: �sdyjftart
"
I"
,
J
· 4
•
Endergebnis 31
=
3 x 2]
Bild 5.31 Frontpanels von zwei nummerierten Klonen und vom Ursprungsprogramm 'Fak-82.vi'. wie sie bei der rekursiven Berechnung von 31 3 x 2 x 1 auftreten =
Geklonte VIs zeigen Zwischenergebnisse an. Sie können aber nicht editiert, d.h. verändert werden. Änderungen sind m i mer nur direkt am Ursprungs-VI möglich.
Merke: Auch in LabVIEW können Unterprogramme rekursiv aufgerufen werden. Sie müssen dann aber ablaufinvariant sein und benötigen die dynamische Bindung. Wählt man zusätzlich die Option 'VI-Einstellungen...' - 'Ausführung' - 'Auto matische Fehlerbehandlung aktivieren' und setzt an geeigneterStelle einen Haltepunkt im Diagramm, kann man auch ablaufmvariante Unterprogramme wie üblich debuggen. Das System erzeugt dann Klone vom Frontpanel und vom Diagramm.
Ausleihe: 31_07_2009 00:00:00 - OS_OS_2009 00:00:00, ID:7ac0427dS929S1cfOS9d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
6
Prozessvisualisierung
Lernziele 1. Begriff OOP kennen, Eigenschafts- und Methodenknoten aufrufen können.
2.
Verschiedene grafische Ausgabeelemente wie Signalverlaufs-Diagramm (Chart), Signalverlaufs-Graph (Graph) und XY-Graph erstellen können.
3. Eigenschafts- und Methodenknoten aufgrafische AusgabeeJemente anwenden können. 4. Gestaltungsmöglichkeiten wie Farbe, Strichstärke, Skalierung nutzen können. 5. Signalverlaufs-Funktionen zur Erzeugung von Sinuskurven, Rechteckkurven, Sägezahn kurven U$W. einsetzen können.
6. Express-Vb finden und konfigurieren können.
6.1
OOP-Konzepte
In Abschnitt 3.1 haben wir kurz die Konzepte der strukturierten Programmierung vorgestellt. Ein anderes Konzept, das n i den letzten Jahren mehr und mehr an Bedeutung gewonnen hat, ist das Konzept der objektorientierten Programmierung, kurz OOP ge nannt. LabVIEW war bis Version 8.0 keine objektorientierte Programmiersprache wie bei spielsweise C++, doch wurden schon damals einige Konzepte der OOP übernommen. Ab Version 8.2 kann man nun LabVIEW sogar eine objektorientierte Programmiersprache nennen! Das Ziel von OOP ist es, wieder verwendbaren Code zu produzieren. Dies soll da durch erreicht werden, dass der Entwickler sein Programm aus so genannten Klassen auf baut, die als gekapselte Module aufzufassen sind. Kapseln bedeutet hier, dass ein Anwender oder ein anderer Programmierer nur diejenigen Variablen und Funktionen einer Klasse benutzen kann, die der Entwickler der Klasse explizit freigegeben, d.h. für 'publik' (öffent ich) l erklärt hat. In LabVIEW heißen solche öffentlichen Variablen 'Eigenschaftsknoten' und die öffentlichen Funktionen 'Methodenknoten'. Ihre Nutzung soll nachstehend am Beispiel der für messtechnische Anwendungen so wichtigen grafischen Ausgabe in Abschnitt 6.3 behandelt werden. Abschnitt
6.2
bringt zunächst einige allgemeine Ausführungen zur
Anwendung von Eigenschaftsknoten. Ein weiterer Begriff aus der OOP ist die Vererbung. Wir werden n i Kapitel 7 daraufzucück kommen.
6.2
Eigenschafts- und Methodenknoten
Eigenschafts- und Methodenknoten findet man im Kontextmenü von Bedienelementen und Anzeigeelementen. Bild 6.1 zeigt das Beispiel eines Eigenschaftsknotens zu einem Anzeige-
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
114
element, das der Anwendet mit Hi l fe eines Schalters auf dem Panel sichtbar oder unsichtbar machen kann.
�
[j]
Bild 6.1 Panel von 'EigenschafLSichtbar.vi': Anwendung eines Eigenschaftsknotens. mit dem man das Ergebnis sichtbar oder unsichtbar macht
Bild 6.2 Diagramm von 'EigenschafL Sichtbar.vi' zum Panel Bild 6.1
Bemerkungen zur Programmierung von 'ElgenschafCSlchtbar.vl' 1. Addition 'a + b = ?' programmieren gemäß Bild 6.1 und Bild 6.2. 2. Kontextmenü des Anzeigeelements '?' öffnen und 'Erstellen' - 'Eigenschaftsknoten' -
'Sichtbar' aufrufen. Aufdem Diagramm erscheint nun ein neues Element mit demselben
Namen '?', aber mit der Anzeige 'Sichtbar' und Pfeil darunter an der rechten Seite. Dies ist der Eigenschaftsknoten, der auf 'Lesen' voreingestellt ist und außerdem auf die Eigen schaft 'Sichtbar'.
3.
Zum Eigenschaftsknoten gehört wiederum ein Kontextmenü, in dem man von 'Lesen' auf 'Schreiben' umstellen muss. Tut man dies nicht, kann man den Knoten nur lesen, d.h. feststellen, ob das Anzeigeelement '?' gerade sichtbar ist oder nicht. Diese Eigenschaft lässt sich aber nicht verändern.
4. Im Kontextmenü des Eigenschaftsknotens kann man ferner unter 'Eigenschaften' eine Fülle von Wahlmöglichkeiten wahrnehmen. 'Sichtbar' ist eine davon, siehe auch Bi l d 6.3. 5. Schalter auf dem Panel setzen und mit dem Eigenschaftsknoten verbinden. 6. Das Ganze mit einer While-Schleife umgeben, die mit einem Stopp-Knopfbeendet wird. Im Innern ist eine Wartezeit von 100 ms (oder ähnlich) zu programmieren, damit der Prozessor nicht ununterbrochen die Addition ausführt. Das in dieser Weise entwickelte Programm 'EigenschafCSichtbar.vi' zeigt nach dem Laden die Aufgabe 12 + 129 = ? ohne Ergebnis. Erst nach Betätigung des Schalters 'Ergebnis sicht bar?' wird der Wert 141 angezeigt.
IAufgabe 6.1
Versuchen Sie, das Programm 'EigenschafCSichtbar.vi' so zu ändern, dass es nach dem Laden das Ergebnis sofort anzeigt.
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'
6.2 Eigenschafts- und Methodenknoten
1lS
IAufgabe 6.2
Schreiben Sie ein Programm 'Eigenschaft_Blinkend.vi', das die Bedienelemente 'a' und 'b' blinken ässt. l Dazu die Eigenschaft 'Binkend' l wählen.
IAufgabe 6.3
Schreiben Sie ein Programm 'Eigenschaft_Tastenfokus.vi', das das Bedienelement 'a' mit
der Eigenschaft 'Tastaturfokus' ausstattet. Tastaturfokus an einem BedieneJement bedeu tet, dass Tastatureingaben automatisch auf dieses Bedienelement gelenkt werden. Auf die Eigenschaft 'Blinkend' können Sie hier verzichten. Hinweis: Wird das neue Programm aus dem alten abgeleitet, haben 'a' und 'b' noch die Eigenschaft 'Blinkend'. Das heißt, diese Bedienelemente blinken auch dann noch, wenn man die entsprechenden Eigenschaftsknoten entfernt hat. Abhilfe: Entweder vorher im Programm auf 'Blinken' falsch umstellen und das Programm einmal laufen lassen, bevor man die Eigenschaft 'Blinkend' im Diagramm löscht, oder Bedienelemente 'a' und 'b' auf dem Panel entfernen und nebst gewünschten Eigenschaftsknoten neu setzen.
rw�,e
..
>J.>s",,.HD
�
_ " 4 ' 85% " m .. .
lbo,9'O'd-rle> ' I
- BeiT_c
O�_
0_ Oe"",",";'"
Bild 6.3 Kontextmenü zum
w«t l.....- e
<-,
�Toste """",t!!:,,;t,
� f... w...te ...&-hoIb do, "",,,,,,, I
""""",,",,�,,"'otlSlg
-
w.t.b...,,"
�
Eigenschaftsknoten des Aus gabeelements '?' in Bild 6.1 bzw. Bild 62.Man sieht, dass es eine Fülle verschiedener Eigenschaften gibt Im Beispiel wurde die Eigenschaft 'Sicht bar' ausgewählt. Man findet weiter unten sogar noch mehr Eigenschaftsknoten, die hier nicht dargestellt sind
Wenn Sie in Aufgabe 6.3 das Programm 'Eigenschaft_Tastenfokus.vi' unmittelbar nach dem Vorbild des Diagramms in Bild 6.2 entwickeln, sehen Sie nach dem Start in der Symbolleiste inks l neben dem 'Ausführen'-Pfei l einen kleinen Haken, der nicht mehr verschwindet. Ei gentlich soll der Anwender dort klicken und so das Ende seiner Eingabe in 'a' quittieren.
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'
6 Prozessvisualisierung
116
Doch wird das Verschwinden hier nicht sichtbar, weil der nächste Schleifendurchlauf sofort wieder die Eigenschaft 'TastenFokus' aktiviert. Mit 'Eigenschaft_TastenfokusKorrekt.vi' kann man dieses Problem beheben, also mit einem VI, wie es in Bild 6.4 bis Bild 6.6 darge stellt s i t: In Bild 6.4 sieht man den ersten Teil einer dreiteiligen Sequenz. Hier wird 'TastenFokus' auf TRUE gesetzt. In Teil
2 der Sequenz (Bild 6.5)
befindet sich eine While-Schleife, die erst
verlassen wird, wenn 'TastenFokus' den Wert 'FALSE' liefert. Das geschieht in dem Moment, l das VI (nach mindestens in dem der Anwendet seine Eingabe in 'a' quittiert hat. Dann äuft
1000 ms Wartezeit) n i den letzten Teil der Sequenz (Bi l d 6.6), n i dem es die Summe errech
o0
net. Anschließend wiederholt sich dieser Ablauf, bis der Stopp-Knopfbetätigt wird.
I!U]
im
. .2
.
-
T�st�
I
-
SO:: �OOt
[j]
t5tew1mrjj 111
Bild 6.4
Beispiel fürdie Verwendung der Eigenschaft TastenFokus'
Bild 6.5
[j]
,.,.,WiHI!I 2 0 .. 2
I§m 'c 8-r [j]
•
TastenFokus' wird falsch, wenn die Eingabe nach 'a' quittiert wurde. Erst dann wird die innere While-Schleife verlassen. Das Schleifenendesymbol mit dem Rundpfeil ist die logische Negation des üblicherweise (LB. in der äußeren While-Schleife) verwendeten Stoppzeichen symbols
...
!4 •
�.dTii· •
Bild 6.6
Berechnung der Summe von 'a' und 'b'
IAufgabe 6.4
'Eigenschaft_TastenfokusKorrekt.vi' hat den Nachteil, dass der Tastaturfokus nur aufdie Eingabe für 'a' angewandt wurde. Schreiben Sie ein Programm, das nach dem Quittieren der Eingabe für 'a' den Tastaturfokus auf 'b' lenkt, so dass der Anwender durch die ein zelnen Schritte der Definition einer neuen Re<:henaufgabe geführt wird.
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'
6.3 GrafischeAusgabe
117
Bemerkungen •
Man kann die Eingabe in ein Bedienelement auch quittieren, indem man auf irgendeine freie Fläche des PaneJs klickt. Die Quittierung auf dem Hakensymbol links neben dem Startknopf des Vls ist nicht notwendig.
•
Soll ein Bedien- oder Anzeigeelement mehrere Eigenschaften aufweisen, ist es nicht nö tig, für jede einzeJne Eigenschaft einen neuen Knoten zu erzeugen. Man kann den Knoten auch gemäß Bild 6.7 aufziehen.
•
Bild 6.7 zeigt ferner, dass man ein und dieselbe Eigenschaft auch mehrfach verwenden kann, einmal zum Setzen der Eigenschaft (Schreiben) und dann zum Lesen.
•
Hat man mehrere Eigenschaftsknoten wie n i Bi l d 6.7, werden diese von oben nach unten abgearbeitet. Gibt es darin z.B. zweimal dieselbe Eigenschaft, muss man sie erst oben setzen, bevor man weiter unten den neuen Wert lesen kann.
IAufgabe 6.5
n l+::
Bild 6.7
Eigenschaftsknoten mit mehreren Eigenschaften zum Bedien element 'Numerisch'
Ergänzen Sie das Programm n i Bild 6.7 mit einer While-Schleife, damit es nach ein fachem Start mehrfach ausgeführt wird. überzeugen Sie sich von der Wirkung der Eigen schaften, die Sie seJbst während des Programmlaufs verändern können, auf das Bedien eJement 'Numerisch' und aufdie Anzeigeelemente 'Blinkend lesen' und 'Sichtbar lesen'.
Merke: Zu jedem Bedien- oder Anzeigeelement kann man im KontextmenO Eigen schaftsknoten erzeugen. In diesenwiederum lassen sich verschiedene Eigen schaften auswählen.
Merke: Ein Eigenschaftsknoten kann mehrere Eigenschaften enthalten.
Merke: Die Eigenschaften in einem Eigenschaftsknoten lassen sich in den meisten Fällen sowohl lesen als auch schreiben.
BeispieJe zu Methodenknoten werden im Zusammenhang mit der grafischen Ausgabe im folgenden Abschnitt behandelt.
6.3
Grafische Ausgabe
Anzeigeelemente für die grafische Ausgabe auf dem Panel findet man bei 'Elemente' 'Modern' - 'Graph' in der zweiten Zeile rechts. Die wichtigsten sind: •
Signalverlaufs-Diagramm, hier kürzer Chart genannt, erste Zei l e links,
•
Signalverlaufs-Graph, hier kürzer Graph genannt, erste Zei l e Mitte,
•
XY-Graph, erste Zeile rechts.
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'
118
6 Prozessvisualisierung
6.3.1
Chart (Slgnalverlaufs-Dlagramm)
6.3.1.1
Darstellung einer Sinuskurve
l d 6.8 zeigt auf dem Panel ein Chart im Aktualisierungsmodus 'Sweep'. Das bedeutet, der Bi jeweils älteste Teil der angezeigten Kurve wird von der senkrechten roten Geraden, die nach rechts läuft, weggewischt (sweep). Links von dieser Geraden sieht man die Gegenwart und jüngere Vergangenheit, unmittelbar rechts davon die älteste Vergangenheit. Ein Chart hat also eine Historie. Normalerweise umfasst diese Historie 1024 Daten- bzw. Bildpunkte, aber das lässt sich ändern. Im Kontextmenü zum Grafikfenster findet man die Eigenschaft 'Histo rienlänge. . .'. Beim Anklicken öffnet sich ein Fenster, in das man z.B. auch 2000 oder 2048 eintragen kann. Startet man dann das Programm erneut, sieht man ein längeres Teilstück der Kurve in Bild 6.9 als zuvor in Bild 6.8.
Bild 6.8 Anzeige einer Sinuskurve im Sweep-Modus im Programm 'Graphl_Chart.vi'
CJ
,..
�-oo.,-_(O>tot) ,
0,0
{I O,lS
0,'
t
� o�
1\
0,00
.,'
.,' .,0
-
-1,00 ,
V
�
\,
\
""'
Bild 6.9 VI wie in Bild 6.8, aber mit einer Historienlänge von 2048 Datenpunkten
Die Steuerung des 'Anzeigemodus' erfolgt mit einer Enum-Variablen, in die hier die engli schen Begriffe 'Scroll' (0), 'Scope' (1), 'Sweep' (2) eingetragen wurden, weil die deutschen Begriffe Streifendiagramm (0), Oszilloskop (1), überschreiben (2) weniger aussagekräftig sind. Den Sweep-Modus kann man während des Programmlaufs mit Hilfe eines Eigen schaftsknotens mit der Eigenschaft 'Aktualisierungsmodus' in 'Scope' oder 'Scroll' ändern. Man erkennt das im Diagramm von 'Graph1_Chart.vi' in Bi l d 6.10. 'Scope' bedeutet: Die Anzeige erfolgt wie auf einem Oszilloskop, d.h., die Kurve wird von inks l nach rechts gezeichnet und unmitteJbar danach der Bildschirm komplett gelöscht. Dann erscheinen die nächsten Bildpunkte wieder am linken Rand usw.
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'
6.3 GrafischeAusgabe
119
'Sool1' bedeutet: Zunächst wird der Bi l dschirm wie bei 'Scope' mit den Bildpunkten be schrieben. Danach wird aber nicht geJöscht, sondern die Kurve als Ganzes nach links ge schoben, damit am rechten Rand Platz für die nächsten Bildpunkte entsteht.
Bild 6.10 Programmierung von 'Graphl_Chart.vi'
Erklärung des Diagramms in Bild 6.10 1. Die in Bild 6.8 und Bild 6.9 gezeigte Sinuskurve wird links im Diagramm von Bild 6.10 erzeugt. Dazu wird der Index 'i' der Whi l e-Schleife mit 'Ir./360 multipliziert und der Sinusfunktion zugeführt.
Die Zahl
'Ir.
befindet sich unter 'Punktionen' -
'Programmierung' - 'Numerisch' (rechts unten) und dort links oben, die Sinusfunktion
unter 'Punktionen' - 'Mathematik' - 'Grund & Spezialfunktionen' (erste Zeile Mitte) -
'Trigonometrische Funktionen' (erste Zeile links) und dort inks l oben. Diese Funktion verlangt ein Argument im Bogenmaß. Läuft nun 'i' von 0 bis 360, erhält die Sinusfunktion Argumente zwischen 0 und 'Ir., was 180Q entspricht. Wäre nun für den Chart eine Histo
rienlänge von 1080 eingesteJlt, liefe das Argument für die Sinusfunktion von 0 bis 3n;, man sähe also eineinhalb Wellen der Sinusfunktion. Mit einer Historienänge l von 1024 sieht man etwas weniger.
2.
Oben in der Mitte des Diagramms ist eine Wartezeit von 1 ms eingetragen. Ohne diese Wartezeit äuft l das Bild so schnell, dass die Sinuskurve nicht deutlich zu erkennen ist.
3. Rechts oben m i Diagramm befindet sich ein Eigenschaftsknoten, mit dem man den 'Ak tuaisierungsmodus' l einstellen kann, also 'Sweep', 'Scope' oder '8(roll'. 4. Rechts unten im Diagramm findet sich eine Case-Struktur, die vom Stopp-Knopf gesteu ert wird. Solange noch nicht Stopp gedrückt wurde, liefert das zugehörige Tenninal den Wert 'FALSE'. Der FALSE-Teil der Case-Struktur ist leer (hier nicht dargesteJlt), so dass m i NonnalfaU nichts geschieht. Druckt man dagegen die Stopp-Taste, wird der in Bild 6.10 dargestellte TRUE-Teil ausgeführt.
5. Der TRUE-Tei l schreibt einen leeren Vektor in den Eigenschaftsknoten mit der Eigen schaft 'Historiedaten'. Das bedeutet die Löschung aller Daten in diesem Array, in dem der 'Historienänge l . . . ' entsprechend viele Elemente gespeichert sind. Der Effekt ist, dass keine Daten mehr für die Anzeige m i Chart verfügbar sind: Die Sinuskurve verschwindet, der Chart wird gelöscht. Den leeren Vektor erhält man automatisch, wenn man mit der rechten Maustaste auf den Eingang des Eigenschaftsknotens 'Historie' klickt und dann 'Erstellen' - 'Konstante' wählt.
6. Der Löschvorgang darf erst ablaufen, wenn alle Daten angezeigt wurden. Deshalb wird eine Datenabhängigkeit zwischen Anzeigeteil und Löschteil des Programms erzwungen.
IAufgabe 6.6
Starten Sie das Programm 'Graphl_Chart.vi' und lassen Sie die Sinuskurve n i den Modi 'Sweep', 'Scope' und 'SerolI' anzeigen.
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
120
6.3.1.2
Darstellung von zwei oder mehr Kurven In einem (hart
Will man mehr als eine Kurve in einem Chart darstellen, z.B. die Temperatur und die Luft feuchtigkeit in Abhängigkeit von der Zeit, muss man die Datenquellen für beide Funktionen
im Diagramm zusammenführen. Außerdem sollte man sich um die Darstellung auf dem Panel kümmern, etwa indem man verschiedene Farben für die Kurven wählt oder eine Kurve durchgezogen, die andere gestrichelt darstellt. Der Einfachheit halber zeigen wir ein Beispiel mit trigonometrischen Funktionen. In Bild 6.11 werden eine Sinus- und eine Kosinuskurve im Scroll-Modusgezeichnet.
Cl
�,
',. '" ,.
r' ' ,. " "" M
-!.CI)
,..
�
Bild 6.11 Darstellung von zwei Kurven in einem Chart. Statt 'Aktualisierungsmodus' wurde hier die frühere Bezeichnung 'Anzeigemodus' gewählt
Während in Bild 6.8 rechts auf dem Chart die Legende für eine Kurve zu sehen ist, gibt es in Bi l d 6.11 eine Legende mit zwei Kästchen, für jede Kurve eines. Hier können unabhängig voneinander für jede Kurve die Farbe, der Linienstil (gestrichelt, durchgezogen usw.), die Linienbreite und vieles andere eingestellt werden. Diese zwei Legendenkästchen sind von Hand aufzuziehen.
Bild6.12 Diagramm zu
'Graphl_CharL2Kurven.vi' in Bild 6.11. Statt 'Aktualisierungsmodus' wurde die alte Bezeichnung 'Anzeigemodus' velWendet
Erklärung des DIagramms In Bild 6.12 I. Im Unterschied zum Diagramm in Bild 6.10 werden jetzt zwei Funktionen, eine Sinus- und eine Kosinuskurve, zum Terminal 'Signalverlaufs-Diagramm (Chart)' geführt. Dazu muss man sie vorher bündeln ('Funktionen' - 'Programmierung' - 'Cluster
& Variant').
2. Zum Löschen der Kurven nach Programmstopp muss man den Eigenschaftsknoten 'His torie' diesmal mit einem leeren Vektor von Clustern aus je zwei Zahlen füllen. Doch er hält man auch hier diesen Vektor automatisch mit einem Rechtsmausklick auf den Eingang von 'Historie' und der Wahl von 'Erstellen' - 'Konstante'.
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'
6.3 GrafischeAusgabe 6.3.1.3
Legende zu einem (hart oder Graphen
� '"
j
121
K""" 1
(o.t)
K"",, 2
l/'V �
�omont,." ••• ,__t
,
, ,
'�"'e , Kont�et ,-�
, ,
,�
,
'"
,.,
GrlXldhe füile<1
,
x·Achse Y·Achse
, ,
,
Int«po!otün , f'\rttdaßteblg �
Bild 6.13 Kontextmenü zur Plot
Legende eines Charts (Signalverlaufs
Diagramms). Zu allen Optionen gibt es UntermenOs
Unter der Plot-Legende versteht man beim Chart das (oder die) kleine(n) Fenster rechts oben mit der Dreieckskurve. Man kann die Legende auch ausblenden, indem man im Kon textmenü des Charts 'Sichtbare Objekte' wählt und 'Plot-Legende' deaktiviert. Andererseits zeigt Bild 6.13 Möglichkeiten, mit Hilfe der Legende den Chart und die Kurve
darin zu gestalten. Einige dieser Möglichkeiten werden hier behandelt. Fährt man mit dem Mauszeiger über die Menüeinträge, öffnet sich jedes Mal das entsprechende Untermenü: •
Diagrammtyp: verdeutlicht häufig verwendete Arten der Gestaltung eines Charts. Ist man mit einer der in Bild 6,14 gezeigten Darstellungen zufrieden, erübrigt sich das Zu sammensuchen
der gewünschten Eigenschaften aus den folgenden Zeilen wie 'Farbe',
'Linienstil' usw.
Bild 6.14 Häufig benutzte Darstellungen für einen Satz von Bild punkten Links oben werden die Bildpunkte durch Geradenstücke verbunden, d.h., es wird inter poliert. Oben i n der Mitte sind die Bildpunkte markiert und isoliert gezeichnet. Oben rechts werden sie markiert und durch Geradenstücke verbunden. In der zweiten Zeile links ist die Fläche zwischen Kurve und Abszisse gefüllt. In der Mitte der zweiten Zeile werden isolierte Punkte durch Geraden mit der Abszisse verbunden. Man spricht hier vom Balkendiagramm oder Bargraphen. In der zweiten Zeile ganz rechts stehen die Bal ken im Bargraphen nicht mehr isoliert voneinander. •
Farbe: Der Anwender kann sich aus einer Farbpalette die gewünschte Farbe für seine Kurve aussuchen.
•
Linienart: Auswahl von durchgezogenen, gestrichelten, strichpunktierten Linien usw.
•
Linienbreite usw.
•
Interpolation: Auswahl von keiner Interpolation (isolierte Punkte) oder verschiedenen Arten der Verbindung der Bildpunkte mit direkt von Punkt zu Punkt verlaufenden Ge raden oder durch Treppenfunktionen unterschiedlicher Art.
•
Punktdarstellung: Auswahl von Punkten verschiedener Größe und Form.
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
122
Die genannten Einstellungen lassen sich nicht nur manuell, sondern auch per Programm mit Hilfe von Eigenschaftsknoten erzielen. Bi l d 6.15 zeigt ein mögliches Ergebnis solcher durch verschiedene Bedienelemente definierten KurvendarsteIlung.
IAufgabe 6.7 Versuchen Sie, das Diagramm für das VI n i Bi l d 6.15 zu programmieren. Experimentie ren Sie mit dem fertigen Programm, um sich einen überblick über die vielen Möglichkei ten der Darstellung von Kurven zu verschaffen. Hinweis: Gehen Sie vom Programm Graphl_Chart.vi in Bild 6.10 aus und führen Sie ei nen neuen, mehrfach mit Eigenschaften belegten Eigenschaftsknoten ein. Die Eigen schaften finden Sie m i Kontextmenü unter 'Erstellen' - 'Eigenschaftsknoten' - 'Plot'.
I
,,�
I
--',00
' ',
�
J
'," 0,,," 0,00 �,' �," ' ", -1,00
�1� ,
h\�l ,.
�V
'00
,... -
6.3.1.4
Bild 6.15 Einstellungen zur Darstellung von Bildpunkten. Hier als Balkendiagramm mit Bildpunkten, die durch kleine Kreuze markiert sind. Ferner Einstellungen zur Interpolation
Skallerung der Ordinate In einem Chart
Für die Achsen m i Chart und ihre Skalierung gibt es ebenfalls mannigfache Wahlmöglichkei ten. Wir besprechen hier die Ordinate (Y-Achse). Zur Skalierung der Abszisse (X-Achse) verweisen wir auf die entsprechenden Möglichkeiten beim Graphen (Waveform-Graph).
Ordinate oder V-Achse Die Amplitude der Sinuskurve in Bild 6.9 hat den Wert I . Der Offset ist O. Will man nun z,B. die Funktion y = A sin(x) + Offset einstellen, etwa y = 3 sin(x) + 1
hat man verschiedene Möglichkeiten:
1. Man schreibt eine andere Formel im Diagramm nach Bild 6.10 (siehe Aufgabe 6.8). 2. Man nützt die Möglichkeiten, die LabVIEW zur Skalierung der Y-Achse bietet.
IAufgabe 6.8 Verändern Sie das Programm n i Bild 6.10 so, dass es die Funktion y = 3 sin(x) + I an zeigt. Starten Sie das Programm und beobachten Sie die Ausgabe aufdem Panel.
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'
6.3 GrafischeAusgabe
123
Denselben Effekt wie in Aufgabe 6.8 kann man erreichen, wenn
man
die Y-Achse entspre
chend skaliert. Dazu im Kontextmenü des Charts auf 'y-Achse' - 'Formatieren . . . ' gehen, wie in Bild 6.16 zu sehen, und 'Fonnatieren .. .' anklicken. Es öffnet sich ein Fenster, in dessen Menüleiste man auf 'Skalierungen' umschaltet, siehe Bi l d 6.17. Dort trägt man in der rechten unteren Hälfte die Skaierungsfaktoren l Offset = 1 und Faktor = 3 ein. Dann zeigt das unver änderte Programm von Bild 6.10 nach dem Start die gleiche Ansicht wie das nach Aufgabe 6.8 geänderte VI entsprechend Bild 6.18. 5d"otbIn Objelote
•
Ar>
1n 8edioo.... . �� ' . lIesd"o-ehng ....t Topp• • •
Er..,..... Erseuen Datenoperotiorw1 I'
�.,.,f�eidl� � .... fenstert&-eidl .,.....
./ �"'""'" de
'-" � � O: " " M -
• • • • •
stI
. ./��y
-'
__ __ __ __ __ __ __
• •
, - -....
./ Si
Bild 6,16 Weg zur Formatierung der V-Achse I> D,agramm E,gen.chaft�n
Name
Pcde
17 Achsef1·Be"""ttlXlg '1ZeiQffi 17 Achse i>flZeiQffi
17 ActorMtische SkaoIeflXlg
r,"
r lnve
Bild 6,17 Skalierung der V-Achse
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'
6 Prozessvisualisierung
124
-
�
..bciten •
�-"
• •
:J""'"
--
�,je� �,IChon
G
0,0 ,0
',� 1 L,O i
""
-L,O 00
"
o.
". Bild 6.18
Amplitude 3 und Offset 1, erzeugt durch entsprechende Skalierung der Y-Achse
6.3.2
==
==
Graph
Im Unterschied zum Chart akzeptiert ein Graph nicht einzelne Werte als Eingang, sondern immer nur die gesammelten Werte eines Arrays. Das hat Konsequenzen für die Program mierung und auch für das Löschen des Diagramms.
6.3.2.1
Darstellung einer Sinuskurve
Wir versuchen wie zuvor n i Bild 6.8, eine Sinuskurve darzustellen. Zuerst fällt das Raster auf dem Panel in Bild 6.19 auf. Der Versuch, wie beim Chart mit der Farbe Weiß auf einen Schlag einen gleichförmigen Hintergrund zu erzeugen, missingt. l Man muss mehrmals Farbe auf den Hintergrund 'auftupfen' (Untergrundfarbe Weiß einstellen und mit Werkzeug PinseJ antupfen), bis man wie in Bild 6.19 ein großflächiges Raster erhält. Will man auch dieses verschwinden lassen, muss man zusätzlich noch die Vordergrundfarbe auf Weiß stellen. Das Diagramm in Bild 6.20 ähneJt auf den ersten Blick dem in Bild 6.10. Doch gibt es wichti ge Unterschiede: •
•
•
Die Eigenschaft 'Aktualisierungsmodus' existiert nicht für das Anzeigeelement Graph. Ein Graph (Waveform-Graph) akzeptiert keine einzelnen Datenpunkte, sondern stets nur ein Array von Bildpunkten. Deshalb wurde eine FüR-Schleife um die Erzeugung der Sinus-Bildpunkte gelegt. Die Zahl 'n' der Schleifendurchläufe muss vom Anwender ein gegeben werden (oder man wählt eine Konstante). Für die Beendigung des Programms ist es wichtig, eine Datenleitung von der FüR Schleife zur abschließenden Case-Struktur zu ziehen und so eine Datenabhängigkeit zu erzeugen. So wird sichergestellt, dass die Case-Struktur erst nach Abschluss der FüR Schleife zur Ausführung kommt. Andernfalls springt LabVIEW zwischen beiden Struk turen hin und her, weil es prinzipiell alles parallel bearbeitet, was nicht in eine Sequenz struktur eingebettet ist oder auf Grund von Datenabhängigkeiten sequenziell ausgeführt werden muss. Das ist - anders als beim Chart-Beispiel von Bild 6.10 - hier besonders stö rend, weil bei falscher Reihenfolge nicht nur ein einzelner Punkt, sondern alle Punkte des
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
l2S
n i der FüR-Schleife erzeugten Arrays nach dem Löschen des Bi l ds neu gezeichnet wer den könnten
I��.. Cl -1--\ f' 't-
""" , IN
'm 0," 0,_
om
-
Op
.'.'" ·0.75 'm
0
•
' co
"'"
Bild 6.19
"'" '"" """ "'" "" 100
'"
Nutzung des Anzeigeelements Graph (Signalverlaufs-Graph) in 'Graph2_Graph.vi' zur Darstellung einer Sinuskurve. Vergleiche mit Bild 6.8 oder Bild 6.9
Ein Graph (Waveform-Graph) kennt keine Historie wie der Chart. Daher gibt es auch keine Eigenschaft 'Historiendaten'. Das Löschen des Bilds beim Stoppen des VI erfolgt deshalb über den Methodenknoten 'Standardwert wiederherstellen', was das Entfernen der Kurve bedeutet, wenn 'keine Kurve' der Standard war (vorhereinzustellen!).
Bild 6.20 Diagramm zur Erzeu gung der Sinuskurve in Bild 6.19
[j] •
Eine Wartezeit innerhalb der FüR-Schleife zwischen der Erzeugung der einzelnen Bild punkte wie in Bild 6.10 oder Bi l d 6.12 ist überflüssig. Das würde nur die Rechenzeit ver längern, ohne dass sich an dem unmittelbaren Erscheinen der gesamten Sinuskurve et was ändern würde. Sinnvoll ist dagegen eine Wartezeit außerhalb der FüR-Schleife zur Entlastung des Prozessors.
Das VI von Bild 6.20 lässt sich übrigens gemäß Bi l d 6.21 vereinfachen:
P,I"
,
� ,
[j]
""'" ,
�01
eh ' .�
!/>OLl
,
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<1
I omEEJ
i'Ii:t1'1
Ii 111:_:55
,.
Kontextmenü zum
�
Delimolzf/....,
,,0
Bild 6.27 Auswahl der ver schiedenen Beschriftungen für die X-Achse
Auch hier gibt es viele Wahlmöglichkeiten. Es wird geraten, die Einstellungen von Bild 6.27 unverändert zu übernehmen. Vor dem 'OK' sollte oben die Registerkarte 'Skalierungen' aufgerufen werden. Es wird empfohlen, die Einstellungen entsprechend Bild 6.28 zu wählen. Achtung: Passen Sie auf, dass dort in der obersten Zeile auch wirklich 'Zeit (X-Achse)' einge tragen ist und nicht die Y-Achse! Gegebenenfalls korrigieren. Übernimmt man die dort angezeigten Einstellungen für die X-Achse des Programms aus Bi l d 6.15, erhält man m i Anzeigemodus 'Scroll' eine Darstellung gemäß Bi l d 6.29. Die Anzeige der tatsächlichen Uhrzeit wird später n i Abschnitt 6.3.4 besprochen.
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'
6.3 GrafischeAusgabe
129
I> Groph EIgenschaften Er>c�
I
Fcnr"" lX1d �
I
Plot,
�
Z� (X·Achse)
_
I ClXse< I �
"Iz�:;------
'" Achse<1·oe",h'ttlXlg onze
r Inve
Bild 6.28 Skalierungen fOr die X-Achse
'"
,"
I ;:
.....-.......
1 "" "" ""
Bild 6.29 Hier ist die X-Achse auf relative Zeit umgestellt Den Indizes 0, 1,2, . . . entsprechen die Zeiten 0 s, 1 s, 2 S, gemessen vom Programmstart an •
6.3.3
XY·Graph
Charts und Graphen ist gemeinsam, dass man mit ihnen Funktionskurven darstellen kann. Das heißt, zu jedem Index auf der X-Achse gehört genau ein y-Wert. Kurven mit mehr als einem y-Wert, so genannte Relationen wie z.B. ein Kreis, lassen sich dort nur mühsam ab bilden: Man muss z.B. den Kreis in seine obere und untere Hälfte zerlegen und die so entstehenden zwei Kurven nach den Methoden von Abschnitt 6.3.2.2 anzeigen. Eine elegantere Methode zur Visualisierung der Kurven von Relationen bietet der XY Graph. Er erlaubt die Abbildung beliebiger ebener Kurven n i Parameterdarstellung: x= J(t)
y = g(t)
Als Parameter t wirkt dabei der Index 'i' n i der FüR-Schleife, welche die x- und y-Werte berechnet. Bild 6.30 und Bild 6.31 zeigen die Parameterdarstellung eines Kreises.
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
130
6.3.3.1
Darstellung einer Relation im XY-Graphen -..
�o
�
,
oe
r: '" 0'
m
«
.. ..
\
••
,
L, � ' fII! [lJ
,
�
�,7S �,5 �,Z5
,
••
�
,� "
," ,
Bild 6.30 Kreis in Parameterdarstellung: x== sint,y == cos t mit dem Parameter t== i (Index der FOR·Schleife)
,� .
�
�1
� Bild6.31 DiagrammzumVJ von Bild 6.30
Bemerkungen •
•
Das Anzeigeelement XY·Graph ist vom Typ Cluster. Daher muss man die Vektoren X und Y auch zu einem Cluster bündeln. Die Struktur des VI ist gegenüber der des Programms n i Bild 6.20 leicht verändert: So· lange noch nicht 'Stopp' betätigt wurde, wird der FALSE·Teil der Case·Struktur mit der Berechnung der Kurve ausgeführt. Im TRUE·Teil befindet sich wie beim Graphen der Methodenaufruf 'Standardwert wiederherstellen', was zum Löschen der Kurve führt. Diese leicht geänderte Programmierung ist nicht spezifisch für den XY-Graphen. Sie zeigt nur eine neue Variante, die man auch schon bei den anderen Anzeigeelementen Chart und Graph hätte verwenden können.
IAufgabe 6.10
Versuchen Sie, das Programm zur Anzeige zweier Kurven in einem (Signalverlaufs-) Graphen nach der n i Bild 6.3 i gezeigten Struktur zu entwickeln.
IAufgabe 6.1 1
Stellen Sie eine Zykloide (Kurve eines Punktes, der mit einem abrollenden Rad verbun den ist) im XY-Graphen dar. Die Zykloide hat die Parameterdarstellung x = a (rp-Jlsinrp),
y = a · (rp-Jloosrp)
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
131
Dabei ist cp der Winkel des abrollenden Rades, von der Radachse aus gerechnet. Der Faktor � ist das Verhältnis des Punktabstands von der Radachse zum Radius a des Rades. Ist � ;:. I, erhält man eine Kurve wie n i Bild 6.32. ,*", 0
r.-w"",
/v"
.,....,... .. � .. �...
" " o
"
l 1"
,
"
"....��-..,I'-.-+-.,{ 6.3.3.2
'"
''''' -
''''
""
Bild 6.32 Radkurve (Zykloide), bei welcher der am Rad befestigte Punkt von der Achse weiter entfernt ist als die Radlauffläche
Darstellung mehrerer Relationen In einem XV-Graphen
Bei mehreren Funktionen bzw. Relationen verfahrt man im Prinzip ähnlich wie bei den schon bekannten Kurventypen. Bild 6.33 und Bild 6.34 geben ein Beispiel. Die Zusammen fassung der Kurven geschieht in Form der Bildung eines Arrays mit zwei Clusterelementen, wie das Diagramm n i Bild 6.34 zeigt. "4"
-
-
" ,...,
r'...
- -,
•
Bild 6,33 Kreis und Ellipse mit frei wählbaren
Halbachsen a und b in einem XY-Graphen
i Ie.
S, . [j]
• ,
�
.
��I . ,
,
"
,
.
�
�
� ")
.
-10
Bild 6.34 Diagramm zu den Kurven in
Bild 6.33
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
132
Merke: Die grafische Ausgabe von Datenreihen erfolgt in LabVIEW-Programmen meist in einem der drei Anzeigeelemente Chart (Signa1verlaufs-Diagramm), Graph (Signa1verlaufs-Graph) oder XY-Graph.
Merke: Der Chart akzeptiert einzelne numerische Daten (und auch Arrays), der Graph nur Arrays numerischer Daten und der XY-Graph nur Clustervon zwei Arrays.
Merke: Will man mehrere Kurven zusammen darstellen, so muss man bilden: beim Chart ein Cluster der Elemente der verschiedenen Kurven, beim Graphen ein 2-dimensionales Array und beim XY-Graphen ein Array von Clustern.
Merke: Die Achsen der grafischen Anzeigeelemente lassen sich skalieren, die Kurven in vielfliltiger Weise bezüglich Farbe, Strichstärke usw. variieren. Dazu dient die Legende.
Merke: Kurven löscht man beim Chart mit dem Ei�enschaftsknoten 'Historiedaten', beim Graphen mit dem Methodenknoten 'Standardwert wieder herstellen' oder besser mit Hilfe des Ausgan�s 'Standard verwenden, wenn nicht verbunden' aus der Case-Struktur, beim XY-Graphen wie beim Graphen.
6.3.4
SIgnalverlauf
Die meisten der bisher gebrachten Programmierbeispiele lassen sich stark vereinfachen, wenn man Signalverlaufs-Punktionen (eng!. Waveforms) verwendet. Man findet sie unter 'Punktionen' - 'Programmierung' - 'Signalverlauf' (Mitte vierte Zeile). Die Untermenüs dazu sind in Bild 6.35 und Bild 6.36 dargestellt. Waveforms sind eine spezielle Art von Clustern, besonders entwickeJt zur Darstellung von Funktionen der Zeit. Sie enthalten die Komponenten •
tO als Anfangszeitpunkt,
•
dt als Zeitdifferenz zwischen zwei Messwerten und
•
Y als Vektor der aufgenommenen Messwerte.
Man kann diese Funktionen wie Cluster aufschlüsseJn und bündeln, darf dazu aber keine gewöhnlichen Clusterfunktionen benutzen. Vielmehr ist man auf die beiden Funktionen inks l oben in der ersten Zei l en i Bild 6.35 oder in Bild 6.36 angewiesen CSignalveriaufskom ponenten lesen' bzw. 'Signalverlauf erstellen'). Spezielle Funktionen erstellt man, n i dem man aus 'Funktionen' - 'Programmierung' - 'Ana loger Signalverlauf' - 'Signalverlaufserzeugung' links unten in Bi l d 6.36 auswählt.
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'
6.3 GrafischeAusgabe -
133 •
�Ans>:ht
-
. Prw ormjef !LJ(l
L 5ioTOOef� EHE
5ioTOOef� ..
I!!E
5ioTOOef� ..
[g � � l:t':.l
5ioTOOef�..
� Cl � �
iIrJ.>Iog MCh ..
5ioTOOef� ..
5ioTOOef� ..
ITl � Cl � �
5ioTOOef� ..
DiQitol MCh,..
to·Wefte i>US ••
•
:=pr gq «rllljertm
--
' .,....,.,
' - ........, EIi!l
�erIatI
�
�erIatI
�
�erIatI
III
...
...
...
li!B
�
igj
...
-,
Anzlhl der Si••.
-,
�
...
�
5ioTOOef� ..
Deh·t�ffi
Y·Weft 1e>ef1
Zofe·Arroy fl>"..
Sio;J>IIverIatI ••.
�
�5q1 ..
DiQitoief 5q1 ..
DoteH!O (5io<..
�erIatI
�
Bild 6,35 Untermenü 'Signalverlauf
...
�
� ->
letztffi Zofe" ..
B
�
...
�
5ioTOOef� ..
� � g
[:1J
�
...
�
...
Bild 6.36 Unter-UntermenO 'Analoger Signalverlauf
Wavefonns sind abgestimmt auf den Waveform-Graphen. Man kann also den Ausgang einer solchen Funktion ohne aufzuschlüsseln direkt mit dem Waveform·Graphen (Signal· verlaufs-Graphen) verbinden. Bild 6.37 zeigt eine Auswahl von Funktionen wie Sinusfunk· tion, Rechteckfunktion usw. aus dem Untermenü dritter Stufe 'Signalverlaufserzeugung'. So:hon
�ArI"idJ
"��
L Sion3Ive � L��",",.. L"""...... r
W'
Iouf...,...,....,
[rl",he< fL
�
�
"'-"
�
�
E�'
s..,.,���
�
�
�h<,, � ...
[n,= �R, ...
Gomn-o.Rou> ...
hverte«...
freqo;e<1'syrt ... Gk
�
Poo">n·RiIUI ...
l2l
�
Ta"
t!l
I:§l
lEl
Berro.J!·RiOJ. ..
�
Bild 6.37 Untermenü dritter Stufe mit einer Auswahl von Funktionen wie Sinus, Recht eck. Sägezahn usw. Der Sinus steht links in der zweiten Zeile. Rechts ist die Aufschlüsselung des Ausgangs dieser Funktion in die drei Komponenten tO, dr und Y zu sehen
Waveforms wurden schon im einführenden Beispiel in Abschnitt 1.5, Bilder 1.19 und 1.20, dargestellt. Wir wiederholen dieses Beispiel, um die vielen Varianten von Sinuskurven anzu·
deuten, die sich auf einfache Weise mit der Funktion 'Sinussignal' erzeugen lassen. In Bi l d 6.38 und Bild 6.39 sind Panel und Diagramm dargestellt.
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
134
�
' oo':I-\-1H '-f\-+-� 1,00,1---++-+ +-+1-1 11
i ,,00'1---' 1--1 +-+ +-+ +1 - +t-+--\ ++� - n-tI---t \t+--l -1,00,'"..,.1":0',"'''<:-",,:..,,, o,ool -
- l,OOl -
0,00
0,'"
-
0,<0
�
0,'"
0,00
1,00
Bild 6.38
Ausgabe der Funktion 'Sinussignal' auf dem Panel. wenn alle Eingänge und Ausgänge dieser Funktion genutzt werden
[j]
Bild 6.39
Diagramm zum VI in Bild 6.38
Man erkennt zunächst, dass sich problemlos Frequenz, Amplitude und Phase einstellen lassen, während wir früher meist mit konstanten Werten wie Amplitude = I und Phase = 0 gearbeitet hatten. Ferner gibt es einen Offset, der im Beispiel auf I gesetzt wurde. Die Sinusfunktion mit der Ampitude l 3 schwankt also nicht zwischen -3 und +3, sondern zwischen -2 und +4. Die Phase steht auf 45°, so dass nicht sin(2xft), sondern sin(2n;!t + 45") angezeigt wird. Sehr wichtig ist die 'Abtastinformation', ein Cluster mit den Variablen 'Fs' gleich Abtast frequenz (scan Frequency) und '#s', der Zahl der Abtastungen. 1000 Abtastwerte sind voreingestellt. Das bedeutet im Beispiel bei einer Frequenz von 2 Hz, dass für zwei Sinus perioden 1000 Funktionswerte berechnet und in einem Vektor gesammelt werden (interne Bezeichnung Y, wie man in Bild 6.37 rechts sehen kann). Ebenfalls voreingestellt ist die Ab tastfrequenz, und zwar auf 1000 Abtastungen pro Sekunde. Die Vorstellung ist also, dass die
1000 Funktionswerte in einer Sekunde erfasst werden. Dementsprechend steht rechts auf der X-Achse jetzt auch die Zahl 1,00, was als Simulation einer Sekunde gedeutet werden kann. Achtung: Die Frequenz der dargestellten Sinuskurve darfnicht mit der Abtastfrequenz ver wechselt werden!
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'
6.3 GrafischeAusgabe
I3S
Schließlich haben wir noch den Schalter 'Signal zurücksetzen', der auf 'AUS' voreingestellt ist. Das bedeutet 'Nicht zurücksetzen'. Die Wirkung ist die, dass in der While-Schleife die Sinus-Endwerte vom ersten Durchlauf als Anfangswerte des zweiten verwendet werden. Andernfalls würde immer mit den gleichen Anfangswerten gearbeitet. Reduziert man nun die Zahl der Funktionswerte bei gleich bleibender Abtastfrequenz, fangt die Sinuskurve an, nach rechts zu laufen! In Bild 6.40 und Bild 6.41 wird gezeigt, wie man mit Waveform-Funktionen mehrere Kurven in einem Signalverlaufs-Graphen darstellen kann.
..
_..
..., ,..., ,--, ..,. ..,.. .. ,,·f --,
.
- n-l -+ + 1 .-l- -+-�"':-!---' '"
.,.",,0,"" \� , _0,<0 0,20
',60
','"
',00
Bild 6.40 Zwei Kurven in einem Sig
nalverlaufs-Graphen
Bild 6.41 Diagramm zu Bild 6.40 .. G,�ph E",cn
,-
[Xooced�9:e"""" �1C
""""'"'
I "eI"'�eZe'
p.rQ<WS>te' Zef:fcnod:
:a
:"
r �
r .........
r. ""inJoo
r. "".....
fJ""""""3 Kom .... '"'"" 1""00""»0' D.hmol"mot a r MiTi] r _romtonz"9!'f1 r r.
'iMi] Wil
, "...",
..
r. 2,,''''''<Jh
r .
Jd-.
(!��'Be_� "or'oe>Cht"'""", ",<>,b
Bild 6.42 Einstellungen für eine Echt zeitbeschriftung der X-Achse
Mit Hilfe von Waveforms ässt l sich nun auch die X-Achse mit der echten Zeit, d.h. mit der im Computer gespeicherten Momentanzeit, versehen. Dazu im Kontextmenü des Wave form-Graphen auf dem Panel 'x-Achse' - 'Formatieren' wählen und im dadurch geöffneten
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
136
Fenster Einstellungen entsprechend Bild 6.42 vornehmen. Das Ergebnis ist eine Darstellung gemäß Bi l d 6.43. Die Programmierung ist in Bild 6.44 zu sehen.
IAufgabe 6.12
Starten Sie das in Bild 6.38 dargestellte VI und begründen Sie, warum bei einer eingestell ten Anzahl der Abtastungen = 999 und einer Abtastfrequenz = 1000 Hz die Sinuskurve langsam nach rechts wandert. Untersuchen Sie auch die Auswirkung von Änderungen anderer Parameter.
"'," .,; "/10/06
-�- -�
"
..
:
- I�
...... .,
� ..
"""
,�
Bild 6.43 Skalierung der X-Achse im Signalverlaufs-Graphen mit 'Computerechtzeit'. Das ist die Zeit,
die zuletzt als Zeitstempelwert gewählt wurde. Die $inuskulVe bewegt sich nach dem Start langsam nach rechts
[jJ
Bild 6.44
Diagramm zu Bild 6.43
Erläuterungen •
•
•
Auf dem PaneJ links oben befindet sich ein so genannter Zeitstempel. Man findet ihn unter 'Elemente' - 'Modern' - 'Numerisch' in der ersten Zei l e rechts mit der Bezeichnung 'ZeitstempeJ-Eingabe'. Im Kontextmenü zum Zeitstempel 'Format und Genauigkeit' wählen und nach dem Muster von Bild 6.42 einstellen. Ferner die kleine Uhr rechts neben dem Zeitstempel Symbol anklicken und 'Aktuelle Zeit verwenden' wählen. Im Diagramm die Ausgabe der Sinus-Waveform-Funktion aufschlüsseln und mit geän dertem 'tO' wieder bündeln, nachdem diese Variable mit dem Zeitstempel verbunden wurde, siehe Bild 6.44.
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'
6.4
•
Express-VJs
137
Die aktuelle Zeit aufder X-Achse, die anfangs vor Programmstart eingestellt wurde, än dert sich später nicht mehr. Dies zu erreichen, soll dies dem Leser überlassen bleiben, siehe Aufgabe6.14.
IAufgabe 6.13
Versuchen Sie, soweit möglich, alle bisherigen Beispiele aus Abschnitt 6.3 durch die Ver wendung von Waveforms zu vereinfachen.
IAufgabe 6.14
Versuchen Sie das Programm in Bild 6.43 so abzuwandeln, dass die X-Achse aktuelle Zeitmarken aufweist. Im VI von Bild 6.43 war das nicht der Fall. Dort entsprachen die Marken der (aktuellen) Zeit, die der Anwender vor Programmstart eingegeben hatte. Tipp: Verwenden Sie statt des Zeitstempel-Bedienelements die Funktion 'Datum/Zeit in Sekunden ermitteln', die unter 'Funktionen' - 'Programmierung' - 'Timing' und dort in der zweiten Zei l e rechts zu finden ist.
Merke: Mit Signalverlaufs- oder Wavefonn-Funktionen kann man die Programmie rung vieler Vis stark vereinfachen.
Merke: Auch die Skalierun� der X-Achse als Zeitachse mit An�abe der (Computer-) Echtzeit ist hier in einfacher Weise möglich.
6.4
Express-Vls
6.4.1
Ein Express�VI zur Erzeugung von Kurven
I> '"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..
'"' ...."""' . '
r;..,.,,_ P
(" _""'1"""' ''''' '"''1 S9>oI ......kod"'"
(" ""''', stoo,_ und 2eot_' ""_'00
r. """""",", 1<", &>O"J'.T>O V""'"oOM _ _ -' ---
I�
Bild 6.45 Anzeige einer sich bewegenden Sinuskurve, die man erhält wenn man das Express-VI 'Signal simulieren' mit Doppelkliek öffnet
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'
138
6 Prozessvisualisierung
Der Begriff 'Express-VI' taucht erstmals mit der LabVIEW-Version 7.0 (auch 'LabVIEW 7 Express' genannt) unter dem Schlagwort 'Konfigurieren statt programmieren' auf. In gewis ser Weise kann man die Signalverlaufs-Kurven aus Abschnitt 6.3.4 als Vorläufer dieser Denkrichtung ansehen: Der Anwender soll ein Programm aus vorgefertigten VIs bi l den und dort nur noch einige Parameter den speziellen Wünschen entsprechend eintragen (konfigu rieren). Im Zusammenhang mit Waveforms findet man ein solches Express-VI unter 'Funk tionen' - 'Express' - 'Eingabe' -'Signal simulieren' n i der ersten Zeile rechts. Zieht man dieses Express-VI in ein Diagramm und öffnet es mit Doppelkliek, sieht man eine sich bewegende Sinuskurve ähnlich der in Bi l d 6.43. Sie ist in Bild 6.45 dargestellt. Dort kann man die Konfi guration vornehmen. Bild 6.46 und Bild 6.47 zeigen ein Beispiel, n i dem statt der Sinusfunk tion eine Sägezahnfunktion konfiguriert wurde. -
Bild 6.46 Sägezahnkurve. erzeugt mit dem Express-VI 'Signal simulieren'
Dl
Bild 6.47 Diagramm mit dem Express-VI 'Signal simulieren' nebst Anschlüssen. Es liefert das Panel in Bild 6.46
IAufgabQ 6.15 Versuchen Sie, soweit möglich, alle bisherigen Beispiele aus Abschnitt 6.3 mit Hilfe des Express-VIs 'Signal simulieren' zu vereinfachen.
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.4
Express-VJs
6.4.2
139
Express-VI zur Erstellung von Berichten
Häufig möchte man das Ergebnis einer Untersuchung in Porm eines Berichts ausdrucken oder als Web-Datei darstellen. Dazu kann man unter 'Punktionen' - 'Programmierung' die Unterpalette 'Erstellen von Reports' (rechts unten) nutzen. Die Handhabung der einzelnen Punktionen ist jedoch recht umständlich. Hier ist das Express-VI unter 'Punktionen' - 'Ex press' - 'Ausgabe' (oben rechts) - 'Report' (unten links) sehr hi l freich. Beim Absetzen dieser Punktion im Diagramm erscheint automatisch ein Konfigurationsfenster, in seiner Punktion vergleichbar mit dem in Bild 6.45, mit der man den Bericht nach eigenen Wünschen gestal ten kann. Ein einfaches Programm mit Express-Vls könnte so aussehen wie in Bild 6.48.
Bild 6.48
Programm zur Erstellung eines Berichts über eine DreieckskulVe
IAufgabe 6.16 Konfigurieren Sie die beiden Express-Vls in Bild 6.48 wie folgt: •
•
Rechteckkurve mit 5 Hz über I Sekunde, einer Amplitude von hältnis von 70 %;
1,3 und einem Tastver
geeignete überschriften festlegen, Zeit- und Datumsangabe, Kommentar einfügen und Ausgabe in HTM-Datei statt aufden Drucker veranlassen. Korrigieren Sie die Einstellungen so lange, bis Sie einen ansprechenden Bericht erhalten.
Merke: Mit Hilfe von Express-Vb kann man viele Probleme noch einfacher lösen, als das selbst mit Waveforms möglichwäre. Besonders bequem sind Express-Vb auch für die Erstellung von Berichten.
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'
7
Referenzen
Lemzlele 1. Referenzen aufBedien- und AnzeigeeJemente erzeugen können. 2. Referenzen an Unterprogramme übergeben können. 3. Vererbungsstruktur bei Eigenschaften und Methoden erklären können. 4. Geeignete VI-Server-Klasse aussuchen können.
7.1
Einführendes Beispiel
7.'.1
Vertauschung von zwei Variablenwerten
Wir versuchen, die Werte der beiden Variablen a und b n i einem Hauptprogramm mit Hilfe eines geeigneten Unterprogramms zu vertauschen. Bi l d 7.1 zeigt Diagramm und Panel des aufrufenden VIs, Bild 7.2 das Diagramm des SubVIs und Bild 7.3 dessen Panel. • � -5,00
•
� 13,00
� WOBHl
�
�
Bild 7.1 Diagramm (links) und Panel eines VI, bei dem die Werte von 'a' und 'b' zu tauschen sind
Bild 7.2 $ubVI, das vom Programm in Bild 7.1 aufgerufen wird. Es ver tauscht 'a' mit 'b'
�ltapOUl"" zwn Aulit.Mhln von a W1d b
�
•
-5,00
�
•
13,00
Das Pfc9'4IMl �, wem man os �ek 5tartet. f5� n i t h t . �.nml
Bild 7.3 Panel des $ubVls aus Bild 72
Wenn man das SubVI direkt aufruft, tauscht es die Werte von 'a' und 'b'. Obicherweise l ge schieht das, indem man eine Zwischenvariable einführt, z.B. 'c'. Erst speichert man 'a' nach 'c', dann 'b' nach 'a' und zuletzt 'c' nach 'b'. Davon ist hier nichts zu sehen. Die Zwischenvariable 'c' ist nicht nötig. Sie wird durch die Leitung ersetzt, die vom linken Block der Sequenzstruktur zum rechten Block führt. Auf diese Weise wird in Bild 7.3 die 13 mit
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'
7.1 EinfiihrendesBeispiei
141
der -5 vertauscht. Ruft man nun das SubVI vom Hauptprogramm auf, geschieht dort, also in Bild 7.1, nichts. Der Grund: Beim Aufruf eines SubVI werden die Daten kopiert. Das 'a' m i SubVI ist nur eine Kopie des 'a' im aufrufenden Programm, die auf einem anderen Speicher platz steht. Wir werden das Problem deshalb mit Hilfe von Referenzen lösen.
IAufgabe 7.1
überzeugen Sie sich davon, dass das 'a' im Hauptprogramm (Bild 7.1) und das 'a' im
SubVi (Bild 7.2) wirklich auf verschiedenen Speicherplätzen stehen. Lesen Sie dazu zu erst Abschnitt 7.1.2.
7.1.2
Referenzen auf Bedlen� und Anzeigeelemente
Referenzen haben wir bereits n i Abschnitt 5.3.2 beim dynamischen Aufruf von Unterpro grammen kennen gelernt. Doch sind sie nicht nur n i diesem Zusammenhang von Bedeu tung. Man kann mit Referenzen auch auf Bedien- oder Anzeigeelemente zugreifen. Solche
Referenzen werden per Kontextmenü durch Wahl von 'Erstellen' - 'Referenz' zugänglich, siehe Bild 7.4. Diese Operation kann sowohl auf dem Panel als auch im Diagramm ausge führt werden. Das Symbol für die Referenz erscheint aber nur m i Diagramm. Die Referenz hat stets denseJben Namen wie die Variable, auf die sie sich bezieht.
m ! trl ti I "'
AuS9 e ffiIl
Ein
be
t Oi ital
Aus
abe
t OI ltal
Bild 7.4 Bedien- und Anzeigeelement mit zugehörigen Referenzen.
Referenzen kann man nur lesen, aber nicht verändern (schreiben)
Eine Referenz auf eine Variable (Bedien- oder Anzeigeelement) ist eine Speicheradresse. Von dieser ausgehend findet das LabVIEW-System den Speicherplatz, wo die Variable selbst steht*). Man kann den Zahlenwert einer Referenz sichtbar machen, indem man ein kleines VI nach dem Muster von Bild 7.5 schreibt. Erstellt man nämlich per Kontextmenü ein An zeigeeJement zu einer Referenz, erhält man auf dem Panel ein RefNum-Symbol, aber keinen Zahlenwert. Man muss die Referenz also erst umwandeln. Dazu dient eine Punktion mit Röhren-Symbol, die man unter 'Punktionen' - 'Mathematik' - 'Numerisch' - 'Datenmani pulation' (vierte Zeile rechts) als 'Typenformung' oben links findet. Zu beachten ist ferner, dass die Anzeige, die als String erfolgt, im Kontextmenü des Strings auf 'Hex-Anzeige' gestellt werden muss. Im Gegensatz zu den Referenzen aufVIs bleiben deren Zahlenwerte jetzt konstant: Bei Än derung des Speicherinhalts ist es nicht nötig, den Speicherplatz selbst zu ändern. Beim mehr fachen Aufruf von SubVIs dagegen werden eventuell weitere Instanzen gebildet, z.B. dann, wenn das SubVi für 'ablaufinvariant' erklärt wurde. Siehe dazu Abschnitt 5.3.2.4.
erfolgt das indirekt Ober einen dritten Spcicherplatz. Deshalb Vorsidlt beim Vergleich von Referenzen in iI.lteren LabVIEW·Versionen! Erst ab LabVIEW 8.0 funktionieren die entsprechenden Vergleichs
') In LabVIEW operationen.
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'
7 Referenzen
142
1,
0
0
� RefEho8be
ID950 OCH7
� Re/' -'1SOabe 09600013
Bild 7.5 Diagramm und Panel zur Anzeige der Speicheradressen von Referenzen. Im Gegensatz zu
Referenzen aufVls bleiben die Zahlenwerte hier konstant
Lösung des Vertauschungsproblems
7.1.3
Wir machen nun einen zweiten Versuch, das Vertauschungsproblem zu lösen, und verwen den dazu Referenzen.
�� �,
Austausch
ital
•
� -5,00
,,.
Bild 7.6 Diagramm (links)
b
; 13,00
Das Prc:qatnm fuÜblieot rr« Refer�
und Panel eines VI, bei dem die Werte von 'a' und 'b' zu tauschen sind. Dieses Programm arbeitet korrekt Bild 7,7 SubVl,dasvom
w.,
w.,
w.,
Programm in Bild 7.6 auf gerufen wird und 'a' mit 'b' vertauscht. Es gibt einfadlere Lösungen.
siehe Abschnitt 9.1.21
lH:erprogranm a.n Aultaachen von e I.ftd b m � Pro9"anm 0I 1WfUI .
OI lWtUI b
Bild 7.8 Panel des $ubVI aus Bild 7.7. Es zeigt im Gegen
satz zum ursprOnglichen SubVl aus Bild 7.3 keine Zahlen, sondern nur CtHControl-JSyrnbole
Schritte zur Entwicklung des SubVI aus Bild 7.7 I. 'Elemente' - 'Modern' - 'RefNum' (vierte Zeile inks) l - 'BedieneJement (RefNum)' (in der ersten Zeile) aufs Panel ziehen. Das Symbol ist in Bi l d 7.8 zu sehen. Es hat den voreinge stellten Namen 'Cd RefNum'. Mit A-Werkzeug umbenennen in 'Cd RefNum a'. 2. Den Vorgang wiederholen und 'Cd RefNum b' platzieren (siehe Bild 7.8). 3. Beide Symbole auf dem Panel in Bild 7.8 mit dem Anschlussfeld des SubVI in der Ecke rechts oben verbinden. Dabei sind links zwei Eingänge vorzusehen. Das Ausgangsfeld rechts bleibt unverbunden, denn das SubVI hat keine Ausgangsvariablen. Es arbeitet unmittelbar mit den Variablen des aufrufenden Programms.
4. Im Diagramm eine flache Sequenzstruktur ablegen und 2 x 'Rahmen danach einfügen'. Man hat jetzt eine Dreiteilung wie in Bild 7.7. 5. 'Cd RefNum a' in den linken Rahmen der Sequenzstruktur ziehen. Im Kontextmenü 'Erstellen' - 'Eigenschaft für Bedienelement-Klasse' - 'Wert' (in Version 8.0: 'Erstellen' -
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'
7.2
Vererbung
143
'Eigenschaft' - 'Wert'; nicht 'Eigenschaftsknoten'!) wählen, das nun erscheinende Sym bol ebenfalls n i den inken l Rahmen ziehen und mit 'Cd RefNum a' verbinden. 6. Entsprechend mit 'Ctl RefNum b' verfahren, das in den mittleren Rahmen m i Diagramm
gehört. 7. Die restlichen Operationen im Diagramm sind Bild 7.7 zu entnehmen. Dies ist der erste große Vorteil des Arbeitens mit Referenzen: Die Variablen werden nicht zwischen Hauptprogramm und Unterprogramm durch Kopieren hin- und hergeschoben. Das Unterprogramm arbeitet direkt mit den Variablen des aufrufenden Programms. Ein zweiter Vorteil ist die Universalität. Das Tausch-SubVI nach Bild 7.7 kann nicht nur numerische DBL-Typen tauschen, sondern auch beliebige andere Typen. Dazu gehören boolesche Typen, Stringtypen und auch zusammengesetzte Typen wie Arrays oder Cluster. Im Cluster wiederum kann man bunt gemischt nahezu beliebige Datentypen zusammen fassen. Doch müssen die Cluster in ihrer Struktur identisch sein. Das Gleiche gilt für Arrays.
IAufgabe 7.2 Schreiben Sie ein VI, in dem Sie zwei Cluster gleicher Struktur anlegen. Erzeugen Sie Re ferenzen auf die auster und führen Sie diese dem Vertauschungsprogramm nach Bild 7.7 zu. überzeugen Sie sich, dass die Werte in den Clustern richtig getauscht werden. Merk.: Mit Referenzen in einem SubVI kann man direkt aufdie Daten des aufrufen den Programms zugreifen. Merk.:
7.2
Mit Referenzen gewinnt man große Flexibilität in Bezug aufdie Behandlung verschiedener Datentypen.
Vererbung
In Abschnitt 6.1 hatten wir bereits die Konzepte der objektorientierten Programmierung (OOP) angesprochen und in den nachfolgenden Abschnitten ausgiebig Eigenschaften und Methoden auf grafische Ausgabeelemente angewandt. Das Prinzip der Vererbung dagegen hatten wir zurückgestellt. Damit wollen wir uns m i Folgenden befassen. In der OOP ordnet man Objekte wie Daten und Programme hierarchisch an. Das geschieht in der Weise, dass Objekte, die in der Hierarchie tiefer stehen, Eigenschaften und Methoden von den höher stehenden erben. Man kann sich das genauso vorstellen wie bei Lebewesen, bei denen die Kinder stets einen Teil ihrer Eigenschaften von den Eltern erben, aber m i mer auch neue Eigenschaften aufweisen, die nicht auf die Vererbung zurückgeführt werden kön nen. So verhält es sich auch bei Objekten von LabVIEW. Wir machen uns das an der in Bild 7.9 dargestellten Baumstruktur klar. Man erhält diese wie folgt: 1. In 'Funktionen' - 'Programmierung' - 'Anwendungssteuerung' (vierte Zeile rechts) die 'Klassenbezeichner-Konstante' ins Diagramm ziehen (vierte Zeile Mitte). Dort erhält ihr Symbol die Bezeichnung 'Allgemein'. 2. Im Kontextmenü der 'Kiassenbezeichner·Konstante' zum Eintrag 'VJ·Server·Klasse auswählen' gehen, dort von 'Allgemein' zu 'GObjekt', von dort zu 'Element' usw., wie das Bild 7,9 zeigt.
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'
7 Referenzen
144
�s_",,,,, ,",, .-ln�_�
••
'"."on
� '"�
-."...,..l"_
� •
M§!!.
....,..a-T." ..
''''"'-
...... ,-,,-� .
,.,.,�,�
,..t_....... . ......,....... �.�
,,,,,,.,., ,. ,, ,.,. ,, ,",,,
,_..-... �
Bild 7.9 Kontextmenü 'VI-Server-Klasse auswählen' und weitere Untermenüs (LabVIEW 8.2, in anderen Versionen sinngemäß)
Klickt man schließlich innerhalb dieses Baumes auf eines der Elemente, von denen keine weiteren Verzweigungen ausgehen, z.B. auf 'Digital', verwandelt sich die 'Klassenbezeichner Konstante' in ein ähnliches Symbol, jetzt allerdings mit der Inschrift 'Digital' an Stelle von 'Allgemein'. Man ist in der Hierarchie von der Klasse mit den allgemeinen Eigenschaften und Methoden zur Klasse mit den speziellen Eigenschaften und Methoden für digitale Elemente herabgestiegen. Diese Klasse hat alle Eigenschaften der übergeordneten Klassen wie GObjekt geerbt, hat aber zusätzliche Eigenschaften, die man dort nicht findet. VI-Server ist übrigens ein Tei l des LabVIEW-Systems, den man als dienenden Bestandteil (serve) für die Programmierung von Vls betrachten kann. Er macht die Hierarchie deutlich. Wie Bild 7.9 zeigt, kann man neben 'Plot', 'Cursor' und 'Seite' auch 'GObjekt' wählen. Man hat schon früh zu Beginn der LabVIEW-Entwickiung die zu Grunde liegende Programmier sprache 'G' (Abkürzung für Grafik) genannt. Die Bedienelemente (nebst Anzeigeelementen) sind Teile oder Objekte von 'G'. Unter 'Elemente' faUen, wie wir n i Kapitel 4 gesehen haben, neben Strings, booleschen Elementen usw. auch numerische Elemente. Die wiederum kann man unterteilen in digitale Elemente und solche, die zusammengesetzt sind aus numeri schem Zahlenwert und zugehörigem Text ('NumerischMitText') wie 'Enum' oder 'Ring'. Weiter gibt es noch 'Farbrampe' und 'NumerischesElementMitSkala'. Wir wollen nun zwei BeispieJe für die Nutzung der hierarchisch geordneten Eigenschaften bei der Programmierung geben. Das erste nutzt sehr allgemeine Eigenschaften, die alle E1emente haben. Das zweite verwendet speziellere Eigenschaften, die man nur bei den
Ausleihe: 31_07_2009 00:00:00 - OS_08_2009 00:00:00, ID:7ac0427d5929S1cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
7.2
Vererbung
145
numerischen Elementen findet. Da wir uns in beiden Fällen nicht auf ein einziges Element beschränken wollen, entwickeln wir vorbereitend ein SubVI, das die Referenzen aller Front paneJ-Elemente in einer Liste sammelt. Das entsprechende Diagramm ist in Bild 7.10 darge stellt. Die Entwicklungsschritte sind folgende: •
•
'VI (RefNurn)' aus 'EJemente' - 'Modern' - 'RefNum' m i Panel platzieren. Im Diagramm per Kontextmenü 'Erstellen' - 'Eigenschaft für VI-Klasse' - 'Frontpanel' einen Eigenschaftsknoten mit dem Symbol 'Panel' erzeugen und mit 'VI RefNum' ver binden.
•
Entsprechend vom Knoten 'Panel' ausgehend, den Eigenschaftsknoten 'ErsteJlen' 'Eigenschaft für Panel-Klasse' - 'Bedienelemente[]' erzeugen und gemäß Bild 7.10 ver binden.
•
Per Kontextmenü zu 'Bedienelemente[]' Anzeigeelement aufdem Panel erzeugen.
•
Ein SubVI herstellen durch Verbinden der Panel-Elemente mit dem VI-Anschlussfeld. VI Refnum
!. < 'III !.
Panel
7.2.1
,,<
PnI
Bedienelemente
!'
].
Bedienelemerte
0)
Bild 7.10 Auslesen der Referenzen aller Bedien elemente eines Frontpanels
Eigenschaften der Basisklasse
Mit Hi l fe des SubVIs in Bild 7.10, dessen Symbol in 'Cd[]' umgeschrieben wurde (wegen Controls; Cd), kann man ein Programm entwickeln, das nach dem Start alle Frontpanel Elemente 'tanzen' lässt. Genauer gesagt: Sie bewegen sich auf Kreisen, deren Radien nach dem Programmstart zufällig gewählt werden. Bild 7.11 zeigt das Diagramm. Das Frontpanel enthält unterschiedliche Elemente, deren Typen m i Diagramm links unten zu sehen sind. Trotzdem liefert das SubVI 'Cd[]' eine Liste von Referenzen auf Bedienelemente, wie man am K1assenbezeichner 'Cd' des Eigenschaftsknotens n i der inken l FüR-Schleife erkennt. Da ein Array ausschließlich Elemente vom selben Typ enthalten kann, wurden alle verschiede nen Referenzen der Frontpanel-Elemente in Referenzen auf Bedienelemente (allgemeinere Klasse!) umgewandelt. Das ist möglich, weil alle Bedien- und Anzeigeelemente die gemein same Basisklasse 'Element' (frühere Bezeichnung 'Bedienelement') besitzen. Man sagt, dass eine beliebige Referenz hier nach einer allgemeineren Klasse gewandelt wurde. AJs Eingang benötigt 'Cd[]' die Referenz des aufrufenden VI. Dazu unter 'Programmierung' - 'Anwen dungssteuerung' einen Eigenschaftsknoten aus der zweiten Zeile holen. Er zeigt anfangs m i oberen Kästchen einen Schraubenschlüssel und die Bezeichnung 'App', im unteren 'Eigen schaft'. Man wandelt 'App' per Kontextmenü über 'Klasse auswählen' - 'VI-Server' - 'VI' zu 'VI' und 'Eigenschaft' über 'Eigenschaften' - 'VI-Name' zu 'Name'.
Nachdem dann n i der FüR-Schleife mit Hilfe der Referenzen die Positionen aller Elemente eingesammelt wurden, werden sie an die While-Schleife übergeben, welche die Berechnung der Kreisbahn übernimmt, indem sie Schritt für Schritt die Positionen der Bedienelemente verändert. Die Eigenschaft 'Position' ist in der Klasse 'Gübjekt' definiert und wird an alle Frontpanel-Elemente vererbt. Wenn es Ihnen geJingt, nach dem Start die Stopp-Taste zu
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'
7 Referenzen
146
treffen, können Sie das Programm auch beenden. Die oben am Beispiel gezeigte Vorgehens weise gilt nicht nur für Eigenschaften, sondern sinngemäß auch für Methoden.
�Nl .
,�
'"
.
,
<0
,
Postbn
•
ce,
;�
�
3() OO'�
[j]
� � 19 ���
Ii\-
.
I�
•
[j]
1-fuftT'n �li--0 c� I
-'�
,
Positoo
I1llIl II!
Bild 7.11 Manipulation der Position von Bedien- und Anzeigeelementen eines Frontpanels
7.2.2
Eigenschaften von abgeleiteten Klassen
Mit dem 'Ctll]'-SubVI können wir auf Eigenschaften von FrontpaneJ-Elementen zugreifen, die in der Klasse 'Element' definiert sind. Auf Eigenschaften von Klassen, die in der Ver erbungshierarchie weiter unten stehen, können wir noch nicht zugreifen. Dazu müssen wir erst die Referenzen vom SubVI 'Ct1[]' der Reihe nach n i Referenzen auf eine spezifischere Klasse umwandeln. Eine geeignete Funktion hierfür ist unter 'Anwendungssteuerung' 'Nach spezifischerer Klasse' zu finden. Sie wird in Bi l d 7.12 n i der Case-Struktur der FOR Schleife verwendet, um eine Referenz auf ein Bedienelement in eine Referenz der Klasse 'Digital' umzuwandeln.
Bild 7.12 Format und Genauigkeit für alle numerischen Elemente eines Frontpanels anpassen
Bei diesem Beispiel geht es darum, die ZahlendarsteIlung der Zahlengröße anzupassen. Hat eine Zahl zu viele Stellen, passt sie nicht mehr in ein Anzeigeelement fester Breite, Man kann dann aber z.B. die Zahl 700 000 000 in der so genannten SI-Darstellung kürzer als 700 M (Mega) schreiben. Das Beispielprogramm soll diesen Vorgang automatisieren. Zahlen bis 10 000 passen in das vorgesehene Anzeigeelement. Zahlen mit mehr Ziffern sollen in SI-Notation dargestellt werden. Da unser Frontpanel nicht nur numerische Elemente (Typ 'Digital') enthält, muss sichergestellt werden, dass allein Elemente vom Typ 'Digital' bearbei-
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'
7.2
Vererbung
147
tet werden. Wir nutzen dazu die Eigenschaft 'KlassenName' der Klasse 'Allgemein' als Selek tor. Beim Typ 'Digital' wird der in Bild 7.12 sichtbare Teil der Case-Struktur ausgeführt, sonst der Standard-Rahmen, der leer ist. Nach der Umwandlung haben wir Zugriff auf Eigenschaften der Klasse 'Digital', wie z.B. 'Pormat&Genauigkeit'. Bevor der Zahlenwert aber verglichen werden kann, muss das als Variant-Wert ausgegebene Ergebnis erst noch in eine DBL-Zahl gewandelt werden. Ist der Wert größer oder gleich 10000, wird der obere, ansons ten der untere Clusterwert in die Eigenschaft 'Pormat&Genauigkeit' geschrieben. Die Kom mentare im Diagramm erklären den Rest. Bemerkung: Ab Version 8.0 kann der Eigenschaftsknoten 'Name' in Bild 7.12 links oben durch 'VI-Server-Referenz' aus 'Punktionen' - 'Programmierung' -'Anwendungssteuerung' ersetzt werden. Bis dahin war ein unmittelbarer Bezug eines VI aufsich selbst nicht möglich.
IAufgabe 7.3
Bauen Sie selbst die VIs aus Bild 7.11 und Bild 7.12 auf und studieren Sie deren Eigen schaften.
Merk.:
Die Anwendung des Kontextmenüs auf die 'Klassenbezeichner-Konstante' und die Festlegung von 'VI-$erver-Klasse auswählen' verschafft einen Überblick über die K1assenhierarchie von LabVIEW.
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'
8
Datentransfer von und zur Festplatte
Lernzl.1e 1. Strings in Textdateien auf der Festplatte speichern und diese lesen können. Sinngemäß das Gleiche mit Vektoren und Matrizen. 2. Mit dem Datentyp 'Pfad' arbeiten können. 3. Die wichtigsten Pfadkonstanten kennen. 4. Problem bezüglich des Dateipfads beim Erstellen einer EXE-Datei kennen und geeignete Methoden zur Lösung dieses Problems anwenden.
8.1
Dateifunktionen
8.1.1
Allgemeines zur Speicherung von Dateien
Alle Datensätze, die auf einer Festplatte gespeichert sind, werden mit dem Zeichen EOF gleich 'End of File' abgeschlossen. Das ist ein vom Rechnersystem abhängiges Zeichen, das normalerweise durch eine negative Zahl, häufig -I, dargesteUt wird. Man bekommt es als Anwender nicht zu Gesicht. Das EOP-Zeichen dient einer Lesefunktion, die einen vollstän digen Datensatz lesen soll, ohne dessen Umfang zu kennen. Es ist ein Hinweis, dass nun das Lesen abzuschießen l ist. Beispiel: Bilden die drei Buchstaben A, B, C, einen vollständigen Datensatz, so werden sie auf der Festplatte als A, B, C, <EOF> gespeichert. Ein weiteres Steuerzeichen ist EOl gleich 'End of Line'. Es wird bei der Eingabe von Daten über die Tastatur erzeugt, sobald man die Return-Taste betätigt. Die Eingabe von A, S, C,
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.1 Dateifunktionen
149
Die Dateifunktionen von LabVIEW wandeln normalerweise das systemabhängige EOL Zeichen in das LabVlEW-EOL 'OA' um, es sei denn, der Programmierer setzt im Kontext menü der Dateifunktion einen Haken vor 'EOL konvertieren'. Auf einem PC, der unter Windows XP läuft, erhält man dann im obigen Beispiel die Hex-Anzeige 41 4243 0DOA444546 Das EOL besteht hier also aus zwei Zeichen, die noch aus der Zeit stammen, als man mechanische Fernschreiber benutzte. Sie haben folgende Bedeutung: OD gleich 'Wagenrüc.k lauf und OA gleich 'Zeilenvorschub'. Das Programm EOL_EOF_Test.vi erläutert das. Auch hat der Anwender hier die Möglich keit, eine Datei sowohl vom Anfang her zu lesen als auch vom Ende her. Dabei kann er ver schiedene Offsets nutzen. Das Panel ist in Bi l d 8.1 dargesteUt.
",--
-IF68 ;F21r:w576171 2ü69 717-1 :l'OA
, '''' ncN:'-.(Mt>:)
-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<
--
Bild 8A Untermenü 'Datei-I/O', das sich in der LabVlEW-Version 8.2 öffnet, wenn man unter 'Funktionen' -'Programmierung' auf das Diskettensymbol in der Mitte der zweiten Zeile klickt. In anderen LabVIEW-Versionen ist das ähnlich.
. --
1l:;i rn �
_ ." "�
,
._�
--
", , , "
�od"""'"
EJ
�
,
,...
,,,,, ,
�
""'�".,." -""",�
I'B t!l , I§
.-
-
I'B l'lI �
, W"""," " " ,
-
"""' ..�'" "....""." =
''''''''''
"'
@
�-
=
",,., ... �.
�
......._'"
Bild 8.5 Unter-Unterpalette fürfortgeschrittene Dateifunktionen
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.1 Dateifunktionen
151
Klickt man n i der Unterpalette nach Bild 8.4 ganz unten rechts auf das Hammer-' Schrauben-Schlüssel-Symbol, also auf 'Dateifunktionen (Fortgeschritten)', erhält man eine weitere Unterpalette, die nach Aufziehen in die Breite eine Gestalt nach Bild 8.5 annimmt.
8.1.3
Einführendes Beispiel
Am einfachsten wird die Programmierung von Dateioperationen, wenn man in die dritte Zei l e des Untennenüs in Bild 8.4 geht und mit den Funktionen 'ln Textdatei schreiben' und 'Aus Textdatei lesen' arbeitet. Ein kleines Beispiel soll das eräutern: l Der Anwender will einen
String in ein Eingabefenster schreiben, der anschließend auf der Festplatte n i einer Datei mit der Erweiterung 'txt' gespeichert werden soll. Nach der Betätigung eines speziellen Knopfes soll dieser Text auf der Festplatte wiedergefunden, n i den Hauptspeicher gebracht und im Ausgabefenster angezeigt werden. Das VI in Bild 8.6 und Bild 8.7 leistet dies.
,
Bild 8.6 Panel eines VI zum Schreiben auf die und Lesen von der Festplatte (Version 8.2; Versi on 8.0 sinngemäß)
Bild 8.7 Diagramm zu Bild 8.6. Das Polling in der While-Schleife ist ungeschickt auch kann man die Sequenz-Struktur vermeiden, siehe Bild 8.8
Erläuterungen •
Beim Schreiben in eine Datei oder beim Lesen aus h i r muss üblicherweise die Datei zuerst geöffnet und später wieder geschlossen werden. Solche Funktionen gibt es auch unter LabVIEW, Z.D. unter Datei-l/O n i Bild 8.4 n i der zweiten Zeile inks l für das Öffnen und
daneben für das Schließen. Beim Aufruf von 'ln Textdatei schreiben' oder 'Aus Textdatei
lesen' benötigt man sie jedoch nicht, sofern man die Programme mit einer Pfadeingabe aufruft. Dann erfolgt das Öffnen und Schließen automatisch. •
Die Funktion 'ln Textdatei schreiben' benötigt entweder den Pfad der Datei, n i die man Zeichen schreiben möchte, oder eine Referenznummer. Will man mit dem Pfad arbeiten, braucht man ein Bedienelement für die Pfadeingabe, in Bild 8.6 ganz oben mit der Be
zeichnung 'Datei'. Man findet dieses Element unter 'Elemente' - 'Modern' - 'String &
Pfad', dort in der zweiten Zeile. Einen Pfadnamen kann man entweder Zeichen für Zei chen eintippen oder über das Suchsymbol rechts am Eingabefenster auswählen.
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 Datentransfer von und zur Festplatte
152
•
Der gewählte Dateipfad wird in Bild 8.7 gleichzeitig in den Sequenzrahmen ganz rechts geführt. Dort steht er der Funktion 'Aus Textdatei lesen' zur Verfügung. Folglich wird aus der gleichen Datei gelesen, in die vorher geschrieben wurde.
•
Im mittleren Sequenzrahmen befindet sich eine While-Schleife, die erst verlassen wird, wenn der Anwender den Knopf'Start Datei lesen' auf dem Panel gedrückt hat.
•
Funktionen zum Setzen des Lesezeigers bzw. des Schreibzeigers beim Schreiben auf die Festplatte werden hier nicht benötigt. Benutzt man eine Pfadeingabe, wird von Anfang an geschrieben und gelesen, und zwar alle Zeichen, die unter dem Eingabe-String stehen.
Das Diagramm in Bild 8.7 kann vereinfacht werden, wenn man sich erinnert, dass LabVIEW eine datenflussorientierte Programmiersprache ist. Darauf wurde bereits in Abschnitt 7.1.3, Bi l d 7,7, hingewiesen. Bild 8.8 zeigt die verbesserte Version. Der Datenfluss wird hier sowohl durch die Pfad-Leitung als auch durch die Fehlerleitung gesteuert. Das heißt, erst wenn beide Leitungen Daten enthalten, kommt die While-Schleife zum Zuge.
Bild 8.8 Verbesserte Version von 'DateiBeispiel-82.vi' aus Bild 8.7: Die Sequenz fehlt und die While-Schleife hat eine Wartezeit. Das Panel hat eine Fehleranzeige
IAufgabe 8.2
Testen Sie das oben beschriebene Programm auf Ihrem Rechner. Sie müssen natürlich
die Eintragungen m i Bedienelement für die Pfadeingabe entsprechend Ihrer Dateistruk tur modifizieren.
8.1.4
Modifiziertes Beispiel
Das Programm 'DateiBeispiel-82.vi' in Abschnitt 8.1.3 hat den Nachteil, dass die Pfadangabe schon vor dem Start bekannt sein muss. Will sich der Anwender erst während der Laufzeit entscheiden, muss er den Programmaufbau ändern, z.B. so wie in Bild 8.9 dargestellt. Bild 8.9 Programm 'DateiBeispieIOhnepfad.vi', erfragt die pfadangabe erst zur Laufzeit. Die links geöffnete Referenz sollte des ordentli chen Programmierstils halber rechts geschlossen werden
Dieses VI benötigt kein Bedienelement zur Pfadeingabe. Nach dem Start fragt links die Funktion 'In Textdatei schreiben', der nunmehr die Pfadeingabe über das Terminal fehlt, n i einem Fenster entsprechend Bild 8.10 nach dem Pfad der zu öffnenden Datei. In unserem Beispiel könnte man nach dem Programmstart dort etwa 'Datei.txt' wählen und mit 'OK' bestätigen. Trägt man keinen Pfad ein, erhält man eine Fehlermeldung. Die Funktion 'In Textdatei schreiben' liefert allerdings als Ausgabe keine Pfadangabe, son dern eine Referenznummer. Würde man diese unmittelbar an die Funktion 'Aus Textdatei lesen' im rechten Teil der Sequenz weiterreichen, wäre das fehlerhaft: Die Lesefunktion über nimmt nämlich bei Referenzeingabe als Lesezeiger die Stellung des Schreibzeigers von der
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'
8.1 Dateifunktionen
153
Schreibfunktion. Die aber steht nach Abschluss des Schreibens auf 'end'. Die Lesefunktion kann daher keine Zeichen mehr lesen. Damit bleibt der Ausgabe-String leer! Man muss des halb die Referenz in einen Pfad verwandeln, z.B. mit der Punktion 'Refnum nach Pfad' unter 'Punktionen' - 'Programmierung' - 'Datei-1/0' - 'Dateifunktionen (Fortgeschritten)'.
08Ct3-Dot�.,; 080S-Dot�TextDoteMtW�-7D.'; 080S-Dote6eispieNeoeTextDoteMtW�-8:J.,; 0803-Dote6eispieNeoeTextDoteOhneWi>fr>.XlQ-70.,; 0803-Dot�TextDoteOhneWi>fr>.XlQ.'; 00lO-Beispef.leoeTextd.ol:�-IO.,; 0011-Beispef.leoeTextD"eiOhn<Wi>f"""Ve
,,"1"-Dot�TexlDoteOhneW",ro.x-qfriDn>l..-te-70.,; 0016-M-otri,50:"-"e>«>-70.�
0018_Akt""-''''....I. .•x.
30018-Aktcoolef'"od\II.n
0018-Aktcdef"'od\II.,; 0021-M-otri,50:"-"e�)E-70.,;
0022-M-otri'50:"-"e�ef'lext�-70.�
11IIII
Bild8_10 Auswahl einer Datei, in die geschrieben werden soll
8.1.5
Beispiel: Anlegen einer Protokolldatei
Die Programme aus Bild 8.8 und Bild 8.9 überschreiben bei mehrfacher Anwendung die gewählte Datei: Der alte Inhalt geht verloren. Nun ist aber häufig die Protokollierung von Statusinformationen in einer Textdatei wünschenswert. Eine Lösung dieser Aufgabe ist n i Bi l d 8.11 und Bild 8.12 dargestellt. I> D.t",B",...eIProtokoM�2 v, Frontpanel
Bild 8.11 Frontpanel eines VI, das eine Protokolldatei
-
erzeugt. bei der die ver schiedenen Einträge jeweils an das Dateiende ange hängt werden
, '
Bi l d 8.12 zeigt das Diagramm für Version 8.2 (Version 8.0 nahezu identisch). Die flache Sequenz enthält links zusätzlich die Punktionen 'Öffnen/Erstellen/Ersetzen einer Datei' aus . . .'Datei-I/O' (zweiten Zeile) und aus den fortgeschrittenen Dateifunktionen 'Dateiposition festlegen', deren Eingang auf'end', 'current' oder 'start' gestellt werden kann. Die Einstellung 'start' verursacht überschreiben der Datei, die Einstellung 'end' dagegen Anhängen neuer Daten an das Dateiende. In der zweiten Zeile findet man auch die Funktion 'Datei schließen'. Man könnte auf sie in diesem Pali verzichten, weil bei Programmende die Referenznummer Refnum automatisch gelöscht wird. Doch sollte
man
konsequenterweise alle Dateien, die
man explizit öffnet, auch expiz l it schließen.
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 Dattntransfer von und zur Festplatte
154
Bild 8.12 Diagramm zu 'DateiBeispieIProtokoll-82.vi' aus Bild 8.1 1
8.1.6
O berschreiben ohne Warnung
Das Programm 'DateiBeispieIOhnePfad-82.vi' aus Bi l d 8.9 fragt, nachdem der Anwendet eine Datei gewählt hat, ob er diese wirklich überschreiben will (ist die Datei nicht im Ordner aufgeführt, d.h., gibt der Benutzer den Namen einer nicht existierenden Datei ein, entfällt diese Nachfrage; die Datei wird dann neu angelegt). Diese ständige Nachfrage, ob man die bestehende Datei ersetzen möchte, ist als Schutz gegen versehentliches überschreiben einer falschen Datei nützlich. Sie erfordert aber den manuellen Eingriff des Anwenders. Ein gut getestetes Programm sollte dagegen automatisch und ohne Eingriff des Benutzers ablaufen. Zur Lösung dieses Problems muss man fortgeschrittenere Dateifunktionen nutzen. Eine Lösung deutete bereits 'DateiBeispieIProtokoll-82.vi' in Bild 8.12 an. Man muss hier nur die Eingabe für die Funktion 'Dateiposition festlegen' von 'end' auf 'start' umstellen. Allerdings ist es notwendig, dass die gewählte Datei bereits existiert. Ist das nicht der Fall, erhält man eine Fehlermeldung. Mit einer kleinen Modifikation entsprechend Bild 8.13 kann man diese Fehlermeldung unterdrücken. Man braucht dazu die Funktion 'ÖffnenJErstellen/Ersetzen einer Datei' aus . . .'Datei-I/O' n i der zweiten Zei l e. Dort wählt man statt der Voreinstellung Operation = 0 Ö ( ffnen) und Zugriff = 0 (Lesen/Schreiben) links im Diagramm als Eingang Zugriff = 3 ('open or create', d.h. 'Öffnen oder Erstellen'). Zu beachten ist: Schreibt man n i eine be stehende Datei weniger Zeichen, als sie bereits enthält, so werden nur die ersten Zeichen überschrieben. Der Rest bleibt erhalten!
Bild 8.13 Schreiben in eine existierende oder noch zu erstellende Datei ohne Warnhinweis. Lesen ihres Inhalts
IAufgabe 8.3 Finden Sie die n i Bild 8.13 verwendeten Dateifunktionen und informieren Sie sich per Kontexthilfe über ihre Parameter. Untersuchen Sie mit einem Editor wie z.B. Notepad den Inhalt der Datei, n i weJche das LabVIEW-VI geschrieben hat.
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.2 Pfade 8.2
155
Pfade
Im Beispiel aus Bild 8.6 musste man den kompletten Pfadnamen der Textdatei eingeben. Das ist mühseig l und fehleranfällig. Es gibt daher n i LabVIEW eine Reihe von Möglic.hkeiten, diese Aufgabe zu vereinfachen.
8.2.1
pfadkonstanten
In 'Punktionen' - 'Programmierung' - 'Datei-l/O' findet man in der vorletzten Zeile die 'Dateikonstanten'. Sie sind n i Bild 8.14 zu sehen.
... Pr oar ormjef !LJ(l L D"eH!O L DoteiDnstontffi
f'fdcnstonte
l_« f'fod (... Ke;n f'fod (Ko...
Kffie Rofrun... "".- f'f,...
YI·__
stond.ordv«z .. T...--ilfe, Y... stond.ord·Dot...
Bild 8.14 Dateikonstanten unter 'Funktionen' - 'Programmie rung' - 'Datei-l/O'
Eine einfac.he Methode, die Pfadangabe zu verkürzen, besteht n i der Verwendung der Pfad konstanten 'Aktueller Pfad des Vls' in der Mitte der zweiten Zeile. Bild 8.15 zeigt einen ersten Versuch, mit diesem EJement zu arbeiten.
Bild 8.15 Ungeeigneter Versuch, die pfadangabe zu vereinfachen: Das VI löscht sich selbst! Doch ist das eine sehr schlechte Variante: Erstens überschreibt sich das VI selbst mit den eingegebenen Stringdaten, weil die links genutzte pfadkonstante direkt auf das VI zeigt, in dem sie steht. Zweitens hat der Anwender keine Möglichkeit mehr, einen eigenen Dateina men zu wählen. Eine verbesserte, häufig genutzte Variante zeigt das Diagramm in Bild 8.16.
Bild 8.16 Lösung mit Hilfe der Funktionen 'pfad zerlegen' und 'pfad erstellen'
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'
156
r·'-�
8 Dattntransfer von und zur Festplatte
l d 8.17 zu sehen. Das Panel dazu ist in Bi ... _
,i
Bild 8.17 Panel des VI in
Bild 8.16
Erläuterungen •
•
•
Die links in Bild 8.16 neu verwendeten Funktionen 'Pfad zerlegen' und 'Pfad erstellen' findet man unter 'Punktionen' - 'Programmierung' - 'Datei-I/O'. Die Funktion 'Pfad zerlegen' erhält als Eingabe den Pfad des aktuellen VIs. Sie streift stets das letzte Element ab, hier den Namen des VIs, n i dem sie steht. AJs Ausgabe liefert sie den Rest, d.h. den Pfad auf das Verzeichnis, in dem sich das VI befindet. Die Funktion 'Pfad erstellen' hat zwei Eingänge. Sie verknüpft die Pfadangabe des oberen Eingangs mit einer relativen Pfadangabe am unteren Eingang oder (einfacher) mit einem String, der den Namen der gewünschten Datei enthält. In unserem Beispiel ist das der Name 'Datei.txt', der auf dem Pane1 in Bild 8.17 eingestellt ist. AJs Ausgang erhält man den zusammengesetzten Pfad. Das ist in unserem Beispie1 der vollständige Pfad, der zu 'Datei.txt' führt.
Der Vorteil dieser Methode besteht vor allem darin, dass ein VI gemäß Bild 8.16 auf jedem Rechner äuft, l ohne dass man als Anwender erst die spezielle Umgebung durch Modifikation des Pfadnamens aufdem Pane1 wie in Bi l d 8.6 berücksichtigen muss. 8.2.2
pfadkonstante 'Standardverzeichnis'
Sobald LabVIEW aufeinem PC installiert ist, speichert es seine eigenen VIs in verschiedenen Standardverzeichnissen. Eines dieser Verzeichnisse ist auch für den Anwender zugänglich, falls er Administratorrechte hat. Man findet es unter 'Werkzeuge' - 'Optionen', wenn man dort 'Pfade' - 'Standardverzeichnis"" wählt, siehe Bild 8.18. Man liest ab, dass in diesem Fall 'C:\Programme\National Instruments\LabVIEW 8.0' das Standardverzeichnis ist. Auf dieses Verzeichnis kann man sich mit der pfadkonstanten 'Standardverzeichnis' (in der linken unteren Ecke der Pfadkonstanten, Symbol mit kleinem Haus) beziehen. Man hätte im Programm von Bild 8.16 diese Konstante an Ste1le von 'Aktueller Pfad des VIs' verwenden und so die Funktion 'Pfad zerlegen' einsparen können. 'Datei.txt' wäre dann als 'C:\Programme\National Instruments\LabVIEW 8.0\Datei.txt' ge speichert worden. Bild 8.19 zeigt das Diagramm dieses VI. Das Panel bleibt unverändert gegenüber Bi l d 8.17. Zu beachten ist, dass die Funktion 'Pfad zerlegen' hier nicht benötigt wird! Der Nachteil dieser Methode besteht darin, dass Installationen von LabVIEW auf verschie denen Rechnern zu verschiedenen Standardpfaden führen können. Außerdem wird ein selbst erstelltes Programm dann innerhalb des LabVIEW-Systems gespeichert. Das ist häufig nicht erwünscht. Deshalb ist die Speicherung in ' . . .\National Instruments\' auch nur erlaubt, wenn der Anwender Administratorrechte hat. Anderenfalls kommt eine Fehlenneldung.
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'
8.2 Pfade
157
I> Opt,on�n
"�
!lockdlqorrm
Iiusrd�lXlQ
trJo7ier(lf �Vilf_
\"l·5en«: Kon/;potün \"l·5en«: Corrvh<·Zu;Ttf \"l.5«'«: B
�,
�I
wob>e
Web=v«: Ensel-bafe VI, Web=v«: Bf""""'"' '-'7tr
Bild 8.18 Möglichkeiten zur Einstellung des Standardverzeichnisses
Bild 8.19 VelWendung der pfadkonstanten 'Standardverzeichnis'
8.2.3
'Standardverzeichnis' ändern
Das LabVIEW-Standardverzeichnis ässt l sich ändern. Man muss dazu in Bild 8.18 das Häk chen vor 'Standard' entfernen und den Pfadnamen für irgendein anderes Verzeichnis eintra gen. Bild 8.20 zeigt dies am Beispiel. Man kann den alten Namen nicht direkt überschreiben, sondern muss ihn m i unteren Teil des Fensters eintragen und dann noch 'Ersetzen' und 'OK' drücken. Die Änderung des Standardverzeichnisses hat den Nachteil, dass das VI auf einem pe mit anderem Standardverzeichnis möglicherweise nicht mehr läuft, etwa weil es Dateien in Verzeichnissen sucht, n i denen sie nicht stehen. Das Standardverzeichnis ist also für jeden Rechnern jedes Mal neu anzupassen. Achtung: Die Änderung des Standardverzeichnisses wird erst wirksam, wenn man LabVIEW verlassen und danach neu gestartet hat.
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'
8 Dattntransfer von undzur Festplatte
158 I> Optlon�n
AusrdJ,lX)oJWitt« Po!etten J.lemerte"lTJd JlXlktOrie<1" Ve<>icnsvo<wollXlg FeIlIe,><>:Oe
Vor�c
VI-Serv«: Konf....otbn ..
01_""w'" ,""'" '",,_l, ",tf Bild 8.20 Änderung Standardverzeichnis
8.2.4
'Standard-Datenverzelchnls' ändern
Meist ist es günstiger, nicht das Standardverzeichnis zu ändern, sondern das Standard Datenverzeichnis. Man verwendet dann keine Verzeichnisse, die das LabVIEW-System benutzt, sondern allgemeine, dem Anwendet standardmäßig zugeordnete Unterverzeichnis se n i ' . . . Dokumente und Einstellungen\.. .'. Die entsprechende Dateikonstante findet man in Bi l d 8.14 ganz unten rechts. Bi l d 8.21 zeigt ein mit Hilfe dieserKonstanten modifiziertes VI.
Bild 8.21 VI von Bild 8.19, modifiziert mit der Konstanten Standard-Datenverzeichnis
IAufgabe 8.4
Lassen Sie das Programm von Bild 8.21 auf Ihrem Rechner laufen und ennitteln Sie das Verzeichnis, in das die von Ihnen benannte Datei gespeichert wird.
8.2.5
Lesen und Schreiben anderer Datentypen
Will man keine Strings, sondern andere Datentypen auf die Festplatte schreiben, hat man zwei Möglichkeiten: 1. Man wandeJt diese Datentypen um in Strings, schreibt sie mit den bisher besprochenen Dateifunktionen auf die Festplatte, liest sie als String und verwandelt sie zurück in den ursprünglichen Datentyp. 2. Man verwendet spezielle binäre Sclueib-/Leseoperationen.
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.2 Pfade
159
Wir werden uns hier mit der zweiten Methode beschäftigen. Während in LabVIEW 7 spezielle Schreibfunktionen nur zum Lesen und Schreiben von 1- oder 2-dimensionalen Arrays existierten, sind die entsprechenden Punktionen in LabVIEW 8.x flexibler. Man fin det sie unter 'Punktionen' - 'Programmierung' - 'Datei-I/O'. Die Schreibfunktion passt sich an den Datentyp an, in Bild 8.23 an ein 2-dimensionales Array von Gleitkommazahlen des Typs DBL (Double Precision oder doppeJte Genauigkeit). Die Lesefunktion rechts im Diagramm erhält den Datentyp über einen speziellen Eingang. Im Beispiel wird er durch eine entsprechende Konstante definiert. Man hätte aber auch einfach die Leitung 'Eingabe-Array' bis zu diesem Eingang verlängern können. Bild 8.22 und Bild 8.23 zeigen PaneJ und Diagramm eines VI, das eine 2 x 2-Matrix n i eine Datei schreibt und zurüclcliest. 'Datei.txt' wurde umbenannt n i 'Datei.dat'. Das ist zwar nicht notwendig, verhindert aber die Fehl einschätzung, es handle sich um eine aus ASCII-Zeichen bestehende Textdatei.
Qatei �en /'i"Ilei9On erojel
11
I� � .
I",' :0;;. :11:.
�.
,
Bild 8,22 Schreiben und Lesen einer 2 x 2-Matrix vom Typ DBL aufdie und von der Festplatte
Bild 8,23 Diagramm zum VI in Bild 8.22
8.2.6
Verketten von Schreib- und Lesefunktionen
Wenn man für das Schreiben auf die Festplatte eine Pfadangabe benutzt, wird die genannte Datei automatisch geöffnet und nach dem Schreiben automatisch geschlossen. Versucht man, andere Daten in dieselbe Datei zu schreiben, geht der alte Inhalt verloren. Das ist an
ders, wenn man mit Referenznummern (Refnum) arbeitet. Die Referenznummer überträgt auch den momentanen Stand des Schreibzeigers. Hängt man also an eine Schreibfunktion per Refnum eine zweite Schreibfunktion, so wird dort weitergeschrieben, wo die erste Funk tion aufgehört hat. Entsprechendes gi l t für die Lesefunktionen. Ein Beispiel dafür gibt das Programm in Bild 8.24 und Bi l d 8.25.
Ausleihe: 31.07.2009 00:00:00 - OS.OS.2009 00:00:00, ID:7ac0427dS929S1cfOS9d91b1gecaOOaO. Zenlral- u 2009.07.31 21:42:39 +02'00'
8
160 r>[)i1le,Sd"�,l>enL ...enllinil",Y"rkett,,t.Y' FrontJHInel --
Qat.. lln:'I>eten � �ojekt t\IISf(h.... � 1:_" !jJIfe �
11
1� �ftart .
Dattntransfer von und zur Festplatte •
'co ;0;;;. :11::.
-.
.,
,
1 11,755
·15
• .4 Bild 8.24 Schreiben und Lesen, a) Vektor und b) Matrix
Bild 8.25 Diagramm zum Programm von Bild 824 Die Funktion 'Dateiposition festlegen' rechts neben der While-Schleife ist notwendig, weil die Lesefunktion sonst versuchen würde, ab Dateiende-Zeichen EOF zu lesen. Diese Funkti on hat zwei Eingänge zur Festlegung der Startposition und des Offsets. Sie müssen aber nicht gesetzt werden, weil die Voreinstellungen bereits die hier erforderlichen Werte liefern.
IAufgabe 8.5
Entwickeln Sie ein VI, das einen Vektor auf die Festplatte schreibt und von dort zuruck
liest. 8.2.7
Tabellenkalkulation
Zum Schreiben und Lesen im Zusammenhang mit Tabellenkalkulationsprogrammen wie ExceJ
8.3
Pfade in einer EXE-Datei
LabVIEW-VIs benötigen für ihre Ausführung die Installation des kompletten LabVIEW Systems. Das ist unbequem für Anwender, die fertig programmierte VIs von einer Software firma beziehen und vielleicht nicht die Fähigkeit haben, diese VIs selbst zu verändern. Sie müssten trotzdem das nicht ganz billige LabVIEW-System dazukaufen. Um das zu vennei-
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'
8.3 Pfade in einer EXE-Datei
161
den, gab man dem Entwickler die Möglichkeit, ein VI zu übersetzen, d.h. eine EXE-Datei zu erzeugen, die aufjedem Rechner unabhängig von LabVIEW lauffiihig ist. Das Vorgehen bei der Übersetzung eines VIs n i eine EXE-Datei wird in Kapitel 9 näher erklärt. Hier geht es um ein Problem, das im Zusammenhang mit Schreib-/Lesezugriffen bei dieser übersetzung entsteht, und um ein Rezept zur Lösung. Das Problem besteht darin, dass die Funktion 'Aktueller Pfad des VIs' in einer EXE-Datei einen Wert erzeugt, der gegenüber dem Wert in einem normalen VI leicht verändert ist. Das zeigen Bild 8.26, Bild 8.27 und Bi l d 8.28.
Bild8.26 Dieses VI gibt den pfad auf sich selbst aus, ferner den pfad zum Verzeichnis, in dem es steht. und seinen eigenen Na moo
�"'� �." .kiton
<;>
/if"=9>n
11
[l' ojol< f!.d ....'" �....,., 0""""' tlIf' '3«_";,, ...... . :",. <;;; - Iti. (')._ -'-'" _ _ _ _ _
_.0
Bild 8.27 Panel nach AblaufdesVI in Bild 826 ... Akt""lereladU..
••
� D:l._EWJ''"''-'.'tnm <. "'-"'_\� '\KId� [.l U · & I: ••,.... 4kt_odexe \A>t_odII ]."
_'0
O _EW_,""",,,,,:7"-"'!_Vdlooo_.\K....� OO'l-�","uok"od.';;;�� -
Bild 8.28 Panel nach Ablaufder zum VI in Bild B.26 gehörigen EXE-Datei
Man sieht, dass beim übersetzten VI (Bild 8.28) der Pfad länger ist als der beim gewöhn ichen l VI. Statt 'AktuellerPfadVI.vi' erscheint jetzt 'AktuellerPfadVI.exe\AktuellerPfadVI.vi' als Abschluss der ersten Zeile, Daher streift die Funktion 'Pfad zerlegen' n i Bi l d 8.26 nur 'AktuellerPfadVI-82.vi' ab, nicht aber den Bestandteil 'AktuellerpfadVI.exe'. Der zerlegte Pfad endet daher nicht mit ' . . .Kapitel 08\LabBeispiel' wie beim nicht übersetzten VI, son dern mit ' . . . KapiteJ 08\AktuellerPfadVI.exe'. Die Konsequenz ist, dass z.B. das frühere Pro gramm von Bi l d 8.16 als EXE-Datei einen Fehler produziert, weil der Funktion 'Pfad erstel len' links im Diagramm ein falscher Pfad übergeben wird. Was kann man tun? Die einfachste Möglichkeit ist, die Funktion 'Pfad zerlegen' zweimal anzuwenden, damit man doch noch zum richtigen Pfad ' . . . .Kapitel 08\LabBeispiel' kommt. Bi l d 8.29 zeigt diese Abwandlung des Programms von Bild 8.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'
162
8 Dattntransfer von und zur Festplatte
Diese Methode hat Erfolg. Beim Aufruf der EXE-Datei gibt es keinen Fehler mehr, und 'Datei.dat' wird richtig im Verzeichnis ' . . . Kapitel 08\LabBeispieJ' abgelegt. Der Nachtei l ist aber nun, dass das nicht übersetzte und das übersetzte Programm 'Datei.dat' die Daten n i verschiedene Verzeichnisse schreiben.
Bild 8.29 Zweimalige Anwendung von 'pfad zerlegen' zur Bildung einer funktionsfähigen EXE-Datei Man kann diesen Nachteil durch eine kleine Änderung m i linken Teil von Bild 8.29 beheben. l d 8.30 zeigt diese Modifikation. Bi
Bild 8.30 Dieses Programm greift als VI und als EXE auf die gleiche Datei zu Nach der ersten Anwendung von 'Pfad zerlegen' wird der erhaltene Pfad der Funktion 'Datei-Nerzeichnisinformation' zugeführt. Sie steht unter 'Funktionen' -'Programmierung' -'Datei-I/O' - 'Dateifunktionen (Fortgeschritten)' und prüft, ob der Eingangspfad auf ein Verzeichnis oder auf eine Datei zeigt. Ist es ein Verzeichnis, liefert sie am Ausgang oben 'TRUE', anderenfalls 'PALSE'. Damit wird nun die folgende Case-Struktur gesteuert. Bei einem gewöhnlichen VI zeigt 'Aktueller Pfad des VIs' auf eine Datei und der zerlegte Pfad auf das Verzeichnis, in dem das VI steht. Also wird TRUE ausgegeben. Im TRUE-Teil von Bild 8.30 (hier nicht dargestellt) wird aber der Ausgangspfad von 'Datei-/Verzeichnis-Info' (der gleich dem Eingangspfad ist) ohne Änderung durch die Case-Struktur gezogen. Anders bei der EXE-Datei: Hier beseitigt die Punktion 'Pfad zerlegen' nur den abschließenden Tei l 'AktuellerPfadVLvi', so dass der Pfad jetzt auf die EXE-Datei zeigt. 'Datei-/Verzeichnis information' liefert deshalb FALSE, und in diesem Teil der Case-Struktur wird nochmals 'Pfad zerlegen' aufgerufen, wie Bi l d 8.30 verdeutlicht. Somit zeigen nunmehr nicht übersetz tes und übersetztes VI nach außen hin das gleiche Verhalten.
IAufgabe 8.6 Lesen Sie n i KapiteJ 9 das Rezept zum Erzeugen einer EXE-Datei und entwickeJn Sie ein VI zum Schreiben von Vektoren auf die Festplatte sowie zum Lesen der erzeugten Datei. Schreiben Sie das Programm so, dass die übersetzte Version dieses VI das gleiche Verhal ten aufweist wie die nicht übersetzte Version.
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'
8.4 Fortgeschrittene Dateitypen
163
Merke: Der Datentyp 'Pfud' wird wichtig, wenn man Daten in eine Datei auf der Festplatte schreiben oder von dort lesen will. Merke: Es gibt verschiedene Pfudkonstanten. Eine der nützlichsten ist die Konstante 'Aktueller Pfad des VIs', von der ausgehend man sich mit Hilfe der Funktio nen 'Pfad zerlegen' und 'Pfad erstellen' beliebig in den Verzeichnissen eines Rechners bewegen kann. Merke: VIs können übersetzt werden: Man bildet so eine EXE-Datei, die unabhängig von LabVIEW aufjedem pe läuft. Merke: Bei übersetzten Vis liefert die Dateikonstante 'Aktueller Pfad des VIs' ein anderes Ergebnis als beim nicht übersetzten VI. Mit einer speziellen Kon struktion kann man die daraus resultierenden Probleme lösen.
8.4
Fortgeschrittene Dateitypen
Mit LabVIEW werden überwiegend messtechnische Aufgaben behandelt. Ein wesentlicher Bestandteil der Programmierung ist daher die Erfassung und Speicherung von Messdaten, z.8. des Temperaturverlaufs in einem verfahrenstechnischen Reaktorgefaß. Nun genügt es aber in der Praxis nicht, die Temperaturwerte eines Tages aufzunehmen und in einer Datei zu speichern. Man möchte später wissen, wann die Daten erhoben wurden, in welchen Zeit intervallen gemessen wurde, ob die Temperaturwerte in Grad Celsius oder in Fahrenheit vorliegen, aus welchem von mehreren Reaktoren die Daten stammen usw. Es ist üblich, diese zusätzlichen Angaben an den Anfang der Datei in den so genannten 'Header' zu schreiben, bevor die eigentlichen Messwerte folgen. Die Gestaltung des Headers, eine nicht ganz einfa che Aufgabe, blieb lange Zeit dem Anwender überlassen. Ab Version 7.0 von LabVIEW hat National Instruments dem Programmierer zwei Standardtypen von Messwertdateien zur Verfügung gestellt, die nach ihrer Erweiterung •
LVM-Dateien bzw.
•
TDM-Dateien
genannt werden. Sie werden zwe<:kmäßigerweise mit den entsprechenden gleichzeitig einge führten Express-VIs eingesetzt. Dies erleichtert die Programmieraufgabe ganz entscheidend. 8.4.1
LVM-, TOMS- und TOM-Dateien
Jede LVM-Datei (LabVIEW Measurement File) besteht aus einem Header-Abschnitt, gefolgt von Daten, die in Segmenten angeordnet sind. Jedes Segment kann wiederum einen eigenen Header-Abschnitt enthalten. Das ist zweckmäßig, wenn man zusammengehörige Daten erfasst, die aus verschiedenen Quellen kommen, z.B. Temperatur und Druck im Reaktor zu einer bestimmten Zeit. Das zugehörige Express-VI kann diese Daten dann entweder als Ganzes lesen oder auch getrennt nach Temperatur und Druck. LVM-Dateien bestehen aus ASCII-Zeichen. Sie benötigen daher mehr Speicherplatz als Binärdateien und ihre Verarbeitung ist zeitintensiver. So kann man mit einer DBL-Zahl, die 64 Bit gleich 8 Byte m i Speicher belegt, eine Genauigkeit von etwa 15 Dezimalstellen erzielen. Als ASCII-Zahl benötigt man dazu 16 Zeichen, 15 für die Dezimalziffern und eine für das
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'
8 Dattntransfer von und zur Festplatte
164
Komma. Das entspricht 16 Byte, also dem Doppelten. Die Verarbeitungsgeschwindigkeit sinkt auch deshalb, weil die Umwandlung von Strings in die für die Anzeige erforderlichen Gleitkommazahlen Zeit erfordert. Doch sind diese Unterschiede bei kleineren Messwertda teien nicht reJevant. Bild 8.31 und Bild 8.32 zeigen ein BeispieL Man findet die Funktionen 'Messwerte in Datei schreiben' und 'Messwerte aus Datei lesen' unter 'Punktionen' - 'Datei-I/O'. Beide Funktionen sind zu konfigurieren, z.B. so wie in Bild 8.33 und Bild 8.34 gezeigt. Die Datenwandlungsfunktion links in Bild 8.32 entsteht automatisch, wenn man den Aus gang der 2-D-Matrix mit dem Signaleingang der Sdlreibfunktion verbindet. Man findet sie aber auch unter 'Funktionen' - 'Express' - 'Signalmanipulation' in der untersten Zeile als Funktion 'In dynamische Daten konvertieren'.
-
,
I'
� :� -
17' 1,' 1 , "
Bild B.31 Schreiben und Lesen von zwei Messwertreihen (erste und zweite Zeile der Matrix links) in eine bzw. aus einer LVM-Datei
Bild B.32 Diagramm zu
Bild B.31 • 10 1." 11\<'1)
«I . , ..... ""'�
r; /I.< 00<0........ .. "'1_"
..._ 0.0.; ......,,,
r.
,,-.ndo""��
("l _�"", ,,,r-.nr>oteCffi«1 __
("l""",,� .......,
r D"�_s
....,........ ... .
�.""' ..._"o_
r""."", ..._ r<en; ..._
_.. rurx·......,
, ""' ,.-pm,.... !:: ttr ..,., _
(O e_.z........
�.-
Bild 8.33
Konfigurieren der Schreibfunktion in Bild 8.32
Ausleihe: 31.07.2009 00:00:00 - 08.0S.2009 00:00:00, ID:7ac0427d5929S1cfOS9d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
8.4 Fortgeschrittene Dateitypen
165
Die LVM-Datei, die beim Schreiben erzeugt wird, hat den n i Bild 8.35 gezeigten Inhalt. Dies kann man z.B. beim Öffnen mit dem Notepad-Editor erkennen. I> <0","'"""'0 .0. ....... , •••"" .u, D••", ,."'" L "............, D"•• '...oJ
�.
,....-
' li''''',",- <Je< ,""SS'"l � '''''''
� ''''1'''''1
<"l o.bsolJt loal.OcoJ '''I -�-
a � � Dr_
r _ I'[)Io11 p,
otnt
""" ",,, r u.. "a",""""" alfc
r � � 5<00,"'11", dot.. Erlo
�I
fl ',... ZOk""""- •......r O " .te'"ool!, "'-'''''d ''' �-
r. 1'
""',-I Bild 8.34 Konfigurieren der lesefunktion in Bild 8.32
�obVIEW M"
,",",m,nl
Wder_Vmro
0.92
Sep,.-atoc Tob
1
R'OO
Mili_H,odng,
y"
X_Cola"",
No
T;"-"_Pre[ Rolati�e OP"'�o,
T;"-" Date
Admrimatof
=01,1)1 1600 50,780999
-*"'End_cCH,ad,,-**
Ch=-.:l,
2
S,.-nple, Date
2C()9/0IM
T;"-"
3
3
2C()9/01101
1600 50,780999
x_='""0"
T;"-"
1600 50,780999
T;"-"
XO
o.oooooooooOOOOOOOE+D
D,lta_X
1.000000
1.000000
x_v",\>:
Unt�ed
Unt�ed 1
���End_c<_lliad,,�U
o OOOOOOOOOOOOOOOOE+D
Comrr.ert
1 000000 ·1 000000 4.000000 ·2000000 9.000000 4.500000
Bild 8.35 LVM-Datei lVM_Beispiel-82.lvrn
Bei der Konfiguration nach Bild 8.33 und Bild 8.34 wurde nicht der per Voreinstellung vor geschlagene Name gewählt ( . . . \Dokumente und Einstellungen\...\test.lvm), sondern 'D:\LabYIEW_Einführung, 4. Außage\Auflagc4\ Kapitel08\LabBeispiel\LYM_Beispiel.lvrn'.
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 Dattntransfer von und zur Festplatte
166
Während der Konfiguration für Lesen und Schreiben wurde ferner als Dateifonnat rechts oben in beiden Fällen 'Text (LVM)' festgeJegt. Trägt man dort dagegen 'Binär (TDM)' ein, erzeugen bzw. lesen dieselben Express-Funktionen jeweils zwei Binärdateien, die nicht mehr mit einem Texteditor dargestellt werden können. Bei Wahl von TOM haben diese Dateien die Erweiterungen 'tdm' und 'tdx'. Die 'tdm'-Datei kann man mit einem XML-Editor öfillen und die dort enthaltenen Informationen lesen. Doch sind diese in einer Beschreibungsspra ehe niedergelegt, die unverständlich bleibt, wenn man XML nicht kennt. Die anderen Datei en können gar nicht bzw. nur mit Hilfe der oben erwähnten Express-Vb in einer verständli chen Form, z.B. als Grafik, dargestellt werden. Die Abkürzung 'TOM' bedeutet übrigens 'Technical Data Management'. Ab LabVIEW-Version 8.2 findet man unter 'Funktionen' 'Datei-IJO' die Palette 'TOM Streaming' oder 'TDMS'. Beim Schreiben werden hier Dateien mit den Endungen 'tdms' und 'tdms_index' erzeugt. TDMS ist schneller als TOM. Nachstehend werden zwei einfache Beispiele für TDM- und TDMS-VIs gezeigt, die auf dem Frontpanel die gleiche Funktionalität wie das Programm in Bild 8.31 haben, aber schneller arbeiten, wei l sie Binärdateien erzeugen. TOM läuft unter LabVIEW 8.0, dagegen erfordert TDMS neuere Versionen. Hier haben wir mit der Version LabVIEW 8.5.1 gearbeitet. In beiden Fällen haben wir nicht mit 'Messwerte in Datei schreiben' und 'Messwerte aus Datei lesen' gearbeitet, sondern mit 'Datenspeicherung' bzw. 'TDM-Streaming' unter 'Funktionen' - 'Datei-IIO' und deren Unterfunktionen, siehe Bild 8.36 und Bild 8.38. ��
� �
. - ---
� �
0__ , 0_'_ ..,.",,"",...
� �
00''''",'''
,.,." d,.",.., ,,,,,, _ ,,,
� �
"""',_.., ""'"""''''"
�
""'�_...
Bild 8.36 Unterpalette zu 'Funktionen' - 'Datei/IQ' - 'Datenspeicherung'
Das Diagramm von 'TDM-Beispiel.vi' ist in Bild 8.37 dargestellt, 'TDMS-BeispieC85.vi' in Bi l d 8.40.
Bild 8.37 Einfaches Beispiel-VI zur Schreiben und Lesen von TOM-Dateien
Die Express-Vls in Bild 8.37 sind n i ähnicher l Weise zu konfigurieren wie im LVM-Beispiel von Bild 8.31. Die Einzelheiten können dem Beispielprogramm '0837-TDM_Beispiel.vi' entnommen werden. Bemerkenswert ist die Möglichkeit, beim Lesen Vergleichsoperationen wie '<' zu verwenden. Im Beispiel werden nur Werte < 10 angezeigt. Setzt man die Konstante 10 n i Bi l d 8.37 auf9 herab, sieht man in Bild 8.31 nur noch die kleinere der beiden Kurven (nunmehr nicht rot, sondern schwarz dargestellt). Bei '0839-TDMS_Beispiel_85.vi' besteht keine solche Vergleichsmöglichkeit, auch werden hier keine konfigurierbaren Express-Vb verwendet. Jedoch arbeitet dieses VI schneller.
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'
8.4 Fortgeschrittene Dateitypen
�
167
__000
L �'Ilo L n: .,_""""""
l1\'l
lLj
[;';:j
mMS: Öffnen
1<:+15<_e."
mMS:',,,.,
1E
ilI
i/ij
Tom: "fJI<." """';r-t\OI: " TCM5 :!>;IefJS...
r:1ll
T"",: Dm • .
rn:l
Im
Bild 8.38 Unterpalette zu 'Funktionen' - 'Datei/lO' - TDM-Streaming'
"
Bild 8.39 Einfaches Beispiel-VI zur Schreiben und Lesen von TDM5-Dateien
IAufgabe 8.7 Schreiben Sie in Anlehnung an das Beispiel von Bi l d 8.32 drei VIs des Typs LVM, TOM und TDMS, die in einem Diagramm 1000 Punkte von zwei Sinuskurven der Frequenz I Hz und 3 Hz darstellen. Die Daten sind erst in die entsprechenden Dateien zu schrei ben, dann aus diesen zu lesen und in einem Signalverlaufsgraphen darzustellen. Vergleichen Sie die Rechenzeiten in den genannten drei Fällen und den jeweiligen Speicherbedarf. 8.4.2
Diadem
National Instruments vertreibt ein eigenes Produkt, das vergleichbare Fähigkeiten wie ExceJ (siehe Kapitel 19) aufweist. Es hat die Bezeichnung 'Diadem'. Diadem hat Vorteile und Nachteile. Einige Vorteile von Diadem: •
•
•
unmittelbar an LabVIEW angepasst, z.B. bei der Ausgabe von TDM- und TDMS Dateien, einfache Erstellung von Grafiken und Berichten, keine Beschränkung von Zei l en- und Spaltenzahl wie bei Exce!.
Einige Vorteile von Excel: •
•
weite Verbreitung, häufig bereits vorhanden, also keine zusätzlichen Kosten.
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'
8 Dattntransfer von und zur Festplatte
168 ZIP�Dateien
8.4.3
Neu ab LabVIEW 8.0 sind auch Funktionen für das Arbeiten mit ZIP-Archiven. Damit kann man Archive erstellen und bestehende Dateien hinzufügen. Man findet diese Funktionen unter 'Programmierung' - 'Datei-IIO' - 'Zip'. Bild 8.40 zeigt ein Beispielprogramm, welches das aufrufende VI in das ZIP-Archiv 'archiv.zip' speichert.
....d..., . . ZIP-Oate;
Bild 8.40
Beispiel fOr die Ver wendung der neuen ZIP-Funktionen
at.. zu ZIP
Das Entpacken ist bei der Version 8.0 und 8.2 nur mit einem externen Programm möglich, z.8. WinRAR. Ab Version 8.5 geht das auch aus einem VI heraus. Das VI in Bild 8.40 ist sehr einfach. Es packt nur eine einzige Datei, nämlich sich selbst. Et was komfortabler, allerdings auch schon etwas komplizierter, ist das VI in Bild 8.41 bis Bi l d 8.42. Hier kann der Anwender sowohl den Namen des ZIP-Archivs wählen als auch die Namen aller Dateien, die er in ihm packen will. t> 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<
.
FAlSE·Te
13 mI
fY>
-
III
..
Ootei NiOne
Neue Ootei rn IIp· Arem oo./ne!nef1
L 'J=
.��
.{ii'ill II!
Diagramm zu Bild 8.41. Öffnen außerhalb der While-Schleife und Hinzufügen
im Innern
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'
8.4 Fortgeschrittene Dateitypen
169
TRLE
c...o lPlr.lf[lil Arm �""" ..
!EI. [1;11.
_cfÜQen
-
[j]
�
�
-��
lIi
Bild 8.43 Diagramm zu Bild 8.41. Schließen des Archivs im TRUE-Teil der äußeren Case-Struktur
IAufgabe 8.8 Das Programm in Bild 8.41 bis Bild 8.43 ist verbesserungsbedürftig. Erstens kann das Öffnen der ZIP-Datei mit Hilfe einer Gase-Struktur innerhalb der While-Schleife ausge führt werden. Die While-Schleife wird dazu mit einem Schieberegister für die Referenz nummer der Funktion zum Öffnen des Archivs versehen. Der Anfangswert ist O. Wenn ein Fehler beim Schreiben auftritt, soUte mit der alten Referenznummer weitergearbeitet werden, weil sonst das Archiv beschädigt wird. Man kann ein beschädigtes Archiv erst löschen, nachdem man LabVIEW verlassen hat - eine sehr umständliche Prozedur. Drit tens soUte man mit einem Methodenknoten das Eingabefeld für den Dateinamen lö schen, sobald die Datei zum Archiv hinzugefügt wurde. Anleitung: Eine Teilansicht des gewünschten Programms ist in Bi l d 8.44 zu sehen.
Bild 8.44 Teilansicht des zu entwickelnden Programms 8.4.4
Konfigurationsdateien
In der Infonnatik ist es üblich, Parameter für ein Programm, die sich gelegentlich, aber nicht ständig ändern, in Textdateien zu schreiben, so genannte Konfigurationsdateien. Ein altes BeispieJ ist die von DOS her bekannte Datei 'Config.sys', welche die wichtigsten Einstel lungen eines DOS-Rechners enthielt. Heute sind Konfigurationsdateien etwa nach dem Schema von Bild 8.45 aufgebaut.
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'
8 Dattntransfer von und zur Festplatte
170
Abschnin 1J Boolesch-FALSE oouble-2, OOOOOo 5tri n g l_Hil.l l o , hier [AbscFinitt
2]
bin i c h '
Pfad_/D/LabvI EltCE1 nfuehrung, 3 . Aufl agejee1 sp1 el e/K08!sett1 ngs . txt Numerisch 2--120, 000000 string 2_und hier i s t ein anderer
Bild aAS
Konfigurationsdatei mit zwei Abschnitten und jeweils drei Eintragungen
Danach zerf allt eine Konfigurationsdatei in einen oder mehrere Abschnitte (Sektionen), deren an sich beliebige Bezeichnung unbedingt n i eckige Klammern einzuschließen ist. Hier wurden die Bezeichnungen '[Abschnitt I]' und '[Abschnitt 2] ' gewählt. Achtung: Auch auf Zwischenräume ist sorgfältig zu achten, sofern man sie benutzt! In einem Abschnitt kann man einen oder mehrere Schlüssel (key) verwenden, hinter die das Gleichheitszeichen und unmittelbar danach die Werte der Parameter ohne Abstand zu schreiben sind. Im Beispiel ist der erste Schlüssel in Abschnitt I die Bezeichnung 'Boolesch' und der Parameter 'FALSE'. Der zweite Schlüssel ist 'Double' und der Parameter '2,000000'. Sinngemäß wurden die rest ichen l Schlüsselnamen in Abschnitt I und in Abschnitt 2 gewählt.
Bild 8.46
Lesen einer Konfigurationsdatei in LabVJEW mit dem Programm 'LesenKonfig.vi'
Um in einem LabVIEW-Programm auf die Parameter zuzugreifen, genügen im Prinzip die Funktionen zur Stringverarbeitung. Doch ist die Programmierung damit mühsam. Deshalb stellt LabVIEW schon seit längerem spezielle Funktionen zur Verfügung, mit denen man solche Konfigurationsdateien bequemer auswerten kann. Bild 8.46 zeigt ein Beispiel. �"'-
'"" ..
-
,..
�..
\�" .IJ\IoI\ •
.,., I
... ,
.
.... '
.. .
ir'
'* '*' kh1 1
H20,1Xl I
IF�on I
••
Bild 8.47 Ausgabe der Parameter der Konfigurationsdatei 'Konfigu rationsdateLtxt' auf dem Panel von 'LesenKonfig.vi'
Links im Diagramm n i Bild 8.46 wird ein Dateidialog eröffnet (zu finden unter 'Funktionen' - 'Programmierung' - 'Datei-1/0' - 'Dateifunktionen (Fortgeschritten)' - 'Dateidialog'). Gibt
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'
8.4 Fortgeschrittene Dateitypen
l7l
man dort den Namen 'Konfigurationsdatei.txt' ein, holt das Programm 'LesenKonfig.vi' die Parameter aus der Textdatei und gibt sie aufdem Frontpanel aus, siehe Bild 8.47. Die erforderlichen Funktionen zum Offnen, Lesen und Schließen einer Konfigurationsdatei findet man unter 'Funktionen' - 'Programmierung' - 'Datei-IIO' - 'Konfigurationsdatei-Vls' (sechste Zeile links). Sie heißen 'Konfigurationsdatei öffnen' (links oben), 'Schlüssel lesen' (daneben) und 'Konfigurationsdatei schließen' (zweite Zeile rechts). Mit Hi l fe von Konfigu rationsdateien kann man ein Programm gegebener Struktur an völlig verschiedene Aufgaben anpassen, wenn man entsprechende Eintragungen vornimmt. Das folgende Beispiel zeigt einen einfachen Automaten, der durch Parameteranpassung wahlweise auf einen Zigaretten-, Getränke- oder Kaugummiautomaten umgestellt werden l d als auch der zu entrichtende Geld kann. Dabei ändern sich sowohl das Erscheinungsbi betrag sowie Hinweise und die "musikalische Umrahmung". Das Diagramm in Bild 8.48 von 'FlexiblerAutomat.vi' arbeitet also mit Multimedia-Effekten.
Bild 8.48
Diagramm des Programms 'FlexiblerAutomat.vi'
In der oberen While-Schleife werden die Parameter ausgelesen, welche über die Art des Au tomaten entscheiden. Da hier in der zugehörigen Konfigurationsdatei 'KonfigAutomat.txt' jede Sektion die gleiche Anzahl von Parametern gleichen Typs hat (was keineswegs so sein muss), genügt es, die Fallunterscheidung auf den Namen der Sektion zu beschränken. Es sind dies die Bezeichnungen 'Zigaretten', 'Bier' und 'Kaugummi'. Das geschieht n i der Case Struktur links oben. Die Funktion 'Schlüssel lesen' benötigt in jedem Fall die folgenden drei Eingaben: 1. Refnum von der Funktion 'Konfigurationsdatei öffnen', 2. Abschnittsname (Bezeichnung in eckigen Klammern in der Konfigurationsdatei), String, 3. Name des Schlüssels, String. Der Schlüssel selbst erlaubt verschiedene Datentypen, näm
lich Boolesch, Double, 132, Pfad, String und U32. Die Funktion 'Schlüssel lesen' muss wissen, welchen Datentyp sie einlesen soll. Man muss sie deshalb m i Kontextmenü mit 'Typ auswählen' entsprechend konfigurieren.
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'
172
8 Dattntransfer von und zur Festplatte
Als Ausgabe von 'Schlüssel lesen' erhält man den Wert, der unter dem betreffenden Ab schnitt und unmittelbar nach dem Gleichheitszeichen hinter dem Schlüssel in der Konfigura tionsdatei steht. Die obere While-Schleife n i Bild 8.48 wird nun solange durchlaufen, bis der Anwendet auf 'Fertig' drückt. Entscheidet er sich im Enum-Eingabefeld 'Wahl des Automaten' für Zigaret ten, werden die Konfigurationsdaten aus diesem Abschnitt der Konfigurationsdatei geholt. Die beiden ersten Instanzen von 'Schlüssel lesen' inks l steUen Pfade für zwei Bilder zur Ver fügung, die rechts mit der Funktion 'PNG-Datei lesen' (unter 'Punktionen' - 'Programmie
rung' - 'Audio & Grafik' - 'Grafikfonnate') auf dem Panel angezeigt werden. Die dritte In stanz von 'Sdllüssel lesen' zeigt auf dem Panel den erforderlichen Geldbetrag an, die sechste und letzte gibt einen Hinweis für den Käufer des Produkts, ebenfalls auf dem PaneL Die vierte Instanz gibt einen Pfad auf eine Tondatei mit der Erweiterung 'wav' aus, die fünfte iefert l eine Wartezeit zum Hören der Tondatei in Millisekunden. Verwandelt der Anwender den flexiblen Automaten in einen Zigarettenautomaten, sieht er ein Frontpanel gemäß Bild
8.49. Entscheidet er sich dagegen für einen Getränkeautomaten (der hier nur Bier liefern kann), zeigt sich ihm ein Frontpanel wie n i Bild 8.50.
Bild 8.49 Panel des flexiblen Automa ten in der Ausprägung als Zigaretten automat Die Angaben aus der dritten bis fünften Instanz von 'Schlüssel lesen' werden erst wirksam, wenn die obere While-Schleife mit 'Fertig' beendet wurde und nunmehr die zweite untere Whi l e-Schleife durchlaufen wird. Sie endet erst mit dem Einschreiben des geforderten Geld betrages. Wechselgeld wird nicht herausgegeben. Der Automat ist eben sehr einfach. Die Funktion zum Abspielen der WAV-Datei findet man in 'Funktionen' - 'Programmierung' 'Audio & Grafik' - 'Audio' - 'Ausgabe' als Funktion 'Audiodatei abspielen' links unten.
Abgespielt wird der Ton nur, wenn der eingetippte Geldbetrag mit dem angezeigten überein stimmt. Eine Abfrage auf Gleichheit ist problematisch, wenn man mit Gleitkommazahlen (Double) arbeitet. Gebrochene Zahlen wie 0,50 € sind m i Dualsystem, in dem sie letztlich dargestellt werden, unendlich periodische Brüche, die im Rahmen der Genauigkeit gerundet werden müssen. Werden zwei solche Zahlen auf verschiedene Weise erstellt, z.B. einmal durch Umwandlung eines Strings in Double und auf der anderen Seite durch Hochzählen von jeweils 0,10 €, können sich beide Werte in den letzten Dezimalen unterscheiden. Aus diesem Grunde wurde hier der Vergleichsoperator 'Wertebereich prüfen und erzwingen'
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.4 Fortgeschrittene Dateitypen
173
unter 'Funktionen' - 'Programmierung' - 'Vergleich' benutzt, der sich dort in der fünften Zei l e rechts befindet. Im vorliegenden Fall wird also bei 0,50 € nur geprüft, ob die eingetippte Zahl zwischen 0,49 € und 0,51 € liegt.
Bild 8.50 Panel des flexiblen Automa ten in der Ausprägung als Getränkeau tomat für Bier ! KonfigAutomattHt Ed,tor
zi aretten Bil gdpfadl_z garetten.png Bi 1 d pf�d2_TotQnkopf. png eldbetrag_"I,OO € " Ton_soNinmDenn.wav Laenge_24100 Text_"statistisch gesehen treiben sie jetzt selbstmord auf Raten" [Bierl Bi1dp �dl_BiQrf1�
Bild 8.51 Konfigura tionsdatei 'KonfigAutomat.txt'
IAufgabe 8,9
Bauen Sie das Programm von Bi l d 8.48 von Anfang an auf und testen Sie seine verschie denen Möglichkeiten. Die Konfigurationsdatei 'KonfigAutomat.txt' dazu hat einen Inhalt gemäß Bild 851. Vorausgesetzt wird ferner, dass sich m i selben Verzeichnis wie das Pro gramm nicht nur 'KonfigAutomat.txt' befindet, sondern dass auch die drei WAV Dateien 'SoNimmDenn.wav', 'Trumpet1.wav', 'Yippee.wav' sowie die sechs PNG-Dateien 'Zigaretten.png', 'Totenkopf.png', 'Bierflasche.png', 'Säufer.png', 'Kaugummi.png', 'LachendesKind.png' vorliegen. Welches Frontpanel sehen Sie, wenn Sie 'Kaugummi' wählen?
Bei messtechnischen Anwendungen schreibt man gern den Offset und die Empfindlichkeit von Sensoren in eine Konfigurationsdatei. Diese Werte können sich ändern. Häufig ist des-
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'
174
8
Dattntransfer von und zur Festplatte
halb der eigentlichen Messung eine Kalibrierungsstufe vorangestellt, n i welcher der Sensor auf bekannte physikalische Größen reagieren muss. Haben sich nun Offset und Empfind ichkeit l geändert, sollen sie über das Programm n i die Konfigurationsdatei geschrieben wer den. Eine ständige Korrektur per Hand wäre zu umständlich. Aus diesem Grunde findet man nicht nur Lese- sondern auch &hreibfunktionen unter 'Punktionen' - 'Programmierung' 'Datei-I/O' - 'Konfigurationsdatei-Vls'. Ferner gibt es dort auch Funktionen, mit denen man Abschnitte aus einer Konfigurationsdatei löschen kann. Machen Sie sich mit einigen dieser Möglichkeiten vertraut, indem Sie die folgende Aufgabe bearbeiten:
IAufgabe 8.10
Ergänzen Sie das Programm in Bild 8.46 derart, dass 'Konfigurationsdatei.txt' verändert wird, z.B. durc.h Erhöhen der Zahlenwerte und durch Umschreiben der Texte. Beim zweiten Aufrufdieses Programms müssten diese neuen Daten dann sichtbar 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'
9
LabVIEW-Kurzüberblick
Lernziele 1. Verständnis für die Arbeitsweise von LabVIEW bei der VI-Programmierung entwickeln. 2. Mit Projekten arbeiten können.
3. EXE-Datei rur ein VI erstellen können.
4. LiBs (LabVIEW libraries) nutzen können. 5. In C programmierte DLLs in LabVIEW einbinden können. 6. Informationsque1len und Programmierhilfen für LabVIEW kennen.
9.1
Aufbau des LabVIEW·Systems
9.1.1
Interpretieren oder kompilieren?
Beim Start von LabVIEW wird zunächst ein Editor aufgerufen, der das Schreiben eines Pro gramms erlaubt, des so genannten VI. Das ist ganz ähnlich wie in herkömmichen l Program miersprachen, etwa in C oder früher in Basic. Nur werden bei LabVIEW nicht wie dort Zeile rur Zeile Anweisungen untereinandergeschrieben, sondern grafische Strukturen erstellt. Hat die Summe dieser Eingaben eine gewisse Vollständigkeit erlangt, kann man sie als Pro gramm ausführen. Man unterscheidet dabei zwei Methoden: 1. Interpretation 2. Kompilierung (übersetzung) Im ersten Fall wandelt bei herkömmlichen Programmiersprachen ein Interpreter die einge gebenen Zeichen Zeile für Zeile in ein Maschinenprogramm um, das der Prozessor des Computers versteht und ausführt. Der Nachtei l ist, dass in einer Schleife der Interpreter bei jeder Wiederholung einer Zeile dieselben Zeichenketten m i mer wieder neu interpretieren, d.h. in Maschinencode übersetzen muss. In der LabVIEW-Version 1.0 wurde ebenfalls so verfahren. Aber schon ab Version 2 entschied man sich für die Kompilierung. Bei der Kompilierung wird das komplette Programm in Maschinencode umgewandelt und erst dann ausgeführt. Diese Methode bewirkt kürzere Rechenzeiten. Wie arbeitet nun ein grafischer Editor? In LabVIEW werden keinesfalls die aus Millionen von Pixeln zusammengesetzten Panels und Diagramme interpretiert, die man bei der Ent wicklung eines VI bi l det. Vielmehr wird beim Setzen von Funktionssymbolen oder Ziehen von Verbindungslinien im Hintergrund ein Zwischencode generiert, der ganz ähnlich aus sieht wie der von herkömmlichen Programmiersprachen.
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
176
Im Internet gibt es zu diesem Thema einen interessanten Artikel in der 'NI Developer Zone', unter ·http://www.ni.com/devzoneflvzone/dr_vi_archived6.htm·. aufden wir uns beziehen. Der Titel heißt 'Ask Dr. VI!'. Die n i der Programmiersprache C geschriebene Anweisung c = (a"'a + O,S)"'b;
(9.1)
würde man in LabVIEW entsprechend Bild 9.1 darstellen.
Bild 9.1 LabVlEW-Programm zur Anweisung (9.1 )
In beiden Fällen kann man die Befehlsfolge abkürzend so notieren, dass sie jemand mit ei nem Taschenrechner ausführen kann, sofern dieser wie z.B. die Hp·-Taschenrechner die so genannte 'umgekehrte polnische Notation' verwendet. Diese lautet: a, quadrieren, 0.5, +, b, *, c, enter
(9.2)
und bezeichnet die Reihenfolge der Tasten, die nacheinander betätigt werden müssen. Der Name einer Eingabevariablen wie 'a' bedeutet dabei das Eintippen eines Zahlenwerts für diese Variable. Der LabVIEW-Editor notiert sich nun, wenn Sie ein Programm wie in Bild 9.1 schrittweise aufbauen, genau diese Reihenfolge der Operationen, die später beim Programmstart auszu führen sind. Er wandelt sie zusätzlich noch in den Maschinencode um, der vom Prozessor Ihres PCS verstanden wird. Wenn Sie also das fertige Programm starten, ruft LabVIEW ein bereits ausführbares Programm auf, das 'Maschinenprogramm'. Das muss nicht erst kompi iert l werden, es ist bereits kompiliert. Natürlich sollte der Editor noch mehr können. Er muss registrieren, wenn Sie eine falsche Verbindungslinie löschen, einen Operator durch einen anderen ersetzen, den Variablentyp ändern und vieles mehr. In all diesen Fällen hat er die symbolische Befehlsfolge in (9.2) zu korrigieren und fortlaufend das geänderte Maschinenprogramm zu erzeugen.
9.1.2
Datenflussprogrammierung
LabVIEW ist datenflussorientiert. Das bedeutet, Funktionen werden dann aufgerufen, wenn alle Daten für sie bereitstehen. Besteht keine Datenabhängigkeit, werden die Funktionen (quasi-)parallel abgearbeitet. Siehe auch Abschnitt 1.6.
r& Ii,-ec� I � �J }]
......
-
w .,
-,
[i.-e0.!...ij -
Bild 9.2 Vertauschungs-SubVl, bereits erklärt in Abschnitt 7.1.3, verbesserte Fassung
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.1 Aufbau des LabVIEW-Systems
177
Beharrt man aufdem Datenflussprinzip in seiner strengen Form, benötigt man nicht einmal die Sequenzstruktur. So kann man auf sie z.B. in Bi l d 7.7, hier nochmals dargestellt in ver besserter Form als Bild 9.2, verzichten und stattdessen Eingänge und Ausgänge zur Erzwin gung des korrekten Datenflusses nutzen, siehe Bild 9.3.
�um� l!:dM!t" 1� � ctl �r Wert
�
tl RefNum b o
1� � Ctl � �
Wert
Wert
�
l� � ctl �I �
Wert
Bild 9.3 Oben: SubVl mit der gleichen Vertauschungsfunktion wie beim SubVl in Bild 9.2. Zu beachten ist dabei, dass Eigenschaftsknoten von oben nach unten abgearbeitet werden: Zuerst wird der Wert von 'b' ausgelesen und auf die Ausgangsleitung gebracht (zur späteren Speicherung nach 'a'), dann erst der zwischen gespeicherte Wert von 'a' eingelesen und nach 'b' gebracht Unten: Wie oben, aber zusätzlich bewirken auch noch die miteinander verbundenen Fehlerein Iausgänge das sequenzielle Verhalten
Die Nutzung der Sequenzfunktion verstößt also gegen das Prinzip der reinen Datenflusspro grammierung. Doch hat der Versuch, 'Reinheit' zu erzwingen, gravierende Nachteile. Erstens sind die überlegungen, die man anstellen muss, um die richtige Reihenfolge der Ausführung von Funktionen zu bewirken, häufig sehr mühsam und fehleranfa.J.lig. Zweitens kann das Beharren auf Reinheit die Anwender abschrecken und längerfristig sogar zum Untergang einer Programmiersprache führen. Dafür ist die Programmiersprache APL (A Programming Language) von IBM ein warnendes Beispiel. In den 70er-Jahren entwickelt, verbannte APL alle Schlüsselworte wie 'ir, 'then', 'else' aus seinem Konzept und ebenso die Deklaration von Variablen. Variablen bekamen ihren Typ m i plizit durch die Eingabeform, die der Anwender wählte. Die Konsequenz war, dass viele Spezialzeichen erforderich l wurden und damit spe zielle Tastaturen mit zusätzlichen Sonderzeichen. Trotzdem war APL seinerzeit recht ver breitet, und manche Experten erwarteten sogar die Verdrängung aller anderen Program miersprachen durch APL Es kam aber umgekehrt: APL wird heute nicht mehr benutzt und ist kaum noch bekannt. LabVIEW hat diesen Fehler nicht wiederholt. Es hat seine Grundideen mit den erprobten Konzepten anderer Programmiersprachen angereichert und überdies Schnittstellen zu diesen geschaffen. Das werden wir in Kapitel 17 noch näher ausführen. Merke: LabVIEW-Vls werden nicht interpretiert, sondern schon während der Editierphase in Maschinencode übersetzt_ Merke: LabVIEW ist eine datenßussorientierte Programmiersprache.
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 LabVIEW-Kurzilberblick
178
9.2
Projektverwaltung
Seit der Version 8,0 gibt es auch n i LabVIEW die von Entwicklungsumgebungen anderer Programmiersprachen wie z.B. C her bekannte Möglichkeit, einzelne Programme in den größeren Zusammenhang eines Projekts zu stellen. Mit Hilfe der Projektverwaltung lassen sich alle Dateien, die zum selben Projekt gehören, komfortabel handhaben. Ein neues Pro jekt kann man aus dem Startfenster heraus über 'Neu' - 'Leeres Projekt' erstellen oder aus einem geöffneten VI heraus mit 'Projekt' - 'Neues Projekt' (oder auch mit 'Datei' - 'Neues Projekt'). Besteht bereits ein Projekt, kann es im LabVIEW-Startfenster mit 'Öffnen' durch einen Dateiauswahl-Dialog gefunden werden. Wurde das Projekt erst kürzlich bearbeitet, kann man es direkt mit 'Öffuen' - '
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 � Toteni
r
r � �·pno �' ei � Ei �. Ei �Y
L 'e
�·wav T•.....w\.wav m>ee.wav �en
Ud-5Joediloationen Bild 9.5
Projekt-Explorer mit den Dateien, die vom Programm 'FlexiblerAutomat.vi' benötigt werden
9.3
Erstellung von EXE-Dateien
9.3.1
Warum EXE·Dateien?
Ausführbare Programme nennt man EXE-Dateien, wei l der Dateiname unter Microsoft Windows üblicherweise diese Erweiterung hat. Nach Abschnitt 9.1.1 ist aber ein korrekt entwickeltes LabVIEW-VI bereits ausführbar. Warum gibt man ihm die Namenserweiterung 'vi' und nicht 'exe'? Der Grund ist, dass ein normales VI nicht ohne das komplette LabVIEW-System laufen kann, das ihm die verschiedenen Funktionen wie '+', '>t' 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 Dreie<_.>i 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<:ksberechnung\Mein Dreieck' als 'Dreieck.exe'.
"",,,,, "',on ,�
,,,,t�" d.. �"'"
,= ,,,,-,,,,,",,,
5porlon ", l...J"t<,
1""""'"''·''''''''''' ·'"''''''''' '' ---
Bild 9.8 Voreingesteiite Applikations-Parameter unter 'Angaben zur Anwendung'
En>telrqoo cl« �"'o
>= ,,,, �,,,,",,,
I
Bild 9.9 Vom Anwender gewählte Applikations-Parameter unter 'Angaben zur Anwendung'
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 LabVIEW-Kurzilberblick
182 I> '1.", D,..eck E,genscha[b,n ��� -
!rJst�
P "joMclot_
E3
_C�'"
� Dr_�" Iiiil Dr_"'-tl,�
..
.. ..
----
:,f.i
Bild 9.10 Festlegung eines Start-Vls, hier 'DreieckMain.vi'
8. Ruft man dieses Programm mit Doppe1klick auf, startet es von selbst. Die Exe-Datei hat ein Panel, aber kein Diagramm! Im übrigen arbeitet das Programm wie das ursprüng liche VI. Die Projektdatei hat sich jetzt leicht geändert, siehe Bild 9.11.
Bild 9.11 Projekt-Explorer mit zusätzlicher Eintragung. Doppelklick auf die letzte Ein tragung zeigt die für die Kompilierung gewählten Parameter
Die Datei 'Dreieck.exe' (im Beispiel) kann aus ihrem Verzeichnis heraus mit einem Doppel kliek gestartet werden. Will man sie einem Kunden aushändigen, der kein LabVIEW-System besitzt, muss man dafür sorgen, dass aufseinem Rechner die LabVIEW-Runtime-Bibliothek vorhanden ist. Das lässt sich aufverschiedene Weise erreichen: 1. Der Kunde holt sich die LabVIEW Runtime Engine (hier Version 8.0 bzw. 8.5) aus dem Internet. Sie wird von National Instruments kostenlos vertrieben. Oder
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
183
2. wir erleichtern dem Kunden die Aufgabe, n i dem wir ihm eine CD mit dem übersetzten Programm und einem Installationsprogramm mitgeben, das wir vorher erzeugt haben. Im zweiten Fall schreiben wir zunächst den Ordner 'builds' mit Unterverzeichnissen und dem kompilierten EXE-Programm auf die CD, siehe Bi l d 9.12.
r
�""�
I0
�""-
llKld
�h>
�"",,,,'eo
"'''"''
"'oToeo
•
I!l D <�.I09
" O� � a ",__oc� "' -
' �_
,
_ . •
",';"±. • I",,, ",.;.,± . • ,.
�';"± ;n
Go-ioßo 1 <"
�_ .>.LI'5ES·O"�
18.00.2008 15,,.
270<" � 3<"
18.00.2008 15,,. 18.00.2008 15,,.
Bild 9,12 Die drei Dateien 'Dreieck.aliases', 'Dreieck.exe' und 'Dreieck.ini' als Teil des Ordners 'builds' 'Dreiecksberechnung' - 'Mein Dreieck'
Danach erzeugen wir einen 'Installer' für die Installation der LabVIEW-Runtime-Bibliothek, Version 8.0. Wir legen dazu ein Projekt 'EinzeJ-Installer.lvproj' an und wählen jetzt unter 'Build-Spezifikationen' im Kontextmenü (siehe Bild 9.7) 'Neu' - 'Installationsprogramm'. Einzutragen sind hier die Bezeichnungen unter den Kategorien 'Produktinfonnationen' und - besonders wichtig - unter 'Zusätzliche lnstaller' nach Bild 9.15. Danach 'Build' drücken. Der Projekt-Explorer zeigt sich nun wie in Bild 9.13. Dort im Kontextmenü von 'Einzel Installer' auf'Build' drücken.
Bild 9.13
s ., � I!l fl ",_ktefecw..... I!l fl Enz�-I,"'*r
" 0_
[;i fl _ lost"", ltI i!:I b;n
, , .� f) ""WO'tfib
Bild 9,14
Projekt-Explorer für den Einzel-Installer
0*
D""eo:<&ior Dlotea&ior Dlotea&ior H" ID-DIote< 2,3%t" "" <""",,,,,Iotmseinst,, ,
� Wec"""zu
-,�
18m,l(OJ 15:-19 18,09,l(OJ 15:-19 18,09,l(OJ 15:-19 18,09,l(OJ 15:-19 11.I1.lOOIOO:-IS 18,09,l(OJ 15:-19
Ordner und Dateien von 'Einzel-lnstaller'
Das Ergebnis ist n i unserem Beispiel zu finden unter 'D:\LabVIEW_Einfuehrung, 4. Auflage \Auflagc4\KapiteJ09\builds\Einzel-Installer\Meininstaller\Datenträger'. Bild 9.14 zeigt die
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 LabVIEW-Kurzilberblick
184
Reihenfolge der Ordner und einiger Dateien, von denen insbesondere 'setup.exe' wichtig ist. Man schreibt 'Einzel-Installer' mit allen Unterordnern und Dateien ebenso wie die Applika tion auf eine CD und händigt diese dem Kunden aus. Er hat dann nur noch 'setup.exe' auf zurufen, um die LabVIEW Runtime Eogine auf seinem Rechner zu installieren und so 'Dreieck.exe' lauffahig zu machen. Wir könnten statt des Einzel-Installers auch einen Installer erzeugen, der die auszuführende EXE-Datei mit umfasst. Doch wird der Vorgang dann komplizierter und fehleranfalliger. Wir verzichten deshalb auf die Besprechung dieser Methode. • "o
MMun'" Fa,,,,,,,,,,,,"
!ro.b!,_ ,"".... ""' >IottruI rID-'=,
r .......
r: NIH,,_,�W-
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<0' •.•. t r: m Ll\l l .',O
. �
!3
'""""ooou'-"'l'"''-''''''O """ ''''' � _ sr..-od l!b
r: NI__,e", r: NI-Do\()-o,",' r: NID:POI/ER L ' 1 r "1«+1 2,',' r NI""''''.5 r "I-HiOJO 1.5,3 r Hl+FSO ',O,' r "l-llfS<; 1.3,'
r: "�>CoPE 3.<,0 r: "'_"""TOH' r: "l_"'''' CCrl.,..,,,,,,,, ,,,,,,, •.'
"J-"'''' ''... '' ." o;,"'_"'"_[""__...,.'''" ....roo h''....',
-.., "-',�, ..,,,._o.i ...""" �"' '''-..t .... cnJ '''I ...... .-ho-_fon. _t�""""" d«�, '�""o.i
Bild 9.15 Auswahl der 'NI LabViEW Run-Time Engine 8.2' fOrden Installer
Wie schon erwähnt, sind ursprüngliches VI und die zugehörige EXE-Datei annähernd gleich schnell. Ein Test mit den abgewandelten Programmen 'DreieckMainZeit.vi' und 'Dreieck MainZeit.exe' ergab bei I-Millionen-facher Wiederholung der Berechnung Laufzeiten von 3819 ms bzw. 2678 ms. Etwas ist also durch die Kompilierung doch noch zu erreichen. Dabei ist die Laufzeit des VIs unter LabVIEW 8.0 schon wesentlich kürzer als unter LabVIEW 7.1, bei dem derselbe Computer 10190 ms benötigte!
Merke: VIs können in EXE-Dateien übersetzt werden, die ohne das LabVIEW-System lauffiihig sind. Sie benötigen zusätzlich die LabVIEW-Runtime-Bibliothek.
Merke: VIs und ihre zugehörigen EXE-Programme laufen etwa gleich schnell.
IAufgabe 9.1
Führen Sie die Umwandlung VI � EXE-Datei am Beispiel 'FlexiblerAutomat.vi' aus Abschnitt 8.5.3 durch. Beachten Sie, dass 'FlexiblerAutomat.vi' einige zusätzliche Dateien benötigt, um korrekt zu arbeiten! Portieren Sie das lauffahige Programm auf einen Rech ner ohne LabVIEW-System.
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'
ISS
9.4 Entwick/ungsumgebung von LabVIEW 8.x 9.4
Entwicklungsumgebung von LabVIEW B.x
Ab Version 8.0 von LabVIEW weist die Entwiclclungsumgebung einige Neuerungen auf, die sich vorteilhaft bei der Erstellung umfangreicherer Programme auswirken.
9.4.1
Deaktivlerungsstrukturen
LabVIEW 8.0 enthält zwei neue Elemente: 'Diagramm-Deaktivierungsstruktur' ('Diagram Disable Structure') und 'Bedingte Deaktivierungsstruktur' CConditional Disable Struc ture'). Sie sind vorteilhaft bei der Entwicklung und beim Debuggen von VIs. Die 'Diagram-Deaktivierungsstruktur' kann durch eine Case-Stuktur ersetzt werden, die bis einschießlich l LabVIEW 7.1 die einzige Möglichkeit war, für das Debuggen zeitweise Tei le des Programms zu deaktivieren: Man umgibt den Teil, den man testen will, mit einer Gase
Struktur und setzt den Selektor mit einer booleschen Konstante aufTRUE. Der FALSE-Teil enthält den Programmabschnitt, der entweder schon getestet ist oder den man erst später testen möchte. Startet man nun dieses VI, wird nur der Teil durchlaufen, den man testen will.
Das wird üblicherweise mit eingeschalteter 'Highight-Funktion' l (der gelben Lampe m i Dia gramm) durchgeführt. Nachteil dieser Methode: Der FALSE-Teil der Case-Struktur darf keine syntaktischen Fehler enthalten, wei l dann das VI überhaupt nicht laufen würde. Diesen Nachteil venneidet die neue 'Diagram-Deaktivierungsstruktur'. Auch muss man keinen Selektor mehr bedienen. Es genügt, die zu testenden Teile des Programms n i den Teil der Struktur zu schieben, der am oberen Rand mit 'Aktiviert' gekennzeichnet ist. Der nicht oder später zu testende Teil kommt n i den Rahmen der Struktur, der mit 'Deaktiviert' bezeichnet ist. Die Funktionen in diesem Teil werden nicht ausgeführt. Sie sind aufgehellt dargestellt. Die 'Diagram-Deaktivierungsstruktur' unter 'Funktionen' - 'Programmierung' - 'Strukturen' ist n i der vierten Zeile links zu finden, siehe Bild 9.16. Deaktiviert ...
Bild 9.16
Diagramm Deaktivierungsstruktur Daneben befindet sich die 'Bedingte Deaktivierungsstruktur'. Sie ist noch wichtiger. Auch mit ihr können Bereiche des Diagramms deaktiviert werden. Doch erfolgt im Gegensatz zur 'Diagram-Deaktivierungsstruktur' die Aktivierung nicht im Diagramm selbst, sondern global in der Projektverwaltung, und zwar für a l l e 'Bedingten Deaktivierungsstrukturen' zusam men (siehe dazu Abschnitt 9.4.2 zur Projektverwaltung, Bi l d 9.22, 'Symbole für bedingte Deaktivierung'). Für die Entwicklung großer Programme ist das ein unschätzbarer Vorteil. Solche Systeme testet man üblicherweise, indem man im Entwicklungsstadium Testausgaben programmiert, die man später beim fertigen Programm beseitigen muss, weil sie den An wender nur verwirren. Früher mussten die Anzeigeelemente für solche Testausgaben einzeln und von Hand entfernt werden, was bei großen Systemen leicht zu neuen Fehlern führen konnte. Ab LabVIEW 8.0 lässt man die Testausgaben unverändert stehen und deaktiviert nach Abschluss der Programmierarbeiten generell alle 'Bedingten Deaktivierungsstrukturen', in die man vorher bei der Programmentwicklungdiese Testausgaben eingefügt hatte.
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 LabVIEW-Kurzilberblick
186
Ein anderer Vorteil ist der folgende: Will man eines Tages das Programmsystem weiterent wickeln, stehen immer noch alle Testausgaben zur Verfügung. Auch lassen sich, wie oben schon erwähnt, bei der Entwicklung syntaktisch fehlerhafte Abschnitte des VI auskommen tieren, so dass die n i teressierenden Teile des Programms trotzdem ausführbar sind. Bi l d 9.17 und Bild 9.18 zeigen ein BeispieL Im Bild 9.17 ist die bedingte Deaktivierungsstruk tur auf 'Debug==true, Standard' gesetzt, in Bild 9.18 auf 'Debug==false'. In beiden Fällen wird auf dem Panel eine Sinuskurve als Graph (Signalverlaufs-Graph) angezeigt, jedoch werden im ersteren Fall über 'Signal (Ausgang)' zusätzlich noch die Zahlenwerte des Arrays abgebi l det, welches die Sinuskurve definiert. Siehe dazu Bild 9.19 und Bild 9.20. Die Um schaltung erfolgt, wie schon erwähnt, in der Projektverwaltung, siehe Abschnitt 9.4.2.
Bild 9.17 Beispiel fürdie Aktivierung des Programmbereichs, der für das Testen (Debug= true) vorgesehen ist. über die 'Bedingte Deaktivierungs struktur'
Bild 9.18
, ,
ö
,.;:J'
Beispiel für die Deaktivie rung des Programmbereichs, der später für den Anwender uninteres sant ist (also Debug= false), wieder über die 'Bedingte Deaktivierungs struktur'
"" 0
_.. ,
r� o.�
--
0.'
.00
"-
'00
<.� <.'
<.�
., .
°
-..
00:00:00
1.'10.""-""""
..
'.-
0.'
0.'
'"
0.'
0.'
,
, r;o
. 0,707107 ,.""" 0."'"'
O,7«
Bild 9.19
Ausgabe des Arrays, das die Sinuskurve definiert. für Testzwecke
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.4 Entwick/ungsumgebung von LabVIEW 8.x
ö
......
: ,00
l'E::r
187
l:::::J
_..
••"
,
r�
o.� 0.'
<."
Bild 9.20 Jetzt, im Gegensatz zu Bild 9.19, nur die Ausgabedes Sinus
<.'
<.� ,
.
.
0.'
0
0.'
'"
0.'
0.'
,
Graphen, des einzigen Anzeige elements, das den Anwender noch interessiert
Debug·Elnstellung In der Projektverwaltung
9.4.2
Ein weiterer Vorteil der Projektverwaltung (siehe Abschnitt 9.2) ist die Möglichkeit, die bedingte Deaktivierungsstruktur dort generell ein- und auszuschalten: Nachstehend wurde ein Projekt für das Beispielprogramm 'BedingteDeaktivierung.vi' gebildet, siehe Bild 9.21. o ,
EI . I . rIS .. .. ' 1I L il ""","",eD<�,,,,,.,, � i· V Atlo.IoJd<.elon ;. 'i:; BuiIj.<;p,,,t.>:,,,,,,,
Bild 9.21
Projekt für das Beispielprogramm BedingteDeaktivierung.vi
Die Entscheidung über Debuggen oder Nichtdebuggen wird gemäß Bild 9.22 getroffen. I> E,genschaften me"",. Computers
x
•
1I-5«v«: Konhpotion 1I-5«v«: CorJV.':«-llqfl
,,-
_
'1 5o
,I
,,C� 0'
Bild 9,22 Entscheidung über bedingte Kompilierung. Zunächst wird 'Debug' in das Symbolfenster rechts und 'true' in das Wert'-Fenster daneben eingetragen und mit 'Hinzufügen' in die Liste unten übernommen. So werden alle bedingten Deaktivierungsstrukturen im Projekt auf 'Debug== true' gesetzt. Die anderen Eintragungen zu (PU und Betriebssystem (OS) sind bereits voreingestellt
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 LabVIEW-Kurzilberblick
188
Man öffnet dieses Fenster m i Projekt-Explorer im Kontextmenü von 'Mein Computer', in dem man links die Kategorie 'Symbole für bedingte Deaktivierung' wählt. In der zugehörigen Liste rechts werden verschiedene Symbole und ihre aktuellen Werte verwaltet. Die Werte für
die CPU und rur das Betriebssystem (OS gleich Operating System) sind bereits voreingestellt.
Neue Symbole lassen sich mit den beiden Eingabefeldern im oberen Bereich rechts erstellen und über 'Hinzufügen' in die Liste unten übertragen. Hier kann auch über die 'Bedingten Deaktivierungsstrukturen' des gesamten Projekts entschieden werden: Man trägt rechts oben entweder 'Debug' gleich 'true' oder 'Debug' gleich '(alse' ein. Anschließend werden die Werte mit 'Hinzufügen' in die darunterstehende Liste übernommen. Der Wert eines dort befindli chen Symbols kann nachträglich auch durch Doppelkliek geändert werden. Die Symbol namen innerhalb der Liste müssen eindeutig sein. Symbole aus der Liste streicht man mit 'Ausgewählte Elemente entfernen'.
9.5
LabVIEW·Bibliotheken
Klickt man das Verzeichnis unter ' . . .\National Instruments\LabViEW 8.0' an, sieht man die Vertei l ung der Software auf eine Reihe von Unterverzeichnissen. Das Ergebnis ist n i Bild
9.23 dargestellt. -�
""'"
. t
E�ort""
E�'M �...
x • • • • • • 8
J . liI 0 Pfcjocl ,.....
Bild 9.23 Unterordner im System von LabVlEW 8.0
Eine ähnliche, jetzt aber einspaltige Ansicht erhält man beim Aufruf von 'Werkzeuge' ' . . . LLB-Manager' nach Wahl des richtigen Verzeichnisses, siehe Bild 9.24 rechts. LLB ist die Abkürzung für LabVIEW Library. Die Existenz von LLBs ist historisch begrün det: Beim Übergang vom Apple Macintosh zum Windows-PC m i Jahre 1996 wollte National Instruments nicht auf die Vorteile verzichten, die das Apple-Betriebssystem bezüglich der Wahl von Dateinamen gegenüber Windows damals hatte (z.B. keine Beschränkung auf nur
8 Zeichen). Deshalb erhieJt LabVIEW sein eigenes Dateisystem. Eine LLB-Bibliothek ist,
Ausleihe: 31_07_2009 00:00:00 - 08_0S_2009 00:00:00, ID:7ac0427d5929S1cfOS9d91b1gecaOOaO, Zenlral- u 2009_07_31 21:42:39 +02'00'
9.5 LabVIEW-Bibliotheken
189
vom Betriebssystem aus gesehen, kein Verzeichnis, sondern eine einzelne Datei, in der sich mehrer VIs befinden. Das ist auch heute noch von Vorteil, z.B. beim Kopieren. Man muss nicht befürchten, dass durch einen Bedienungsfehler einzelne VIs verloren gehen. Die Verzeichnisse in Bild 9.23 rechts sind keine LLBs, sondern noch gewöhnliche Unterver zeichnisse. Steigt man aber n i der Hierarchie weiter ab, findet man an verschiedenen Stellen LLBs, so z.B. in 'examples' - 'analysis', wie Bild 9.24 zeigt.
, �... ..,.. . _.. meas>: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
..!J .
oc c.u.ed 5pecttun.yj Ed"IO Detector.101
iIl Edo;Je Dd:ect""' ..... zto COi'"I'>Ub> il 1mogeCorrv=ion ..... OCl.yj il P"""",I. n....... ... .yj
=
zto Nyqo.i
iIl dear or <001:.101
r'M'
il Ed"IOGeoefotc.-.yj "-idct.yj � sntt .yj R ... o"u.yj
iIl _....rnx.vi
�
.,r
Bild 9.25 Vls in der LLB 'dspxmplJlb'
Es würde den Rahmen des Buchs sprengen, würden wir die Inhalte aller Unterverzeichnisse l d 9.23 kommentieren. Wir treffen deshalb nur eine kleine Auswahl: von Bi
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
190 •
'examples' enthält Beispiele zum Programmieren in LabVIEW. Öffnet man dieses Ver
zeichnis, sieht man die Namen weiterer Unterverzeichnisse wie 'analysis', 'apps', 'eins', 'comm' usw. bis 'Waveform'. Gelangt man in diese Unterverzeichnissse, stößt man wie derum auf LLBs, also LabVIEW-Bibliotheken. Die Vls einer LLB lassen sich in ein ge wöhnliches Verzeichnis konvertieren. Mehr dazu in Abschnitt 9.6. •
'manuals' enthält pdf-Dateien mit Bedienungsanleitungen oder Beschreibungen wie z.B. 'LV_Fundamentals.pdf', eine Einführung in die Grundlagen von LabVIEW,
•
'menus' enthält die Aufzeichnungen über die Palettenmenüs 'default', 'express' und eige ne Menüs, die im Abschnitt 2.4 (nur im Internet) besprochen werden.
•
'templates' enthält Vls, die als Vorlagen zur Eigenentwicklung genutzt werden können, damit die Programmierarbeit nicht jedes Mal ganz von vorn beginnen muss.
•
'user.lib' kann zum Speichern selbst entwicke1ter Funktionen genutzt werden. Speichert man dort z.B. die Funktionen 'DreieckSub.vi' und 'TauschenSub.vi' aus den Abschnitten
5.2.1 und 7.1.3, kann man diese beim nächsten Aufruf (!) von LabVIEW unter 'Funktio nen' - 'Eigene Bibliotheken' (vorletzte Zeile unten) wiederfinden und von dort aus ins Diagramm eines VI ziehen. Bi l d 9.26 zeigt das.
�'
-I till
(igerJe6Uot..
T.......ctteoSW .,;
Bild 9.26 Selbst entwickelte SubVls in 'userJib'
Entsprechend kann man auch eigene Bediene1emente entwickeln, unter 'user.lib' spei chern und später in 'Elemente' - 'Eigene Elemente' wiederfinden. Wir geben ein Beispie1: Wenn der Platz auf dem Panel knapp wird, lassen sich mit Hilfe von Registerkarten ver schiedene Bedien- oder Anzeigeelemente übereinanderlegen. Das zeigt Bild 9.27.
_eI
_2 1
:'- 1
_ I _2 1
....m.ol_otts
I i.lI.l5,OO
_.
: -� "
0'
..
Bild 9.27 Zwei Registerkarten, die mit Hilfe der Reiter 'Seite 1', 'Seite 2' umgeschaltet werden Man kann auch drei oder mehr Registerkarten erzeugen. Man bildet sie mit 'Elemente' 'Container' (dritte Zei l e Mitte) - 'Registerkarte', wobei standardmäßig zwei Karten er scheinen. Mit dem Kontextmenü kann man das erweitern. Eine so definierte Registerkartenmenge kann man als selbst definiertes Element in 'user.lib' speichern. Dazu im Kontextmenü 'Fortgeschritten' - 'Anpassen' wählen. Das er-
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS929S1cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
9.5 LabVIEW-Bibliotheken
191
zeugt ein weiteres Panel mit dem Namen 'Element 1 Bedienelement'. Hat man vorher be reits Bedienelemente auf die Registerkarten gebracht wie in Bild 9.27, verschwinden die se. Bild 9.28 zeigt ein Beispiel mit drei Registerkarten. Speichert man das dort vorgestellte Bedienelement 'DreiRegisterkarten.ctl' in 'user.lib', findet man es beim nächsten Lab VIEW-Aufrufunter 'Bedienelemente' - 'Eigene Elemente', wie Bild 9.29 zeigt. �
D re,Reg,sterkarten.ctl Bed,enelement
•
f' 5eb t
I
SeteZ
I
5eb J
•
Bild 9_28 Drei Registerkarten als benutzerdefiniertes (Bedien-)Element •
'vi.lib' enthält die vom LabVIEW-System genutzten Funktionen. Hier sollte man keines falls eigene Routinen speichern!
.
"""""
· """" · '""""
· "..., . • �desqI o..nd smJaI:ion • zu.atzpakrte •
5;IerJe Elemente
:1 . � �EIeme.,
DreJteo$terk. . .
•
-
Element ....... . . . , IIE T & ActtveX
•
Bild 9.29 Selbst definiertes Bedienelement unter 'Elemente' - 'Eigene Elemente'. Man sieht unten dasselbe Symbol wie im Panel von Bild 928 rechts oben
IAufgabe 9.2 Erzeugen Sie die in Bi l d 9.27 gezeigten Registerkarten samt Bedienelementen und pro grammieren Sie das Diagramm zum 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'
9 LabVIEW-Kurzilberblick
192
IAufgabe 9,3 Definieren Sie ein eigenes Bedienelement, das aus vier Registerkarten besteht, und spei chern Sie es als CtI-Element unter 'user.lib'. Verlassen Sie nun LabVIEW, rufen Sie es dann erneut auf und programmieren Sie ein VI, das mit dem von Ihnen erstellten Be dienelement arbeitet.
9.6
Umwandeln von LLB-Bibliotheken
Wie schon erwähnt, ist eine LLB-Bibliothek kein Verzeichnis, sondern eine einzelne Datei, die meist mehrere verschiedene VIs enthält. Man kann nun eine LLB in ein gewöhnliches Verzeichnis mit verschiedenen Dateien umwandeln und umgekehrt ein Verzeichnis mit verschiedenen Vb zu einer LLB als einzelner Datei zusammenfassen. Beispielsweise können wir die in Bild 9.24 oben angezeigte LLB 'dspxmpl. lb' zu einer Samm l lung einzelner VIs im Verzeichnis '. . .\Kapitel 09\LabBeispiel\0930-Testordner' umformen. Achtung! Bei der Umwandlung verschwindet die ursprüngliche LL8. Sie wird durch die Vls im Testordner ersetzt. Man sollte deshalb solche Umwandlungen niemals mit den Systemda teien von LabVIEW durchführen. Im schlimmsten Fall ist dann eine Neuinstallation faIlig! Im nachstehend gezeigten Beispiel wurde deshalb zunächst die Systemdatei 'dspxmpl.llb' auf übliche Weise nach '. . .\Kapitel 09\LabBeispiel\0930-Testordner' kopiert, siehe Bild 9.30.
fQ&:ei
•
r,eiOftdffi �" E"
I O fu'i>:k . l' .< 50.<:"'" � Or_ r X It) : . : . Id,�", 13D.\l!obIIEWJ'rl""'....,..., ",. 1
,
Bild 9.30
_
.
823Ki l"INIEWVIltrory
12.11.= 12:35
.!J
Der Testordner enthält hier eine Kopie der LLB-LabVlEW-$ystemdatei 'dspxmpLllb'
Mit 'Werkzeuge' - 'LLB-Manager. . .' rufen wir aus einem VI den LLB-Manager und stellen ihn auf' . . . \Kapitel 09\LabBeispiel\0930-Testordner'. Mit 'Bearbeiten' - 'Umwandeln . . ' ein.
Bild 9.31 Testordner mit einer markierten lLB. Mit 'Bearbeiten' - 'Umwandeln' erzeugt man die Verzeichnisse in Bild 9.33
Gemäß Bild 9.31 starten wir dann die Umwandlung und erhalten das Fenster in Bild 9.32. Dort belassen wir es bei den voreingestellten Parametern. Nach 'Umwandeln' erhalten wir schließich l die in Bild 9.33 dargestellten zwei Einträge. Auch der Testordner enthält jetzt diese Einträge, siehe Bild 9.34.
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.6 Umwandeln von LLB-BibIiotheken 1 0 _ """ " '" """"00'.....
193
ll"'
o.�""n
�".""",
1"0''''''' '''; '''
:3 :3 Bild 9,32 Optionen zur Umwandlung
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
-
-
// Re1he cpp n
Def1niert den hnsprungpunkt fur d,e Dll-.l.mrendung
#includo; 'stda!" h' EOJl .l.PIENTRY Dlll!ain( H.l.NDIE hl!odule, D\lORD ul_reason_for_call lPVOID IpReserv�
return TRUL
double \lIN"PI su.üeren( long n )
{
double s-O 0 long k, for (k-1 , k< on, k++) s+-l O/(k*k) return (s)
Bild 9.37 Queilcode eines C++-Programms, das Formel (9.3) realisiert •
•
•
•
Bei der nächsten Frage 'What kind of Dll would you like to create?' ist anzukreuzen 'A simple Dll project'. Nach einigen weiteren Bedienschritten erhält man automatisch den oberen Teil des n i Bild 9.37 dargestellten Quellcodes. Nun erst beginnt die eigentli che Programmierung: Dabei wurde der Funktionsname 'summieren' willkürlich gewählt. Diesem Namen muss die Deklaration 'double WINAPI' vorausgehen, wobei das Schlüs selwort 'WINAPI' unverziehtbar ist! Wir müssen zusätzlich eine so genannte DEF-Datei erzeugen, der wir im Beispiel den Namen 'Reihe.der gegeben haben. Dabei ist die Endung 'der ebenfalls unverziehtbar, wenn die spätere Konfigurierung des ClF-Knotens auf einfache Weise erfolgen soll. Die Datei erhält den in Bi l d 9.38 gezeigten Inhalt. I!' Re,he.def [&to.
IBRAJl.Y RnH� EXPORTS surm1eren
•
•
Bild 9.38 OEF-Datei für die OLL 'Reihe' mit der Funktion 'summieren'
In unserem Beispiel enthält die Dll nur die einzelne Funktion 'summieren'. Man kann aber beliebig viele weitere Funktionen im Quelleode hinzufügen. Deren Namen sind dann n i der DEF-Datei ebenfalls mit 'EXPORTS . . . ' aufzuführen. Zuletzt ist die DLL zu kompilieren. Der Microsoft Visual C++ 6.0 Compiler erstellt nun ein Verzeichnis 'Reihe' mit mehreren Dateien wie 'Reihe.dsp' und anderen. Dort findet man auch die von uns erzeugten Dateien 'Reihe.cpp' (Quelleode), 'Reihe.def' und das Unterverzeichnis 'Debug'. Letzteres enthält weitere Dateien, darunter auch 'reihe.dll', die für die Konfigurierung des ClF-Knotens wichtig ist.
9.7.2
Anschließen einer OLL an einen eLF-Knoten
Einen ClF-Knoten findet man unter 'Funktionen' - 'Konnektivität' - 'Bibiotheken l & Programme' (links oben) - 'Knoten zum Aufruf externer Bibliotheken' (links). Wenn man ihn ins Diagramm zieht, hat er die in Bi l d 9.39 gezeigte Form. Bild 9.39 elF-Knoten ('Knoten zum Aufruf externer Bibliotheken') unmittelbar nach dem Aufruf
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 LabVIEW-Kurzilberblick
196
Wir müssen nun die Verbindung zur gewünschten DLL erstellen, d.h., wir haben zu konfigurieren. Dazu m i Kontextmenü des Knotens 'Konfigurieren. . . ' aufrufen. Wir erhalten ein Fenster wie n i Bild 9.40 (bis LabVIEW 8.0, später leicht geändert, siehe Bild 15.21). I> Aufruf eKterner B Ib lIotheken
1<1
I
FuiOiico.spotot)'P:
fo.n:Name(void);
F
I" "
'*
'
"I
I
Abbrechen
�e
Bild 9.40 Konfigurationsfenster für einen elF-Knoten (LabVlEW 8.0, spätere Versionen siehe Bild 15.21) beim ersten Aufruf, noch weitgehend leer
Hier sind folgende Eintragungen vorzunehmen: •
•
•
•
•
•
Pfad zur DLL unter 'Bibliotheksnamen oder Pfad', Das kann mit der Suchtaste rechts geschehen.
Als Funktionsnamen wählen wir in unserem Beispiel 'summieren'.
'Aufrufkonventionen' werden umgeschaltet auf 'stdcaU (WINAPI)'. Das entspricht der Deklaration im C++-Quellprogramm. Achtung: Belässt man es bei der Standardvorgabe 'C', kann später LabVIEW abstürzen. Nun werden die Parameter eingetragen: Der Parameter von 'return type' ist in der Zei le 'Typ von 'void' auf 'Numerisch' umzustellen. Dann erscheint eine weitere Zeile 'Daten typ'. Hier '8-Byte-Double' wählen. Zuletzt 'Parameter danach einfügen' aufrufen und auf 'Numerisch', 'Vorzeichenloser 32-Bit-Integer' sowie auf 'Wert' (die A1ternative wäre 'Zeiger auf Wert', wenn wir m i Quelkode mit Zeigerübergabe gearbeitet hätten) stellen. Der Prototyp der Funktion ist jetzt 'double summieren(unsigned long argl);' Siehe dazu Bild 9.41 links unten. Abschließen der Konfiguration mit 'üK', Der Knoten hat sich jetzt verändert und zeigt die in Bild 9.42 dargestellte Fonn. Nun kann der Knoten wie eine eingebaute LabVIEW-Funktion aufgerufen werden. Im Beispiel fügen wir ihn an Stelle der inneren FüR-Schleife in Bild 9.36 in Rahmen [ I ] ein und erhalten das n i Bild 9.43 und Bild 9.44 dargestellte Programm.
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
197
-
\> Aufruf eKtern�r 6Ib�ott.,.,ken
�otctyp;
(Ä
I --I --!!!.J
Bild 9-41 Konfigurationsfenster für den ClF-Knoten mit allen Eintragungen (LabVlEW, Version 8.0)
lIIl!l!l �
Bild 9.42 CLF-Knoten nach der Konfiguration zum Einbinden der OLL-Funktion 'summieren' 1 0..2
..
...
N
(j]
•
Bild 9-43 Reihenberechnung mit CLF-Knoten, der die Funktion 'summieren' in LabViEW einbindet
Dieses VI ist ungefähr zweimal so schnell wie das VI von Bild 9.35 und benötigt eine Laufzeit von nur noch 0,5 s.
Bild 9.44 Panel zum VI aus Bild 9.43
Der Aufbau einer elF im Anschluss an das Konfigurieren ist prinzipiell immer gleich: Das oberste Feld links ist leer. Die Felder darunter enthalten Abkürzungen für den Typ der verschiedenen Eingabeparameter (bei uns U32 für den einzigen Parameter 'Gliederzahl n'). Auf der rechten Seite steht in der obersten Zeile stets genau ein Returnwert (hier 'Summe' vom Typ DB1), weil eine eLF-Funktion immer nur maximal einen Rückgabewert liefert. Die Ausgänge darunter enthalten nur Kopien der links eingespeisten Eingabeparameter. Siehe dazu Bi l d 9.43. Das Panel dieses VI ist n i Bild 9.44 dargestellt.
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 LabVIEW-Kurzilberblick
198
9.8
Hilfen zu LabVIEW
Dieses Lehrbuch - wie auch andere - deckt nur einen Bruchteil der Möglichkeiten ab, die LabVIEW bietet. Man ist also auf zusätzliche Hilfe angewiesen. Dazu einige Anregungen:
I. Kontexthilfe zu Funktionen: aus einem VI heraus 'Hilfe' aufrufen, dort 'Kontexthi l fe anzeigen' markieren. Fährt man anschließend mit dem Mauszeiger über eine Funktion, erscheint in dem Kontexthi l fe-Fenster automatisch eine kurze Erklärung. In vielen Fällen kann man dort noch 'Klicken Sie hier, um mehr Hilfe zu erhalten' aufrufen.
2. 'Hilfe' - 'LabVIEW-Hilfe durchsuchen. . .' führt zu einem Fenster, in dem man unter Index ein Stichwort wie 'Array' eingeben kann. Man erhält dann die in Bild 9.45 darge stellte Auflistung, von der aus man durch einen Doppelklick auf die links stehenden Ein tragungen weitere Hilfe erhält.
!li.
l)pb:.-..n 1.......
I[!d<>:
I s.� I E...:rl"" I
Zu ouohondoo SohIüe..!wooj
W:NATIONAL ,- INSTRUMENTS'
LabVIEW'" Hife
At>gtd 2006, 37136IB-{)1I3 In die..,r �e finden Sie Inlo� zu den Gn>n
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,"', tl
,,-
CiJ�r.,�coj � roll'" ....,;."" . ,
Ci! Irddrelo """"ixq>n "' ,,��
CliJ _Z_,-" ca N
I:J Auscrco:k
GI rooUs coj �
Ci! �,ht ,"",�ie,te rocks lXd Moi.Oo .
C lzd. !IeWieIe"; r;.cern .I lneo.tbel" can·l.blrqo
Bild 9.46 NI-$uchmaschine: Auffinden von passenden Beispielen und Unterstützung im Internet : Ii
'W:NATIONAl � INSTRUMEHTS'
lIf v",.. C10rt
NI Developer Zone Wh,t " D.v.lop"r Zon.'
""'"
...,,"'
@ '"''
I l>elp I """,reh INI DeveIoper ZoneiJ I
,j,
® ""..
,ii Select Your Count",
"'""
"'""'"'
@
®
"'" "".",
LabVIEW Zone F"atu,.., � Altends·"" � in your ar"" >Ot tl>e NI TecIric10I Symposium Prot� DeveJopmerrt ser>es for �rs. se""" from """rtv '0 � rangoiog from introdtxX<>r)' '0 """anoed trmniog. Leam more..
""".n to 00' Podc.....
...., � on ...... .� . »<1 •.--...!c
o..lTen's w",,�1v N<>OOd · Decemtre, 4
lhOoa tl>e a..s. _ in UtbV1EW.
Bild 9.47 Internet-Hilfe von National Instruments
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
200
Merke: Für die Entwicklung größerer Programme sind die Deaktivierungsstrukturen von LabVIEW 8.0 nützlich. Merke: LLBs sind nützlich, wenn es um die übersichtliche Zusammenfassung vieler, logisch zusammengehörender VIs geht.
Merke: LLBs können samt Inhalt in nonna1e Verzeichnisse umgewandelt werden und umgekehrt.
Merke: Für LabVIEW-Benutzergibt es eine Fülle von Hilfen, die nicht nur für Anflinger von großer Bedeutung sind. Besonders zu erwähnen ist hier die 'NI Developer Zone', die man von der NI-Suchmaschine aus aufrufen kann.
Merke: Auch die Analyse von Express-Vls nach deren Umwandlung kann hilfreich sein.
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'
Teil 1 1 : Technische Anwendungen
Während in Teil I Ausschnitte aus LabVIEW systematisch dargestellt wurden, beschäftigt sich Teil 11 mit technischen Anwendungen. Neue Elemente von LabVIEW werden nur noch dort eingeführt, wo sie sich aus der jeweiligen AufgabensteIlung ergeben. Eine gewisse Aus nahme bildet nur Kapitel 14, das sich mit der Synchronisierung von Prozessen und der Event-Struktur beschäftigt.
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'
10
Fouriertransformation
Lernzl.1e I. Zeit- und Frequenzbereich einer periodischen Funktion kennen. 2. Einseitige und doppelseitige reelle Fouriertransformation sowie die Darstellung der komplexen Werte der doppelseitigen Transfonnation in LabVIEW beherrschen. 3. Satz von Shannon kennen und berücksichtigen.
4. Aliasing kennen und berücksichtigen. 5. Frequenzauflösung kennen und beachten.
10.1
Zeit- und Frequenzbereich
Erinnern wir uns, dass National Instruments LabVIEW ursprünglich entwickelt hat, um Messinstrumente zu simulieren, d.h. um VIs (Virtual lnstruments) zu erstellen. Messinstru mente haben häufig die Aufgabe, Daten zu erfassen und nach periodisch auftretenden Mus tern zu durchsuchen. Wir können uns z.B. vorstellen, dass wir von einer Antenne Daten empfangen, die vom 50-Hz-Signal der Spannungsversorgung im Gebäude gestört wird.
Dann haben wir die Störung zu entdecken, durch Fi l terung zu entfernen und das restliche Signal zu analysieren. Die Analyse wird in Kapitel 10 besprochen, die Filterung in Kapitel !!. Periodische Signale können die verschiedensten Formen annehmen: Rechtecke, Dreiecke,
Sägezahnform und wesentlich komplizierter. In allen technisch interessanten Fällen lassen sie sich n i eine unendliche Summe von Sinus- und Kosinusfunktionen zerlegen, annähernd auch in eine endliche Summe. Man nennt diese Zerlegung Fourieranalyse. Die Fourieranalyse oder Fouriertransformation hat den Zweck, Funktionen t -) fit), darge stellt im 'Zeitbereich', umzuformen in eine Funktion im 'Frequenzbereich'. Das ist schon deshalb nützlich, weil einer aus mehreren Sinus- und Kosinusfunktionen zusammengesetz ten Funktion im Zeitbereich kaum anzusehen s i t, welche Bestandteile sie enthält. Dagegen ist das im Frequenzbereich sehr einfach, wie Bild 10.1 verdeutlicht. Wir sehen links die Funktion f(t) = 3·sin(2:n;t) + 2·sin(2-2:n;t) + 1 m i Zeitbereich, wie sich aus
der Überschrift des VIs und den links eingestellten Parametern erkennen lässt. Rechts sehen wir dieselbe Kurve transfonniert in den Frequenzbereich, dargestellt durch drei Balken mit den Amplituden 3, 2 über den Frequenzen! = 2:n;/2:n; = I,! = 2-2:n;/2:n; = 2 und dem Offset 1
über! = O. Man nennt diese Darstellung, die eigentlich nur aus drei Punkten besteht, auch das Amplitudenspektrum von f(t). Der besseren Erkennbarkeit wegen wird aus diesen drei
Punkten ein Balkendiagramm mit drei Linien erzeugt.
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'
10.1 Zeit- und Frequenzbereich
203
Aus der rechten Seite von Bild 10.1 lässt sich leicht die symbolische Darstellung der Funktion ableiten und damit die Kurve links rekonstruieren. Von der linken Seite auf die rechte zu schließen ist dagegen rechenaufwändig und Sache der Fouriertransfonnation.
I� I$E:J
" 1 . ("''' . 1U1IIo(�) H
-
�
1:Eu I�
•
i: ,
•
· ,
I,r::""i' 10.1.1
v .
.
1\
IJ
r:::::
,
!
I\
.
.
'0}.
n,.,..,
-
:/
i
.
Fo
',' ,
1.5 ,
0.50',
0.0 0.2 0.< 0,0 0.8 lJl 1.2 1.1 1.0 1.! 2,0
-
Bild 10,1
""'"" 1
•
; 2.00
0.0 0.5 1.0 1.5 2,0 2.5 3,0 3.5 "'.0 "'.5 5Jl """"""
Funktion ((t) 3·sin(2ntJ + 2·sin(2·211t) + 1 im Zeitbereich (links) und im Frequenzbereich ==
Die reelle Fourlertransformation
Die Grundlage der oben angestellten überlegungen ist der
Satz von Fourier Gegeben sei eine Funktion t --* fit) mit der primitiven Periode T (d.h., Tist die kleinste Peri ode). Das bedeutet, dass für jede reelle Zahl t gi l t: f(HT) =f(t). Ferner wird angenommen, dassf(t) eine beschränkte Ableitung hat. Dann gilt mit m= 2n/T: f(t) = � + 2
�>k coskml+�)k sinkmt k=!
(10,1)
k=!
Darin ist
ak = T2 J f(/) coskmldt, T
,
bk = : Jf(t)sinkm tdt T
(102)
,
Dies gilt für k = I, 2, . . . und ebenso für k = 0, wenn man bo = 0 voraussetzt. Eine andere Darstellung ist: f(/) = � + 2
mit AI;
=
L k=!
I , + b2 -Val;
Ak
1; '
cos(km 1 +
(jJk )
· (jJk = -bk Ja; +b;
sm
(103)
,
COS(jJ1; =
ak Ja; +bl
(10.4)
Die al' b, sind Formel (10.1) zu entnehmen. Diese Darstellung hat den Vorteil, dass man nicht mehr Sinus- und Kosinusfunktionen unterscheiden muss. Die Parameter sind hier die Ampituden l Al und die Phasen «R.
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'
204
10
Fouriertransformation
Der Satz von Fourier gilt auch für Funktionen t ---) fit), die zwischen 0 und T endlich viele Sprunge aufweisen, faUs jeweils ein rechter und linker Grenzwert existiert (bei sonst gleichen Voraussetzungen wie oben). Die Reihe berechnet dann an jeder Sprungste11e den Funkti onswert als arithmetisches Mittel zwischen linkem und rechtem Grenzwert. Die Fourierreihe ist eindeutig. Das heißt, wenn man eine Funktion t ---) fit) auf irgendeine Weise als Reihe nach (10.1) schreiben kann, hat diese Reihe dieselben Koeffizienten QI' b. wie die, wekhe sich aus (10.2) ergeben. Im Beispiel von Bild 10.1 haben wir eine Fourierreihe mit den Koeffizienten
Qo = 2,
a1 =Q2 =a) ... =O, b1 =3, b2 = 2, b3 = b4 ... = O
Wir brauchen in diesem Fall den Index k in Formel (10.2) also nicht von 0 bis <><> laufen zu lassen, sondern nur von 0 bis 2. Auch dann, wenn unendlich viele Koeffizienten nötig wären, z.B. wenn wir eine Rechteck kurve durch Sinus- und Kosinuskurven ausdrücken wollten (bekannte Mathematik Obungsaufgabe), müssen wir mit endlich vielen Gliedern der Fourierreihe vorliebnehmen. Die LabVIEW-Funktion für die Fouriertransformation rechnet numerisch und nicht sym bolisch, muss also nach endlich vielen Rechengängen abbrechen. Sie ersetzt die Integrale in
(10.2) durch endliche Summen. In diesen Fällen iefert l die Fouriertransfonnation nicht exakt die gewünschte Funktion, sondern nur eine Näherung. Diese ist allerdings optimal unter der Voraussetzung, dass nur Sinus- und Kosinusfunktionen gemäß (10.1) erlaubt sind. Die Fouriertransformation, wie sie eben beschrieben wurde, heißt reelle Fouriertransforma tion. Sie ordnet einer reellen Funktion im Zeitbereich reelle Koeffizienten zu. Dabei entsteht
das Problem, zwischen den Sinuskoeffizienten bl und den Kosinuskoeffizienten al bei Formel
(10.1) unterscheiden zu müssen bzw. zwischen Al und ipl bei Formel (10.3). Wie sollen wir das im Frequenzbereich grafisch darstellen? In Bild 10.1 hatten wir damit kein Problem, weil es nur Sinusfunktionen gab. Was aber sollen wir tun, wenn eine Funktion Sinus- und Kosi nusfunktionen enthält? Wir müssen dann zwei Graphen aufzeichnen, wobei es übich l ist, ein Balkendiagramm für die AI und ein zweites für die ipl zu erstellen. Man nennt diese Darstel lungen Amplitudengang und Phasengang. Die Erfahrung hat ferner gezeigt, dass es günsti
ger ist, die Koeffizienten al und bl durch komplexe Koeffizienten '..I: zu ersetzen. Man vermei
det dann ganz die trigonometrischen Funktionen, indem man sie durch die Exponentialfunk
tion ersetzt. Wir gehen von (10.1) aus und schreiben, wobei wir die EuIer-Formel
ejop = cos ip + jsinip benutzen und die Ausdrücke cOSip und sinip umformen:
fC/) =�+ 2
Lak coskw l +Lbk sinkw i -
-
k=l
k=!
i i
i
k k k k Cakej "'t +ake-j "'t )+� Cbkej "'/ -bke-j "'t) = �+ � 2 2 k=! 2J k=!
(10.5)
a k k k k Cakej "'t +ake-j "'t - jbkej "'/ + jbke-j "'/) = o +� 2 2 k=!
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'
10.1 Zeit- und Frequenzbereich Fasst man nun in
(10.5)
205
die Exponentialfunktionen mit positiven Exponenten zusammen
und ebenso die mit negativen, erhält man
oder
(10.6) mit den Abkürzungen
für k = O a./2 a. - jb. e. = für k > O 2 a • + jb • für k < O 2 •
(10.7)
•
Damit wird aus (10.2)
oder
I
fk = -
J f(t) e-J"'ktdt
r/2
.
T -r/2
LabVIEW arbeitet genau nach den Formeln (10.6),
(10.8)
( 10.7) und (10.8), wobei es in der letzten
Formel die Integrale durch Summen ersetzt. Obwohl die Ergebnisse k . komplexe Zahlen
sind, spricht man immer noch von der reellen Fouriertransformation, weil die Eingangs
größe ein Array von reellen Funktionswerten j(t) ist. Man nennt sie auch zweiseitige Fouriertransformation m i Gegensatz zur einseitigen Fouriertransformation, die n i Bild dargestellt wurde, Bild 10.2 macht das verständlich. Wenden wir Formel
(10.7) auf die Funktion f(t) = 3·sin(2nt) + 2·sn i (2·2nt) + I an, erhalten
wir für die k. folgende Werte:
So = 1 , S
= . 1,5j, = 1,5j,
f.l
IAufgabe 10,1
10.1
,,-, =
.
e, = J, -
S, = J,
f.··
=0 S, = S. .. = 0
(10.9)
Bestätigen Sie die Ergebnisse in (10.9). Im Balkendiagramm werden die Amplituden nun einfach als Beträge der � dargestellt, die halb so groß sind wie die A., denn aus (10.4) und (10.7) folgt
�
(10.10) � = 2 1f.t 1 = a;+b; Der Winkel Q"J. aus (10.3) ist einfach der Winkel der komplexen Zahl in der Gaußschen Zah lenebene, wenn man � in der Exponentialform
fk = bl · eif'l schreibt.
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'
206
10
Fouriertransformation
IAufgabe 10.2
Bestätigen Sie 00.10), indem Sie, beginnend mit k = 0, für die " aus (10.7) die Beträge bilden. Dabei ist b. = 0 zu setzen.
Man sieht auch am Beispiel von f(t) = 3-sin(2nt) + 2-sin(2-2nt) + I, dass die zweiseitige Fou riertransformation nur die halben Beträge liefert, denn da hier alle b1 = 0 sind, ergibt sich aus (10.7) sofort If ll = la1V2. Nur f . ändert sich nicht, weil auch bei der einseitigen Fourier transformation nicht Q", sondern aj2 ausgegeben wird. Bi l d 10.2 stellt die Ergebnisse der einseitigen und der zweiseitigen Fouriertransformation am obigen Beispiel dar. Amplitude
Amplituck
•
•
Einseitig
,
,
Zweiseitig
,
--1--I-+-;-�+ ,
Bild 10.2
,
.
F�""nz
-T""--;-!-+--'I--+--l�-,---,4
·3
_2
_I
,
,
.
F�uellZ
Einseitige und zweiseitige Fouriertransformation, letztere in LabVIEW verwendet
IAufgabe 10.3
Zeigen Sie, dass die -'. und die L. konjugiert komplex sind. Anleitung: Die Zahlen c = a + jb und c* = a - jb heißen konjugiert komplex.
Merke: Man unterscheidet einseitige und zweiseitige Fouriertransformation. Obli
chetweise wird mit der zweiseitigen Transformation gearbeitet, welche die komplexen Koeffizienten fk liefert. Merke: Stellt man die Beträge der c. als Balkendiagramm dar, spricht man vom
Amplitudengang. Stellt man die �. dar, spricht man vom Phasengang.
Merke: Die fk und die f-k sind konjugiert komplex.
10.1.2
Darstellung der Fourlerkoefflzlenten �lr.ln LabVIEW
Bi l d 10.3 und Bild 10.4 zeigen Panel und Diagramm eines VI, das die LabVIEW-Funktion zur reellen Fouriertransformation verwendet. Sie ist zu finden unter 'Funktionen' - 'Signal verarbeitung' - 'Transformationen' (rechts unten) und dort als 'FFT' oben links. Die Funk tion benötigt als Eingangsgröße einen reellen Vektor und liefert als Ausgangsgröße einen komplexen Vektor. In Bild 10.3 ist die Funktion f(t) = 3·sin(2m+900) + 2·sin(2·2xt) + 1 eingestellt, d.h., wir ha ben hier die Summe von Kosinusfunktion (sin(2m+900) = cos 2xt) und Sinusfunktion. Die Kurve im Zeitbereich unterscheidet sich daher ein wenig von der Kurve n i Bild 10.1.
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'
10.1 Zeit-undFrequenzbereich
207
PO:t0.a -
',00
...00
·
0
, "",
,
Bild 10,3 Panel eines VI, das die Summe von zwei Sinusfunktionen mit verschiedenen Parametern für Amplitude, Frequenz und Phase in den Frequenzbereich transformiert
Bild 10,4 Diagramm zu Bild 10.3 Der Frequenzbereich zeigt m i Balkendiagramm Amplituden > allerdings halbiert gegenüber Bild
10.1
0 bei denselben Frequenzen, 1
(mit Ausnahme des Offset, der wie dort die Höhe
aufweist).
Erläuterungen zu Bild •
10.3 und Bild 10.4
10.3 zeigt links unten als 'Abtastinfonnation' ('sampling info') eine Scanfrequenz von Fs = 20 Hz und eine Punktzahl von #s = 40. Es sei noch einmal betont, dass die Bild
Scanfrequenz nichts mit der Frequenz der dargestellten Sinus- oder Kosinusfunktionen zu tun hat. Sie besagt nur, dass die im Eingangsarray verfügbaren Werte (hier
40) mit
einer simulierten Frequenz von 20 Hz abgetastet werden (der pe arbeitet natürlich viel schneller). Das heißt, Index 0 entspricht 0 Sekunden, Index 20 entspricht
1 Sekunde und
Index 40 entspräche 2 Sekunden, wenn es ihn gäbe. Da aber bei 40 Werten der Index nur
von 0 bis 39 äuft, l gehört der letzte Wert zu einer Zeit von
1,95 Sekunden. Will man nun
nicht einfach den Index anzeigen, sondern die simuierte l Zeit, muss man mit einem Ei genschaftsknoten skalieren. Das geschieht m i unteren Bereich von Bild
10.4
etwa in
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'
208
10
Fouriertransformation
Bildmitte mit der Eigenschaft 'XAchse.Faktor', der der Wert l/Fs zugeführt wird (hier
1!20 = 0,05). Die Beschriftung der X-Achse von 'Zeitbereich' in Bild 10.3 zeigt nur Werte von 0 bis 2, wobei die Funktionskurve diesen Wert nicht ganz erreicht. Zur Skalierung von Signalverlaufs-Graphen siehe auch Abschnitt 6.3.2.3. •
Entsprechend wird das Balkendiagramm im Frequenzbereich skaliert. Das ist allerdings komplizierter: Man muss wissen, dass die LabVIEW-Fouriertransfonnation einen kom plexen Ausgangsvektor iefert, l der ebenso viele Daten in Form der '. enthält wie der Ein
gangsvektor, im Beispiel also #$ = 40. Die Funktion ordnet nun dem Index 0 den Koeffi
zienten '0 zu. Die resdichen 39 Indizes werden den '. und '-l zugeteilt, die paarweise auf
treten. Dabei stellt ,. die Frequenz k-20/4O Hz dar, so dass im BeispieJ die
19 Frequenzen 0,5 Hz, 1,0 Hz, . . . 9,5 Hz auftreten. Die ' _. benötigen weitere 19 Speicherplätze. Ein Spei cherplatz in der Mitte bleibt frei und wird mit 0 belegt. Man kann das Prinzip besser ver stehen, wenn man Bild 10.5 betrachtet, n i dem für den Frequenzbereich im Gegensatz zu Bl i d 10.3 'Autom. Skalierung X' gewählt wurde. P!otO
',W
r"
..(!l
',,"
0," 0,"" 0,,"
0,00
°
'-
,
--
"
-
Will man nun statt der
"
'"
Bild 10.5 Frequenzbereich von Bild 1 0.3 automatisch skaliert
40 Indizes die Frequenzwerte anzeigen, muss man die X-Achse
mit dem Faktor 20/40 skaieren l oder allgemeiner mit Fs/#s, wie n i Bild 10.4 zu sehen. •
Die LabVIEW-Fouriertransformation liefert nicht die Koeffizienten '*, sondern das Pro dukt der , . mit #s. Man muss deshalb das Ergebnis noch durch #s dividieren. Das ist ebenfalls rechts im Diagramm von Bild 10.4 zu sehen.
•
Ein Array komplexer Zahlen kann zwar als Graph dargesteJlt werden, doch ist das nicht sinnvoll, weil die Darstellung dreidimensional sein sollte (zwei Achsen für die komplexe Zahl, eine Achse für die Frequenz), ein Graph aber nur zwei Dimensionen zeigt. Er verschluckt die Darstellung der Imaginärteile. Deshalb wird aus dem Array komplexer Zahlen ein reelles Array mit den Beträgen der komplexen Zahlen erzeugt. Das geschieht mit Hilfe der Funktion 'Komplex nach Polar', die man unter 'Funktionen' - Programmie rung' - 'Numerisch' - 'Komplex' (sechste Zeile rechts) findet. Sie liefert mit ihrem oberen
Ausgang 'r' den Betrag einer komplexen Zahl, mit dem unteren namens '8' deren Phasenwinkel in der Gaußsehen Zahlenebene.
•
Die komplexen Ergebnisse werden ebenfalls ausgegeben und an der rechten Seite von Bild
10.3
als Array dargestellt. Man erkennt dort den Offset I, gespeichert mit Index
0,
weiterhin " mit Index 2 (und nicht mit Index I - dieser ist der Frequenz 0,5 Hz zugeord
i d spiegelbildich l ge net, die im BeispieJ nicht vorkommt) und 'I mit Index 4. Die L. sn speichert mit dem Index dem Index 36 = 40 - 4.
(40 - Index+): als '_. mit dem Index 38 = 40 - 2 und als '_I mit
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'
10.2 Diskrete Fouriertransformation •
209
Die Frequenzdarstellung in Bild 10.3 und Bild 10.5 erfolgt über die Legende so: Farbe: Schwarz wählen Linienbreite: vierte Stufe Interpolation ausschalten Grundlinie füllen: null Kein Balkendiagramm wählen, wei l sonst die Linienstärke unberücksichtigt bleibt!
IAufgabe 10.4
Stellen Sie im Panel von Bild 10.3 andere FrequenzenJ, undJ, ein und machen Sie sich ein Bild von der Speicherung der ' . und von der Auswirkung auf das Balkendiagramm im
Frequenzbereich.
IAufgabe 10.5
Stellen Sie im Panel von Bild 10.3 andere Werte von #s ein, z.8. #s = Fs oder andere Viel fache von Fs, etwa das Drei- oder Vierfache, aber auch Werte wie #s = 25 usw. Was beobachten Sie m i Balkendiagramm des Frequenzbereichs?
Merke: Im Zeitbereich erfolgt die Skalierung der X-Achse über einen Eigenschafts knoten mit dem Faktor I/Fs.
Merke: Im Frequenzbereich geschieht die Skalierung der X-Achse mit Fs/#S. Merke: Bei der FFT sind die erhaltenen Y-Werte durch #5 zu dividieren!
10.2
Diskrete Fouriertransformation
Wie schon erwähnt, werden bei numerischen Berechnungen niemals die Integrale aus (10.2) oder (10.8) ausgewertet. Sie werden durch Rechnungen mit endichen l Summen ersetzt.
Dafür gibt es verschiedene Verfahren. Die allgemeine Bezeichnung ist DFT oder 'Diskrete Fourier-Tansformation'. Sehr häufig wird der Begriff FFT verwendet, der für 'Fast Fourier Transformation' steht. Auch die FFT ist eine diskrete Fouriertransformation, die aber sehr viel schneller arbeitet, wenn die Zahl n der Daten, auf die man sie anwendet, eine Potenz von
2 ist. Es muss also gelten n = #s = 2'"
mit m = 2, 3, 4,...
Häufig wird n = 256, 512 oder 1024 gewählt. Die FFT ist schneller als die gewöhniche l OFT, weil sie die Symmetrien nutzt, die sich er
i t. Sie erzeugt aber keine anderen Werte für die '. als die geben, wenn n eine Zweierpotenz s gewöhnliche OFT, denn die Darstellung einer Funktion durch die Fourierreihe ist ja bei gegebenem n nach dem Satz von Fourier eindeutig.
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'
210
10
10.2.1
Fouriertransformation
Satz von Shannon
Wenn sich eine Funktion aus Sinus- und Kosinusfunktionen mit Frequenzen zwischen I Hz und 9 Hz zusammensetzt, kann man sie nach Formel (10.6) rekonstruieren, sobald man die Werte von f " fl-' . . . , f . hat. Die Werte der L" f.t, . . . , f ... kann man aus diesen als konjugiert komplexe Zahlen errechnen. Wie viele Daten benötigt man bei gegebener Funktion t ---*fit), um -' . bis -'. zu berechnen? -' . als Offset ist reell, alle anderen kl sind komplex, enthalten also zwei unbekannte reelle Größen al und bl. Folglich benötigt man I + 2-9 = 19 Gleichungen, um alle -' -l zu berechnen. Das geschieht mit Hilfe eines linearen Gleichungssystems mit 19 reellen Unbekannten. Schreibt man das Gleichungssystem nach Formel (10.6) komplex, muss man für 19 Werte von t die nachstehende Beziehung
anschreiben. Man erhält also: <> Le- ;..,t, + ... + s,e-;"'1 +!:.e· + !:,e;"'1 + ... + f,e';"'1
· !:. te- ;·t, + ... + s,e-i•t, +!:.e· +f,e;·t, + ... + f.e·;·t, -
= 1(1,)
= 1(1,)
Daraus lassen sich alle -'l errechnen, und das ist die Aufgabe der Fouriertransformation. Man sieht an diesem Beispiel, dass man zur Berechnung von maximal 9 verschiedenen Frequen zen mehr als die doppelte Zahl von Gleichungen, nämich l 2-9 + I = 19, benötigt und damit 19 bekannte Werte der Funktion t ----) fit) für die rechte Seite des Gleichungssystems. Eine Periode dieser Funktion braucht also mindestens 19 Abtastwerte. Mit anderen Worten, Fs muss größer oder gleich 19 sein. Die Verallgemeinerung dieser Überlegungen führt zum Satz von Shannon (auch: Nyqulst-Theorem)
Jede periodische Funktion t ---71(r) mit der kleinsten Periode T, die aus einer Summe von endlich vielen Sinus- und Kosinusfunktionen mit m= 2nlT besteht und nach der Formel
f(t) =
"
L
s-eikaot
ko·_�
gebildet ist (d.h., die höchste auftretende Frequenz ist I... = m-nl(2-n) = nlT), kann exakt rekonstruiert werden, wenn man die Funktionswerte an mehr als 2-n äquidistanten Stellen innerhalb einer Periode T erfasst (gescannt) hat. Als Formel gilt: Fs> 2/""" Bemerkungen •
Die Formulierung 'Die Scanfrequenz muss mindestens gleich dem Doppelten der höchs ten m i Signal enthaltenen Frequenz sein' ist falsch. Sie muss größer als das Doppelte sein! Im Beispiel mitf-. = 9 Hz ist Fs > 18 Hz zu wählen, also 19 Hz oder mehr. Istf-. = 1 kHz, muss Fs > 2 kHz sein, also z.B. 2001 Hz usw.
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'
10.2 Diskrete Fouriertransformation •
211
Will man eine Funktion in LabVIEW im Zeitbereich darstellen, wählt man besser eine
Scanfrequenz, die wesentlich größer als das Doppelte von J""", ist, z.B. Fs = 10f""",. Das ist sinnvoll, weil LabVIEW die errechneten Punkte nicht (wie theoretisch möglich wäre) mit Sinuslinien verbindet, sondern einfach durch Geradenstücke. Das Kurvenbild leidet dar
unter. Man sieht das, wenn man im Panel von Bild 10.3 etwaJ; = 9 einstellt. •
Die LabVIEW-Funktion 'Sinussignal' ('Sine Waveform.vi') liefert bei Fs < 2f... eine Fehlenneldung, bei Fs = 2f.... leider nicht, sondern nur falsche Ergebnisse.
10.2.2
Aliaslng
Erhält man ein Signal nicht von einer eingebauten Funktion wie 'Sine Waveform.vi', sondern von der Außenwelt, bekommt man keine Warnung bei Unterabtastung, d.h. bei einer Abtastung mit Fs :<::: 2f-.. Der erste Gedanke, das sei nicht weiter schlimm, die erhaltene Kurve sei dann eben nur etwas ungenau, trügt. Enthält das Signal zu hohe Frequenzen mit größerer Amplitude, kann es zur Vortäuschung niedriger Frequenzen gleicher Amplitude kommen, die im Signal überhaupt nicht enthalten sind. Der Anwender sieht ein anderes Signal, ein Alias (lateinisch: anders). Ein Beispiel dafür zeigt Bild 10.6. Wir kennen dieses Phänomen aber auch aus dem Alltag, wenn in einem Wildwestfilm, der ja aus einzelnen Bi l dsequenzen zusammengesetzt s i t, der Zuschauer den Eindruck hat, die Räder einer vor wärts fahrenden Pferdekutsche würden sich rückwärts bewegen. Das liegt an der Unter abtastung der Speichen der sich drehenden Räder durch die Bi l dfolgefrequenz.
�
=-"81
•
""
••
--_ ... _ ------,-_ ....
.•-
'1 .
" .
' 0
,
•
"
"
.,
"
--
=mm "
j::: " M
0.0 '.'
T '"
�, M '"
�.
..
M
I�
. .
. ' .
" "
� ,
',-
-
:.
,
"
I:
r
1 ' ..1.
',-
.�
" ,-
"
..
"
-"
I :t;j "
�
-,'
',-
. '
I J" {
" ". ' ". ' 0, '
0,>
I
0. '
"
._.[';
-,
0,> "" �, "" �.
'.0
Bild 10.6 Beispiel fOrden Effekt des Aliasing durch Unterabtastung Die Vermeidung des Aliasing-Effekts bei externen Signalen mit Softwaremitteln allein ist nicht möglich. Jedenfalls geht es dann nicht, wenn man nicht genau weiß, welche maximale Frequenz das externe Signal enthält. In solchen Fällen muss ein Hardwarefilter vorgeschaltet werden, der Signale ab einer bestimmten Frequenzschwelle sehr stark dämpft. Dann muss man sich nicht mehr um Frequenzen oberhalb dieser Schwelle kümmern. Der Aliasing
Effekt ist zwar immer noch vorhanden, jedoch mit so kleinen Ampituden, l dass man ihn
vernachlässigen kann.
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'
212
10
Fouriertransformation
Merke: Unterabtastung kann zur Bildung falscher Frequenzen fuhren, die im Originalsignal nicht enthalten sind.
10.2.3
Frequenzauflösung
Stellt man die Parameter im Panel des Fouriertestprogramms gemäß Bi l d 10.7 ein, erhält man im Frequenzbereich nicht die erwartete Frequenz von 1,5 Hz, sondern alle Frequenzen
zwischen 0 und 9 Hz mit verschiedener Ampitudenhöhe. l Der Grund ist die mangelnde Frequenzauflösung. Bei 1,5 Hz passt die Kosinuskurve bzw. eine Folge mehrerer Kosinus
kurven nicht vollständig in den gewählten Bereich von 20 Werten. Die Fouriertransfor mation geht aber von einer periodischen Funktion aus, verarbeitet also eine Funktion, die beim Index 0 den Wert I hat und beim Index 19 mit einem Wert von knapp (-I) aufhört, in der folgenden Periode aber wieder mit 1 beginnt. Das heißt, die Funktion hätte beim über gang von Index 19 zu Index 20 (in der Folgeperiode) einen Sprung. Die Fouriertrans formation versucht, diese Funktion mit SprungsteIle optimal nach dem Prinzip der kleinsten Quadrate darzustellen. Dabei ergeben sich die verschiedenen unten angezeigten Frequenzen.
... .. 1....1·1_1,
� Al���_
-
"" .J.::!J
I;�m '�1][[[�J ,"
" .
la.",
'.
,
,
,�,
'.•
,
,,-�
,
10
�- ..
Bild 10.7 Mangelhafte Frequenzauflösung
Anders verhält es sich, wenn man die Zahl der Werte von #s = 20 auf #s = 40 erhöht. Jetzt werden auch die Frequenzen 0,5 und 1,5 dargestellt. Das Ergebnis ist in Bild 10.8 zu sehen.
Definition Frequenzauflösung
=
Scarrfte q ue nz ""' '''''' '' ::;; = ''ans Zahl de r Sc
1's
#s
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'
10.2 Diskrete Fouriertransformation
213
Zusammenfassung Ist die Zahl der Scans (der von einem Signal erfassten Werte) n = 2·m, versucht die Lab VIEW-Fourierfunktion die Koeffizienten der Fourierreihe mit den Frequenzen 0,1 f_ , 2 /- , 3 1- " ,,(m-I) /n
n
n
n
so zu bestimmen, dass die im Bereich [0, 1,2, ..., (m-I)] gegebene und als periodisch voraus gesetzte Funktion bestmöglich approximiert wird. 'Bestmöglich' heißt: nach der Methode der kleinsten Quadrate approximiert.
..
"
.,_(....· t..')
.. A2�.., . .....
Pk>: 0I!
"_1...... ',.
0,.
j ,.rrt�ttIt++-t++-++I ---'rt-t 0,00
-§ 0.0()
to.", o�-
0.00 , 0
,
< , , "-"'
,
--
Bild 10,B Verbesserte Frequenzauflösung gegenOber Bild 10.7
Merke: Eine hohe Frequenzauflösung ermöglicht eine genauere Darstellung der gegebenen Funktion.
Merke: Generell wird eine gegebene Funktion nach der Methode der kleinsten Quadrate approximiert, wenn sie nicht exakt dargestellt werden 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'
11
Filterung
Lernziel. I. Die Begriffe Tiefpass, Hochpass, Bandpass, Bandstopp erklären und mit einer Skizze beschreiben können. 2. Unterscheiden zwischen Analogfiltern und digitalen Filtern. Einige wichtige Eigenschaf ten digitaler Filter kennen. 3. Einige Methoden der Filterung im Zeitbereich erlernen und mit eingebauten LabVIEW Funktionen realisieren können.
4. Methode der Filterung m i Frequenzbereich kennen und n i LabVIEW programmieren können.
1 1 .1
Filtertypen
Filter kann man nach ihrer Funktion n i •
Tiefpass,
•
Hochpass,
•
Bandpass und
•
Bandstopp
unterteilen. Bild 11.1 und Bi l d 11.2 zeigen das Prinzip beim idealen Filter.
1 1 .1.1
Ideale und reale Filter
Ein idealer Filter hat die Eigenschaft, alle in einem Signal enthaltenen Sinus-/Kosinus Bestandteile, deren Frequenzen in ein bestimmtes Intervall fallen, unverändert durchzu lassen und Bestandteile mit anderen Frequenzen vollkommen zu stoppen, d.h. ohne Rest zu
f. aufder
löschen. Denkt man sich die Frequenzen bezogen aufeine wählbare Grenzfrequenz
X-Achse aufgezeichnet und die Ampitudenverhältnisse l Ausgangs-/Eingangssignal AjA, auf der Y-Achse, kommt man für die vier oben genannten Filtertypen m i Idealfall zu den in Bild 11.1 und in Bi l d 11.2 dargestellten Verhaltensweisen. Hier bedeutet ein Amplituden verhältnis = 1 keine Veränderung des eingespeisten Frequenzanteils, ein Ampituden l
verhältnis = 0 dagegen die komplette Löschung. Diese Darstellung heißt auch Frequenzgang des Filters. Stellt man die Amplitude dar, spricht man vom Amplitudengang, entsprechend bei Darstellung der Phase vom Phasengang. In der Realität zeigen Filter nicht dieses ideale Verhalten. Die Sprünge bei der Grenzfrequenz sind nicht scharf. Nur mit hohem Aufwand kann man sich dem gewünschten Idealzustand nähern. Man unterscheidet Hardware- und Softwarefilter. Hardwarefilter arbeiten mit elek-
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'
11.1
215
Filtertypen
tronischen Schaltkreisen, die Widerstände, Kondensatoren und andere elektronische EJe mente enthalten. Man nennt sie auch Analogfilter. Softwarefilter nutzen bestimmte Re chenmethoden mit diskreten Zahlenwerten. Sie heißen Digitalfilter.
Aa/Ae
AJAe ---------------
L---.I -f----
.------
l...-.I ---t--
Ig
Ig
Bild 11,1 Idealer Tiefpass
Idealer Hochpass
Aa/Ae l
i
II
-----r--1
I
'---+-.1 ---1i--�
'1
Bild 11,2 Idealer Bandpass
Idealer Bandstopp
Beispiel eines digitalen Filters
1 1 .1.2
Es ist nicht schwer, einen realen Filter, z.B. einen digitalen Tiefpass, zu konstruieren. Denn schon die arithmetische Mittelwertbildung zweier benachbarter Werte eines Signals glättet dieses, d.h. entfernt bis zu einem gewissen Grade die höheren Frequenzen. Bessere Ergebnis se erhält man mit dem arithmetischen Mittel mehrerer Werte, Z.B. von fünf. Bild 11.3 zeigt das Verhalten eines solchen Filters, Bild 11.4 das Bode-Diagramm dazu. ' .111 1
..
..
1,0 -
0._
"
0._
0._
�o
_
----
0.' 0._
"
'
"'
�."-
�o
...
•
�,
=.0
Bild 11,3 Amplitudengang beim arithmetischen Mittel aus fünf Daten, ls 2000
�
".0 _.0
·25,0 ·Sil,O
! r"""O ·125.0 -
'"/"
ptt: o
".0 , ,
"-
'"
i--
"" .Jt
---... '---
''''',0
·ISil,O
"
,
100,0
""
J:Ü.D
-
1Il,.0
�.o
Phasengang, Filtermethode wie links
==
Ausleihe: 31.07.2009 00:00:00 - OS.08.2009 00:00:00, ID:7ac0427d5929S1cf089d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
11 Filterung
216 •
�.
-
�o�
0,0 _",0
"
-ro,o
�-"" D
, ,
•
� oL '"
�o >,0 0,0 .0
l _]5�o,0 i-1m,
'''',e
�,O
"
�-
,
_<0,0 _,",,0
'"
"
"�
,�O
.,.n,' "
=0
Bild 1 1 ,4 Logarithmische Darstellung des Ampli tudengangsvon Bild 11.3
"
,
'"
"�
, ,�,
=,
Logarithmische Darstellung des Phasengangs von Bild 11.3
Das Bode-Diagramm (auch: Frequenzkennlinien-Diagramm) stellt sowohl die Frequenzen
auf der X-Achse als auch die Amplitudenverhältnisse auf der Y-Achse logarithmisch dar. Das ist in LabVIEW sowohl beim Signalverlaufsgraphen als auch beim XY-Graphen möglich. Man wählt im Kontextmenü 'X-Achse' - 'Achsenskalierung' - 'Logarithmisch' an Stelle der Voreinste11ung 'Linear'. Man kann diese Einstellungen getrennt für X- und Y-Achse vor
nehmen, so dass auch halblogarithmische Achseneinteilungen möglich sind. Die Besonder heit beim Bode-Diagramm ist, dass das Amplitudenverhältnis in dB ausgedrückt wird. Es gilt,
AJA. in dB :::: 20· log,. AJA.
1 ist, werden die 11.4 links. 20 dB entsprechen einer Deka de. Das heißt, wenn AjA, :::: 0,1 ist, hat man einen Wert von -20 dB.
Da das Amplitudenverhältnis normalerweise bei der Fi l terung kleiner als Zahlen in dB negativ. Man sieht das schön in Bild
11.3 und Bild 11.4 links zeigen nun deutlich, dass ein realer Tiefpass dem gewünschten 100 Hz nicht wesentlich geschwächt, Frequenzen ab 200 bis 400 Hz dagegen deutlich. Bei 400 Hz sinkt die Amplitude des gefilterten Signals bis auf 1/1000 entsprechend -60 dB. über 400 Hz wird aber die Filterwirkung sogar wieder geringer. Bei 500 Hz etwa beträgt die Amplitude des gefilter ten Signals wieder 1/5 des Originalsignals. Bild
Idealverhalten n i Bi l d 11.1 nur wenig ähnelt. Zwar werden Frequenzen bis etwa
Nun wirkt die arithmetische Mittelwertbildung zwar als Tiefpassfilter, allerdings ziemlich schlecht. In LabVIEW kann man diesen Filter mit dem SubVI aus Bild 11.5 realisieren.
I I
Bild 11.5 Ausschnitt eines SubVls, das einen Tiefpass durch Mittelwertbildung von je fOnfWerten eines Arrays realisiert. Links oben der Anschluss für die Eingangsdaten, rechts unten der Ausgang für die gefilterten Daten. Für die ersten vier Werte ist die Mittelwertbildung nicht korrekt weil das Schieberegister mit den vom System voreingestellten Anfangswerten 0 arbeitet. Erst danach stimmt das Ergebnis
Im-li
xn.2 •
Wie wirkt sich nun ein solcher Tiefpass auf ein Signal aus, das von Störungen überlagert wird? Bild
11.6 gibt darüber Auskunft.
Obwohl die MitteJwertbildung kein gutes Filterver
fahren ist, ergibt sich eine beachtliche Glättung. Die zufaIlige Störung kann in ihrem Ausmaß mit dem 'Zufallsfaktor' links unten in Bi ld
11.6 eingestellt werden.
Bild
11.7 zeigt den Me
chanismus dieser Störung m i Diagramm von 'DigitalcFiltecMitteJwertS.vi'.
Ausleihe: 31_07_2009 00:00:00 - OS_08_2009 00:00:00, ID:7ac0427d5929S1cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21 :42:39 +02'00'
11.1
217
Filtertypen
•
"
'.,
" " "
"
I"
I. " '. '., " " ,'
,� .
1,0
,",
--
'., . I,'
.
.
'" o� ',' 1,0 U 1,' 1�
,."
I,' ',0 .
.
:
: ,:,
'-' 0.' '" 0,' . . 1.1 u 1,' 1,' , .
,�
Bild 1 1 .6 Filterung eines zufällig gestörten Signals durch arithmetische Mittelwertbildung
III Bild 11.7 Diagramm zu Bild 1 1 .6
IAufgabe 1 1 . 1
Verwandeln Sie den in Bild 11.5 dargestellten Programmausschnitt in ein SubVI, das die Funktion des Unterprogramms in Bild
I\.7 mit dem Symbol 'Mittelwert 5' übernehmen
kann.
IAufgabe 1 1 .2
ld Das Diagramm in Bi
1\.5
lässt sich entsprechend Bild I \.8 vereinfachen. Versuchen
Sie, dieses Unterprogramm von Anfang an aufzubauen.
Bild 11.8 VereinfachteVersion des Unter
programms zur arithmetischen Mittelwertbildung. Das Schieberegister links lässt sich im Kontextmenü mit 'Element hinzufügen' aufziehen. Es speichert dann nicht nur einen Zwischenwert. sondem die letzten vier
Ausleihe: 31.07.2009 00:00:00 - OS.OS.2009 00:00:00, ID:7ac0427dS929S1cfOS9d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
11 Filterung
218
IAufgaba 1 1 .3 Wie lauten die Koeffizienten a, in Fonnel
(11.1) für die arithmetische Mittelwertbildung
aus fünfElementen?
Merke: Die arithmetische Mittelwertbildung wirkt als Tiefpassfilter.
1 1 .2
LabVIEW-Filterfunktionen
Die arithmetische Mittelwertbildung ist der Spezialfall eines FIR-Filters (FIR bedeutet 'Finite Impulse Response'), dessen allgemeines Bildungsgesetz durch L
y" =
L akx,,_k ,1,=0
(ILI)
gegeben ist. Das gefilterte Signal Y. ergibt sich aus dem Wert des Originalsignals mit gleichem Index und den L vorausgehenden Werten. Die n i Abschnitt
11.1.2
erwähnte Mittelwert
bildung aus fünfbenachbarten Werten des Originalsignals ist ein einfaches Beispiel Die allgemeine Formel zur Bildung digitaler Filter berücksichtigt nicht nur die Werte
x, des
Originalsignals, sondern auch bereits ermittelte WerteY. des gefilterten Signals. Man arbeitet also auch mit Rückkopplung. Die Fonnel für diese IIR-Fi l ter ('Infinite Impulse Response') lautet: L
y" =
M
Lakxn-k - L bkYn-k k=O kcl
(11.2)
Die Behandlung der damit zusammenhängenden Fragen wie des Filterentwurfs ist nicht Thema dieses Buchs. Einzelheiten dazu siehe z.8. (41, Kapitel
19 oder (SI, Kapitel 12.
Hier ist nur interessant, dass n i der LabVIEW-Funktionsbibliothek eine Reihe von Filter funktionen bereitgestellt wird, die nach den genannten Prinzipien konstruiert wurden. Man findet sie n i 'Funktionen' -'Signalverarbeitung' - 'Filter' (dritte Zeile links), siehe Bild 11.9 . •
L ",.
[fl � �
[iJ 00 tliI
[fl � �
[fl �
lIltterworth-,., Chebyshev-fl., , lfflerser ehe", E�FIler
[fl �
_.a.
Ifl �
EqU-Rp.TI".
EqU-R�" . �·B" , EqU-R�,., Inverser f.fl:er _... FIR l)efenste,,,
Med!Jn·FIler
,.
s.wtzk.,...Gda., , IIR.fI:en.n;J '"
r,:I �
FIR·FIterung '"
Bild 1 1 .9 Palette von Filterfunktionen Hier steht ganz links oben der Butterworth-Filter, gleich rechts daneben der Tschebyscheff
Filter. Alle Filterfunktionen sind ähnlich zu bedienen. Sie haben einen Eingang für das Arrar
der Originalwerte und einen Arrayausgang für die gefilterten Werte. Von Bedeutung sind:
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'
11.2 LabVIEW-Filterfunktionen
219
Ordnung des Filters mit Werten wie
•
2, 3, 4 usw. Die Ordnung sagt etwas aus über die 11.2 und damit über die Annäherung
Zahl der verwendeten Reihenglieder nach Formel
an einen idealen Filter. Grenzfrequenz. Ein Tiefpass sollte bis knapp unterhalb der angegebenen Grenzfrequenz das Amplitudenverhältnis möglichst genau bei I halten und oberhalb der Grenzfrequenz möglichst dicht bei 0 liegen. Die Grenzfrequenz seJbst ist per Definition der Wert, bei dem das Ampitudenverhältnis l ";2/2 "" 0,707 beträgt. Er ist am Eingang 'Untere Grenzfre quenz: fI' einzustellen. Der Eingang 'Obere Grenzfrequenz: fh' wird beim Tiefpass nicht benötigt, nur beim Bandpass und Bandstopp.
•
Filtertyp. An diesem Eingang oben am Funktionssymbol kann man zwischen Tiefpass, Hochpass, Bandpass und Bandstopp wählen. Bei letzteren beiden sind sowohl die untere als auch die obere Grenzfrequenz einzustellen.
•
l d 1l.l0 sind die Frequenzgänge eines Butterworth-Filters der Ordnungen 2, In Bi dargestellt. Als untere Grenzfrequenz wurde 200 Hz gewählt.
j::r-..
--
--
a.«1
J..
,.
°
.
••
••
••
r--
4 und 8
. " '" " .
' I'"
"
-.
-
-
-
Bild 11,10 Butterworth, Ordn. 2,
'" �° -... '
�
�
-
..
Ordnung 4,
OrdnungS
Bild 11.11 zeigt die anderen Filtertypen für eine untere Grenzfrequenz von 200 Hz und die Ordnung 8. Für Bandpass und Bandstopp beträgt die obere Grenzfrequenz 300 Hz.
°1 '
1=
..
••
.
1::
�::r--
..
','"
I'· '"
0,.
..
0,_
,
.
, 0
••
..
-
..
,. 0
-
Bild 11,11 Butterworth-Hochpass, -Bandpass,
�
-
I-
-
f-
.&
-
'"
-
'-=
:=
-
-
-Bandstopp
Will man einen steileren Abfall des Amplitudengangs bei der Grenzfrequenz haben, kann man den Tschebyscheff-Filter wählen. Bild 11.12 zeigt einen Tiefpass der Ordnung 8. • •
�
r=' ° ,. ,. " , .
',-
r-.
r
',,
.
0,' 0,_
,;"
'"
0,_
.. .. -
_ Itt. �t
L,LO
..
,a
---j ---j °
..
.. ,; '" -
'"
-
Bild 11,12 Tschebyscheff-Tiefpass, wie links, Ausschnitt: deutliches Oberschwingen
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'
11 Filterung
220
Der Tschebyscheff-Tiefpass hat unter sonst gleichen Voraussetzungen einen wesentlich steileren Abfall bei der Grenzfrequenz als der Butterworth-Tiefpass in Bild ll.!0 rechts. Man erkauft dieses Verhalten allerdings mit einem überschwingen im Durchlassbereich, wie Bild 11.12 rechts deutlich zeigt. Die Auswahl eines für die jeweilige Anwendung geeigneten Filters ist nicht Aufgabe dieses Buchs, siehe dazu [4], Kapitel 19.
IAufgabe 1 1 .4
Schreiben Sie ein Programm, das wie in Bild 11.7 den Einfluss der Filterung auf ein gestörtes Signal anzeigt. Ersetzen Sie dabei das Unterprogramm 'MitteJwert 5' durch eine Case-Struktur, n i der einige der LabVIEW-Filter aufgerufen werden können, z.8. Butterworth, Tschebyscheff, Sessel usw. Steuern Sie die Case-Struktur durch eine Enum Variable mit den entsprechenden Bezeichnungen.
IAufgabe 1 1 .5
Ergänzen Sie das VI aus Aufgabe 11.4 durch verschiedene Arten der Störung. Bild 11.7 verändert das erzeugte Sinussignal durch Addition einer zufilligen Störung (Würfelsym bol links oben im Diagramm). Doch bietet LabVIEW noch viele andere Möglichkeiten, z.B. eine Störung durch 'weißes Rauschen'. Die Funktion dazu und andere findet man unter 'Funktionen' - 'Analyse' - 'Signalverarbeitung' - 'Signalerzeugung' in den unteren zwei Zei l en. Auch hier sollte die Art der Störung vom Anwender wählbar sein.
IAufgabe 1 1 .6
Testen Sie das Programm aus Aufgabe 11.5 und verschaffen Sie sich einen überblick über die Wirkung verschiedener Filtertypen bei unterschiedlichen Arten der Störung.
Merke: LabVIEW stellt eine Fülle digitaler Filter zur Verfügung wie ButtelWOrth-, Tschebyscheff- oder Bessel-Filter und andere.
1 1 .3
Filterung im Frequenzbereich
Die LabVIEW-Filterfunktionen kommen dem idealen Filter nahe, wenn man die Ordnung hinreichend hoch wählt. Es gibt aber eine Möglichkeit, das Filterverhalten auf eine ganz andere Weise zu verbessern, nämlich durch Filterung im Frequenzbereich. 1 1 .3.1
Idee der Filterung Im Frequenzbereich
Der Gedanke besteht darin, das Array der Eingangsdaten in den Frequenzbereich zu trans formieren, dort die störenden Frequenzen gleich null zu setzen und das Ergebnis mit Hilfe der inversen Fouriertransformation zurück in den Zeitbereich zu wandeln. 1 1 .3.2
Die inverse Fouriertransformatlon in LabVIEW
Die nverse i LabVIEW-Fouriertransformation findet sich in 'Funktionen' - 'Analyse' 'Signalverarbeitung' - 'Frequenzbereich' n i der dritten Zei l e links, bezeichnet mit F'(x). Die einfachste Anwendung zeigt Bild 11.13. Eine Sinusfunktion im Zeitbereich wird in den
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'
11.3 Filterung im Frequenzbereich
221
Frequenzbereich transformiert und mit der inversen Fouriertransformation wieder zuruck gewandelt. Die beiden Funktionen sind identisch im Signalverlaufs-Diagramm. funktion
funktion
Bild 11,13 Fouriertransformation und Rücktransformation. Die X-Achse der Ausgangsfunktion muss mit 1/1000 skaliert werden, weil anderenfalls die Indizes angezeigt wOrden. Das sind 1000, weil die Sinussignal-Funktion links standardmäßig mit Is 1000 arbeitet '"
--
.......-
1"00,000
1"000,00 ',00
',00
-1,00
-2,00 0,0
-1,00
0,'
0,4
0,'
,..
0,'
1,0
-2,00 , 0,0
0,'
0,4
0,'
,..
0,'
1,0
Bild 11,14 Eingangsfunktion und mit Fouriertransformation und inverser Fouriertransformation erzeugte Ausgangsfunktion. Panel zu Bild 11.13 1 1 .3.3
Beispiel eines Tiefpasses
Die Programmierung eines Tiefpasses mit Hi l fe der inversen Fouriertransfonnation ist etwas aufwändiger. Bild 11.15 zeigt das Prinzip, Bi l d 11.16 das Ergebnis:
[j] Bild 11,15 Diagramm eines VI, das Zufallsstörungen im Frequenzbereich perTIefpass filtert
Ausleihe: 31.07.2009 00:00:00 - OS.OS.2009 00:00:00, ID:7ac0427dS929S1cfOS9d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
222
11
Filterung
Bild 11,16 Panel zu Bild 1 1 . 1 5
Bemerkungen zu Bild 11.15 und Bild 11.16 •
•
Das VI erzeugt eine Sinusfunktion, deren Frequenz am Panel eingestellt werden kann. Sie wird gestört durch Zufallsschwankungen wie n i dem VI aus Bild 11.7. Der dafür zustän dige Programmteil wurde jetzt in ein SubVI umgewandelt. Dazu den Bereich, der zum SubVI gemacht werden soU (das ist die FüR-Schleife links oben), durch Umfahren mit linker Maustaste markieren, dann 'Bearbeiten' - 'SubVI erstellen' aufrufen. Man erhält dann ein SubVI mit Standardsymbol, aus dem Ein- und Ausgänge herausgeführt sind. Danach muss nur noch ein passendes Symbol für das SubVI erzeugt werden, in unserem Beispiel 'Zufall Störg.' Das Symbol 'Frequ. Tiefp.' rechts n i Bild 11.15 ist das Zeichen für das Unterprogramm 'FrequenzTiefpass.vi'. Bild 11.17 zeigt das Diagramm dieses SubVI.
Bild 11.17 SubVl 'FrequenzTiefpass.vi' zur Tiefpassfilterung im Frequenzbereich
Ausleihe: 31.07.2009 00:00:00 - OS.OS.2009 00:00:00, ID:7ac0427dS929S1cfOS9d91b1gecaOOaO, Zentral- u 2009.07.31 21 :42:39 +02'00'
11.3 •
Filterung im Frequenzbereich
223
Es setzt im Feld der komplexen Fourierkoeffizienten einen Bereich ab dem Index F_·(#sIFs)+1 gleich 0+0·;, und zwar auf einer Länge von (#s - I ) - 2 F (#sIFs) Die Verdoppelung ist nötig, weil die Fourierkoeffizienten bei der doppelseitigen Fourier transformation symmetrisch gespeichert werden, siehe Abschnitt 10.1.2, Bild 10.5. Die Funktion, die das ausführt, heißt 'Tei l arrayersetzen' und ist zu finden unter 'Funktionen' - 'Programmierung' - 'Array' rechts oben. ·
•
· """,
.
In Bi l d 11.16 wurde oben links eine Frequenz von 6 Hz eingestellt, ebenso in der Mitte unten F = 6 Hz. Man sieht im Fenster der Amplituden, dass alle Frequenzen größer 6 Hz exakt gleich 0 sind. Unterhalb von 6 Hz sind kleine niederfrequente Störungen vom ZufaUsgenerator zu erkennen. Man könnte sie auch entfernen, wenn man einen entspre chend konstruierten Bandpass einsetzen würde. _
•
Die Filterung im Frequenzbereich ist also sehr trennscharf. Nachteil: Sie ist recheninten siverals die übliche Filterung im Zeitbereich.
IAufgabe 1 1 .7 Entwickeln Sie nach dem Muster von Bild 11.17 einen Bandpass. Hier muss natürlich neben F-. auch F..", einstellbar sein. Merke: Man kann SignaJe nicht nur im Zeitbereich filtern, sondern auch im Frequenzbereich. Vorteil: große Trennschärfe. Nachteil: höherer Rechenaufwand.
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'
12
Differenzialgleichungen
Lernzl.1e I. Einfache Differenzialgleichungen mit LabVIEW-ODE-Funktionen lösen können. 2. MATLAB�-ähnliche Blockdiagramme für Differenzialgleichungen aufstellen können.
3. MATLAB�-ähnliche Blockdiagramme n i LabVIEW-Diagramme umsetzen können. 4. Mit globalen Variablen arbeiten können. 5. Eine Vorstellung über die Genauigkeit numerischer Rechenverfahren entwickeln.
1 2.1
Lösen mit LabVIEW-ODE-Funktionen
Wir wählen als erstes Beispiel das bekannte Problem des gedämpften Feder-Masse-Systems in Bi l d 12.1.
Bild 12.1 Gedämpftes Feder-Masse-System mit Masse m, geschwindig
keitsproportionaler Dämpfung d, Federkonstante k und von oben wir kender Kraft f(t) Die Differenzialgleichung dieses Systems lautet:
m i(I) , d x(l)i k x(I) � f(l)
(12.1)
Man kann zur Lösung der Differenzialgleichung die LabVIEW-Punktion 'Runge Kutta
(4. Ordnung)' wählen, die man unter 'Punktionen' - 'Mathematik'- 'Differenzialgleichungen' in der Mitte der ersten Zeile findet. Diese Punktion gehört zur Gruppe der sogenannten ODE-Punktionen. 'ODE' ist die Abkür zung der englischen Bezeichnung für eine gewöhnliche Differenzialgleichung, nämich l 'Ordinary Differential Equation'. Mit dieser Punktion kann man nur Differenzialgleichungssysteme numerisch lösen. Eine einzelne Differenzialgleichung muss folglich zuerst in ein System umgewandelt werden. Das ist hier nicht schwer. Man setzt die Geschwindigkeit dx/dt = y und erhält dann aus (12.1) die Beziehung
i=y .
Y=-
d
-
m
k
[(I) y - _ · x + -m
(12.2)
m
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'
12.1 Lösen mit LabVIEW-ODE-FunktioTlen
225
Bi l d 12.2 zeigt das Panel eines VI, welches die Runge-Kutta-Funktion mit den Werten d/m = 0,2, kJm = I und !{O == 0 aufruft. Außerdem benötigt die Funktion die Namen der Variablen (hier x und y sowie t), h i re Anfangswerte und das Zeitintervall mit Anfangs- und Endwert, ferner die Schrittweite oder Schrittrate h. Man darf h nicht zu groß wählen, weil sonst die Lösung zu ungenau ausfallt. ...
-
PfP"-'
:6,00
.-
1
-
:=,00 I
' ....... ,
-
:6,D100 1 111
�r"""" _X
:,,�
.... ,.. -
1
,
...
-" '"
..., ,.,
w.,
�:�
Gwd "" " _ Y(t) ,
,
','
,
''
'v
r: ',<
<,' <,<
,/
1\ Y/
•
"
<,' <,'
.,
•
,
•
•
'"
...
"
"
"
�
Bild 12,2 Lösung der Differenzialgleichung einer gedämpften Schwingung mit Runge-Kutta in 'DGL_ODE1.vi'
Der Aufrufvon 'ODE: Runge Kutta (4. Ordnung)' benötigt eine Reihe von Parametern, wie man n i Bild 12.3 sehen kann.
Bild 12,3 Diagramm mit Auf ruf von Runge-Kutta. Eingabe werte und Ergebnisse in Bild 12.2. Die R-K-Funktion liefert das ErgebniS in Spalten, die für die Ausgabe als Vektoren zuvor zu transponieren sind. Deshalb führen die Indexwerte 0 und 1 in die unteren Eingänge der Funktion 'Array indizieren'
Dabei kann man sich besonders bei der Eingabe der Stringkonstanten für die Variablen namen leicht verschreiben und erst recht bei der Eingabe der rechten Seite des Differenzial gleichungssystems. Die Funktion reagiert darauf mit einer Fehlermeldung und bricht den Lösungsprozess ab. Man sieht keine Ergebniskurven und weiß nicht den Grund. Deshalb ist es hier besonders wichtig, den Fehlerausgang der Funktion zu nutzen, damit man sich an hand der Fehlernummern über die Ursache infonnieren kann. Dazu aufdem Panel m i Feh ler-Cluster das Kontextmenü zu 'Status' aufrufen und 'Warnung beschreiben' wählen. Oder auch: Aufrufen von 'Hilfe' - 'VI-Funktionen- und Anwendungshilfe . . . ' (Shortcut: Strg+?), 'Fehlercodes' unter Index eingeben und in der passenden Sparte (hier: Mathematik) nach schauen.
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'
226
12
Differenzialgleichungen
Die Lösung zur Federschwingung mit diesem Programm ist trotzdem unbefriedigend. Man kann z.B. nicht unmittelbar Masse m, Dämpfung d und Federkonstante k variieren, sondern muss erst auf dem Papier kleine Nebenrechnungen machen und dann die neuen Werte als Strings eingeben. Bild 12.4 und Bild 12.5 zeigen einen verbesserten Ansatz. Die Strings wer den, ausgehend von den genannten Parametern, vom VI seJbst erzeugt. Außerdem ist noch eine anregende Sinusfunktion für f(f) vorgesehen, die von einem vibrierenden Boden herrühren könnte, und schließlich kommt noch die Wirkung der Gravitationskonstanten g dazu. Auf die Eingabe und Anzeige der Variablennamen wurde verzichtet.
-<-
,.
Bild 12,4 Erzwungene Schwingung mit 'DGL_ODE2.vi': Sinusfrequenz nahe der Eigenfrequenz
Bild 12.5 Diagramm zu Bild 12.4. Der ganze obere Teil dient nur der Bereitstellung der rechten Seite des Differenzial gleichungssystems in FOnTI von 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'
12.2 Lösen nach dem Analogrechnerprinzip
227
1 2.2
Lösen nach dem Analogrechnerprinzip
12.2.1
Blockdlagramm-Darstellung
Das VI nach Bild
12.4 ist jetzt zwar vom Benutzer gut bedienbar, doch ist sein Diagramm
wenig übersichtlich. Man erkennt nicht gleich, was programmiert wurde. Ein anderer Ansatz � geht davon aus, die Differenzialgleichung wie n i MATLAB als Blockdiagramm abzubilden und in ein übersichtliches LabVIEW-Diagramm umzusetzen. Die Differenzialgleichung
(12.1) lässt sich z.B. wie in Bild 12.6 darstellen. *'
-+_w+-
L---
Das Blockdiagramm (nicht
Ausgabe
Bild 12.6 Differenzialgleichung
�
(12.1) als Blockdiagramm ähnlich
· wie in MATlAB
__ __
zu verwechseln
mit demselben Begriff in LabVIEW!) ist eine
prägnante grafische Darstellung der Differenzialgleichung. Sie diente früher auch als Vorlage
rur die Verdrahtung von Analogrechnern, die n i den 6Oer- und 70er-Jahren eingesetzt wur den. Auch n i LabVIEW kann man damit arbeiten, wie Bild
,
.. .
0,08 ',00
,
.... liltiii a i IirMilb
•
d
0,00
12.8 zeigt.
,
,"
.
---
:
0,00
,'"
- '" �
: 100 00 . . ..
�) 0,010
Bild 12.7 Panel des Blockdiagramm-orientierten VI 'DGl,.Block1.vi' mit denselben Parametern wie in Bild 12.4
IAufgabe 12.1
Stellen Sie die Parameter auf dem Panel von DGL_Blockl.vi (Bi ld die gleichen Resultate erzieJen wie in Bild
12.2.
12.7) so ein, dass Sie
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'
228
12
Differenzialgleichungen
Bild 12.8 Programmierung der Differenzialgleichung (12.1) in einem Blockdiagramm. Die Ergebnisse sind in Bild 12.7 zu sehen
Erläuterungen •
Das Blockdiagramm n i Bild 12.6 wird durch die FüR-Schleife in Bild 12.8 realisiert. Statt der Dreieckssymbole werden quadratische Symbole für SubVIs mit der Bezeichnung 'INT' und 'INT I' verwendet.
•
Die Rückführungen von x und dxldt sind durch Schieberegister realisiert, welche die Ergebnisse eines Sdlleifendurchlaufs zum nächsten übertragen. Dieses Prinzip wurde bereits in Abschnitt 3.4 erläutert. Siehe dort besonders Bild 3.19.
•
Weil das Prinzip der Rückkopplung bei Verwendung von Schieberegistern nicht so deut lich wird, wurde n i LabVIEW 7.0 ein von rechts nach links gerichteter Pfeil ein geführt,der in 'Funktionen' - 'Programmierung' - 'Strukturen' als 'Rückkopplungs knoten' (auch 'Feedback-Knoten') zu finden ist. Man muss ihn aber nicht unbedingt von dort holen. Dieser Pfeil stellt sich z.B. automatisch ein, wenn man innerhalb einer FüR oder While-Schleife den Ausgang einer Funktion mit ihrem Eingang verbindet (in älteren LabVIEW-Versionen führte das zu einer FehlermeJdung). Dritte Möglichkeit: im Kon textmenü eines Schieberegisters 'Durch Rückkopplungsknoten ersetzen' wählen. Bild
12,9 zeigt das Diagramm von Bild 12.8, gestaltet mit diesem neuen Element. Das Dia
* gramm wird so leichter verständlich und dem MATLAB -Blockdiagramm ähnlicher. Die Ergebnisse sind die gleichen. Der Rückkopplungsknoten hat dieseJbe Funktion wie ein Schieberegister. Er wird nur optisch anders dargestellt. Man kann das auch an den rau tenförmigen Symbolen am linken Rand der FüR-Schleife erkennen. Damit können Rückkopplungsknoten genauso initiaisiert l werden wie Schieberegister.
Erläuterungen zur Integration •
Die Bezeichnungen 'INT' und 'INT l ' bedeuten Integrationen. Die Funktion 'Int.vi' ' macht aus der zweiten Ableitung d xldf die erste Ableitung dxldt und 'Intl.vi' erzeugt aus dxldt die Funktion x(t}.
•
Die Integration erfolgt mit Hilfe eines numerischen Näherungsverfahrens. Die einfachste Methode ist die von Euler:
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'
12.2 Lösen nach dem Analogrechnerprinzip
J
229
t.+&
x(I, ) = x(to + At) = x(to) +
.
x(t)dt = x(to) + x(to ) At
' •
•
Grafisch bedeutet das, den Punkt x(t,) zu berechnen, indem man in x(t,) die Tangente an die unbekannte Kurve x(t) legt, von der man anfangs nur den Funktionswert und die Ab leitung n i !. kennt. Man ersetzt also die unbekannte Funktionskurve näherungsweise durch die bekannte Tangente. In x(!,) wiederholt man das Verfahren, erhält x(tJ usw. Auf diese Weise wird schließlich x(!) durch einen Polygonzug ersetzt, der näherungswei se mit der gesuchten Funktion übereinstimmt. Das Verfahren ist sehr grob, doch kann man in vielen Fällen recht gute Ergebnisse erzielen, wenn man die Zeitschritte h = l!t hin reichend klein macht. Dieses Verfahren wird n i den Funktionen 'Int.vi' und 'Int l.vi' ver wendet. Bild 12.10 zeigt die PaneJ von Int.vi und Int1.vi, Bild 12.11 die beiden Rahmen der Case-Struktur von Int.vi. Das Programm Intl.vi hat den gleichen Aufbau, nur andere Variablennamen. Das Programm Int.vi besteht aus einer Case-Struktur mit zwei Fällen. Ist die Variable 'Init' gleich TRUE, wird der Anfangswert als 'x{t)' gespeichert. Ist 'Init' gleich FALSE, wird einmal die Eulersche Näherungsformel ausgeführt und zu 'x(t)' addiert. Auf diese Art ändert sich schrittweise die Ausgangsgröße 'x(t)', die Näherung für den Integralwert. Beim Lösen einer Differenzialgleichung wird nur zu Beginn der TRUE-Teil von Int.vi verwendet, danach stets der FALSE-Teil. Im Diagramm von Bi l d 12.9 wird das durch ein Schieberegister oben an der FüR-Schleife erreicht. Beim Eintritt wird 'TRUE' eingespeist und 'Int.vi' und 'Intl.vi' zugeführt. Dann wird (oben rechts) sofort aufFALSE umgestellt, so dass die folgenden Schleifendurchläufe mit 'FALSE' arbeiten. ,.
Bild 12.9 Programmierung der Differenzialgleichung (12.1) in einem Blockdiagramm, diesmal unter Verwendung von Rückkopplungsknoten. Die Ergebnisse sind in Bild 12.7 zu sehen P' In!
-
., tlootpan.'
I�T
0
,.
�
,. ,
"
•
' : �.... .... u.
:..... •
0 K
!f't'
�
,-
.'-.... ,
'" ,
.,
�jo.w
-.J
i' •
<'l'
""
,.-
, 4
Blkl12.10 Panel von Int.vi und Intl.vi. Sie unter scheiden sich nur durch die Namen oben und rechts
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'
230
12
Bild 12.1 1 TRUE-Rahmen von Int.vi 12.2.2
Differenzialgleichungen
FAL$E-Rahmen von Int.vi
Vereinfachungen
Das Diagramm in Bi l d 12.9 ässt l sich noch in verschiedener Weise vereinfachen: •
Die Verwendung unterschiedlicher Variablenspeicher für die Anfangswerte von x(t) und von dx(t)/dt ist zwar notwendig, muss aber nicht so ungeschickt erfolgen, dass man zweimal praktisch identische VIs schreibt. In Abschnitt 5.2.3 wurden ablaufinvariante (reentrant) Unterprogramme besprochen, die hier bestens geeignet sind. Man braucht
nur lnt.vi mit 'Datei' - 'VI Einstellungen .. .' - 'Ausführung' - 'Ablaufinvariante Ausfüh
rung' umzustellen und in dieser Form zu speichern. Dann benötigt man nur ein SubVI, hier gespeichert unter IntR.vi. •
Der Eingang für die Initialisierung von IntR.vi kann entfallen, wenn man die Funktion 'Erster Aufruf?' gemäß Abschnitt 5.2.4 verwendet.
•
Schließlich ist auch auf die Eingangsvariable für dt verzichbar, wenn man eine globale Variable nutzt. Abschnitt 12.3 gibt darüber Auskunft.
Fasst man alle Verbesserungsvorschläge in IntR.vi zusammen, kommt man zu einem SubVI, das in Bild 12.12 und Bild 12.13 dargestellt ist.
�
:)3.00 9ril{tl
:}O.oo
>:ß)j
10.00 Bild 12.12 Panel des $ubVllntR.vi
Bild 12.13 TRUE-Rahmen von IntR.vi
FAL$E-Rahmen von IntR,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'
12.3 Globale Variablen
231
Unter Verwendung dieses einen SubVI vereinfacht sich das Diagramm aus Bild 12.9 erheb ich. l Das zeigt Bild 12.14. Das Symbol 'INT' wurde dort durch 'lls' ersetzt. Das bezeichnet üblicherweise die Integration in Blockdiagrammen. Es leitet sich ab von der Laplace Transformation einer Differenzialgleichung, bei der das Differenzieren durch Multipiz l ieren mit s und das Integrieren durch Dividieren durch $ ersetzt wird.
Bild 12.14 Vereinfachtes Diagramm zur Berechnung der Differenzialgleichung (12.1)
Die Ergebnisse bei der Wahl der gleichen Eingabeparameter sind dieselben wie in Bild 12.7.
IAufgabe 12.2
Versuchen Sie, ein Diagramm für DGL_Block3.vi zu entwickeln, das die Differenzial
gleichung eines Re-Gliedes von der Porm R-C-du,ldt +
u, = u(t) löst. Nehmen Sie als
Beispiel u{t) = Uo = wnst = -0,2 Volt, R = 1 Ohm, C = 1 Farad.
1 2.3
Globale Variablen
Zur Vereinfachung des Diagramms aus Bild 12.9 wurde auch eine 'Globale Variable' verwendet. Globale Variablen stehen bei 'Punktionen' - 'Programmierung' - 'Strukturen' als Symbol 'GLüB' mit der Bezeichnung 'Globale Variable'. Lokale Variablen dienen dazu, Daten zwischen verschiedenen Stellen im seihen VI auszu tauschen. Mit globalen Variablen kann man Daten zwischen verschiedenen, parallel laufen den Vb austauschen. Auf die globalen Variablen können alle VIs lesend und schreibend zugreifen. Das Prinzip ist n i Bild 12.15 skizziert. Globale Variable I
1Var1
__
'\
/,,,,,(
VII
L IGlobl
Panel fiIr globale Variabk(n)
�bl -Ivarl VI2
Bild 12.15 Prinzip des Zugriffs von zwei VJs auf dieselben Daten mit Hilfe einer globalen Variablen
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'
232
12
Differenzialgleichungen
Rezept zur Nutzung globaler Variablen
Im Diagramm eines VI wird das Symbol 'GLOS' ausgewählt. Wir nehmen als Beispiel das Unterprogramm InlR.vi von Bild 12.13. Dann erscheint dort eine zunächst noch nicht defi nierte globale Variable mit kleiner Erdkugel und Fragezeichen. Sie kann mit Doppelkliek der inken l Maustaste zu einem Panel wie für ein gewöhniches l VI geöffnet werden. Jedoch hat dieses spezielle VI kein Diagramm. Danach ist in diesem Fenster wie folgt zu verfahren: •
•
•
•
•
Aufdem Panel für die globale Variable passendes Bedienelement oder AnzeigeeJement wählen. Im Beispiel wurde ein numerisches Bediene1ement gesetzt. Geeigneten Namen wählen. Im Beispiel war das 'dt'. Nun erst kann man dem Erdkugelsymbol im Diagramm des VI, das mit einer globalen Variablen arbeitet, einen Namen geben. Man klickt dazu mit der linken Maustaste aufdie Erdkugel. Dann erscheinen die Namen aller Variablen, die m i Moment zugeordnet wer den können. Im Beispiel ist das nur 'dt', weil das Panel der globalen Variablen nur dieses Bedienelement aufweist. Nun mit der Maus gewünschte Bezeichnung auswählen und los lassen. Damit ordnet man diesen Namen dem Symbol der globalen Variablen zu, m i Bei spiel 'dt'. Andere Möglichkeit: im Kontextmenü der globalen Variablen 'Objekt wählen' aufrufen und dann die Wahl treffen. Speichern der globalen Variablen. Das PaneJ für die globale Variable wird im Prinzip wie ein Unterprogramm behandelt. AJso diesem Panel einen Namen geben, indem man mit 'Datei' - 'Speichern unter . . .' arbeitet. Mit 'Datei' - 'Speichern' allein erhielte man den voreingestellten Namen 'Globale Variable I '. Im Beispiel wurde die Bezeichnung 'Delta-" gewählt. Die Endung '.vi' wird automatisch angehängt. Hat man mehrere globale Variablen, wird man sie nonnalerweise in einem Panel zu sammenfassen. Dazu muss man das VI der globalen Variablen wie ein gewöhnliches Unterprogramm mit 'Punktionen' - 'VI auswählen . . . ' öffnen (sofern es nicht bereits geöffnet ist) und dort weitere Bedienelemente definieren. Dagegen würde eine simple Wiederholung von 'Punktionen' - 'Programmierung' - 'Strukturen' - 'Globale Variable' zu einem anderen Panel mit dem Namen 'Globale Variable 2' usw. führen.
•
•
Will man globale Variablen in einem anderen VI verwenden, muss man sie dort ebenfalls wie ein Unterprogramm laden. Im Beispiel ist das 'DGL-Block3.vi', dessen Diagramm in Bild 12,14 dargestellt ist.
Da globale Variablen formal wie ein Unterprogramm behandelt werden, kann man im Prontpanel auch das Symbol oben rechts ändern (anklicken mit rechter Maustaste, dann 'Symbol bearbeiten .. .' wählen und nach Wunsch verändern). Im Beispiel wurde von dieser Möglichkeit nicht Gebrauch gemacht, siehe Bild 12.16.
[!J
1 2.4
Bild 12.16
Standardsymbol fürdas zuerst verwendete Globale-Variablen-Panel
Genauigkeit numerischer Verfahren
Das in Abschnitt 12.2 verwendete Integrationsverfahren nach Euler ist sehr anspruchslos. Komplexere Verfahren verwenden nicht nur die Tangente im Anfangspunkt t., sondern zusätzlich solche in einem oder mehreren Zwischenpunkten zwischen to und t,. Das im VI von Bild 12.3 benutzte Runge-Kutta-Verfahren arbeitet mit vier Punkten, ist recht genau
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'
12.4 Genauigkeit numerischer Verfahren
233
und gilt als eines der Standardverfahren für die numerische Berechnung von Differenzial gleichungen. Aber auch die mit dem Euler-Verfahren errechneten Werte sind recht gut, wie ein Vergleich der Panels n i Bild 12.4 und Bi l d 12.7 zeigt. Die Frage ist aber, ob nicht doch beträchtliche Unterschiede existieren, was die Abweichung von der wahren Lösungskurve betrifft. Die Berechnung der wahren Lösung ist bei unseren einfachen Beispielen möglich, doch schon recht aufwändig. Wir gehen deshalb einen ande ren pragmatischen Weg. Wir vergleichen die Lösungsarrays, die wir bei verschiedenen Ver fahren und mit verschiedener Schrittweite erzielen, in einem speziellen Programm namens Genauigkeit.vi, dem wir die Daten parallel laufender Vb über globale Variable zur Ver fügung stellen. Dazu modifizieren wir das mit Runge-Kutta arbeitende ODE-VI von Bild 12.3 in der Weise, dass wir den Matrix-Ausgang 'x(t), y(t)' einer globalen Variablen zuführen. Eingestellt ist dort die Schrittweite h = 0,01 (10 m). Wir bilden eine Modifikation mit h = 0,001 (I m) und verwenden für den Ausgang eine zweite globale Variable. Entsprechend verfahren wir mit dem Programm, das nach Euler arbeitet (Bi l d 12.14). Das gibt zwei weitere globale Variab len. Sie alle werden in 'Global_Genauigkeit.vi' gespeichert, siehe Bi l d 12.17.
Bild 12.17 Vier globale Variablen in einem speziellen VI ohne Blockdiagramm namens 'Global_Genauigkeit.vi'
Das Programm 'Genauigkeit.vi' liest diese globalen Variablen und bildet verschiedene Diffe renzen der Ergebnisse für Weg und Geschwindigkeit: •
Euler 10 m - Runge-Kutta 10 m,
•
Euler I m - Runge-Kutta I m und
•
Runge-Kutta 10 m - Runge-Kutta I m.
Das Diagramm von 'Genauigkeit.vi' ist in Bi l d 12.18 dargestellt, das Panel, in dem man die Ergebnisse ablesen kann, in Bild 12.19.
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'
234
12
Differenzialgleichungen
I'
Bild 12,18 Verarbeitung der Ergebnisse verschiedener Lösungsverfahren. Diagramm zu Bild 12.19
""1D
i lE' l D",,"ri'li-',\-.',�!��!\+I-+� D _"'_1D
\
\' j
Bild 12.19 Grafische Darstellung der Genauigkeit von Runge-Kutta im Ver gleich mit Euler. Jeweils zwei unterschied liche Schrittweiten für die Berechnung
Diskussion der Ergebnisse
Der Vergleich der Runge-Kuua-Ergebnisse mit h = 0,010 und 0,001 zeigt sehr kleine Dif ferenzen bis maximal ca. 3 x 10"". Das trifft sowohl auf die Auslenkung der Feder zu als auch auf ihre Geschwindigkeit, die im unteren Diagramm von Bild 12.19 dargesteUt sind. Man kann also davon ausgehen, dass eine weitere Verkleinerung von h keine nennenswerte Verbesserung mehr bringen würde. Das ist zwar kein mathematischer Beweis, praktisch wird aber gern so geschlossen. Wir können also annehmen, dass die wahren Werte mit dem Ver fahren von Runge-Kutta vollkommen ausreichend ennittelt werden können. Daran lässt sich nun die Genauigkeit des Euler-Verfahrens messen, grafisch dargestellt in den oberen beiden Fenstern von Bild 12.19. Das erste Fenster zeigt Abweichungen bis zu maximal 0,006, das untere bis 0,002. Die Verkleinerung der Schrittweite von 0,01 auf 0,001 hat also einen gewissen Effekt, jedoch keinen großen. Geht man noch weiter, etwa zu h = 0,0001, bekommt man Probleme mit der Rechenzeit. Auch kommt irgendwann der
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'
12.4 Genauigkeit numerischer Verfahren
235
Moment, in dem eine weitere Vergrößerung der Zahl der Rechenschritte (das bedeutet ja die Verkleinerung von h) nichts mehr bringt, wei l die Rundungsfehler den theoretischen Ge winn an Genauigkeit wieder aufheben. Das Runge-Kutta-Verfahren ist demnach weit über legen. Auch hier bestätigt sich wieder der alte Satz von
Max Planck: "Es gibt nichts Prakti
scheres als eine gute Theorie." Geht man davon aus, dass physikaisch l
im mkgs-System
gerechnet wird, handelt es sich
beim Euler-Verfahren n i unserem Beispiel um Fehler in der Größenordnung von 0,6 mm (Weg) bzw. 0,2 mmls (Geschwindigkeit), wenn die Feder mit einer Auslenkung von
I
m
startet. Auch diese Genauigkeit dürfte in den meisten Fällen völlig genügen.
Bemerkungen zur Programmierung von 'Genaulgkeit.vl'
ist der Vergleich der Daten verschieden langer Arrays. Wählt man h = 0,01, fallen n i unserem Beispiel, in dem t von 0 bis 20 läuft, 2000 Werte an. Rechnet man dagegen mit h = 0,001, erhält man 20000 Werte. Man kann also nicht einfach die Differenz der Arrays bilden, sondern muss vom längeren VI nur jeweils den zehnten Wert nehmen. Das heißt, Ein Problem
man vergleicht den ersten Wert des kürzeren Arrays mit dem zehnten des längeren, den zweiten mit dem zwanzigsten usw. Für Indizes im längeren Array, die keine Vielfachen von
10 sind, setzt man die Differenz gleich null. Man erhält dann allerdings eine Kurve im Anzei geelement, die eher wie eine Fläche wirkt. Das liegt am Interpolationsmodus. Schaltet man
ihn aus, erscheint die Kurve punktiert wie im unteren Graphen von Bild 12.19.
IAufgabe 12.3
Analysieren Sie das Blockdiagramm von Bild 12.18, bauen Sie es von Anfang an auf und ergänzen Sie den dort nicht sichtbaren FALSE-Teil der Case-Struktur innerhalb der dop pelten FüR-Schleife.
IAufgabe 12.4
Vergleichen Sie die Genauigkeit des Euler-Verfahrens für die Schrittweiten h = 0,001 und h = 0,0001 nach der Methode des Blockdiagramms von Bild 12.18.
Merke: Gewöhnliche DifferenziaJgleichungen (genauer. Systeme von DifferenziaJ
gleichungen) kann man mit Hilfe eingebauter LabVIEW-Funktionen (ODE = Ordinary Differential Equation) numerisch lösen. Man sollte ein ODE-SubVI wählen, das mit dem Runge-Kutta-Verfahren arbeitet. Merke: Gewöhnliche DifferenziaJgleichungen lassen sichauch lösen, indem man sie als Blockdiagramm darstellt und davon ausgehend ein LabVIEW-Programm entwickelt. Benötigt wird dazu ein SubVI, das ablaufinvariant sein muss (sofern es im Blockdiagramm mehr als einmal benötigt wird). In vielen Fällen ist es ausreichend, in diesem SubVI das Ewer-Verfahren zu verwenden. Merke: Das Runge-Kutta-Verfahren erzielt bei gleicher Schrittweite wesentlich
genauere Ergebnisse als das Ewer-Verfahren. Man kann das in gewissen Grenzen durch Verkleinerung der Schrittweite ausgleichen. Merke: Der Datenaustausch zwischen zwei verschiedenen Vb kann auch über globa
le Variablen erfolgen. Man muss die Daten nicht aufder Festplatte als Zwi schenträger speichern.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00. ID:7ac0427dS929S1cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
13
Systeme von Differenzialgleichungen
Lernzl.1e I. Differenzialgleichungssysteme mit LabVIEW-ODE-Funktionen lösen können. 2. Blockdiagramme für Differenzialgleichungssysteme aufstellen können. 3. Blockdiagramme für Differenzialgleichungssysteme in LabVIEW-Diagramme umsetzen
können.
13.1
Systeme gewöhnlicher Differenzialgleichungen
In Abschnitt 12.1 waren wir gezwungen, die Differenzialgleichung zweiter Ordnung für den gedämpften Massenschwinger in ein System von zwei Differenzialgleichungen erster Ord nung umzuwandeln. Anderenfalls hätten wir die mit dem Verfahren von Runge-Kutta arbei tende LabVIEW-ODE-Funktion nicht anwenden können. Bei der Umsetzung des Blockdia gramm-Verfahrens nach Abschnitt 12.2 dagegen war das nicht erforderlich; einer der Vortei le dieser Methode. Nun gibt es Fälle, in denen von vornherein auf Grund der Umstände Differenzialgleichungs systeme vorliegen. Diese kann man direkt mit der LabVIEW-üDE-Funktion lösen. Ebenso gut kann man aber auch hier das Differenzialgleichungssystem als Blockdiagramm modellieren und dieses mit Hilfe der FüR-Schleife in ein VI umwandeln, das im Rahmen einer gewissen Genauigkeit dieselben Ergebnisse liefert. 13.2
Gekoppeltes Feder-Masse-System
Bi l d 13.1 zeigt ein ungedämpftes Feder-Masse-System, das durch folgendes System von Dif ferenzialgleichungen beschrieben werden kann: mix, +klx, + (x, -x2)k2 = 0
(13.1)
m2x2 +(x2 -x,)k2 = 0
Bi l d 13.1 zeigt die Ruhelage. Die Pfei l e mit x, und � verdeutlichen darin die Richtung, in der Abweichungen der Massen aus der Ruhelage positiv gezählt werden.
[�!AAAAA r mmr "
A AA A A A A IfVVV\fI[V "
m,
�
m,
Bild 13.1 Ungedämpftes
System mit zwei Massen und zwei Federn
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'
13.2
GekoppeItesFeder-Masse-System
237
Lösung mit eingebauter ODE-Funktion
13.2.1
Wie schon in Abschnitt 12.1 muss man Hilfsvariablen einführen, weil die ODE-Funktion nur mit Differenzialgleichungssystemen erster Ordnung arbeitet. Wir setzen
und erhalten damit aus (13.1) Formeln für vier Funktionen: y,
x, =
.
Y, = -
(k, +k, ) m,
Y,
-
k x, + , x, k,
k, -x,
Y, =
(13.2)
111,
-x,
m,
m,
Wie wir in Abschnitt 12.1 auc.h sc.hon gesehen haben, ist es mühsam, ein Programm zu schreiben, das der ODE-Funktion variable Parameter k" k, usw. übergibt. Wir beschränken uns deshalb auf folgendes BeispieJ: k, = 80, k, = 30, m, = 500, m, = 200. Die Anfangsbedin gungen seien: Anfangsauslenkung x'o = 0,30, (dx,ldt)o = 0, � = 0, (dx,ldt)o = l. Bild 13.2 zeigt das Panel, Bild 13.3 das zugehörige Blockdiagramm zur Lösung des Problems. I> 1 :JJ 2 DGl ODE 2we,F.dern VI
u;
,,(Sctwt:b...)
:�
,
-<,
-,
-
' ' -�''' 3,oo-'�"I'""'T''II' 'I r-,..."I'""''I,.ooti-+t-I++--t-f1\-t--Pt-I-t-l
_ ..
i·1:,0:0F-I HJ'--I\--tl \ l- fhi-H\\:H'l t-Itl l---i\I+�*\-'I--I+'f/I--t-1i'f-t-'\I ·2,00t--t-"!-t-'4--1-1t--t--\lt-t--I ·3,00+....j. ..< +..-I10�I-..,h.-l-..� ro..-l'-+...1 100 �
:JJ
�
�
,
.
w
00
�
Bild 13.2 Auslenkungen der Massen m, und m, im Verlauf von 100 s bei vorgegebenen Parametern. Panel zum Diagramm von Bild 13.3
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'
238
13
Systeme von Differenzialgleichungen
Bild 13.3 Berechnung der lösung für ein ungedämpftes Zwei Feder-Masse-$ystem mit der LabVlEW-QOE Funktion nach Runge-Kutta
Bemerkungen zum VI In Bild 13.2 und Bild 13.3 •
Da das in der ODE-Funktion verwendete Runge-Kuua-Verfahren sehr genau ist, genügt die Sdlrittweite h = 0, I $.
•
Damit im Signalverlaufs-Graphen auf dem Panel rechts nicht der Index 1000 (für die Schrittzahl), sondern die Zeit 100 s angezeigt wird, nutzt man einen Eigenschaftsknoten zur Skalierung der X-Achse mit dem Wert von h.
•
Die Runge-Kutta-LabVIEW-Funktion liefert eine Matrix mit 1000 Zei l en und vier Spal
ten für die Variablen x"y" � und Yl" Das ergibt sich aus der Reihenfolge, in der die Vari ablen auf dem PaneJ unter 'x (Variablennamen)' eingetragen wurden. Will man nun x, und x,., die Auslenkungen der Massen m, und m1, anzeigen, muss man die Spalten 0 und 2 auswählen, was durch Indizierung der Matrix erfolgt. Das ist rechts in Bild 13.3 zu sehen.
Außerdem ist die Matrix vorher zu transponieren, weil der Ausgabegraph die Zei l en der Matrix liest und nicht die deren Spalten.
IAufgabe 13.1
Schreiben Sie ein VI ähnlich dem n i Bild 13.2, das aber nur die Geschwindigkeiten gra
fisch anzeigt.
IAufgabe 13.2
Wie Aufgabe 13.1, aber mit Ausgabe für beide Auslenkungen und beide Geschwindigkei ten. Hinweis: Die Aufgabe vereinfacht sich, weil die Indizierung der Matrizen nun nicht mehr nötig ist.
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'
13.2
GekoppeItesFeder-Masse-System
239
Lösung mit Blockdiagramm wie In MATLAB�
13.2.2
Flexibler n i der Handhabung der Parameter ist die Lösung des Problems bei der Program mierung als Blockdiagramm wie in MATLAB�, dargestellt in Bild 13.4 und Bild 13.5.
.,
•
" "
" ;1SäOO. 1 , - • . iMn J. .-, - ::-..-I •
•
., . .� -'
:�. 1 �: ,. iOoo
.-
:"" I
,, '
;1);-
"'"
��
-.
•
��
-
1 00. ""
�
��
": E "
f\
.
BiVeMalrdslaeunfvm,onAuunsdlem�nskbeuimnigveonrder PBigeBlaocldngeeklbdzeiuanmgedirnaDiemPsaamm-ode graaramlmmiemtetrdem.vorn h O de A n e n e l o g r e c t n h :; ' � "m , 1 t �" � ; t � � � � � � � � :: :: :: :: :: � � � � =i :: :: rt:��� :: 13.4
11
100
·'.00
,
"
ro
"
•
;,
,.
•
"
•
"
,ro
13.5,
I'ii. .
aBiulsdgehendBveorencehinnuenrgBldeocrkLdöiasgurnagmfm-üreDianrsutnegleudnägmimpfStetisleZwevoni-MATFedeLrA-MB·as e-System, 13,5
Bemerkungen zum VI In Bild BA und Bild 13.5 •
Die Parameter im Panel sind abgesehen von den Anfangswerten alle an Schiebereglern einzustellen. Sie können wegen der alles umschließenden While-Schleife auch während des Programmlaufs verändert werden. Man sieht dann das Verhalten der zwei Federn in Abhängigkeit von den Parametern wie Massen und Federkonstanten.
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'0 '
240 •
13
Systeme von Differenzialgleichungen
Die While-Schleife im Diagramm sorgt dafür, dass alle 100 ms eine Neubere<:hnung der Kurven erfolgt, die dann die Startwerte aus den Endwerten des vorhergehenden Durch laufs beziehen: Die Kurve scheint zu wandern.
IAufgabe 13.3 Verifizieren Sie, dass das Blockdiagramm n i Bi ld chungssystem (13.2) entspricht.
13.5 tatsächlich dem Differenzialglei
IAufgabe 13.4
Testen Sie das VI n i Bi l d 13.s und verschaffen Sie sich einen Eindruck vom Verhalten der Federschwingung. Testen Sie besonders RandfaIle wie Masse oder Federkonstante gleich null. Entspricht alles Ihren Erwartungen?
13.3
Umwelt und Tourismus
Das folgende BeispieJ behandelt die Einwirkung des Massentourismus auf die Umweltquali tät eines FerienzieJs. Man kann diese Wechselwirkung nach 11] (Abschnitt 6.2: Dynamische Systeme mit zwei Zustandsgrößen, S. 293) durch das folgende gekoppeJte System von zwei Differenzialgleichungen beschreiben:
x = -a x+b y y = d y·(1-ylk)-c x Y Die Funktionen und Parameter bedeuten: •
•
x(t) Massenstrom der Touristen, y(t) Qualität der Umwelt,
•
a
•
b
•
c
•
•
d k
Touristenzahlenverlustrate infolge überfüllung, Werbewirkung durch Umweltqualität, Rate der Umweltzerstörung, Rate der Umwelterholung, Tragfähigkeit der Umwelt.
Die Zahlenwerte für diese Konstanten sind aus Beobachtungen einzelner Beispiele touristi scher Regionen entnommen Sie müssen möglichst sorgfältig ermittelt werden. Bild 13.6 zeigt die Darstellung dieser Differenzialgleichungen in MATLAB·-Simulink·.
desBildTouristDienffsetrreonmsziailnglMATlekhuAngBs·-y$ismteumli,ndak*sbedisechgreegibetnseitigeAbhängigkeitderUmweltqualität und 13.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
13.3 Umwelt und Tourismus
241
Bi l d 13.7 verdeutlicht die Lösung für das Verhalten von Umwelt und Tourismusstrom, wo bei die mit Simulink* durchgeführten Rechnungen voraussetzen:
• x(0) =0, • y(O) = 1.00 bzw. = 2.00, • a = 1.00, • b = 5.00,
2.5
c = 1.00, d = 1.00, k = 1.00.
/.-',
, ,
, ,
i , ::/ � , 1-1 , �
0.5
.
�..
�.
4·
I
- -' --," ' ''' -'' -'= -= -= --= -= - -� -'-= -�
Die ausgezogenen Kurven zeigen den Fall mit den Anfangswerten x(O) = 0, y(O) = 1.00, die gestrichelten den FaUx(O) = O,y(O) = 2.00. Ferner gilt ts- = 0, tStopp = 10, h = 0.01.
Auch hier lassen sich mit LabVIEW leicht Ergebnisse erzielen, die im Rahmen hinreichender Genauigkeit mit denen von MATLAB* -Simulink'" übereinstimmen. Wir verzichten diesmal auf die Lösung mit der LabVIEW-ODE-Funktion und zeigen nur Panel und Diagramm eines im Analogrechnerstil entwickelten VI.
IAufgabe 13.5 Entwickeln Sie ein VI unter Zuhilfenahme der LabVIEW-ODE-Funktion, das gleiche Er gebnisse liefert wie das MATLAS'"-Simulink*-ModeU für die Fälle von Bild 13.7. Es folgt die Vergleichsrechnung mit einem LabVIEW-VI:
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
242
13
Systeme von Differenzialgleichungen
DeBildr DezimEailnpeusndkterisEtrhgieebrndiusrcehvdaonsBDeildz1im3.a7l,kbeommarechnzeutemirsettzeiennem LabVlEW-VI. 13.8
erlats-Iir
m
Bild Diagrammzum PanelvonBild 13.8 13.9
IAufgabe 13.6 Starten Sie das Programm von Aufgabe 13.5 mit 'Wiederholt ausführen' und beobachten Sie die Abwandlung der Ergebniskurven bei Parameteränderungen.
IAufgabe 13.7
In LabVIEW bewegt sich der Signalfluss, anders als in den Simulink*.Diagrammen, stets
von links nach rechts. In Bild 13.9 läuft er aber trotzdem teilweise von rechts nach links. Das wurde durch ein Unterprogramm für die Multiplikation mit dem Symbol 'X' mög lich. Versuchen Sie, selbst ein solches SubVI zu schreiben.
Merke: Die LabVIEW-ODE-Funktion mit dem Runge-Kutta-Verfahren eignet sich besonders für Differenzialgleichungssysteme.
Merke: Mit dem Blockdiagramm-Verfahren (Analogreclmerverfahren) lassen sich LabVIEW-Vis erstellen, die Diagrammen von MATLAB--Simulink- gleichen und im Rahmen der Genauigkeit zu denselben Ergebnissen führen.
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
Parallelverarbeitung, Ereignis-, Zeitsteuerung
lernziele 1. Begriffe Multiprocessing, Multitasking, Multithreading erklären können. 2. Beschreiben, unter welchen Bedingungen verschiedene Teile eines VI parallel und unter wekhen Bedingungen sie sequenziell ablaufen. 3. Prozesse synchronisieren können. 4. Daten zwischen Prozessen austauschen lassen. 5. Events programmieren können.
6. Zeitgesteuerte Schleifen kennen und nutzen können 14.1
Einführendes Beispiel
LabVIEW-Programme werden ohne spezielles Zutun des Programmierers parallel ausge führt. Aus diesem Grund müssen wir einigen Aufwand treiben, um einen sequenziellen Ablauf zu erreichen, siehe Abschnitt 3.1.1. Einleitend wollen wir den Begriff 'parallele Aus führung' am Beispiel von einfachen While-Schleifen gemäß Bild 14.1 untersuchen. Wir wer den dabei auf unerwartete Probleme stoßen. Im nächsten Abschnitt lernen wir verschiedene Werkzeuge zur Lösung dieser Probleme kennen. Beginnen wir mit dem VI in Bi l d 14.1. Was wird passieren, wenn wir es starten? Wir könnten vermuten, dass beide Schleifen unbegrenzt oft ausgeführt werden, denn es gibt ja keinen Stopp-Knopf und die Konstanten an den Bedingungsterminals stehen auf FALSE, während die Abbruchbedingung auf 'Stopp wenn TRUE' steht. Doch diese Vennutung ist nicht rich tig. Nach einigen Sekunden Laufzeit zeigt uns das Panel das n i Bild 14.2 dargestellte Ergeb nis. Die linke Schleife wurde 17-mal durchlaufen, die rechte überhaupt nicht. Warum? 111111
'"
'"
11
,111 11
� m--ii\'
E!!I · tI
,... ,
,.
� m-ii
�I '"
""
!I!
-
DatenabhäZwengigikWheitile-Schleifenmit kunden LaEurfzgeeibtnis des Programmsaus Bild nach einigen 4
Bild 14.1
Bild 14,2
14.1
Se
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
244
Parallelverarbeitung, Ereignis-. Zeitsteuerung
Erklärung
Die Verbindungslinie zwischen den beiden While-Schleifen führt zur Datenabhängigkeit. Die rechte Schleife kann erst dann ausgeführt werden, wenn die linke beendet ist. Sie wird aber nicht beendet und folglich die rechte Schleife gar nicht erst begonnen. Daher das Ergebnis von Bi l d 14.2. Bemerkung
Die Wartezeiten in den Schleifen erlauben dem Anwender, das Hochzählen des Index zu beobachten. Wenn wir die Datenabhängigkeit zwischen den beiden While-Schleifen wie in Bild 14.3 beseitigen, werden heide Schleifen parallel und unabhängig ausgeführt. Die Anzeigeelemente geben denselben Wert an, wie man Bi l d 14.4 entnimmt. Das Programm läuft unbegrenzt lange, die Abbruchbedingungen wurden ja nicht verändert. ,,-&:ei t,ei>ftdffi •
.!J
ilr"
�o;e+1
"
Iillill-{QJ �
lIl!I !I
"
ttf"GbtiI �
:.!:«fzeo.q Eeoster " l:'V �
!\C>flh:ef1
""
Iillill-{QJ �
lIl!I !II I
-"
J DatenabhäZwengigikWheitile-Schleifenohne
ili
Bild 14.3
kunden LaEurfzgeeibtnis des Programmsaus Bild nach einigen Se Bild 14A
"
14.3
In Wirklichkeit kann ein Computer mit einem Prozessor natürlich nicht paralleJ arbeiten. Doch verteilt das Betriebssystem die Re<:henleistung des Prozessors auf verschiedene Tasks bzw. Threads, die jeweils nur für kurze Zeiten im Millisekundenbereich aktiv sind. Für den Anwender sieht das so aus, als ob beide Programmteile parallel abliefen. Man spricht deshalb auch von quasiparalleler Ausführung. Was passiert, wenn die Wartezeiten in den Schleifen wie in Bild 14.5 verschieden sind? IjItiiiEfflI m ...I ..&!1' ��ei �i>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
l
esm,exe msvc32,e,e =,","" e
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=es
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) ,_
h.:
Helder -r l---;
!2rneren?
(F)
F!'hII!r (Eingang, k8l Fl!hler) .J
X
•
U!� MI!kkxIg
Fehler (Ausgang)
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
252
Parallelverarbeitung, Ereignis-. Zeitsteuerung
Als Eingang verlangen alle Funktionen die Referenz der Ressource, die wir als Ausgang der
Erzeugungs-Funktionen in Tabelle 14.2 erhalten haben. Bei 'Melder' und 'Queue' kann über den Eingang 'Queue eliminieren? (F)' die Ressource sofort freigegeben werden, indem der Eingang auf TRUE gesetzt wird. Andernfalls müssen alle geöffneten Referenzen an jeder Stelle über den Aufruf dieser Funktion freigegeben werden. Als Ausgang liefern die Funktionen den Namen der frei gewordenen Ressource, bei unbe nannten Ressourcen ist dies eine leere Zeichenkette. Bei 'Melder' und 'Queue' werden zusätz ich l 'Letzte Meldung' bzw. 'Verbliebene Elemente' mit ausgegeben. Greift eine Funktion innerhalb der Anwendung auf eine bereits gelöschte Ressource lesend oder schreibend zu, wird sie mit einem Fehler beendet. Dies ist ein probates MitteJ, eine While-Schleife zu verlassen, indem man die Fehlermeldung mit dem Schleifenausgang ver bindet: Die Schleife wird erst dann verlassen, wenn ein Fehler auftritt.
14.3.3
Zeltbegrenzung schont Ressourcen
Viele Funktionen der Prozess-Synchronisation besitzen den Eingang 'Timeout in ms(-1)'. Er gibt an, wie lange die Funktion warten soll, bis die Ausführbed.ingung eintritt, z.B. dass bei einem Lesezugriff auf eine Queue Daten vorhanden sind oder dass ein Semaphor belegt werden kann. Solange die Funktion m i Wartezustand ist, wird der gesamte Thread nicht ausgeführt. Er benötigt keine Prozessorleistung. Die Zeitbegrenzung wird n i Millisekunden angegeben. Eine -I bedeutet, dass die Funktion unendlich lange wartet. Wird eine Zahl un gleich -1 angegeben, kann über den Ausgang 'Zeitbegrenzung überschritten?' festgestellt werden, ob die Zeitbegrenzung abgeJaufen oder die Ausführbedingung eingetreten ist.
1 4.4
Prozess-Synchronisation ohne Datenaustausch
14.4.1
Occurrences
Mit Occurrences können wir das im Zusammenhang mit Bild 14.5 und Bild 14.6 gestellte Problem lösen. Beide Schleifen sollen trotz unterschiedlicher Wartezeiten gleich oft durch laufen werden. 'BeispieI4_0ccurrences.vi' n i Bild 14.11 zeigt eine einfache Lösung.
J
�� �
[illJ --8I
I{P � �
[illJ - -8I
zvweresicehriSecdhelneSeifynennLcahmiuroftzneisitaetnion Bild 14,11
IAufgabe 14,3 Starten Sie 'BeispieI4_0ccurrences.vi' und überzeugen Sie sich, dass beide Zähler 'Loop I' und 'Loop 2' jetzt gleich häufig zählen.
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.4 Prozess-Synchronisation ohne Datenaustausch
253
Nachteil der Lösung von Bild 14.11: Die Schleife mit der längeren Wartezeit muss die Funk tion 'Occurrence setzen' enthalten, die mit der kürzeren Wartezeit 'Auf Occurrence warten'. Wenn die Wartezeiten aber Rechenzeiten simulieren, ist oft nicht bekannt, welche Schleife mehr Zeit benötigt. Auch kann dies in Abhängigkeit von den zugeführten Daten fallweise verschieden sein. Um dieses Problem zu lösen, benötigen wir die Rendezvous-Funktionen, siehe Abschnitt 14.4.3.
Semaphor
14.4.2
Sema!>hoo"
...
. . . Sema!>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:<<w' lIJ
,
b
gemeiSnysnacmheZuroDangirstiaffetniaounf
e<�'.Gr""
Bild 14.13
I'm IOI
ohne
Der Produzent produziert Daten in einer bestim mten Geschwindigkeit, und der Konsument soll auf diese Daten erst dann zugreifen, wenn sie vollständig erzeugt wurden. Wir können uns z.B. vorstellen, dass eine Schleife Sinuswerte hervorbringt und eine andere diese in ei-
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
254
Parallelverarbeitung, Ereignis-. Zeitsteuerung
nem Chart anzeigt. Bi l d 14.13 zeigt zwei solche Schleifen (Threads), die zunächst noch un koordiniert arbeiten. Die Wartezeiten simulieren die Rechenzeiten einer realen Anwendung. Der Produzent benötigt in diesem Beispiel 1080 ms (360 x 3), der Konsument etwa 10 ms. Da beide Schleifen parallel laufen, nachdem das Array 'Daten' bei Programmbeginn mit 360 Nullen gefüllt ist, wird der Konsument vieJ zu früh Daten anzeigen. Er hat nur einen Teil der erzeugten Sinuswerte erhalten, der Rest besteht aus Nullen. Einen ähnlichen Effekt hat man, wenn man während der Laufzeit auf dem Panel z.B. von zwei Perioden auf eine Periode um schaltet. Die Anzeige sieht dann kurzfristig so aus wie in Bild 14.14. Bi l d 14.15 zeigt das korrekte Programm, das einen Semaphor nutzt. Es entnimmt entweder der Produzent oder der Konsument zuerst eine Marke. Da nur eine Marke existiert, ist der andere Thread blockiert. Er kommt erst
zum
Zuge, wenn der momentane Markenbesitzer
den Semaphor freigibt (jeweils rechts, Symbol geöffnetes Schloss).
,,�-' , ' 00
�
_... ',00
/'\,
0,'
0,_
'\
1'3
0,00
·0,25 '0,'" ·0,75 ·1,00
°
•
'00
,. � ,.
V
� m
"
BiDa'AnltdzeanhsläPtzeeriAuobedeismgna'Umsvboenucnhvaaoultlfesntändiger 14.14
2
1
BigSyelnmdcehirnosnaimsaZuetiDaognrtiffenaumift 14.15
Erhält nun zuerst der Konsument die Marke, bevor Sinuswerte erzeugt wurden, zeigt er eine durchgehende Nulllinie. Danach aber kommt der Produzent zum Zuge und erzeugt alle Sinuswerte, so dass der Konsument von da an immer nur vollständige Kurven ausgibt. Erhält (zufallig) der Produzent zuerst die Marke, werden schon von Beginn an nur vollständige Sinuslinien dargestellt.
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.4 Prozess-Synchronisation ohne Datenaustausch
255
Beendet der Anwender das Programm per Stopp, löst der Konsument den Semaphor auf. Der Produzent erzeugt bei dem Versuch, danach noch eine Marke zu entnehmen oder eine Marke zurückzulegen, einen Fehler, der nun auch die Produzentenschleife beendet. Dies ist ein üblicher Weg, ein VI mit mehreren Schleifen zu beenden, ohne wie in Bild 14.13 mit einer lokalen Variablen für Stopp zu arbeiten.
14.4.3 "
Rendezvous
-
[;t] t1
Rend
;::: A."JSicht.
Ad:
[�::J [i:]
-
�
Rend
Gf:l � "
Rend
Ke;n Rend
Rend
FunktionenPalet enansicht:'Rendezvous' Bild 14.16
Mit den Rendezvous-Punktionen aus Bild 14.16 können wir nun endlich unser altes Problem der parallel laufenden Schleifen mit unbestimmten Ausführungszeiten lösen. Wir simulieren diese Zeiten mit dem Zufallsgenerator (Würfel) aus 'Punktionen' - 'Programmierung' 'Numerisch', vierte Zei l e. Bild 14.17 zeigt das Diagramm.
IT'J ,
�
� ·iIl
.'. , --
[j]
I �� �� � �
,
SmichtleReifnedneuzvnSboyesunsct-hiFmruomtnnkisteiaortAunioennsfzweiühruenrgWsdhaileuer Bild 14.17
Mit Rendezvous kann man den Ausführungszeitpunkt an beliebig vielen Punkten im Block diagramm synchronisieren. Ruft man die Funktion 'Rendezvous erstellen' auf, hat man für 'Größe (2)' den Standardwert 2. Das bedeutet, dass mindestens zwei Threads am Rendez
vous teilnehmen müssen, bevor die Ausführung fortgesetzt wird. Im Beispiel von Bild 14.17 wird mit diesem Standardwert gearbeitet, weil es um die Synchronisation von zwei Schleifen geht. Nachdem das Rendezvous erstellt wurde, kann eine der beiden Schleifen erst dann weiterarbeiten, wenn beide Schleifen ihre jeweilige Funktion 'Auf Rendezvous warten' er reicht haben. Damit ist dieser Zeitpunkt synchronisiert. Nun wird (quasiparallel) n i beiden Schleifen gewürfelt und die entstehende Wartezeit 'abgearbeitet'. Hat nun z.B. die obere Schleife eine Wartezeit von 600 ms und die untere eine von 230 ms, wird die untere versu chen, den nächsten Schleifendurchlauf anzugehen. Sie stößt dabei aber erneut auf die Funk tion 'Warten auf Rendezvous' und kommt erst weiter, wenn auch die obere Schleife an der entsprechenden Stelle angelangt ist, d.h. erst nach 600 ms. Das synchronisiert die Wartezei-
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'0 '
14
256
Parallelverarbeitung, Ereignis-. Zeitsteuerung
teD: Die längere Zeit setzt sich durch. Beim Programmlauf beobachtet man zufallsbedingtes unregelmäßiges Aufwärtszählen, aber mit gleichen Werten für 'Loop l' und 'Loop 2',
IAufgabe 14.4 Schreiben Sie ein VI, das sinngemäß wie das n i Bild 14.17 drei Schleifen mit Hilfe von Rendezvous synchronisiert.
14.5
Prozess-Synchronisation mit Datenaustausch
Dieser Abschnitt beschreibt die Möglichkeiten, Daten zwischen mehreren Threads auszutau schen. Melder und Queues können beliebige Daten übertragen. Ihr Typ wird beim Erstellen der Ressource am Eingang 'Element-Datentyp' festgelegt. Für benannte Ressourcen mit dem gleichen Namen muss der Datentyp identisch sein, sonst entsteht ein Laufzeitfehler.
14.5.1
Melder�Operationen
'Melder' werden verwendet, um Daten zwischen zwei Threads bzw. Tasks auszutauschen. Im Gegensatz zu Queues werden die Daten beim Melder nicht gespeichert. Wird eine MeJdung verschickt, aber nicht abgeholt, geht sie beim nächsten Schreibzugriff verloren. Eine Mel dung, die von einem Thread verschickt wird, kann von mehreren anderen Threads empfan gen werden ('Auf Meldung warten'). Genauso kann ein Thread Meldungen von mehreren anderen Threadsempfangen ('Auf Meldung von mehreren warten').
Beispiel Produzent - Konsument Bi l d 14.18 und Bild 14.19 zeigen eine Variante des Produzenten-Konsumenten-Problems von Abschnitt 14.4.2, Im Unterschied zu dort werden die Daten hier nicht n i einem Array gespeichert, auf das Produzent und Konsument gemeinsam zugreifen. Vielmehr übergibt der Produzent die Daten direkt an den Konsumenten. Es sei nochmals erwähnt, dass es wichtig ist, die betei l igten Threads in der richtigen Reihenfolge auszuführen. Werden Daten erzeugt, bevor sie angenommen werden können, gehen sie verloren. Bi l d 14.18 zeigt das Programm für das Erzeugen von Sinuswerten, die über einen Melder übertragen werden. Damit keine Daten verloren gehen, muss sichergestellt werden, dass der Thread für die Entgegennahme der Daten vorher gestartet wurde. Nun ist aber im Produzen ten-VI der Eingang 'Erzeugen, wenn nicht gefunden.. .' der Funktion 'Melder anfordern' auf FALSE gesetzt. Die Erzeugung des Melders ist Aufgabe des Konsumenten-VI, denn dort steht am selben Eingang ein TRUE. Wurde das Konsumenten-VI noch nicht gestartet, exis tiert also im Produzenten-VI noch kein Melder, so dass dort ein Fehler entsteht, der die Case-Struktur umschaltet. Der Anwender bekommt die Nachricht 'Bitte starten Sie erst Mel der_Konsument.vi'. Wurde dagegen das Konsumenten-VI bereits gestartet, existiert ein Melder und das Produzenten-VI beginnt sofort mit der Produktion von Sinusdaten. über die Taste 'Stopp' im Produzenten-VI kann der Meldevorgang beendet werden. Das Frei-
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.5 Prozess-Synchronisation mit Datenaustausch
257
geben der Melder-Referenz bewirkt das Beenden aller Threads, hier also auch des Konsu menten-Threads, der mit derselben Referenz arbeitet. Bi l d 14.19 zeigt den Thread für die Darstellung der empfangenen Daten. Auch dieser Thread kann über die Taste 'Stopp' beendet werden. Anschließend wird die Ressource freigegeben. Tritt während des Datentransfers ein Fehler auf, z.B. wenn der Melder im Produzenten Thread freigegeben wurde, wird der Thread auch beendet, aber die Ressource nicht freigege ben, da dies schon m i anderen Thread geschehen ist (leerer Fehlerzweig der Case-Struktur). Als Ergebnisse erhält man die gleichen wie m i VI von Bild 14.15, nur sieht man hier die Ausgabe jedes einzelnen Punktes m i Chart. Die Geschwindigkeit kann über die Wartezeit auf dem PaneJ eingestellt werden. Die Historienlänge des Charts wurde auf 360 gesetzt (ent sprechend einer Sinusperiode, sofern 'Anzahl Perioden' auf 1 steht).
derKonsumThenrtegaedsftüarrtdietewuDartdeenerzeugung (Produzent). DerobereTeilwirderstausgeführt,nachdem Bild 14,1B
Ke;n Feillet �
J,�
�
",
xffij
0< • ."
III Bild 14,19
��
Im
' E> -li!
Threadfürden Datenempfang (Konsument).DerFehlerzweigderCase-Struktur ist le r
Rezept: Verwenden Sie Melder, wenn ein eventueller Datenverlust keine Rolle spielt.
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
14
258 14.5.2
Parallelverarbeitung, Ereignis-, Zeitsteuerung
Queue-Operationen
Eine weitere Möglichkeit ist die Datenübertragung über Queues. Sie dienen wie Melder zum Datenaustausch zwischen verschiedenen Threads und können mehrere Datensätze spei chern. Die maximal zulässige Zahl der Blöcke gibt man beim Erzeugen der Queue über den Eingang 'Max. Queue Größe (-1, unbegrenzt)' vor. Beim Auslesen der Queue wird das zuerst gespeicherte EJement auch zuerst ausgelesen (FIFO: First In, First Out). Würde beim Schrei ben die maximale Anzahl der Elemente überschritten werden, blockiert die Schreibfunktion so lange, bis durch einen Lesezugriff wieder Platz in der Queue entstanden ist. Im Gegensatz zum MeJder werden also keine EJemente überschrieben. Wird der Defaultwert (-1) ver wendet, kann die Queue theoretisch unbegrenzt anwachsen. Praktisch wird sie durch den endlichen pe-Speicher begrenzt.
IAufgabe 14.5 Ändern Sie die Programme von Bild 14.18 und Bild 14.19, indem Sie die Datenübertra gung mit Queues an Stelle von MeJdern realisieren. Beachten Sie, dass hier die Startrei henfolge der Threads nicht relevant ist, weil die Daten gepuffert werden.
Merke: Zur Synchronisation von Prozessen
0 h n e Datenübertragung dienen
Occurrences, Semaphoren und Rendezvous.
Merke: Zur Synchronisation von Prozessen m i t Datenübertragung nutzt man Melder (Notifications) und Queues (Warteschlangen).
Merke: Häufig ist es möglich, ein Synchronisationsproblem mit verschiedenen der oben genannten Ressourcen zu lösen.
1 4.6
Ereignisgesteuerte Programmierung
14.6.1
Frontpanel-Ereignisse
Häufig kommt es vor, dass der Benutzer eines VIs während des Programmlaufs über das Panel Parameter ändern will. Man spricht auch von Frontpanel-Aktivitäten. Soll das VI darauf schnell reagieren, muss es alle Eingabeparameter in kurzer Zeit, z.B. m i 100 ms
Rhythmus, abfragen. Diese Methode heißt 'Polling' (poil = abfragen). Dabei werden die
meisten Abfragen überflüssig sein, weil sich in der Zwischenzeit nichts geändert hat. Das
Polling erkauft also kurze Reaktionszeiten im Ernstfall mit vieJen überflüssigen Abfragen im Normalfall, die unnötige Prozessorzeit verschlingen. Eine bessere Lösung als das Polling ist die Interrupt-Methode. LabVIEW stellt hierfür die 'Ereignisstruktur' zur Verfügung. Man findet sie z.B. n i 'Funktionen' - 'Strukturen'. Tabelle 14.4 gibt eine übersicht. Jedes Frontpanel-Element, Vls und auch LabVIEW selbst können Ereignisse erzeugen, auf welche die Anwendung reagieren kann. Die Anzahl der möglichen Ereignisse ist vielf aItig, und das VI soll ja auch nicht auf jedes Ereignis reagieren. über die 'Ereignisstruktur' legt der Programmierer daher fest, auf welche Ereignisse die Anwendung zu reagieren hat. Eine Er eignisstruktur besteht analog zur Case-Struktur aus Rahmen, die man über den Selektor an
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.6 Ereignisgesteuerte Programmierung
259
der oberen Kante auswählen kann. Jeder Rahmen besitzt eine eindeutige Nummer und als Text das zu bearbeitende Ereignis. Bild 14.20 zeigt die Standardansicht einer Ereignisstruk tur, nachdem man sie mit dem Aufruf 'Funktionen' - 'Strukturen' - 'Ereignisstruktur' ins Diagramm gezogen hat. Tabelle 14,4
Ereignisgesteuerte Programmierung:velWendete Palet en, Strukturen und Funktionen
�. � l1!ll .. .
=-� . """
,
-:-'I't":'il 1iI" ' g
Palette 'Strukturen' Palette 'Ereignisstruktur' Palette 'Dialog & Benutzeroberfläche' (bis LabVIEW 8.0 'Anwendungssteuer...') Palette 'Ereignisse' Funktion 'Für Ereignisse registrieren' Struktur 'Ereignis.struktur' Funktion 'Ereignisregistrierung aufheben' Funktion 'Benutzerereignis erzeugen' Funktion 'Benutzerereignis generieren' Funktion 'BenutzerereiRllis löschen'
o TirrIe!U ...
dem PlatzierSetnanidmaDirdaagnrsaicmhtmeeinineersEvVIent-Struktur unmit elbarnach Bild 14.20
Innerhalb dieses Rahmens kann man die 'Ereignisdaten-Knoten' am linken Rand unten verschieben. Man kann sie per Kontextmenü bis auf ein Element löschen und meist noch weitere Elemente hinzufügen. So lässt sich im Beispiel von Bild 14.20 das Element 'QueUe' hinzufügen. Ferner kann man außer 'Timeout' weitere Rahmen erzeugen, indem man im Kontextmenü der Ereignisstruktur 'Ereignis-Case hinzufügen' wählt. Entsprechend ist es möglich, mit 'Diesen Ereignis-Case löschen' einen Rahmen zu entfernen. Wir wollen weitere Einzelheiten am Beispiel in Bild 14.21 und Bild 14.22 erl äutern.
Es handelt sich um den bekannten Fall der Erzeugung von Daten eines Sinussignals unter
Nutzung der Funktion 'Sine Waveform.vi' (siehe Abschnitt 6.3.4, Bild 6.38) mit anschlie ßender Fouriertransformation (siehe Abschnitt 10.1.1).
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
260
�
00
-
,.
�� ö , ...
,�
Bild 14,21
_.
•
--
Parallelverarbeitung, Ereignis-. Zeitsteuerung 0
'" ,
•
r:
0,0
t
0
0
' ,'
,
,
. ... , . 0
-
,
0
0,' ,.
,
0
,
0
,
• • • e�
,
•
0
"
Sinusfunktion mitOffset links, dasAmplitudenspektrum rechts
Panel von BDiildagrammzum Bild 14.22
14.21
Startet man dieses VI, so führt es in einer Whi l e-Schleife ununterbrochen Berechnungen durch, auch dann, wenn sich an den Eingangsdaten nichts geändert hat. Der einzelne Prozes sor eines pe mit einer Taktfrequenz von 2,00 GHz ist dann bei den gewählten Parametern
von Fs = 100 kHz und #$ = 100000 k zu ca. 40 % ausgelastet. Es wäre daher vernünftig, die Rechnungen nur dann durchzuführen, wenn sich die Daten wie etwa Frequenz und Ampli tude der Sinusschwingung verändert haben. Das lässt sich mit der Ereignisstruktur errei chen: Bild 14.23 zeigt das Diagramm. Das Panel ist nahezu identisch mit dem von Bild 14.21. Die Berechnung der Sinusfunktion mit anschießender l Fouriertransformation wurde gegen l d 14.22 nicht verändert. Allerdings ist sie in eine Case-Struktur gebettet, die nur über Bi ausgeführt wird, wenn die boolesche Variable 'Rechnen' aufTRUE steht. Das ist beim Start der Fall. Doch wird diese Variable schon während der ersten Berechnung auf FALSE gesetzt. Damit wird beim zweiten Durchlauf der FALSE-Zweig der Case-Struktur aufgerufen,
welcher eine Wartezeit von 100 ms enthält, sonst aber leer ist. So geht die Prozessorbelastung zurück auf ca. 2 %. Wenn der Anwender jedoch einen Parameter ändert, erkennt das die Event-Struktur, die 'Rechnen' wieder für einen Durchlauf auf TRUE setzt. Dann steigt die Prozessorbelastung kurzfristig auf etwa 15 % an. Die Ereignisstruktur von Bild 14.23 hat zwei Rahmen. Sie werden wie folgt erzeugt: Ausge hend von der Standardstruktur n i Bild 14.20 wird im Kontextmenü mit 'Ereignisse dieses Cases bearbeiten . . . ' der Case-Editor aufgerufen, siehe Bild 14.24. Hier kann man jedem Rahmen der Event-Struktur mehrere Ereignisse zuordnen, wozu man die Liste 'Ereignis Bezeichner' mit dem Plussymbol um einen Eintrag zu erweitern hat. Das Kreuzsymbollöscht
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.6 Ereignisgesteuerte Programmierung
261
einen Eintrag aus der Liste, sofern mehr als einer existiert. Ober die Liste 'Ereignis-Quellen' wird das Objekt, welches ein Ereignis, also einen Interrupt, generieren soU, ausgewählt. Eine Liste alle möglichen 'Ereignisse' des gewählten Objektes wird auf der rechten Seite darge stellt. In unserem Fall sieht der Editor nach Auswahl aller maßgebenden Ereignisse so aus wie in Bild 14.24. Bild 14.25 zeigt die Ereignisstruktur nach Verlassen des Editors mit 'OK'. Die Reihenfolge der Eintragungen verläuft so: Zunächst 'frequency' unter 'Elemente' links anklicken und rechts 'Wertänderung' wählen. Damit wird oben die ursprüngliche Standard Eintragung 'Application' überschrieben. Nun müssen wir die Plustaste drücken, damit der nächste Eintrag nicht den alten überschreibt. Es folgt das Auswählen von 'amplitude' und rechts wieder von 'Wertänderung'. Dann mit Plustaste, 'phase' und 'Wertänderung' im Kopf der Tabelle die dritte Zeile erzeugen. Weiter mit 'sampling info' - '
[j] o"
cde" ",
do"
·fr
�
�Wert
Bild 14.23 Diagramm mit
[j]
parallel laufender
Ereignisstrukur
In der Ereignisstruktur werden nun alle Ereignisdaten-Knoten inks l geJöscht bis auf 'Neuer Wert'. Das ist zwar nicht zwingend notwendig, macht das VI aber übersichtlicher. Danach wird eine While-Schleife um die Struktur gelegt und das Innere gemäß Bild 14.26 verdrahtet. Die While-Schleife, die parallel zur großen Schleife oben läuft, ist notwendig. Eine Ereignis struktur ist nämich l sozusagen verbraucht, sobald das Ereignis n i h i r einmal aufgetreten ist. Man könnte sie also in unserem Fall nur zu einer einzigen Parameteränderung nutzen. Notwendig ist ferner ein zweiter Rahmen, der das Stoppen des Programms behandelt. Fehlt dieser, wird bei Betätigung von 'Stopp' im Panel zwar die Hauptschleife beendet, das VI insgesamt befindet sich aber m i mer noch im Run-Modus, weil die Schleife um die Ereignis struktur nicht abgeschlossen wurde. Man legt also per Kontextmenü einen zweiten Rahmen [11 an, behandelt ihn sinngemäß wie den Rahmen (01, jedoch nur für das eine Ereignis 'Stopp', und verdrahtet ihn gemäß Bild 14.26.
Ausleihe:31.07.2009 00:00:00 -08.08.2009 00:00:00, ID:7ac0427dS92981cf089d91b1gecaOOaO. Zentral- 2009.07.31 21:42:39 +02'0 ' u
14
262
F.....,..,...f.o
B
Fen"orl=o;d,
n"...o"M,
,-
0
'-'
B
...,� "-
,......., rlo
"
M..."t",t. <>riOckt'
j
.. .. .. " ..
Toste�>«1 Toste <;!O&OO<.t Toste <;!O&cdP T�hoI.rt:J T-'-holo:l'
�
zot-bMndot
� Hou> v."�,,t "","
zohen ,,..,,tl .. U!le<1 QJeIe ...._" .. Ze!le<1 iuslTlt �
.. Ze!le<1 Lbe.
p froot� >Pe
�
o "fr
• 'a
Parallelverarbeitung, Ereignis-. Zeitsteuerung
...:h
__
'Ereignis e beErearibgneiiste-End'itor. Dialog Bild 14.24
....
tude" ·
T" Zet CtlRef AlterWert NeoerWert
Bild 14.25 14.24
,
· : Wett
Ereignis trukturnach Bearbeitung gemäß Bild
.
_Wert
III
11
Bild 14.26
Ereignis-Rahmen fürden Stopp-Fal [1]
IAufgabe 14.6 Programmieren Sie das VI von Bild 14.23 ohne Ereignisstruktur.
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.6 Ereignisgesteuerte Programmierung
263
Merke: An Stelle von Polling, der ständigen Abfrage nach Änderung von Eingabeparametern, sind vielfach Interrupts vorzuziehen, die beim Auftreten bestimmter Ereignisse ausgelöst werden.
Merke: LabVIEW bietet dazu die Ercignisstruktur an, die vom Anwender den jeweiligen Bedürfnissen angepasst werden kann.
Wertänderungs-Ereignisse
14.6.2
Ab LabVIEW 7.0 kann man nicht nur Frontpanel-Aktivitäten als Ereignisse in eine Ereignis struktur einbeziehen, sondern auch Wertänderungs-Ereignisse ohne Benutzereingabe. Wir zeigen das am Beispiel einer verbesserten Version des Programms aus Bild 14.23. Das VI dort verzichtete zwar weitgehend aufPolling, aber nicht vollständig: Alle 100 ms wurde abge fragt, ob 'Rechnen' aufTRUE steht. Die in Bild 14.27 und Bild 14.28 dargestellte Variante arbeitet dagegen vollständig ohne Polling. Der Kern des Programms läuft hier nicht mehr in einer parallel ausgeführten Schleife, er ist vielmehr Teil der Ereignisstruktur und in Rahmen (I] untergebracht. Dieser wird bei Para meteränderungen auf dem Panel aufgerufen. Die ganze Ereignisstruktur besteht aus drei Rahmen, wobei Rahmen [2] für Programm-Stopp sorgt und nach dem Muster von Bild
14.26 aufgebaut ist. Rahmen [0] bedient den Timeout. Er wird angelegt, indem man m i Er eignis-Editor '<Applikation>' wählt und danach rechts 'Timeout', siehe Bild 14.29.
�
E
o r......
�
�
•
i!r' t:'�1
��ru � ��&Jsc;hen, �atrnen fctrt. Sor"r.: wi"d lßl
daru, ene P««neterSlden... �
� �kl: ""h dem St«t
� .:««neter so siTlvolles Er
[1] fJdq I x 9Mechnet, obwohl der Anwender noch sof ort ein
ge&ndert tut.Er
.
erMl
iI
[j]
Bild 14,27 Timeout-RahmenderEvent-Struktur, nurbeim StartdesVIaufgerufen wird
Wird nun das VI gestartet, erfolgt sofort ein Timeout, weil als Timeout-Zeit der Wert 0 die Schleife
um
an
die Ereignisstruktur übergeben wird. Beim nächsten Durchlauf wird aber
dieser Wert per Schieberegister auf -I gesetzt, was einer Wartezeit von <><> entspricht. Damit kann später kein weiterer Timeout mehr auftreten. Beim ersten Timeout wird nun dem Rahmen (I] eine Parameteränderung vorgespielt, indem der Wert von 'amplitude' auf sich selbst gespeichert wird. Wichtig ist dabei, dass der zweite Eigenschaftsknoten zu 'amplitude' die Eigenschaft 'Wert(SGL)' erhält, denn nur das löst das Ereignis aus, das anschließend
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
264
Parallelverarbeitung, Ereignis-. Zeitsteuerung
sofort zur ersten Berechnung führt. Wenn man auf den Timeout-Rahmen verzichtet, läuft das VI auch, aber es zeigt ein Ergebnis erst nach Parameteränderung durch den Anwendet.
.
,
ric" "f
• " off.ot" "Raset' , Wert.Inderun ...
,
.
[J] Bild 14,28 I>
Haupt eilderEvent-Struktur,wird aufgerufen beijederWertänderungam Panel - -
E' '''g .ru••e bearbe,tefl
llehardeite freio)'i<se:
(,�
r-o-::!]
- ..J
cIesem c .... ....eEr� '*'=
�e se zu entternon, y.....o... 510 cio 5chotfIIo:hen �'!rId
M>eo", Dl.rch �id
er> .....oem üeoaooi
"-
.. �onzodW&n • .. �..... odWe6en} .. NI'Sdlerhoit- 6efU_�
�,
,
FlII"IStofbenithe Fenslefb ...id.,
•
"...
•
�
,,,""'''
,,�
•
-.. �Wo <JII Element.> "
..
r
�,
� L-"' .,
--'
_ _
ETidmiteoorsutbe-RimaAuhmAnferlunefsgdeenseEirneeigsnis Bild 14,29
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.7 ZeitschleiJen 14.7
265
Zeitschleifen
Die Dauer einer Whi l e- oder FüR-Schleife lässt sich mit der Funktion 'Programmierung' 'Timing' - 'Warten (ms)' bestimmen. Jedoch lässt die Genauigkeit zu wünschen übrig, wenn man n i den Bereich von 1 ms kommt. Das folgende Beispiel in Bild 14.30 zeigt das. Q....
�..bo;t",
lOf,jiI
�m
,
I!co__
•
" �..tondo mo
[j]
El' ojol> �""'""
'"" � "
•
�..,..
E""'"'
tJI'.
1 3pt�_..t
�
1J
� .,
�
�
�
J zzBieulirtdEzwirzesucghueKonnngzweevienineDurtifoernsctehglläeeuleFfgOetnR-enSchleife 14.30
I
Warte
�
Stellt man hier für 'Zu wartende ms' den Wert I ein, kann das System nicht folgen, wie man l d 14.31 entnimmt. Der Grund liegt im Betriebssystem, das selbst in unregelmäßiger Weise Bi Zeit benötigt. Auch die Verwendung der Funktion 'Programmierung' - 'Timing' - 'Bis zum nächsten Vielfachen von ms warten' (Metronom) bringt hier keine Besserung. Erst bei etwas längeren Wartezeiten von 2 oder 3 ms werden die Wünsche des Anwenders genauer, aber auch nicht ganz zuverlässig erfüllt.
BiSbeclhndlöetifigetn,dobwohuZwirchlsäculhnfeeunnrzwewemsrdi egnewmeOnisstchtms war 14.31
'1' :::;;;;;;;;;;;;;;;;;;;;;;;;;;;);� .!::
' .4
2
1
Schon seit LabVIEW 7.1 hat man ein Mittel gegen diese Ungenauigkeiten entwickelt, die so genannte 'Zeitgesteuerte Schleife', in LabVIEW 8.0 zu finden unter 'Programmierung' 'Strukturen' - 'Zeitgesteuerte Strukturen'. Dort steht neben der 'Zeitgesteuerten Schleife' inks l oben auch die 'Zeitgesteuerte Sequenz'. Erstere wird in Bild 14.32 verwendet. Das Ergebnis ist jetzt auch für eine einzige Millisekunde Wartezeit korrekt, siehe Bild 14.33.
Dies gilt unabhängig von der Zahl der Schleifendurchläufe, siehe Bild 14.34.
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
266
Bild 14.32
Parallelverarbeitung, Ereignis-. Zeitsteuerung
Zeitgesteuerte Schleife zur Realisierung derselben Aufgabe wie in i d
B l 14.30
Merke: Zeitschleifen erlauben eine prlziaere Einhaltungvon ZeitTorpbeo ab gew6hn·
liche While-Schleifen.
Didenofmchertdieanuezs.gleDineAndiecshDitgeeeffn,zwieeSricegehntilezeniifZeBisetlndaitdeuuncrhbechnlaiacuhfms 1
Bild 14.33
14.34
liinegti dgenauDertamsusennadcshtedZeemitwnuelrtten Bild 14.34
1000
B l 14.33
Ausleihe: 31.07.2009 00:0 :00 -08.08.2009 00:0 :00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral- 2009.07.31 21:42:39 +02'0 ' u
Teil 111: Kommunikation
i Für Teil III gilt sinngemäß das Gleiche wie für Teil Ir. Nur steht hier die Kommunikation m
Vordergrund. Weitere Funktionen von LabVIEW werden nur dann besprochen, wenn die Aufgabenste11ung das erfordert.
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
1S
Serielle Eingabe/Ausgabe
Lernzl.1e I. Zwischen 'Instrumenten-IIO' und 'Mess-I/O' unterscheiden können 2. Mit VISA programmieren können. 3. Serielle Eingabe/Ausgabe über die RS-232-Schnittstelle programmieren können.
4. USB-Sdlnittstelle in LabVIEW programmieren können. 5. CAN-Bus programmieren können. 6. GPIB-Bus mit VISA programmieren können. Überblick Bisher haben wir den LabVIEW-Datentransfer stets nur innerhalb des Rechners betrachtet: Vom Hauptspeicher zum Hauptspeicher zwischen den VIs oder vom Hauptspeicher zur Festplatte und zurück, wie n i Kapitel 8 beschrieben. Messtechnik will
jedoch
mit realen
Daten arbeiten, die aus der Außenwelt kommen. Für diesen Zweck hat National Instruments (NI) Datenerfassungskarten, sogenannte DAQ Boards (Data Acquisition Board) entwickelt. NI war ursprünglich eine hardwareorientierte Finna. Das hat sich zwar mit der Erfindung und Einführung von LabVIEW geändert. Doch stand m i mer noch die Softwareunterstützung für die DAQ-Boards im Vordergrund. Die LabVIEW-Funktionen dazu findet man heute unter der Bezeichnung 'Mess-I/O'. Mit diesem Thema wird sich Kapitel 16 befassen. Das vorliegende KapiteJ dagegen bespricht Datenübertragungssysteme wie die RS 232, den GPIB-Bus, USB und den CAN-Bus, die unabhängig von LabVIEW - tei l weise seit Jahrzehn ten - zur Übertragung von Messdaten und zur Ausgabe von Steuersignalen verwendet wer den. Die LabVIEW-Software dazu ist unter der Bezeichnung 'Instrumenten-UQ' zu finden.
1 5.1
RS-232
Eines der ältesten und auch einfachsten Hilfsmittel, mit der Außenwelt zu kommunizieren, ist die serielle RS-232-Schnittstelle. Mit ihr wollen wir beginnen, obwohl sie mehr und mehr durch die USB-Schnittstelle abgelöst wird. USB bedeutet Universal Serial Bus, also ebenfalls eine serielle Schnittstelle. Unter dem Begriff seriell versteht man meist bitseriell m i Gegensatz zum Verfahren einer Parallelschnittstelle wie dem GPIB-Bus (General Purpose Interface Bus), der byteseriell arbeitet und jeweils 8 Bit auf 8 Leitungen parallel überträgt.
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
15.1 RS-232
269
Der Vorteil einer seriellen Schnittstelle ist der minimale technische Aufwand. Im Prinzip braucht man nur zwei Drähte, einen für das Bezugspotenzial, normalerweise GND CGround' oder 'Erde'), den anderen zur übertragung von 'high' und 'low', z.B. von +12 V und -12 V. Der Nachteil ist die relativ geringe Geschwindigkeit. Im einfachsten Fall arbeitet man asyn chron nach DIN 44302. Sender und Empfänger synchronisieren sich über Start- und Stopp bits. Dem Startbit folgen 4 bis 8 Datenbit, danach 1 oder 2 Stoppbit. Natürlich müssen Sen der und Empfänger mit ungefähr gleicher Frequenz arbeiten. Der Empfänger erkennt das Startbit und tastet dann die Datenbits jeweils zeitlich in der 'Bitmitte' ab, bis die übertragung beendet s i t. Das ist nach 5 bis 10 weiteren Bit (Stoppbits eingeschlossen) geschehen. Das nächste Datenpaket wird wieder mit einem Startbit eingeleitet. Daher rührt die Bezeichnung asynchron. Ein kleiner Unterschied zwischen Sender- und Empfangerfrequenz kann die korrekte Übertragung nicht stören. Die Phasenverschiebung innerhalb eines Pakets darf nur nicht größer werden als die Zeit für ein halbes Bit. Das entspricht einer Frequenzdifferenz vonetwa 6%. Der Nachteil der asynchronen übertragung besteht darin, dass ungefähr 20 % der Bits keine Datenbits sind, sondern als Start- und Stoppbits lediglich der Synchronisation dienen. Normung: Für das serielle PC-Interface gibt es einige Standards. Zum Beispiel leitet sich die Bezeich nung 'RS-232-Interface' vom US-Standard RS232C ab. Ein anderer Name ist 'V.24-Interface' (CCITI-Empfehlung V.24). Die zwei DIN-Normen 66020 und 66022 beschreiben im We sentlichen dasselbe. Wichtig für uns ist: Elektrisch:
High-Zustand +3 V bis +25 V Low-Zustand -3 V bis -25 V Häufig verwendet: ±12 V (V.24-lnterface) Daten werden in negativer Logik übertragen (z.B. 0 --) +12 V, 1 --) -12 V), Steuersignale wie Startbit und Stoppbit n i positiver Logik Flankensteilheit :0::; 30 VI� usw.
Mechanisch: Standardstecker hat 25 Pins, der PC-Stecker üblicherweise 9 Pins. Standardmäßig werden zwei PCS mit einem Kabel, dem so genannten Nullmodem, verbun den, das alle für die Übertragung seJbst nicht benötigten Verbindungen einseitig innerhalb der Stecker links und rechts verdrahtet. Nur die zwei Verbindungen TxD für 'Transmit Data' und RxD für 'Receive Data' gehen neben der Masse GND von einer Seite des Kabels zur anderen. Wenn also z.B. PC 1 in Bild 15.1 sendet, gehen seine Daten von TxD zu RxD von PC 2, der sie empfängt. Umgekehrt geschieht es, wenn PC 2 senden will. Diese Leitungen sind also gekreuzt, wie auch Bild 15.1 deutlich macht.
PC 1
PC 2
BilMaelidtnusnpgrilcinhktsdaVevohrendrrTxavhoDtnuzngugekRxreeiDnuzegtseefnNuülhelrtmituuodenngdemvnosn. HiRxeDrziustTxdiDe. 1$.1
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
270
Manche Messgeräte, wie z.8. eines der programmierbaren Multimeter von Keithlel, müssen dagegen an den pe durch eine Verbindung wie n i Bild 15.1, aber mit nicht gekreuzten Lei tungen angeschlossen werden. Man muss hier sehr sorgfältig arbeiten, um von vornherein später schwer auffindbare Fehler zu venneiden! Unbestimmte Dauer
1146 ).IS 104,17 ).1S (1/9600 s)
high: 12 V
low: -12 V
Bild 15.2
--t+-4---h
//
s 0 0
t
11461-'S
o
Übertragungvon ASCI -Zeichen 't und übereineR$232-Schnit stel e zwei
'0'
Normalerweise werden die Daten als einzelne, m i ASCII-Code verschlüsselte Zeichen über tragen. Der ASCII-Code benutzt heute 8 Bit zur Codierung eines Zeichens wie 'a', 'A', '3', '!' U$W. Also kann man mit den 10 Bit, die einen Abschnitt des asynchronen Bitstroms darstel len, genau ein ASCII-Zeichen übertragen. Normalerweise will man natürlich mehr als ein Zeichen übermitteln. Dann muss man diese Zeichen mit steigenden Adressen im Haupt speicher ablegen. Jedes Zeichen belegt ein Byte. Entsprechend werden auch die einzelnen Bits eines Zeichens in aufsteigender Folge übertragen, d.h. zuerst Bit 0, dann Bit I bis Bit 7. Die Obennittlung der beiden Zeichen 'to' (zu) erfolgt daher gemäß Bild 15.2. Dabei wurde angenommen, dass die Geschwindigkeit auf 9600 Baud = 9600 BitJs gesetzt wurde. Ferner wurden I Startbit, 8 Datenbits, 1 Stoppbit und keine Parität (das würde ein weiteres Bit er fordern) festgeJegt.
1 5.2
Programmierung der R5·232 in LabVIEW
Ab LabVIEW-Version 7.0 programmiert man die serielle RS-232-Schnittstelle mit Hilfe von VISA-Funktionen. VISA ist die Abkürzung für 'Virtual Instrument Software Architecture' die es erlaubt, Schnittstellen symbolisch zu benennen. Außerdem fasst diese Methode ver schiedene Schnittstellentypen unter einem Dach zusammen, serielle ebenso wie paralieJe. Man findet die zugehörigen Funktionen unter 'Funktionen' - 'Instrumenten-I/O' - 'VISA' bzw. noch eine Stufe tiefer unter ' . . . - 'VISA: Fortgeschritten', siehe Bild 15.3. ... lrosb'"""",,,,·I!O ',�
L VISA;
I I
I:i!
fc<19=�lten
115'1: 00"",
Ef'l
[Jjl
� � :",'1 �
VI5'I' 50:_ 115'1: Res,DU .. ,
El
,.. �..
V5A: T..-..oo", [�Moft>k" , 1:u\·!Sdnlt,.. ,
il C
I!\iil bl 5oe
V5A: \OOD,,, VISA: InD"'e", [r�.. , V5A: A,,,,,,o,,, VI5'I:
R
FunktionenFoinrtgLaebscVhiErWit e(lninekVls)SA MiesRestndeiochurtFcsuecnhfkiontdioewen'riekßca)hnditsemaobeE/An(f'aVlISsAma: n AnVIunSssAecrhbeelümasrLbeapditeosnpliastfiensdnur.eHin,ediderearnseiicnhemit AnseriechleluSsch'AniSttsRlt3e:lIeNCOM3STR',d.h.die Bild 15.3
--
1.._ _ _ _ _ ......
PC
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
15.2
Programmierung der RS-232 in LabVIEW
271
Wir bringen ein Beispiel für die VISA-Programmierung: Ein Programm namens 'SerielIPCl_VISA.vi' soll Texte an einen zweiten PC senden, auf dem 'SeriellPC2_VISA. vi' läuft. Dieses VI soll den empfangenen Text zur Kontrolle an den ersten PC zurüc.ksenden, an dem der Anwender vergleichen kann, ob gesendeter und empfangener Text identisch sind. Bild 15.4 zeigt das Panel des VIs, das auf PC I läuft. Bild 15.5 und Bi l d 15.6 verdeutlichen die wesentlichen Teile des zugehörigen Diagramms. Bi l d 15.7 zeigt entsprechend das Diagramm des VIs, das auf PC 2 läuft.
·1073807313
.,
,...
Bild Panel '$erieIlPC'_Vl$A.vi' 15.4
von
i Bild 15.4 gestartet und zuerst den Text 'Guten Der Anwender hat aufPC I das Programm n Morgen, wie geht es Ihnen? ..' in das Texteingabe-Fenster geschrieben. Danach hat er mit der linken Maustaste neben dieses Fenster geklickt, was die serielle übertragung des Fens terinhalts auslöst und den Inhalt von 'Texteingabe' löscht. Alles, was er schreibt, wird im Fenster 'Gesamttext' vermerkt. Im Fenster 'Kontrolltext' gibt das VI Stück für Stück den Text aus, den PC 2 zurücksendet. Nun ist 'Texteingabe' für den nächsten Abschnitt bereit, hier: 'Wollen wir etwas gemeinsm unternehmen?' (Text mit Schreibfehler). Dies wurde noch nicht gesendet.
EI1
i �- � "
�·�rn. o"*""lincton """mlt.x'
=:: I
�
�
l!!l.
,
n-iiT,xt�1I
�:�I
�
' Lf-J
�
�r�
�rlil
I:i ,
.' R> � (
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<:hnittstelle geschlossen werden. Das erfolgt m i TRUE-Teil von Rahmen [1] der Sequenz, dargestellt in Bi l d 15.12. 1 0 .. 1 �
TRLl
[j]
�
� .
iIl
Bild SchließenderUSB-Schnit stele nach Stopp 15.12
� AufrufeKterner Blbhotheken
lIIbIothebnome oder pfad
�:\Lob\IIEW ..Ei-.t...m.n., . .I\I.IIago\A
� Opeti:>ee Yio; Adr�
CUAnelogChomel ''''-''''''"''
chsu::r.en . .. 0...
I
IlnUl-Tr.-oaddU>hhe
F�C.dAd
BiFDiulendsketiKoonnsfpigrBeoutrogatitnyiopnsdestaesnhKonseinch'IftoigignugltraOpebitisoLnnasDpbeVrovlEzicWees-(lVoeesnrfgsüioarrn'Og1pe)'nodSDepeärtv'eIiocrenle'g.iAmcOpeht gEnenDädneedvmueicrtes.(lsoileninhgkeCasBuirlnddtAddre1n5.a2l1ess )'. 1 5.13
B.O.
IAufgabe 15.3 Im Panel von Bi l d 15.9 ist eine Sinusschwingung von ca. 7 Hz abgebildet. Das lässt sich aber nicht an den dort angegebenen Indizes auf der X-Achse ablesen. Wie könnte man m i LabVIEW-VI den am Funktionsgenerator abgelesenen Wert von 7 Hz bestätigen?
IAufgabe 15.4 Tabelle 15.1 zeigt viele andere Funktionen, z.B. Einlesen und Ausgeben von Digitalwer ten, Einlesen aller Analogwerte usw. Experimentieren Sie damit und schreiben Sie ent sprechende LabVIEW-VIs, die einige dieser Funktionen nutzen.
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
278 15.3.2
Programmierung unter Llnux
Der C-Code unter Linux wird ganz ähnich l eingebunden. Das Programm '1513USB_Analoß-Chart_Linux.vi' hat die gleiche Struktur wie das VI n i Bild 15.10 bis Bild 15. 12. Anders verläuft allerdings die Entwicklung der Library libk8055.so, auf die hier anstelle von K8055.DLL Bezug genommen wird. Anleitung: Die nachfolgenden Schritte müssen mit Supervisor-Rechten ausgeführt werden: 1. Die Shared Objec.t Library 'libk8055.so.I.0.1' nach lusr/locaVlib kopieren. 2. Mit dem Kommando 'In -s lusrllocaVib/libk8055.so.I.0.1 l lusr/localllib/libk8055.so' einen symbolischen Link erzeugen. 3. Velleman-Board mit 'mount usbfs -t usbfs Iproclbus/usb' zum Anschluss vorbereiten. 4. Velleman-Board K8055 mit dem USB-Anschluss des Computers verbinden. 5. Mit 'Isusb' testen, ob das K8055 erkannt wird. Die typisch richtige Meldung ist dann z.B.: 'Bus 006 Device 002: ID IOcf:5503 Velleman Components, Inc. 8055 Experiment Inter face Board (address=3)'. 6. LabVIEW m i Supervisor-Modus starten. Dazu ein root-terminal öffnen und LabVIEW wie folgt starten: '/usrllocaVnatinstlLabVIEW-8.x/labview' (8.x ist z.B. 8.5). 7. Testprogramm '1520-USB_Analoß-CharcLinux.vi' ausführen. WICHTIG: Im Gegensatz zu Windows hat der Analog-Eingabekanal AI unter Linux die Nummer 0 und der Analog-Eingabekanal A2 die Nummer I. Merke: Man kann Messdaten auch mit der seriellen Schnittstelle RS-232 einlesen und verarbeiten. Doch lassen sich damit nur recht niedrige Frequenzen erfassen, bei einer Übertragungsrate von 9600 Bitls bestenfalls einige 100 Hz. Merke: Die USB-Schnittstelle 2.0 hat eine Übertragungsrate von bis zu 480 Mbit/s. Damit kommt man in den Frequenzbereich von einigen MHz.. Merke: Mit Hilfe von ClF-Knoten kann man DLLs anderer Hersteller im eigenen LabVIEW-Programm nutzen und damit auch Schnittstellentreiber verwen den, die von National Instruments noch nicht unterstützt werden.
1 5.4
Feld-Bus, CAN-Bus
Mit Feld-Bus bezeichnet man eine Familie von Protokollen für Computer·Netzwerke, die in industrieller Umgebung zur Messdatenerfassung und zur Steuerung von Fertigungsmaschi nen dienen. Sie sind nach IEC 61158 genormt. Zu den Feldbussen gehört z.B. der Profibus, neuerdings der BIT-Bus und unter anderem auch der CAN-Bus. Dabei war der von der Fir· ma Bosch 1973 entwickelte CAN-Bus ursprünglich nur für Anwendungen in Kraftfahrzeu· gen gedacht. Er hat sich aber rasch auch als tauglich für die Industrieautomatisierung erwie sen. Während die serielle RS-232 einen PC nur mit einem Messgerät oder zwei PCS miteinander verbinden kann, erlaubt es der CAN-Bus, mehrere Messgeräte bzw. Sensoren an einen PC anschießen. l Dafür sorgt das Bus·Prinzip, das allen (omnibus lateinisch: für alle) eine Teilnahme zum Senden und Empfangen erlaubt.
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.4 Feld-Bus. CAN-Bus
279
Damit mehrere Sensoren, die am Bus hängen, sich nicht gegenseitig stören, sind Regeln
zu
beachten, die in ihrer Gesamtheit das CAN-Protokoll bi l den. Somit benötigt der CAN-Bus,
obwohl er wie die RS 232 auch nur zwei Drähte zur Datenübertragung verwendet, doch ein recht kompliziertes Protokoll.
15.4.1
CAN-Protokoll
Im Folgenden werden nur die wichtigsten Prinzipien von CAN (Controller Area Network) vorgestellt. Eine genauere Beschreibung ist der Literatur
zu entnehmen, z.B. [7]. Darin wird
auch über geplante Erweiterungen des CAN-Bus-Konzepts infonniert.
Die physikalischen Gegebenheiten sind in ISO 11898 festgelegt. Der CAN-Bus besteht aus zwei Leitungen, auf denen ein und dasselbe Bit redundant mit entgegengesetzten Potentialen abgebi l det wird. Die eJektrisch weniger störempfindliche Differenzspannung sieht für den logischen Pegel 0 den Wert 5 V (> 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
Kn.- I
Kn.- 3 -
-
)
(1)
BidiKneloddomiten n'gaenBewteiisnNulpite'l,lfvweüornidenlKnKnooprtteeinonritiäahtnreedenngZureMastgeaurnkegertveen(irmArlieKrbreitneriise)ruunndgsKnprootzeens beanimde(AN-rMarPkreotodukorlc.h 15.14
3
2 3
1
1
2
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
15 Serielle Eingabe/Ausgabe
280 Generell gi l t:
Merke: Der Knoten mit dem niedrigaten Ideotifier gewinnt den Nachricht ohne Datenftfhut Dbertrqen.
Bu
und kann aeme
Jede Datensendung beginnt mit einem dominanten SOF-Bit (Start of Frame), gefolgt vom Identifier und dem RTR-Bit (Remote-Transmission-Request). Dann kommt das Control Feld, das auch die Zahl der zu übertragenden Datenbytes enthält. Schließlich folgen die eigentlichen Daten (0 bis 8 Bytes) und am Ende ein eRC-Feld (Cyclic Redundancy Check), das die korrekte übertragung der bisher gesendeten Bits überprüft, sowie das Acknowled gement-Feld. In Bild 15.14 wurde nur ein Datenbyte versandt, das eRC-Feld und das Acknowledgement-Feld sind hier nicht dargestellt. Dagegen sieht man das IDE-Bit im Control-Feld, das darüber entscheidet, wie lang der Identifier ist, I I oder 29 Bit gemäß
Norm. Im Beispie1 haben wir 1 1 Bit gewählt, die übliche Länge. Das wird durch IDE = 0 angezeigt.
Das zweite Bit des Kontrollfelds ist für spätere Erweiterungen des CAN-ProtokoUs reserviert und derzeit gleich O. Die restlichen vier Bit verschlüsseln die Länge der Daten in Bytes. In unserem Beispiel von Bi l d 15.14 übertragen wir nur ein einziges Datenbyte. Zur übertragung dieser Daten genügt eine Zweidrahtleitung, doch wird üblicherweise eine an einen 9-poligen Sub-D-Stecker angeschlossene Leitung verwendet, die zwei Datenleitun gen und eine Masseleitung enthält sowie optional weitere Leitungen für Schinnung, ein zwei te Masse und die Versorgungsspannung VCc.
15.4.2
CAN-Controller
Zur Steuerung der oben beschriebenen Abläufe verwendet man CAN-Controller. Das sind entweder mit Mikroprozessoren bestückte Einsteckkarten für den PC oder n i jüngster Zeit auch zunehmend sogenannte USB-to-CAN-Controller. Sie haben den Vortei l , dass man sie auch am Laptop nutzen kann, für den die Auswahl an Einsteckkarten wegen des beschränk ten Platzes immer schon eher dürftig war.
USB-tO-CAN
degauacrtrhFeinvrm,odenaeIrXXiohnCAN-eAmnTeLaCPauonrpsotbltorpeomlaeuers gesteuertwerden Bild 15,15
cornpact
Wein
24
kann
Eines der Unternehmen, die solche USB-to-CAN-Controller herste1len und - was besonders wichtig ist - auch die erforderliche Steuer-Software entwickeln, ist die Finna IXXAT in x t.cQw). In diesem Buch wurden zwei Controller dieser Firma vom Weingarten (http://jxa Typ 'USB-to-CAN compact' nebst Treibersoftware 'VCI V3' verwendet, siehe Bild 15.15.
Ausleihe: 31.07.2009 00:00:00 -08.08.2009 00:0 :00, ID:7ac0427d5929S1cf089d91b1gecaOOaO, Zenlral- 2009.07.31 21:42:39 +02'0 ' u
15.4 Feld-Bus. CAN-Bus
281
Die Treibersoftware hat eine Schnittstelle zu LabVIEW, d.h. einen Adapter 'VCIlVA.OLL', der auf die 'Native Programming library VCINPL.OLL' zurückgreift. 'VCINPL.DLL ist eine Sammlung von in C geschriebenen Olls, die man über die Bibliothek 'VCILVA.DLL' mit
Hilfe von ClF-Knoten in LabVIEW-VIs einbinden kann, so wie das bereits n i Abschnitt 9.7.2 und hier erneut in Abschnitt 15.3 gezeigt wurde. Die Firma IXXAT hat hier bereits die wichtigsten Vorarbeiten geleistet und stellt solche SubVIs nach Installation unter ' . . .LabVIEW 8.0\user.lib\ lxxatWci' zur Verfügung. Dazu später mehr. ,.
-
,�- -
" '3 a .. 'll T � J
001 '
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· l
�-.
•
�
, .
aBiulfddem (AN-MiBnuimsonveritaonrladers enFirumnda lsXichAT.dieMiRetsihumltakteanobemanrneuntchtseannrzeecihgtesnelianszeelnne Sendungen 15.16
I> [AN_B�"p,eI!XX�T v, Frontpanel
'-"' CMO
j
,
<-!*!- ,j F! f,t -... -
.". -
I
,,
01
_ flt_ . _ ...... . .. ....... . _ Wht "" .
oa
00
00
00
00
00
00
�= � " ' :;;o;--, L
.,
«41
-
•
Bild Beispiel einesVI, dasübereinen (AN-Kanal senden undempfangen kan 15.17
Zur CAN-Controller-Software gehört auch der Minimonitor 'Minimon.exe' in Bild 15.16, mit dem man einzelne Sendungen über den CAN-Bus starten und sich die Ergebnisse an schauen kann. Weiter gibt es ein Beispie1programm 'VCI3_0emo.vi', das zeigt, wie man die von IXXAT zur Verfügung gestellten LabVIEW-Routinen zur Bi l dung eines kompletten
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
282
15 Serielle Eingabe/Ausgabe
Programms nutzen kann. Dieses VI wurde für unsere Zwecke modifiziert und unter dem Namen 'CAN_BeispieUXXAT' gespeichert. Das Frontpanel dazu ist in Bild 15.17 dargestellt, das Blockdiagramm in Bild 15.18. Die geJb gefarbten Symbole in Bild 15.18 sind SubVIs, die mehrere der in ' . . \user. ib\...' l enthaltenen SubVls zusammenfassen. So enthält etwa das VI m i unteren Tei l des Diagramms mit dem Symbol 'Transmit' ('Transmit (SubVI).vi') die SubVls 'CanChanneJSendMsg.vi' und 'VciDisplayError.vi', die in Bi l d 15.19 dargestellt sind. 'Transmit (SubVI).vi' versendet Daten aufdem CAN-Bus.
Bild 15.18 Blockdiagramm zu Bild
15.17. Oben der Empfangs- und unten der Sendeteil
�,wt",,1
Bild 1 5.19 Blockdiagramm von 'Transmit ($ubVl).vi' mit $ubVls von IXXAT: 'CanChanneISendMsg.vi' und 'VdDisplayError.vi'
Umgekehrt empfiingt das VI 'Receive (SubVI).vi' Daten, die auf dem CAN-Bus anstehen. Auch dieses Unterprogramm nutzt eines der von IXXAT in '. . . \user.lib\ .. .' zur Verfügung gesteUten SubVIs, siehe Bild 15.20.
Bild 15.20 Blockdiagramm von Receive ($ubVl).vi' mit dem IXXAT-$ubVI 'CanChanneIReadMsg.vi'
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.4 Feld-Bus. CAN-Bus
283
Den zu 'Iv_canChanneIReadMsg.vi' gehörenden C-Code findet man in Tabelle 15.2. Dieses Programm greift seinerseits auf 'amChanneiReadMf.'SSage (HANDLE hCanChn. UINT32 dwMsTimeout. PLVCANRXMSG pCanMsg)' zurück, das zur 'Native Programming library VCINPL.DLL' gehört. Man kann das SubVI n i der schon erwähnten Weise in einen ClF-Knoten einbinden, siehe Bild 15.21. Tabelle 15.2 C-Codevon 'Iv_canChanneIReadMsg' ........................................................................._. . ./
un:RlI_C Hru:SULT YCIAPI lv_eanChann�l�a.m.,s'dq�(I!ANULF: UINT32
hCanChn,
PLYCANRXH5G pCa"",,q) IIR!':SULT �sult;
CAlIM5G
,Canllsq;
�sult
_ cdnChdnndR�acm.,'saq� (hCanChn, dvM,n..,out, .,Ca"",,q ) ;
if
« hR�,ult
__ YCI_OK)
u
(pCanllsq
,_ NULL ) )
, pCanllsq->dvn.., pCanllsq->dvM,qld
sCdnM,q.dvn..,; sCdnM,q.dvM,qld;
pCanllsq->bTYP"
sCdnM,q.uMsqln!o Byt�,.bTyp�;
pCanllsq->bDLC
sCdnM,q.uMsqln!o Bits.d.le;
pCanllsq->bAl""C
sCdnM,q.uMsqln!o Byt�,.bAce�pt;
pCanllsq->tOVR
sCdnM,q.uMsqln!o Bits.ovr;
pCanllsq->tSRR
sCdnM,q.uMsqln!o Bits.nr;
pCanllsq->tRTR
sCdnM,q.uMsqln!o Bits.rtr;
pCanllsq->tUT
SCdnM,q .uMsqln!o . Bits . "xt;
,"""epy(pCdnM,q->abDdtd,
,Canllsq.abDdtd,
6);
=turn ( �sult ) ;
/........................................................................_... . End o! lv_eanChann�l�d.m.,s'dq�
........................................................................._... /
� �ufruf�.t.'"". D,lA,oth.k",
T",ooJ
r., UI·j"eM&OJshAnn
lU"ikcme
r c
Bild 15.21 Konfiguration von 'Iv_canChanneIReadMessage' in einer CLF gemäß der schon im Bild 15.13 dargestellten Methode
Man erhält schließlich den konfigurierten eLF-Knoten, den man n i einem SubVI nach Bi l d 15.22 verwenden kann.
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
15 Serielle Eingabe/Ausgabe
284 Hinweis
Der Umgang mit den n i den CAN-Vls benötigten tei l weise recht komplizierten Strukturen aus Clustern, Arrays und eingebundenen DUs kann übrigens in der Lösung zu Aufgabe 15.5 im Internet nachgelesen werden. I> [on(hanneiReadM•• VI Blockd,ao,amno
Bild 15.22 Diagramm von 'CanChanneIReadMsg.vi'
Die Funktion dieses und aller anderen Unterprogramme mit ihren Parametern ist im C-API Programmierhandbuch beschrieben, das IXXAT mit dem USB-to-CAN-Controller an die Kunden ausliefert.
IAufgabe 15.5
Entwickeln Sie mit Hilfe der n i ' . . .\LabVIEW 8.S\user.lib\...' verfügbaren IXXAT-SubVls das in Bild 15.22 beschriebene Unterprogramm. 15.4.3
CAN-Hardware, erste Anwendungen
Bi l d 15.23 zeigt eine mögliche Anordnung der Hardware, dievon der Software zu steuern ist. ..... CU<�
USB
Ct.N_
""'""" ,
Ct.N-Buo
00 Bild 1 5.23 Mögliche Anordnung eines Laptop mit einem oder mehreren USB-to-CAN-Controllern
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.4 Feld-Bus, CAN-Bus
285
Diese muss dem USB-to-CAN-Controller nicht nur Anweisungen geben, Daten zu senden oder zu empfangen, sie muss auch den Controller auswählen, falls mehrere am Laptop an geschlossen sind. Außerdem muss sie Speicherbereiche als Puffer reservieren, n i die Daten geschrieben werden können. I> Enum�ratlon (SubYI) v, Blockd,a!J"amm
"
Bild 15.24 Auswahl des nächsten Can-Controllers am Laptop bzw. PC
Dementsprechend ist die Struktur von 'CAN_BeispieUXXAT.vi' n i Bild 15.18 organisiert: 1. Betrachten wir zunächst das SubVI mit dem Symbol 'Enumeration' links m i Diagramm. Das Blockdiagramm dazu ist n i Bild 15.24 zu sehen. Es enthält drei weitere Unterpro gramme. Sie beziehen sich auf eine Liste, in der alle am Laptop angeschlossenen Can Controller verzeichnet sind. Diese wird geöffnet, aufden Ausgangszustand zurückgesetzt und schließlich der nächste CAN-ControUer ausgewählt. Ist nur ein Controller ange schlossen, wird dieser ausgewählt und mit einem eindeutigen Identifier im Sinne von Bild 15.14 versehen. Jeder erneute Aufruf von 'VciDeviceEnumNext.vi' wählt den nächsten CAN-Controller. 2. Das folgende SubVI, in Bi l d 15.18 mit dem Symbol 'CAN-Control' zu finden, initialisiert den eben gewählten Controller. Dieses SubVI ist in Bild 15.25 dargestellt.
Bild 15.25 Vorbereitung des CAN-Controllers
Seine Aufgaben sind aufden CAN-Controller bezogen. Im Einzelnen:
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
286 Öffnen eines Geräts allgemein.
Öffnen des CAN-Controllers, hier stets mit der Nummer 0 (Manche Geräte haben auch zwei verschiedene Controller). lnitialisieren mit Einstellen der Baudrate zwischen 10 und 1000 kBaud n i 9 Stufen. Dieser Wert wird in zwei Bytes BTR 1 und BTR 0 zerlegt (den Operator dazu findet man unter 'Punktionen' - 'Numerisch' - 'Datenmanipulation' unter der Bezeichnung 'Zahlen teilen'), ferner Wahl des 'Operating Mode', im BeispieJ 1 1 Bit für den Identi fiet. Setzen des Akzeptanzfilters. Im BeispieJ wird nichts gefiltert. Das heißt, der CAN Controller kann alle Nachrichten empfangen, keine Nachricht mit unerwünschtem Identifier wird ausgefiltert.
3. Das dritte SubVI in 'CAN_BeispieIIXXAT.vi' trägt das Symbol 'CAN-Channel'. Sein Diagramm ist in Bild 15.26 dargesteUt. Es öffnet, nitialisiert i und aktiviert einen Nach richtenkanal. Es handeJt sich hierbei nicht um den Zweidraht-Hardwarekanal des CAN Busses. Vielmehr gilt in diesem Zusammenhang die Erklärung: Ein Nachrichtenkanallässt sich auffassen als ein Paar von Speicherbereichen, die als Sende- und Empfangspuffer dienen, siehe Bild 15.23. • (AM (h.",d (s.bVI) " 11.,kd,.oeo,n,"
------.
" .
,d
,
I
Bild 15.26 Errichten eines Kanals Im Einzelnen: Öffnen des Kanals. Initialisieren mit Zuweisung von 2048 Bytes für den Empfangspuffer
(RX FIFQ Size)
und von 128 Bytes für den Sendepuffer (TX FIFQ Size). Fehlermeldungen werden
ausgegeben, wenn die Puffer bis auf I Byte ausgeschöpft sind (Treshold = Schwelle), Schalten der Leuchtdiode 'Init QK' auf grün. Aktivieren des Kanals.
4. Nun wird der CAN-Controller durch Aufruf von 'CanControIStart.vi' gestartet. 5. CAN_BeispielIXXAT ist nun bereit, in einer Schleife zu empfangen (Receive) und n i einer dazu parallelen Schleife zu senden (Transmit). Gesendet wird jedoch immer nur nach Tastendruck auf dem FrontpaneJ. Dafür sorgt die Funktion 'Auf Frontpanel Aktivität warten' in der unteren While-Schleife von CAN_BeispielIXXAT in Bi l d 15.18.
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.4 Feld-Bus, CAN-Bus
287
6. Stopp beendet beide Whi l e-Schleifen und führt zum SubVI mit dem Icon 'CLOSE'. Das i Bild 15.27. Details sinngemäß wie bei Punkt 5. Diagramm dazu findet man n "'1QiifiJ
Bild 15.27 Schließen von Kanal, CAN-Controller und Gerät allgemein. Fehleranzeige
Das Frontpanel von 'CAN_Beispiel IXXAT.vi' wurde bereits in Bi l d 15.17 dargestellt. Was kann dieses Programm leisten? In erster Linie dient es als Beispiel für die Entwicklung von LabVIEW-VIs für den CAN-Bus. Ferner kann man einfache Experimente machen, ver gleichbar denen, die mit dem Minimonitor von Bild 15.16 möglich sind: Wir setzen dabei voraus, dass wir zwei Laptops haben, die jeweils mit einem USB-to-CAN Controller verbunden sind, siehe Bild 15.28. Ferner werde aufbeiden Laptops das gleiche VI 'CAN_Beispiel IXXAT' (bzw. '1517-CAN_Beispiel IXXAT') gestartet, so dass auf beiden Laptops die LEDs 'Init OK' und 'Is started' grun leuchten.
� = �. r� �-I �._
L-
�
L
�
__
�
__ __
Bild 15.28 Zwei PCs mit zwei USB-to-CAN-Controllern
Stellt man nun in den Feldern 'Arbitration ID', 'DLC' und 'Data' des ersten Laptop die Werte 0, 8 und 1 1 2233 AA BB CC CI FF ein, so wie das Bild 15.29 zeigt, dann führt die Betätigung der Transmit-Taste zur Obertragung dieser Werte an den zweiten Laptop. �o
cl
11M "
r,t
�. "
1C
."
"
"
.
"
"
"
�� -
�
,,;ort
-
F
�
_ .... . -_ . � _.
-_ ... .
f.�I!o-I!o-�"'�1!o-
•
••
,
-
�
'":! �
Bild 15.29 Vorbereitung einer Sendung an einen zweiten PC
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
288 Dort erscheint dann eine Anzeige gemäß Bild 15.30. �o
cl
"-
�.
r,t f,t
00 00 00 00 00 00 00 00
,.
�-
� ... F �o
_ ... .
�
1"''''-
_ü
-_ .
.. _ -
- , ro-
--"' .
-
f,Wl;f,;-f.;I'mi!ci!c�
� �
Bild 15.30 Anzeige der empfangenen Sendung aufdem zweiten pe
Die auf Laptop l oben eingegebenen Daten erscheinen also auf Laptop 2 im Empfangsfeld unten. Vorausgesetzt wurde hier ferner, dass Laptop Nummer 2 den Identifier I und ein Eingabe-Datenfeld mit den Werten 00 aufweist.
"
"
"
M
OO
CC
CI
FF
- _. � ... =
� �
..jo
-
=
F
Mo
_ ... . -_ .
.. _ -
--"' .
oo \'mf,;"'�PooI'mt,;
_M
-
<J ro-
-
Bild 1 5.31 Sendung, ausgehend von Laptop Nummer 2. Hier ist DLC nur die beiden ersten Datenbytes verschickt
==
2, also werden
Die Richtung des Datentransfers lässt sich umkehren. Sendet Laptop 2 mit EinsteUungen gemäß Bi l d 15.31, so empfangt Laptop I nur die zwei ersten Bytes wegen der Einstellung DLC = 2 am Sender, also Data[OJ = 1 1 und Data[IJ = 22. Hat man nur einen einzigen PC, kann man das gleiche Experiment in leicht abgewandelter Form auch dort ausführen: Man steckt den zweiten USB-to-CAN-Controller einfach in eine zweite USB-Schnittstelle. Das Programm 'CAN_Beispiel IXXAT.vi' wird als zweites VI mit dem Namen 'CAN_Beispiel IXXAT2.vi' aufgerufen. Dieses VI ist eine Kopie des ersten bis auf den zweimaligen Aufruf von 'VciEnumDeviceNext.vi', womit der zweite CAN-Controller ausgewählt wird. Versäumt man das, erhält man eine Fehlermeldung, weil dann der erste CAN-Controller von gleichzeitig zwei VIs angesprochen würde, was nicht zulässig ist.
IAufgabe 15.6
Modifizieren Sie 'CAN_Beispie1 IXXAT.vi' so zu 'CAN_Beispiel IXXAT2.vi', dass heide Programme auf einem PC gleichzeitig laufen und über zwei USB-to-CAN-Controller Daten austauschen können. Anleitung: Verändern Sie 'Enumeration (SubVI).vi' zweckentsprechend und fügen Sie es als 'Enumeration_2x (SubVI).vi' in 'CAN_Beispiel IXXAT2.vi' ein.
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.4 Feld-Bus, CAN-Bus
289
Weitere Beispiele für den Datenaustausch mittels CAN-Bus
15.4.4
Das Programm 'CAN_SendenEmpfangenVerschiedenes.vi' (bzw. '1532-CAN_Senden Em fangen Verschiedenes.vi') in Bild 15.32 bzw. Bild 15.33 zeigt, dass man auch quasi gleichzei tig auf derselben Leitung (physikalisch zwei Leitungen, logisch nur eine) in verschiedenen Richtungen senden kann. Dieses Programm wurde von CAN_BeispieIIXXAT.vi abgeleitet, wobei die verschiedenen Initialisierungen für Gerät, Controller, Nachrichtenkanal im SubVI 'CAN_Initiaisieren.vi' l zusammengefasst wurden. Außerdem wurde n i die Sendeschleife unten eine Gase-Struktur eingebaut, die dem Anwender die Wahl ässt, l Sinus- Dreick-, Rechteck- und Sägezahnkurven zu senden, der Einfachheit halber alles normiert auf Daten n i einem Byte. Das Programm wird mit Hilfe zweier USB-to-CAN-Controller auf zwei ver schiedenen Rechnern ausgeführt, die über den CAN-Bus gemäß Bild 15.28 miteinander zu verbinden sind. Der Start der Programme auf den beiden Rechnern ist etwas problematisch: er sollte mög ichst l gleichzeitig erfolgen, wei l sonst der Sendepuffer das CAN-Controllers überlaufen kann. Man könnte Start und Stopp aufbeiden Rechnern mit Umgebungsvariablen automati sieren, doch würde das VI dann komplizierter und seinen Charakter als Demonstrationsob jekt für den CAN-Bus verlieren. Wir verweisen deshalb aufAufgabe 15.7. " (A�-,endenE"'pf""""nYe,.rn;edcncs.., '"on....nd
.
� o:M_..� ��
•
cl
-_.
-
-
-�
•
n� -
,
-
_0
�
.V
�
i"
_0
-
=
t"" Ü'" ""
'00""""
ode"""""",, Ie...chonrdlO,odM,." "
�
r= '
-
A
t= ,"
-
1 ': o
"5'"
•
12m
_.
"'"
=
Bild 15.32 Das VI sendet links Werte einer $inuskulVe und empfängt rechts Werte vom identischen VI aufeinem zweiten Rechner, der auf Funktion Dreieck eingestellt wurde =
IAufgabe 15.7
Synchronisieren Sie Start und Stopp von 'CAN_SendenEmpfangenVerschiedenes.vi' un ter der Voraussetzung, a)
b)
Ausleihe:
dass nur ein Rechner existiert, wobei Aufgabe 15.6 zu beachten ist,
dass die beiden Rechner am Internet oder Intranet Ihrer Organisation angeschlos sen sind und dass Sie Umgebungsvariablen verwenden (siehe Abschnitt 22.3.1.).
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
290
Bild 15.33 Blockdiagramm des Vis in Bild 15.32
Aufihon
� �"" A� "',,... 11
" "_ .
ji,,''' '''' ��" tIlf,
..."' .,.
.-
...
-
.< [1
12 11
"
,
•
,
•
�
__ ... _
• , ,
1
�
Senden
_, _, " _. "" . _, . _, _lO _Ll _" _" _L
---
j'. 1,.
"�,
,l, ....
i:: l--+-t--I , , " ....",,, " , .... .,,, "",e. ,,,," "',".>
, '''CI''','' "'"'."""
Bild 1 5.34 Frontpanel von 'DatenVerschicken.vi'. Als Arbitration Identifier wurde willkOrIich derWert 1235 (dezimal) eingetragen. DieserWert ist binär in den Bits 1 1 bis 1 der Digitalanzeige dargestellt
Ein letztes Beispiel soll den Datenverkehr auf dem CAN-Bus veranschaulichen. Es sei aber nochmals darauf hingewiesen, dass SpannungspegeJ nach Abschnitt ISA.l aufzwei Leitun-
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.4 Feld-Bus. CAN-Bus
291
gen übertragen werden. Im Beispiel wird nur der logische Wert auf dem Bus angezeigt. Ist also die Differenzspannung auf den beiden physikalisch existierenden Leitungen < 1.5 V, so beträgt der logische Wert I. Ist die Differenzspannung > 3,5 V, wird der logische Wert 0 zugeordnet. Das Beispiel wird durch die Programme 'DatenVerschicken.vi' (bzw. '1534DatenVerschicken.vi') und 'DatenAufzeichnen.vi' realisiert. Bild 15.34 zeigt das Frontpanel des Sendeprogramms, Bild 15.35 das Diagramm dazu.
Bild 15.35 Diagramm von 'DatenVerschicken.vi' in Bild 15.34. Dieses VI sendet nur und stellt das logi sche Bit-Muster auf dem (AN-Bus im $ubVI mit dem Symbol 'Digitalanzeige' dar
Das für die CAN-Bus-Darste1lung benötigte SubVI 'Digitalanzeige (SubVI).vi' ist mit seinem Diagramm in Bi l d 15.36 zu sehen.
Bild 15.36 Umwandlung von Arbitration 10, RTR und Datenbyte in eine Digitalanzeige
Mit dem Ausgang 'Cluster out' wird nun im aufrufenden VI in folgender Weise eine Digital anzeige erstellt: Man holt sich unter 'Modern' - Graph' - 'Digitaler Verlaufsgraph' eine digi tale Anzeige aufs Frontpane1. Zu Beginn ist die Plotlegende, die hier links neben dem Gra phen steht, weiß und leer. Sie nimmt das Aussehen von Bild 15.37 links an, sobald man im Diagramm rechts eine Konstante im Kontextmenü erzeugt und dort eine I im untersten Clusterelement einträgt. Die Digitalanzeige hat standardmäßig acht Leitungen. Um sie für eine Leitung so zu gestalten wie Bild 15.34 zeigt, muss man m i Kontextmenü 'Eigenschaften' aufrufen und dort unter Anzeigeformat 'binär' wählen, unter Skalen, 'Zeit (x Achse)', Skala ankreuzen und unter 'Digital-Plots (y-Achse)' die Autoskalierung aufheben
und Minimum = 7,1 sowie Maximum = 9 eintragen. Wählt man schließich l noch in der Plot-
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
15 Serielle Eingabe/Ausgabe
292
Legende im Kontextmenü Farben und Transparenz wie in Bild 15.38 angedeutet, ergibt sich als Digitalanzeige nur ein schmaler Streifen gemäß Bild 15.34.
Bild 15.37 Digitalanzeige mit acht Leitungen, erzeugt durch die Clusterkonstante im Diagramm
[...ru Leitl.ll9 0 I Leib.l'lO 1 [JI..! LeitlSlQ 2 [JU LeitlSlQ 3 [J""U leitl.llQ " [JLJ leitl.J1O 5 [...ru leito..no 6 [Jl.J Leitl.ll9 7
Bild 15.38 Plot-Legende im Kontextmenü einer Digitalanzeige nach entspre chender Wahl von Farbe. Stärke für Leitung 0 und Transparenz fOr Leitung 1 . Achtung: In der LabVIEW-Version 8.0 kann man nicht die ganze leitung fett dar stellen, sodern nur entweder den High- oder den low-Wert
IAufgabe 15.8 Versuchen Sie, eine Digitalanzeige nach Bild 15.34 von Anfang an aufzubauen.
15.4.5
(AN-Bus mit Laptop und einem Sensor
Die Beispiele im vorigen Abschnitt dienten dazu, den Leser ein wenig mit dem CAN-Bus vertraut zu machen. Sie beschreiben aber nicht seine eigentliche Aufgabe, nämich l Daten verschiedener Sensoren an eine Auswertungsstelle, z.B. einen PC, zu übertragen und umge kehrt, die Sensoren vom PC aus zu steuern. Bild 15.39 zeigt das einfachste System dieser Art.
Laptop
Bild 15.39 Ein Laptop steuert den U$B-to-(AN-(ontroller, der Konfigurationsdaten mit Sensor 1 aus tauscht und später Messdaten von ihm empfängt
Der Sensor muss CAN-Bus-fahig sein. In den folgenden Bespielen werden Sensoren der Finna ZILA Elektronik GmbH in 98544 Zella-Mehlis verwendet. Sensor 1 n i Bi l d 15.39 ist ein Temperatursensor vom Typ TSL-CAN-03. Er dient zur Temperaturmessung in (hinrei-
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
15.4 Feld-Bus, CAN-Bus
293
chend trockener} Luft im Bereich zwischen _40 °C und +80 oe. Bild 15.40 zeigt eine reale Anordnung. Zum Vergleich wurde ein gewöhnliches Thennometer beigefügt. Aus den oben beschriebenen Vls wurde das Programm 'CAN_Beispiel_mit I_Sensor.vi' (bzw. '1541-CAN_BeispieCmit I_Sensor.vi') entwickelt, dessen Diagramm in Bild 15.41
dargestellt ist. Startet man dieses Programm, werden zunächst falsche Temperaturwerte
angezeigt, bis man mit dem Transmit-Knopf und der Arbitration-ID = 0 eine Meldung an den Sensor gesendet hat, der diesen veranlasst, jede Sekunde eine Temperaturmessung durchzuführen, als CAN-Botschaft zu verschlüsseln und an den CAN-Controller zu schi cken. Von dort aus liest sie das VI im Laptop mit dem Unterprogramm 'Receive (SubVI).vi'
und stellt sie links m i Diagramm auf dem Frontpanel dar, siehe Bild 15.42. Nach Stopp des Programms wird der komplette Temperaturverlauflinks angezeigt und die Momentanwerte
im Chart werden gelöscht.
Bild 15.40 Laptop, CAN-Controller und ZILA-SensorT$L-(AN-Q3 verbunden gemäß Bild 15.39
Bild 15.41 Diagramm von 'CAN_Beispiel_miL1_Sensor.vi'
Die Frage ist nun, auf welche Botschaft der Sensor reagiert, um mit der übertragung der Temperaturwerte zu beginnen. Siehe dazu Abschnitt 15.4.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
15 Serielle Eingabe/Ausgabe
294
ZI.l� ITransmitl
f- ....�
: IJ�
-
1 -" = I�
' 0 � ..
j"
�O
--
�
�
'�
,,u-
m , � ..
,.
ISTCPI •
"
�"
I" "
" 00,«
��
-
1�:l5:18
07.,,".l
11:;'5:30
1'1:2532
07,,".2000 07.,,".2000 �
1'1:';;;:
0',"".
Bild 15.42 Links im Frontpanel von 'CAN_BeispieCmiCl_Sensor.vi' die Folge der Temperaturmess werte. Nach Stopp des Programms wird die komplette TemperaturkulVe rechts mit Datum und Uhrzeit angezeigt. Die Temperaturen machen einen Sprung nach oben, nachdem der Sensor mit warmer Luft angeblasen wurde.
IAufgabe 15,9 Das SubVI 'Umwandlußg...ß_Bytes.vi' im Sendeteil von 'CAN_Beispiel_mit_I_Sensor.vi' wandelt ein Cluster von maximal acht VS-Daten in eine DBL-Zahl und in eine 64 Bit Binärzahl um. Untersuchen Sie dieses Programm. Bei negativen Zahlen wird mit dem Zweierkomplement gearbeitet. Welches Byte ist das höchstwertige? 15.4.6
CANopen-Protokoll
Bisher wurden beim CAN-Bus nur die Schichten I und 2 im OSI-Modell besprochen. Schicht I (Physical Layer) behandelt die physikalischen Vorschriften für den Bus, z.B. me chanische Eigenschaften, verwendete Spannungen, auch SteckerbeJegungen. Schicht 2 (Data Link Layer) behandelt die Datenübertragung zwischen zwei Knoten, also den Aufbau eines Datenpakets, zu dem auch die Codesicherung und Fragen der Konfliktbewältigung wie Dominanz eines Knotens auf Grund seines Identifiers gehören. Die Frage nach der Bedeu tung eines Datenpakets wurde bisher nicht gestellt, sie betrifft die höhere Schicht 7 (Applica tion layer): Welches Datenpaket muss man z.B. an einen Sensor schicken, damit er beginnt, Messwerte in Form von Datenpaketen zu übermitteln? Welches Datenpaket muss man schi cken, um dem Sensor zu veranlassen, jede Sekunde zu messen oder vielleicht auch nur jede Minute? Es wäre unpraktisch, wenn jeder Sensorhersteller diese Fragen individuell für sich beantworten würde. So wurde 1992 die Anwender-/Hersteller-Gruppe CiA (CAN in Auto mation, http://w.ww can-cia.de) gebildet. n i der solche Fragen geklärt werden. Im Jahre 2008 gehörten ungefähr 500 Firmen zu dieser Non-Profit-Organisation mit Hauptsitz in Nürn berg. Die RegeJn, auf die man sich geeinigt hat, werden unter dem Begriff des CANopen Protokolls zusammengefasst. Einzelheiten zum CANopen-Protokoll können hier nicht erläutert werden (siehe dazu [7]), doch soll anhand des ZIlA-Sensors beispielhaft gezeigt werden, wie man die Messzykluszeit neu setzen kann. ZILA stellt dazu die ausführliche Anleitung 'ZIlA TSlrrSR-CAN-03' zur Verfügung, welche einen Auszug der CANopen-Vorschriften darstellt.
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
15.4 Feld-Bus. CAN-Bus
295
Man unterscheidet zwischen PDO- und SDO-Kommunikation (Process/Service Data Ob jects). Vom Werk ist der Sensor so eingestellt. dass er jede Sekunde automatisch die Tempe ratur misst und diese als CAN-Datenpaket versendet. sobald man den Prozess einmal ange stoßen hat. Die Einstellung des Sensors auf eine andere Zykluszeit gehört zur SDO Kommunikation. Bi l d 15.43 zeigt die notwendigen Operationen. Man könnte das mit dem VI 'CAN_BeispieIIXXAT.vi' bewerkstelligen, doch wurde hier der IXXAT-Minimonitor bevorzugt, weil er ein Protokoll der einzelnen Sendungen aufzeichnet. ii ",
. c_ ..._ " lOO'<.",.;" ..,,,,;.,,,
· ,,"""' .......,
• 0"' ....,,,,, . · ,,,"' ........ ..,... • .... 0/,
I ' Bild 15.43 Minimonitor mit einem Protokoll zur Umstellung der Messzykluszeit auf 0,256 s 00 01 h, entsprechend dem Hexwert 01 00 f--7 256 ms, weil das höherwertige Byte stets im Byte mit der höhe ren Nummer steht =
Erklärung der Zykluszeftveränderung: Anfangs sendet der Sensor I-mal pro Sekunde F600 bzw. 00 F6 f--7 246 f- -7 24,6 "C, weil die Temperatur n i 1/10 gemessen wird (werksseitige Voreinstellung). Das Protokoll wird im Fenster oben rechts angezeigt. Dann wird mit dem Kommando 82 I I und dem Identifier 0 der Sensor I I h im Netz ge stoppt. Dieses Kommando ist m i Fenster unten rechts zu sehen. Anschließend wird mit dem Kommando 22h und dem Index 1800 (geschrieben 00 18) sowie dem Sub-Index 05 der neue Wert 01 00 in den Bytes 6 und 5 des 8 Byte langen Datenpakets übertragen. Der Sensor mit der Knotennummer I I h ist mit dem Identifier 600 h + 1 1 h = 611
h anzusprechen. Er bestätigt den Empfang mit 6000 18050001 0000 und dem Identifier 580h
+ Knotennummer = 591 h.
Startet man nun Sensor I I h mit dem Kommando 01 1 1 h, sieht man rechts oben die gleichen Temperaturwerte wie anfangs; sie erscheinen aber schneller, nämlich alle viertel Sekunde.
Erklärung der Offsetveränderung: Die Einstellung des Sensors auf einen anderen Offset bei der Temperaturmessung gehört ebenfalls zur SDO-Kommunikation. Man macht das im Prinzip wie bei der Zykluszeitverän-
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
296
deruog. Bi l d 15.44 zeigt wieder den Minimon von IXXAT mit seinem Protokoll. Zu beachten ist, dass hier ein Sensor mit der Knotennummer 10 h bearbeitet wird. Entsprechend ändern sich die Identifier. Wichtig ist ferner das Kommando 2210 10017361 7665, das die geänder ten Werte, die zunächst nur flüchtig m i RAM des Sensors gespeichert sind, n i dessen i CAN-Paket bedeutet im ASCII-Code EEPROM bringt. Die Zeichenfolge '73 61 76 65' m einfach 'save'. Anderenfalls wären die Änderungen verloren, sobald man die Versorgungs spannung des Sensors abschaltet. �
MmiMon V3 by IXXAT
-
co
flXlCtürt; "<'-
0 0 ..
;)
""
0 ...
I)()(AT In\erfaen
8
lJSIl-to-CAN CC
-"". 'CJß k SJA "'iCiii'
Cl! •
T....., l l0�Soc
Cü�,
IGmIi«
20 42
'"M
C�,
OO:�:2279
I� Std I� Std I� Std
CüOG:2179
100 Std
Cü:�:2078 CO:�:21 79
•
Cootrolef hit�od l"" >peed tronsc
T
r
• 0"" O'eft\X1 • ErrE< _nng �vel • �"' B.oohale: 20 f1iti' !:osIo:>od %
r::::::
C.
E300 00 00 E9 020000 E200 00 00 E8 020000
<300 00 00 E9 020000 c.
OO:OG:21ß.1
710 Std
CO:�:)}62
610 Std
c.
00:�:3063
�1O Std
oo:�:(Qgg
610 Std
CO:�:(Qgg
510 Std
00:�:(344
610 Std
00:�:(3(6
510 Std
8210 00 402()1 01 00000000 (nOI
c.
01 00000000
222()1 01 1 E OOOOoo 602()1 01 1 E OOOOoo
c.
22101001 73617665 60101001 73617665
",
CO:�:(763
01 1 0 E200 00 00 E8 020000
",
CO:OG:2183
• e
""
c.
0110
Std Std 110 Std 110 Std
00:�:(710
110
0 1 0 1 o o oo E 9 0200oo
co:�:(a1O
110
0 1 0 1 o o oo E 9 0200oo
CO:�:(91O 00:�:5010
710
1J}�51 01
"
AI
AL ...
000I o o oo E 8 0200oo
",
CO:�:51 01
AI AI AI
0 1 0 1 o o oo E 9 0200oo
""""
'" '" '" ,
" 0 0 0 0 0
c.
8210
Std
00
""
0 0 0 0 0
, ..
40201 m 00000000
22201 Ol lE 00 00 00 22101001 73617665
01 1 0
R�oI �""""'oion. D«�",�!
: 21
"
Bild 15.44 Minimonitor mit einem Protokoll der Offsetveränderung um 3 ·e 1 E h. Anfan�s wird eine Temperatur angezeigt die zwischen E2h und E3h schwankt, also zwischen 22,6 und 22,7 C. Nach der Offsetkorrektur um 3 ·e ergibt die Messung der gleichen Temperatur Werte zwischen 00 01 h und 01 01 h, also zwischen 25,6 und 25,7 oe wie erwartet. Zu beachten ist dabei, dass der Sensor die Tempe ratur in 1/IQ-Grad-Einheiten liefert ==
Achtung Das Kommando 22 10 10 01 7361 7665 zum Umspeichern vom RAM des Sensors n i den Ä EEPROM ist besonders wichtig bei der nderung der Knotennummer eines Sensors. Die neue Knotennummmer sollte ja auch nach Abschalten der Spannung erhalten bleiben.
IAufgabe 15.10
Die Knotenummer eines Sensors ist dauerhaft auf25h zu ändern (Voraussetzung: ZIlA Sensor und Handbuch sind verfügbar).
Ausleihe: 31.07.2009 00:0 :00 -08.08.2009 00:0 :00, ID:7ac0427dS92981cf089d91b1gecaOOaO, Zentral- 2009.07.31 21:42:39 +02'0 ' u
15.4 Feld-Bus, CAN-Bus 15.4.7
297
(AN-Bus mit Laptop und mehreren Sensoren
Die eigentliche Aufgabe des CAN-Busses besteht m i Einsammeln und Versenden von Daten in einem Netz, das mehr als einen Knoten enthält. Wir geben ein Beispiel für ein solches Netz mit einem Controller und zwei Sensoren entsprechend Bi l d 15.45.
Laptop
Bild 15.45 Ein Laptop steuert den USB-to-(AN-(ontroller, der Messdaten von Sensor 1 und Sensor 2 empfängt. Diese werden in einem Diagramm angezeigt
Als Sensor 1 wurde der TSR-CAN-03 von ZILA gewählt, der Temperaturen auch m i Wasser messen kann. Er wurde auf den Identifier lOh eingestellt und auf automatische übermittlung von vier Temperaturwerten pro Sekunde. Sensor 2 ist der Luftsensor TSL-CAN-03 derselben Firma. Er hat den Identifier 1 1 h und misst die Temperatur nur einmal pro Sekunde. Das Problem ist daher, diese verschiedenen Zyklen n i einem Diagramm darzustellen. Dazu eignet sich das n i Bild 15.46 dargestellte Pro gramm mit dem Frontpanel von Bild 15.47. � �b
•
tyo)O<j
/,ldlhO<1
13ptDl>t.q<&rI'ilfl
I>:"'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'slnrrl
! [HII N[-{)AQ01X - G.
fr_yA:tl"s_ l fr_y A:tloss _ 10
]j 5o';o' ''-""dId
[!ll'X' "'I'js.te
� "" s<.i.<� 1il61 Sofl,.,.-e , i!J,. 111 Dt1Ve<'
�·a """,,·,,� Bild 15.51 Der MAX zeigt zwei neue GPIB-Instrumente. sobald diese mit Spannung versorgt sind
5. Rechtsklick auf 'Instrument 0' zeigt rechts die Attribute bzw. die 'VISA Properties', siehe Bild 15.52.
D,,,",,Std,,,
T�,d."."""""""",,,,",
Bild 15.52 VISA Properties von Instrument 0, dem
Keithley-Gerät 230 für die Spannungserzeugung. Hier kann man auch einen kürzeren Namen als die VISA-Bezeichnung 'GPIBQ::1::IN$TR' eingeben, z.B. 'K230'
Die entsprechende Anzeige für Instrument 1 ist in Bild 15.53 zu sehen.
�""""" "''''...,,-t
.
iI N'"", q, 01'11 """.
�
D,,,,,,1,...
----' D=c,s..",
T�,""'''''';',,",k.oog �,
Bild 15.53 VISA Properties von Instrument 1, dem
Keithley-Gerät 2000 zur Spannungsmessung. Es hat die VlSA·Bezeichnung 'GPIBQ::16:INSTR'
Mit den VISA-Adressen 'GPIBO::I::INSTR' und 'GPIBO::16::INSTR' lassen sich nun be reits VIs entwickeln, die mit dem GPIB-Bus arbeiten. 6. Nach Abschluss der Arbeiten mit dem Gerät den USB-Anschluss mit 'Hardware sicher entfernen' herausziehen. 7. Beim nächsten Start entsprechend vorgehen, d.h. dafür sorgen, dass im MAX die Geräte angezeigt werden, mit denen das VI arbeiten soll.
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'
15 Serielle Eingabe/Ausgabe
302 15.5.2
Entwicklung eines VI
Was bedeuten die Zahlen 'I' und '16' in 'GPIBQ::I::INSTR' und 'GPIBO::16::INSTR'? Es han delt sich hier um Geräteadressen. Die ' l' gehört zur Spannungsquelle 230. Sie kann durch fünf Kippschalter an der Rückseite des Geräts verändert werden. Die ' 16' gehört zum Multi meter 2000 und ist voreingestellt. Einzelheiten dazu sind den Handbüchern 'Model 2000 Multimeter Quick Reference Guide' (Document Number 2000-903-01) und 'Model 220/230 Programming Manual' von Keithley zu entnehmen (Document Number 220-900-0IB). Das Programm 'VISA-GPIB-Struktur.vi' zeigt das prinzipielle Vorgehen bei der Erstellung von VIs, die mit dem GPIB-Bus kommunizieren. Bild 15.54 zeigt das Frontpanel, Bild 15.55 das Diagramm. Die benötigten Funktionen findet man unter 'Funktionen' - 'Instrumenten1/0' - 'VISA'. Zieht man Low-Level-Programmierung vor, kann man statt 'VISA' auch direkt 'GPIB' wählen. Erläuterung: Nach Öffnen der VISA-Sitzung und Rücksetzen des Multimeters gemäß Norm IEEE-488.1 schickt die VISA-Schreibfunktion einen Befehl, der die eben gemessene Span nung anfordert. Er enthält den String 'FOGlSOTOROX', der mit Wagenrücklauf und Zeilen vorschub abzuschließen s i t. Der genannte String ist eine Verkettung folgender Einzelbefehle (Bedeutung im Handbuch 'Model 2000 Multimeter Quick Reference Guide' nachschlagen!): FO GI SO TO RO X
Filter ausgeschaltet, Lesen ohne Prefix, d.h. nur der Messwert selbst ohne Ergänzung wird ausgelesen, Interpolationszeit von 0,1 s, kontinuierliche Erfassung (Triggern), Messbereich wird automatisch ermittelt (gesamter Messbereich des Geräts) und veranlasst die Ausführung der vorstehenden Befehle,
Diese Befehle entsprechen einer älteren Notation, genannt 'Language 199', die manuell am 2000 Multimeter einzustellen ist. Das 2000 Multimeter versteht auch eine modernere Spra che, bekannt unter der Bezeichnung SCIP (Standard Commands for Programming Instru ments), die im Befehlsstring Doppelpunkte wie in der VISA-Ressourcen-Quelle verwendet. Von dieser Sprache wurde hier aber abgesehen, weil die ältere 230-Spannungsque1le nur die obige Schreibweise kennt. Die Benutzung zweier verschiedener Kommandosprachen würde I das Instrumenten arbeitet, nur unnötig komplizieren.
-......
'--
.... .1.
_
Bild 15.54 Frontpanel von VI$A-GPIB-$truktur.vi, Am Multimeter liegt gerade eine Spannung von 0,54431 1 Volt an
Bild 15.55 Diagramm zum VI in Bild 15.54
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
303
Nachdem die Struktur von VISA-Programmen für den GPIB-Bus bekannt ist, soll das fol gende Beispiel seinen Nutzen beJegen: Der Rechner hat nur eine Verbindung zum Bus (des halb die Bezeichnung GPIBO, anderenfalls gäbe es auch GPIB1 usw.), über die der Laptop Kommandos an die Spannungsquelle sendet und Daten vom Multimeter empfängt. Das folgende Programm 'GPIB-ZweiGeräteNacheinander.vi' zeigt die Erzeugung einer sinusför migen Spannung durch die Spannungsquelle Keithley 230, das Lesen dieser Spannung mit dem Multimeter 2000 und h i re Anzeige am PC in einem Signalverlaufsdiagramm (Chart). Frontpanel und Diagramm sind dargestellt n i Bild 15.56 und Bild 15.57.
..".
•
""' •. , ..
""..,,,..,,""
-
-,
-.- -, �" r.;irn
-.- ,
�
.. ..
r: .. " .' ..
Bild 15.56 Setzen einer Sinus-Spannung mit dem Keithley 230 und Lesen mit dem Multimeter 2000
Bild 15.57 Diagramm zum VI in Bild 15.56
IAufgabe 15.12
Modifizieren Sie das VI aus Bild 15.56 in der Weise, dass wahlweise auch eine Sägezahn und eine Rechteckspannung ausgegeben werden kann, wobei man zusätzlich noch die
Amplitude am PC einstellt.
IAufgabe 15.13
Wie Aufgabe 15.13, aber für drei Instrumente am GPIB-Bus: Zwei Spannungsgenerato ren Keithley 230 und ein Multimeter 2000. Es soll möglich sein, dass die beiden 230Geräte verschiedene Spannungsmuster ausgeben. Das Multimeter liest wechseJweise die eine oder die andere Spannung, die am PC in einem Diagramm verschiedenfarbig darzu stellen sind.
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'
16
Messdaten-Eingabe/-Ausgabe
Lernzl.1e I. Treibertypen und ihre Funktion in LabVIEW kennen.
2. Einige Funktionen des Measurement & Automation Explorers (MAX) kennen. 3. Nicht verfügbare pe-Karten (z.B. NIDAQ PCI-MIO-16E-4) simulieren können. 4. Messwerterfassung und Messwertausgabe des NI U58-6251 in LabVIEW programmieren können. 5. Bedeutung von TEDS kennen. 6. Nutzen von lVI-Treibern und die Funktion des Digitizers NI USB-5133 kennen.
16.1
Datenerfassungskarten
Wann benutzt man Oatenerfassungskarten7 i Kapitel 15 besprochenen Schnittstellen ist für die Die Obertragungsgeschwindigkeit der n Messdateneingabe und -ausgabe manchmal nicht ausreichend. Für solche Fälle bieten ver schiedene Firmen schon seit langem Datenerfassungskarten (Data Acquisition Boards) an, die n i einen pe eingebaut werden können. Auch die Firma National Instruments, bekannt geworden durch die Entwicklung von LabVIEW, gehört zu diesen Anbietern. Die Produktpalette umfasst derzeit m i Wesentlichen Karten der E-Serie (ab 1995, Treibersoftware NlDAQ), inzwischen häufig abgelöst durch die leistungsfähigere, aber trotzdem m i Vergleich zu früher preisgünstige M-Serie, zu der die neue Treibersoftware NIDAQmx gehört, ferner der R-Serie, die mit FPGA (Field Programmable Gate Array, siehe Kap. 22) arbeitet, und der S-Serie für besonders hohe Ansprüche, z.B. simultane Abtastung mehrerer Kanäle, hohe Abtastraten usw. Hinzu kamen n i jüngster Zeit USB-basierte Datenerfassungskarten, wie die NI USB-6251, die seit dem Sommer 2008 auch im LabVIEW-Labor der Hochschule Ravensburg Weingarten verwendet wird. Noch vor nicht allzu langer Zeit schien National Instruments an der USB-Technologie wenig n i teressiert zu sein, was uns dazu geführt hat, das Prinzip n i Kapitel 15.3 anhand der preiswerten VeUeman-Karte zu erklären. Der Nachteil der dort genutzten konventionellen USB-Technologie mit seiner geringen Abtastrate liegt auf der Hand. Inzwischen hat aber NI mit einer neu entwickelten und zum Patent angemeldeten 'Streaming-Technologie' diesen Engpass überwunden. Die NI USB-6251 gehört zur M-Serie und zeigt mit einer Rate von 1,25 Mbitls eine höhere Leistung als z.B. die an der Hochschule
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'
16.2 Allgemeines
305
Ravensburg-Weingarten früher eingesetzte NIDAQ PCI-MIO-16E-4, eine Datenerfassungs karte der E-Serie, PCI n i der SpezifIkation besagt, dass die Karte an den PCI-Bus des PCs anzuschließen ist, MIO ist die Abkürzung für Multiple Input Output, meint also eine Multi funktionskarte. Der Rest der Bezeichnung ist eine interne Produktnummer. Wir werden daher in diesem Kapitel besprechen: Allgemeines zur Messdatenein- und -ausgabe und die dafür benötigten Treiber: Physi kalische und virtuelle Kanäle, Tasks. Deren Konfiguration mit dem 'Measurement and Automation Explorer' (MAX), Simulation von Datenerfassungskarten, Datenein- und -ausgabe mit der USB-Karte NI USB-6251, die ältere Karte NI 6040 E (älterer Name PCI-MIO-16E-4, auch 'Legacy' genannt). Da man diese Karte nicht n i einen Laptop einbauen kann, kommt für uns die mit den neuen NI-DAQmx-Treibern mögliche Simulation zum Tragen. Bedeutung der intelligenten TEDS-Sensoren, IVI-Treiber am Beispiel des Digitizers NI USB-5133. Diese sind für bestimmte Klassen von Messgeräten, z.B. für Digitalmultimeter, Oszilloskope usw. verfügbar.
16.2
Allgemeines
Will man LabVIEW für die Messdatenverarbeitung nutzen, muss man zunächst folgende Fragen klären: Um weJche Daten handelt es sich? Will man Analogwerte erfassen oder Digitalwerte oder geht es um die Zählung von Ereignissen? Will man vielleicht umgekehrt Analog werte oder Digitalwerte erzeugen und zur Steuerung ausgeben? Hat man bereits Stand-Alone-Messgeräte, deren Daten an einen PC geJiefert und dort mit LabVIEW bearbeitet werden sollen oder möchte man das Messgerät als virtuelles Messgerät erst mit Hi l fe von LabVIEW auf dem PC entwickeln? Mit weJcher Geschwindigkeit sind die Daten zu erfassen oder auszugeben? Möchte man alle Daten oder einen Tei l davon im Hauptspeicher oder aufder Festplatte speichern? 16.2.1
Treiber, Measurement and Automation Explorer (MAX)
Von der Beantwortung dieser Fragen hängt es ab, weJche Auswahl man hat, ob man z.B. auf eine der n i Kapitel 15 besprochenen Methoden zurückgreifen kann oder ob man eine Datenerfassungskarte benötigt. Das bestimmt letztlich auch den erforderlichen Treiber. Die Finna National Instruments unterstützt drei Typen von Gerätetreibern: VISA-Treiber (z.B. für die serielle Schnittstelle aus Kapitel 15), NI-DAQmx-Treiber (weiterentwickeJt aus den früheren NI-DAQ-Treibern) und IVI- Treiber.
Ganz allgemein sind Treiber Programme, die einen Software-Befehl höherer Ebene wie z.B. 'Lies die auf Kanal 0 der Karte PCI-MIO-16E-4 als Analogwert anstehende Spannung mit einer Auflösung von 16 Bit' auf der Ebene des Maschinencodes ausführen und das Ergebnis unter einer bestimmten Adresse des Computerhauptspeichers ablegen können. Je nachdem, welche Hardware n i der Datenerfassungskarte realisiert ist, wird der Treiber von Karte zu Karte sehr verschieden sein. Der Anwender, der einen Lesebefehl in LabVIEW program-
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'
306
16
MesscL1ten-Eingabel-Ausgabe
miert, will sich darum nicht kümmern. Er erwartet in jedem Fall das gleiche Ergebnis. Da man Analogdaten mit unzähligen Datenerfassungskarten lesen kann, benötigt man auch sehr viele Treiber für die auf höherer Ebene identische Funktion, nämlich das Lesen eines Ana logwerts. Das erklärt die Größe z.8. des DAQmx-Treibers, der m i Grunde eine Treiber sammlung ist und in der Version NI-DAQmx 8.6.1 insgesamt etwa 810 Megabyte, also ein knappes Gigabyte Code umfasst. Die neueste Version von NI-DAQmx kann man über das Internet unter http://www.nj.com holen. Verwechseln Sie diese Treiber bitte nicht mit ·NI DAQmx Base! Das ist nur eine Untermenge von 'NI-DAQmx', allerdings mit dem Vorteil, dass sie schon früh auch für Betriebssysteme wie MAC OS X verfügbar war.
Wie findet nun das LabVIEW-System den richtigen Treiber? Dazu bedarf es vorbereitender Eingriffe des Anwenders, die in relativ einfacher Weise mit dem Measurement and Automa tion Explorer, kurz MAX, vorgenommen werden können. Man kann MAX aufrufen vom Desktop als Stand-AJone-Programm, vom
LabVIEW-Startfenster mit 'Werkzeuge' - 'Measurement & Automation Explorer...' oder von einem VI oder Projekt aus in gleicher Weise.
Damit erhält man ein Fenster nach Bild 16.1.
National Instruments Measurement & Automation Explorer
Über den "'''.. sur''...., nt 8t Automation [xplo...,r
()ef """'''''''-'', 3. AU'","'''''''' bpOo<er (1oIA)<) �,
Mögiche ArhciL�""hrine
'''' )(jJQ '' Geril teo. o>
. �"' ''''' ' M-'''''�I'U_'' .. 1 fl'4)()( '" Qa" ... cI r ...." .., "... " OOk oo . ...WD:HIa ' "' ''''� ' .l§ ' ll:
l!J u;,,� E..II" 1:.>'''l100<0 _ l/
....
--.J ullfe. Fur
w'd.... II>rom..tion<>n 0fNI'"" ""' "' cl"" ...10"""-> """ w.x ... p<� ....t. ..�tiltrung odoer ""'.- lnlOOMoo...... zu 11>-.. t
Bild 16,1 Startfenster des MAX unmittelbar nach dem Aufruf
Achtung: Der PC muss in der Systemsteuerung bei den Ländereinstellungen auf Deutsch als Standard eingestellt sein. Anderenfalls spricht MAX mit Ihnen Englisch oder auch Franzö sisch oder Japanisch! Sehr wichtig m i MAX sind die links in Bild 16.1 angezeigten Themen Datenumgebung sowie Geräte und Schnittstellen. Hat man auf dem PC bisher noch keine Messdaten eingelesen oder ausgegeben, zeigt der MAX nach tei l weiser Expansion z.B. eine Ansicht nach Bild 16.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'
307
16.2 Allgemeines
PXI "Xl "'_1'-"'''''' ' '''1 ",·9 """�·P"""
!I ce..,
Datenumgebung
fj""r
"'" o..'en.� btio. _ \I��
...._ ;" Ihr"", SY"tom too"*,",,,""" l>hY_cf>on "',",,"n. !>iI>
,..... "'*"""" "'-61 ""'-"'" . . ''' ''''"''
IbO�''''''
","""",
V"'l:roO!>funQoor> ........ �.."". f
"..tUeIe ()AQ.K.ln.>Io. OAQ·Ta*" ode< ri
.-
Bild 1 6,2 'Datenumgebung ist leer. Mit 'Neu . . •' wird das geändert
Will man nun Messdaten einlesen, z.8. von der Datenerfassungskarte 'NI US8-6251', ist nach der Installation von LabVIEW zunäc.hst 1. die Treibersoftware 'NI-DAQmx' zu n i stallieren. Man kann danach m i MAX durch Auf klappen der Zeile 'Software' links kontrollieren, ob diese Installation erfolgreich war. 2. Anschließend ist der pe mit dem USB-Anschluss von 'NI US8-6251' zu verbinden und dieses Gerät einzuschalten. Dann erscheint folgendes Fenster: •
wm:...s 'im �_ '*"'01 ;Me,,,", ,,,,I",,,.,," \MJIl5ie ""-" ... ..., "'""-H.._._...�
")1 U"�""
IE'N[(
We wlWro:-.; jch ,,�....,? �... �""'" ... die,.., uM ruchl.hen " L.,,vEW S;y..E" "" "",,uyoo E...-.....", "'" ol6,� ",,'" ",.,." �I lobvrw"",,,
Bild 16.3 Beginn der Konfiguration der U$B-Karte
'NI U$B-6251
,
3. Auswählen 'Dieses Gerät konfigurieren und testen . . . ' und 'OK', 4. Danach ändert der MAX sein Aussehen entsprechend Bi l d 16.4.
"'"""", - G,,,",
� Viii-illMtMN
"" 'XI ', '''·'llholo''''., )
�_..!f ""��,.."d
,..... 0l.0I.,''"'''" Ihöl """-,,,.
"' . "''''''''
..-.0 ""',","'-n"t...o,
Bild 16.4 Anzeige der
Datenerfassungskarte NI U$B-6251 im MAX nach der Konfiguration mit einem grünen Fähnchen. Bezeichnung als "Dev"
5. 'Se1bsttest' anklicken. Es sollte die Meldung 'Das Gerät hat den Selbsttest bestanden' er scheinen.
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
308
MesscL1ten-Eingabel-Ausgabe
6. Klick auf'Testpanels. . . ' zeigt ein Fenster wie Bild 16.5: Bevor man eine Spannung an den
i Felde 'ANALOG INPUT' angelegt hat, zeigt dieser nach Start und Eingangskanal AIO m Stopp den links dargestellten Spannungsverlauf (ungefahr 0 Volt). Führt man ihm über ein BNC-Kabel eine 2 Hz-Sinusspannung zu, sieht man nach dem Start das rechte Bild. Weitere Detai l s zur USB-Karte sind in Abschnitt 16.3 zu finden.
...... ....oIiQn .""
)'i'",ct"
.�
l!l
-
Bild 16.5 Anzeige. ohne Spannung
Anzeige mit 2 Hz-$inusspannung
Erstellen eines Tasks Damit ist klar, dass die Datenerfassung prinzipiell funktioniert. Die Frage ist nun, wie man diese Daten in einem VI verarbeiten kann. Dazu muss man einen Task erstellen, was n i die sem Zusammenhang bedeutet: eine Messdatenerfassungsaufgabe definieren. Wir gehen folgendermaßen vor, indem wir jetzt im MAX die Zeile 'Datenumgebung' wählen und rechts oben auf'Neu. . . ' klicken. Im Fenster nach Bi l d 16.6 wählen wir 'NCDAQmx Task' ('Globa ler virtueller NI-DAQmx-Kanal' würde nur einen Kanal konfigurieren) und dann 'Weiter >'. Honzufugen
Measurement & Automation Explorer
l� �
Bild 16.6 Gestaltung der Datenumgebung im MAX
Das System bietet nun eine Wahl gemäß Bild 16.7 an und außerdem auf der linken Seite eine kurze Erklärung. Wenn wir Daten lesen wollen, klicken wir rechts auf 'Signale erfassen'.
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'
309
16.2 Allgemeines lin,ufuoc. '" DAQm" l�sk _
Measurement & Y Automation Explorer l ",..
..., w_.. _ _ _ I{<>-<>__' ....., _ , __. _....n ... _�T.'"" .
.
Ein L �k ist ';n ...."' .. _Iot. f... . .. bo-mmmt.. _"""n' '' '''''' 1....... T""...· ,n; .O>d_ Ein,'�" f..,o.....· _··
0."", '""' "'� T••k ",.".",." o'
Bild 16,7 Wahl von Lesen (Signale erfassen) oder Schreiben (Signale erzeugen)
Aufklappen von 'Signale erfassen' führt zu einer Auswahl nach Bi l d 16.8. ��eof.......
Ii
Ii
Anob;Jofrf.......-.;J
Ii
�wteErf�
Ii
D;QItoleErf=u'"IQ
.
�
� .._
Bild 16-8 Wahlmöglichkeiten beim Unterpunkt 'Signale
erfassen'
Wir wählen 'Analoge Erfassung' und dort 'Spannung', was letztlich zum Angebot aller physi kalisch verfügbaren Kanäle der Datenerfassungskarte 'NI USB-62S1' führt, siehe Bild 16.9. . ..........,.
�lt
08';1 (USB·6ZS1 (BNC»
-
� Hlbn SIe ..... \IIorheron ........ .. K..aIe <5tfg> oder
<Shft>QDOdt. ( ZtJIiri.
Vi.... )
0 �
1
I,
IiIJ
AbbM<:hon
Bild 16_9 Wahl eines oder mehrerer physikalischer
Kanäle derjeweiligen Datenerfassungskarte
Wir wählen 'aiO' und 'Weiter >', dann geben wir noch einen beliebigen Namen ein, etwa 'AnalogEingabe', siehe Bild 16.10. Zuletzt drücken wir 'Beenden' und erhalten nach einigen Sekunden eine Anzeige entsprechend Bild 16.11.
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'
310
16
Hlnzuf"gefl M DAQm>< J ask _
Measurement & Automation Explorer
MesscL1ten-Eingabel-Ausgabe
(W' �
Bild 16.10 Wahl eines Namens fürden Task
Im mittleren und rechten Tei l des MAX-Fensters zeigt sich dabei der DAQ-Assistent, den man auch unabhängig vom MAX als Funktion in einem LabVIEW-VI nutzen kann. Dazu später mehr. Er ermöglicht weitere Einstellungen, welche die Sdlaltungsart, den Erfassungs modus, die Zahl der einzulesenden Analogwerte (zu lesende Sampies) und die Abtast frequenz (Rate in Hz) betreffen. Wir haben hier von 'N Sampies' auf 'I Sampie' umgestellt, sonst aber die voreingestellten Werte übernommen. Ferner haben wir von außen mit einem Funktionsgenerator eine Dreiecksspannung auf Kanal AI 0 der USB-Karte gegeben und diese Spannung mit 'Ausführen' zur Anzeige ge bracht. Man muss dazu m i oberen Fenster 'DarsteUungsart' auf 'Diagramm' steUen. Ist man mit dem Ergebnis der Einstellungen zufrieden, klickt man 'Speichern' und hat damit eine der möglichen Voraussetzungen zur Analog-Datenerfassung mit LabVIEW geschaffen.
--
E>o"
I ..,"...."" I
. -----
,--- _ ....,.. "'" -
----
...... .,
"
..._ - -_ ........ - _ ... _ -
,,_
" "' �
Bild 16.11 Zum Abschluss ruft MAX den DAQ-Assistenten zu weiteren Einstellungen auf
In der Rubrik 'Datenumgebung' des MAX wird jetzt unter der Zeile 'NI-DAQmx - Tasks' ein Task mit dem Namen 'AnalogEingabe' angezeigt. Ein einfaches VI, das diese Einstellungen nutzt, ist in Bild 16.12 und n i Bild 16.13 zu sehen.
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'
311
16.2 Allgemeines
VI zum Lesen einzelner Analogwerte auf einem Kanal
[TI
I§
iIl
Bild 16.12 Lesen einzelner Analogwerte in einem VI. Die DAQ-Funktionen findet man unter 'Funktionen' - 'Mess-VO' - 'DAQmx Datenerfassung'. Die hier verwendete Funktion 'DAQmx-Lesen' ist polymorph und muss dem jeweiligen Task angepasst werden
�"" " ���::::::::::l" � . -�
.
Bild 16.13 Frontpanel zu Bild 16.12. Man muss hier als Task-Namen einen der im MAX unter Datenumgebung festgelegten Namen eintragen. Im Augenblick gibt es nur einen verfügbaren Task-Namen. nämlich 'AnalogEingabe'. Die Dreicksfunktion hat eine Frequenz von ca. 1 Hz. Das Signalverlaufsdiagramm ist auf eine Historienlänge von 256 und auf automatische Skalierung der x-Achse eingestellt
�,
} ,,
Die Programmiermethoden werden n i Abschnitt 16.2.3 ausführlich besprochen. Weitere BeispieJe folgen in den Abschnitten 16.2.3 und 16.3. 16.2.2
Physikalische und virtuelle Kanäle, Task
Die oben beschriebene Verbindung des 'NI USB-6251' mit dem PC hat uns mit den Begriffen 'Physikaischer l Kanal', 'Virtueller Kanal' und 'Task' in Berührung gebracht. Darunter ist zu verstehen:
Physikalischer Kanal Real existierende Leitung (Pin), auf der man Analog- oder Digitalwerte ein- oder ausgibt. Gewöhnlich sind das Spannungen, die von außen angelegt und in einem Analog-Digital Konverter (ADC) in Bits und Bytes umgewandelt werden, die der pe speichert. Umgekehrt werden bei der Ausgabe im Computer gespeicherte Zahlen mit einem Digital-Analog Konverter (DAC) in eine Spannung umgewandelt, die man außen abgreifen kann. Alternativ zu Spannungen sind auch üblich: Ströme, Frequenzen, d.h. Re<:hteckspannungen, die mit einer bestimmten Frequenz an einer Eingangsleitung angreifen, bzw. die erzeugt und auf einer Ausgangsleitung verfügbar gemacht werden.
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'
312
16
MesscL1ten-Eingabel-Ausgabe
Virtueller Kanal Jedem physikalischen Kanal im obigen Sinn ist mindestens ein virtueller Kanal zuzuordnen. Das ist eine Stück Software, welche zur Sammlung der Vorgaben dient, die dem Computer sagen, was er mit der Spannung (oder dem Strom oder der Frequenz) an einem bestimmten Piß zu tun hat und wie er das Ergebnis interpretieren soll. Geht es im einfachsten Fall um die Messung der Spannung und nicht um ihre Interpretation als Temperatur oder irgendeine andere physikalische Größe, ist im Wesentlichen nur die Scan-Frequenz festzulegen, d.h. die Häufigkeit, mit wekher der Computer die anliegende Spannung pro Sekunde zu messen hat (Abtast- oder Scanfrequenz). Man unterscheidet: Einfachmessung ('1 Sampie' im DAQ-Assistent; die Scan-Frequenz ist nicht verlangt), Mehrfachmessung ('N Sampies' im DAQ-Assistent) mit gegebener Scan-Frequenz und kontinuierliche Messung, d.h. die mit der vorgeschriebenen Scan-Frequenz getätigten Messungen werden erst nach einem Stopp-Kommando beendet. Einem physikalischen Kanal können auch mehrere virtuelle Kanäle zugeordnet werden, die dann durch ihre Namen zu unterscheiden sind. Zum Beispiel könnte man virtuellen Kanälen die Namen 'AnalogLesen_Einmal' und 'AnalogLesen_Kontinuierlich' geben und beide demselben physikalischen Kanal Pin aiO des NI USB-625 I zuordnen.
Task Ein Task bedeutet n i diesem Zusammenhang eine Messdatenerfassungsaufgabe bzw. eine Aufgabe zur computergesteuerten Ausgabe von Spannungen, Strömen usw. Zu einem Task
gehört mindestens ein virtueller Kanal (zusanunen mit dem physikalischer Kanal, der ihm zu Grunde liegt). Ein Task kann aber auch mehrere virtuelle Kanäle enthalten. Allerdings darf ein Task nicht gleichzeitig Eingabe- und Ausgabekanäle umfassen. Er ist also entweder für die Dateneingabe zuständig oder für die Datenausgabe.
Merke: Zum Einlesen oder Ausgeben von Spannungen ist ein Task zu defmieren.
Merke: Zu jedem Task gehört (mindestens) ein virtueller Kanal zur Beschreibung des Lese- oder Schreibmodus.
Merke: Ein Task dient entweder zur Dateneingabe oder zu Datenausgabe, aber nie mals für beide Operationen gleichzeitig.
16.2.3
Programmierung von Datenerfassungs-Vls, simulierte Geräte
Der Einfachheit halber besprechen wir hier zunächst die Erfassung von Spannungen in Form von Analogwerten auf einem oder mehreren Kanälen. Ein VI, das diesen Zweck erfüllt, ent hält im allgemeinen Fall diese fünfFunktionen: Erzeugen eines Tasks oder Bezugnahme auf einen zuvor im MAX defmierten Task, Starten des Tasks, Lesen des Analogwerts bzw. der Analogwerte, Stoppen des Tasks und Zurücksetzen des Tasks (Löschen aus dem Arbeitsspeicher). Ein zuvor mit dem MAX defmierter Task bleibt aber auf der Festplatte erhalten.
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'
313
16.2 Allgemeines
Dazu gibt es fünf Funktionen, die bei 'Funktionen' - 'Mess-I/O' - 'DAQmx-Datenerfassung' zu finden sind. Siehe Bi l d 16.14, in dem die Angaben der Kontext-Hilfe dargestellt sind. Nicht immer benötigt man alle fünf Funktionen. Z.B. kann man auf die erste verzichten, wenn der Task und damit mindestens ein Kanal bereits im MAX definiert wurden. Auch für den Start des Tasks braucht man nicht notwendig eine Funktion im Diagramm des VI. Nor malerweise startet die Lesefunktion automatisch den Task, falls er noch nicht läuft. Ebenso kann man auf die Stopp-Funktion verzichten, wei l derTask gestoppt wird, sobald das VI mit der zugehörigen Lesefunktion beendet wird. Schießlich l kann man auch auf das Zurückset zen verzichten. Ein Primitivprogramm könnte also wie das in Bild 16.12 aussehen. Ein Frontpanel dazu ist n i Bild 16.13 dargestellt. Mit einem anderen Task wird es in Bi l d 16.15 gezeigt. Dieses VI ist also trotz seiner Einfachheit flexibel. Es kann eine einzelne Analog spannung oder auch mehrere darstellen je nach dem Task, der auf dem Frontpanel ausge wählt wird. Diese Tasks sind zuvor m i MAX zu definieren. Im Beispiel haben wir Ihnen fol gende Namen gegeben: Simuliert_SpannungTask_lSample, Simuliert_NSpannungenTask_NSamples, Simuliert_NSpannungenTask_Kontinuierlich. DAQmH - Yirt""lI�n Kanal �rz�u!l"n [DAQmH [,�at� Yi,tual [han""l.vi]
DAQnuc -fasle _,t""
(DAQmH start 'alk.vI]
....ed»eI;i"ldon�.-.;jde,f . ...... ......, �n>I;der
Meu..n!l odor sqWor'o.qsIg. Die � ","-VI.1It h:w einiIIo � �
,
2 DAQm><-L� (DAQmH RHd.vl]
faokfJ::8na,, (E�)
�fm!« Au
_ .. F....... (�) _
-
F....... (""-"")
lieot s.mpIos "'" ....... '"yoyebeo. , Tm!<""'"' .yo>Jebd., wtuoIen K"". Die Inst......., cIMe< � VI.
DAQmH - Ta.k .topP"n [DAQmH stop Ta.k.vi]
Ta.k!Kanlil� (EinQall\l)
� as!« �) .�
T
das hoO:, ob ru ein ......... SarrPo ""'"' "' . ' ....re s.mpIos � � ""'"' ein ""'"' metre.. K .... obQeftogt werden
FeIlIor(�) stoppt don Tas!< lXld _r.set i"l don Zustand. i"l dem >ich 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<1. i"l_For_��_dMsoIe<1.
_.
OAQmH - 'Hk zwOcksetzen
FeIlIor(E....)..
""
VC>:
-.n
(DAQmM Oe. ,..k.vI]
Ta.k (�)
FÄf �)
�
� f"""' (AusQr>Q)
löscht ... � zu ....... TM!:.. Vor dem Lösd>on
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 '�O
�I
�
." �, �
� �
Bild 16.18 Verbessertes Analogwert
I
�
Erfassungs-VI mit einstellbarer Warte zeit
--
Bild 16.19 Hier ist unter sonst gleichen Voraussetzungen wie in Bild 16.15 eine glatte Kurve zu sehen, weil infolge der Wartezeit von 1 ms derselbe Messwert jetzt nicht mehr fach erfasst wird
Simulierte Geräte Warum haben alle Tasks in den obigen Beispielen Namen erhalten, die mit 'Simuliert_...: beginnen? m"'fugo" ,_ _
_ _ _ _ _ _ _ _ _ _
Measurement &
Y Automation Explorer l �
Q
Q f'XI·10521=1 Q 5GHCOJ Q 5D-l·IO:WC Q IN.IOlI
e. NI·ll"'Il", · SU·l<nscrusbbck • 5C·I345 . ,C·l:15O . S[;(·ES
!!I.� NI-ll"'Il", - TED5-5d-riO,,=lo � 8fK_� ... NI-ll"'Il",-5mOeo:e:5,,"
..., GPlB-\Gllrt�loco P"" IS.;�"'P"�I
�
A VISA TCP�PR,soorce 1i:i 6P1HNETI100
@_III ""... 1",,0<. �I-=
111 RDA-/Etre.'J
Bild 16.20 Ein simuliertes Gerät im MAX erstellen. Beginn dieser Operation
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'
316
16
MesscL1ten-Eingabel-Ausgabe
Der Grund ist, dass VIs, die sich auf diese Tasks beziehen, auf jedem pe laufen, auch wenn keine Datenerfassungs-Hardware angeschlossen ist. Man bildet solche Tasks im MAX, in dem man unter 'Geräte und Schnittstellen' ein Gerät (Device) auswählt, das simuliert wer den kann. Dazu gehört z.B. die Karte 'NI PCI-MIO-16E-4'. Man erstellt ein simuliertes Ge rät, indem man im MAX unter 'Geräte und Schnittstellen' auf 'Neu. . . ' klickt. Dann erscheint ein Fenster gemäß Bild 16.20. Hier wählt maß 'NI-DAQmx - Simuiertes l Gerät' aus und druckt 'Beenden'. Im nächsten Fenster nach Bi l d 16.21 wählen wir beispielsweise die 'DAQ (E-Serie)' aus und dort die Karte 'NI PCI-MIO-16E-4'. NI-DAQmx - _te Gof""e I!l I!l I!l I!l I!l I!l I!l I!l I!l I!l I!l
DAQ (M-5efie) DAQ (E-5efie) DAQ (5-5«ie) DAQ(SC-5efie) US8-DAQ AO-5efie DiQltol-liO TIO-5efie (Z_iTJrief) Erfos",-,"", dyn.yrischef 5ioT'* 5ch.ol� Hochge>c�'-A/D-Wondler
Konfiguration
e-� Me" System IE-. D�� e-. Gerate uroj 5ctNttsteien ,
;
_
I!l I!l I!l I!l
C�tDAQ-Chossis seXI-Chossis sec-AnschUssblock TEDS-AnschUs, RTSH�
Bild 16.21 Zweiter Schritt bei der Erstellung eines simulierten Ge räts. Auswahl eines Kartentyps
,
� liiI NI-oAQ'n,, - Gerate
� NI USB-6ZS1 (BNC): "De� I"
tII'I NI PCI-MIO-16E-4: "Devt'
� PXl PXI System (�ied) � � 5er�&PoY.I
� q Sl<.Wrmoen �-61 SoI'twoYe �-. 11/1 Dri'.'ers I!J-� Netzwer�
Bild 16.22 Dritter Schritt bei der Erstellung eines simulierten Geräts. Auswahl der speziellen Karte NI PCl-Mlo-16E-4. Simu lierte Geräte sind im MAX durch ein gelbes Fähnchen ge kennzeichnet, echte und an den PC angeschlossene Geräte durch ein grünes (siehe auch Bild 16.4). Ist das Gerät gerade nicht angeschlossen oder spannungslos, wechselt die Farbe des Fähnchens auf weiß, und ein kleines rotes Kreuz weist darauf hin, dass "Dev1" im Augenblick nicht verfügbar ist
Die Konfiguration im MAX hat, wenn das USB-Gerät nicht angeschlossen ist, das Aussehen von Bild 16.22. Die Tasks werden bei simulierten Geräten genauso erstellt wie bei echten Geräten.
Bemerkungen I. Beim Einlesen von simulierten Geräten erzeugt die LabVIEW-Umgebung ausschließlich Sinuskurven als Eingangsdatenstrom. 2. Nach dem Austesten des dafür entwickelten VIs kann man leicht auf ein echtes Daten erfassungsgerät umstellen. Man hat nur einen neuen Task zu definieren, der auf dieses Gerät Bezug nimmt. Dann wird das gleiche VI die Kurven anzeigen, die das Gerät real erfasst, z.B. Rechteck- oder Sägezahnkurven, die man über einen Funktionsgenerator einspeist.
IAufgabe 16.1
Erstellen Sie im MAX die Tasks 'Simuliert_SpannungTask_lSample', 'Simu liert_NSpannungenTask_NSamples' und 'Simuliert_NSpannungTask_Kontinuierlich' mit den zugehörigen virtuellen Kanälen zum oben beschriebenen Datenerfassungs-VI. überzeugen Sie sich, dass Sie die gleichen Ergebnisse erhalten.
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'
317
16.2 Allgemeines
IAufgabe 16.2 Erstellen Sie einen weiteren Task 'SimulierCZweiSpannungenTask'. Stellen Sie dabei für die Kanäle ein 'I Sampie', Signaleingangsbereich auf +-7 Volt für den ersten Kanal und +-5 Volt für den zweiten. Ferner Schaltungsart auf 'Differentiell'. Damit sollte das VI 'AnalogEinfachundBessecLesenMehrfach.vi' nachstehende Anzeige produzieren: � [!o_m � 00ffi il'� �" 1'10' 1=.000 Em � " �
.. �
11
__'_T...
�--
,
" ---; --';;;"c;;! "
L �."i.."" 0>." """
16.2.4
,.
Programmierung von Vis zur Analogausgabe
Die Programmierung der Analogausgabe verläuft sinngemäß wie die Eingabe. Zunächst ist ein Task zu erstellen. Man erzeugt ihn mit dem MAX nach dem Rezept von Abschnitt 16.2.1, nur dass man bei der Wahlmöglichkeit von Bi l d 16.7 'Signal erzeugen' anklickt und später 'Analoge Ausgabe'. Der Rest verläuft sinngemäß. Für das folgende Beispiel '1623-AnalogAusgabeAllgemeinecSchreibenMehrfach.vi' wurde wie schon zuvor die Simulation gewählt und die drei Tasks 'AnalogAusgabeSimulierCSpannungTask_lSample', 'AnalogAusgabeSimulierCNSpannungen_NSamples' und 'AnalogAusgabeSimulierCNSpannungen_Kontinuierlich' definiert. Bild 16.23 zeigt inks l das Diagramm und rechts das Frontpanel des VIs.
-- , . -
Bild 16.23
Diagramm und Frontpanel eines VI, das eine oder mehrere Spannungen analog ausgibt
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'
318
16
MesscL1ten-Eingabel-Ausgabe
IAufgabe 16.3 Für den Task 'AnalogAusgabeSimulierCNSpannungen_NSamples' zeigt das VI n i Bild 16.23 einen Fehler an. Analysieren Sie, warum und korrigieren Sie das VI, so dass es für alle oben genannten drei Tasks korrekt arbeitet. 16.2.5
Programmierung von Vis zum Digltal-1/0
Einfache VIs zum simulierten Digital-1/0 lassen sich ebenso leicht wie in Abschnitt 16.2.3 und 16.2.4 programmieren. Bild 16.24 zeigt ein Beispiel zur Digitaleingabe, die im Falle der Simulation regelmäßig zwischen 0 und I hin und her schaltet. Dazu muss das VI zur Analog eingabe nur leicht verändert sowie ein neuer Task definiert werden. Weitere Einzelheiten zur digitalen Ein-/Ausgabe finden sich in Abschnitt 16.3. ,
�__..u •
. �
-...... :""1"1
...__ . , ,
I:
. I. I . I . I. I 1 . 1 1 1
,
, , �
•
Bild 16.24 Programm 1624-DigitaIEinfach_lesenMehrfach.vi zur Digitaleingabe aufeiner Leitung
IAufgabe 16.4
Definieren Sie einen Task so, dass das VI n i Bild 16.24 die rechts gezeigte Ausgabe liefert. Anleitung: Die Historienlänge in der Anzeige wurde von 1024 auf20 verkürzt. 16.2.6
Programmierung mit Hilfe des DAQ�Asslstenten
Tasks müssen nicht unbedingt über den MAX erstellt werden: Eine andere Methode (wenn auch mit eingeschränkten Möglichkeiten) bietet die Funktion 'DAQ-Assistent', die unter 'Mess-I/O' - 'DAQmx-Datenerfassung' zu finden ist. Damit können wir beispieJsweise das Programm 'EinfachsCLesenMehrfach.vi' für den Fall einer Funktion in folgender Weise nachbilden: In leerem VI Whileschleife erzeugen und dort die Funktion 'DAQ-Assistent platzieren, siehe Bi l d 16.25 inks. l In diesem Moment öffnet sich ein Auswahlfenster wie in Bild 16.7, wo wir die gleiche Prozedur durchlaufen wie schon dort beim expliziten Aufruf des MAX Wir schließen die Konfiguration mit 'OK' ab und erhalten dann einen automatisch geänderten DAQ-Assistenten gemäß Bild 16.25 rechts, an den wir bereits manuell einen grafischen Aus gang angeschlossen haben. .
Dieses VI arbeitet wie das Programm n i Bi l d 16.19 und ist schneller zu erstellen, Dafür hat es aber den Nachteil der geringeren Flexibilität: Es zeigt nur eine Kurve und kann nicht vom Frontpanel aus auf einen anderen Task umgestellt werden. Siehe dazu Bild 16.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'
319
16.2 Allgemeines
,.
[j]
[j]
Bild 16,25 Erstellung eines VI zur Datenerfassung mit dem DAQ-Assistenten
Bild 16_26 Ähnliche Anzeige wie in Bild 16.19 bei dem mit dem DAQ-Assistenten erzeugten VI
Man kann auch erkunden, was sich hinter dem DAQ-Symbol rechts in Bild 16.25 verbirgt. Dazu in dessen Kontextmenü 'NI-DAQmx-Code erzeugen' anklicken und einige Sekunden warten. Das LabVIEW-System zeigt dann ein verändertes Diagramm gemäß Bild 16.27.
Bild 16,27 Automatisch aus Bild 16.25 (rechts) entstehendes VI, sobald man im Kontextmenü 'NI DAQmx-Code erzeugen' anklickt
rn
Man hat dort nur noch manuell den Signalverlaufsgraph zu löschen und die Linienführung zu ordnen, dann gelangt man zu einem Diagramm nach Bi l d 16.28.
[j]
111
Bild 16.28 Wie Bild 16.27 nach einigen kleineren
manuellen Eingriffen
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'
320
16
MesscL1ten-Eingabel-Ausgabe
Dieses VI ist voll funktionsfähig und erzeugt auf dem Frontpanel im Modus 'Wiederholt ausführen' dieselbe Anzeige wie das Programm 'AnalogEinfachMitAssistent' in Bild 16.26, siehe auch Bild 16.29.
Bild 16.29 Frontpanel zu Bild 16.28
Das so entstandene VI nutzt das SubVI 'DAQmx-Config-Vorlage.vi', das in seiner abgewan delten Fonn zusammen mit dem aufrufenden VI n i einem Verzeichnis gespeichert werden muss, z.B. unter dem Namen DAQmx-l.vi. Erst dann nämlich lässt sich auch das Daten erfassungs-Programm 'AnalogEinfachMitAssistentDetai l s.vi' aufFestplatte speichern. 16.2.7
Programmatische Task·Erstellung
Ein dritte Möglichkeit zur Erstellung von Datenerfassungsprogrammen besteht schließich l darin, die Funktionen das MAX bzw. des DAQ-Assistenten an spezielle Funktionen inner halb des VIs zu übertragen, mit anderen Worten, Task- und KanaleinsteUungen program matisch durchzuführen. Auch hierzu ein Beispiel: Wesentlich sind dabei die Funktionen 'DAQmx-Virtuellen Kanal erzeugen' und 'DAQmx-Timing', siehe Bild 16.30.
_._,�
Bild 16.30 Diagramm für programmatische Festlegung derTask-Eigenschaften "".
,:;:;;;;;;r
ISTOPP!
.-
�. ,
-
n_ ;,ß_ "'""
.
� tI�
--[';lI
-� " "
,
-
j"
1 ,.: ,
.
•
"
•
-
� '"
-/.�
"
_.
,'"
-
.--
J
,
A
Bild 16.31 Einfaches Einlesen simulierter Analogwerte, Frontpanel zu Bild 16.30
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'
16.3 USB-Gerat NI USB-6251
321
Das Ergebnis ähne1t wieder dem von Bi l d 16.26, siehe Bild 16.31. Nachteil der programmatischen Taskerstellung: Das Programm wird etwas komplizierter. Vorteil: Die Parameter sind auf dem Frontpane1 einzusehen und können auch dort verän dert werden.
1 6.3
USB-Gerät NI USB-62S1
Bild 16,32 Datenerfassungskarte bzw. -gerät NI U$B-6251 mit BNC-Kabel am Analog Input-Kanal AIO zum Einlesen von Analogwerten und einem zweiten Kabel am Analog-Qutput-Kanal AOO (verdeckt)
Dieses Gerät muss nicht in den PC eingebaut werden. Es ist mit ihm über ein USB-Kabel verbunden, wie Bild 16.32 zeigt. Im folgenden Abschnitt setzen wir voraus, dass uns das Gerät NI USB-625 I zur Verfügung steht. Es hat 8 Digital- und Timer-Ein-/Ausgänge mit der Bezeichnung 'PFIO/PF 1.0', 'PFI I/PF 1,1 ' . . . , ferner 8 Analogeingänge AIO bis AI7, zwei Ana logausgänge AO 0 und AO I sowie den Analogtrigger APFI. Die Analog-Digital-Konverter Auflösung (ADC-Auflösung) beträgt 16 bit. Jeder Analogeingang dieses Geräts kann mit einem kleinen Schalter aufFS (Floating Source) oder aufGS (Ground Ref. Source) eingestellt werden. Die Bedeutung der beiden Möglichkeiten ergibt sich aus den Begriffen NRSE, RSE und differentiell, die n i Bild 16.33 dargestellt sind. 16.3.1
Begriffe 'differentiell', 'RSE' und 'NRSE'
Bi l d 16.33 zeigt das Prinzip vereinfacht am Beispiel von KanalO+ und KanaIO-. Real sind immer mehrere Kanäle vorhanden, die je nach Wahl über einen Multiplexer an Stelle von KanalO geschaltet werden, also z.B. Kanall + und Kanall-, Kanal2+ und Kanal2- usw. Man benötigt also zur Messung einer Spannung V zwei Eingangsleitungen. Beim NRSE Verfahren werden die negativen Eingänge aller Kanäle durch die einzige Leitung AISENSE ersetzt, was Hardware spart, dem differentiellen Verfahren aber noch nahe kommt. Beim RSE-Verfahren wird dafür einfach das Bezugspotential des Instrumentenverstärkers genutzt.
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'
322
16
MesscL1ten-Eingabel-Ausgabe
Die genauesten Messungen, weil am ehesten ungestört, erhält man mit der differentiellen Methode, doch halbiert man dann normalerweise die für Messungen verfügbaren Kanäle: Statt z.B. acht Analogspannungen nach dem RSE-Verfahren kann man nur noch vier Span nungen nach dem Differenzverfahren aufnehmen. Das Gerät NI U58-6251 bi l det hier eine Ausnahme, weil man jeden der acht Analogeingänge AIO bis AI7 individuell auf PS (Floating Source) oder auf GS (Ground Ref. Source) stellen kann. Das erstere entspricht dem Differenzverfahren, das zweite dem RSE-Verfahren. Die Schaltungsart kann man bei der Definition eines Tasks im MAX treffen. Die Faustregel heißt: differentielle Schaltung wählen (oder RSE), wenn die zu messende Spannung von einer nicht geerdeten Spannungsque1le wie einer Batterie stammt, differentielle Schaltung (oder NRSE) wählen, wenn die Spannungsquelle geerdet ist. In diesem Fall ist RSE unbedingt zu vermeiden, wei l sonst Erdschleifen entstehen, die als Resonanzkreis wirken und damit einen 'Brumm' erzeugen oder - im schlimmsten Fall das Gerät beschädigen können.
�
[ns'""",'m· ," v....1irI<e<
K'''l0 '
KanalO -
-
K,,,IO .
u A1GND
A1GND �� 1'o!...,iaJ
--::B5{, � �� 1'o!...,iaJ
RSE-Messung (rcfcrenccd, singlc-cndcd, d.h. Masse-bezogen)
Differentielle Messung
K,""IO ' AISENSE
=:B5lr L�Ii:�r �.� 1'o!."".1
NRSE-Mcssung (non-rcfcrcnccd, single-ended, d.h. Kanalx- wird fLif alle Kanäle durch AISENSE ersetzt)
Bild 16_33 Prinzipschaltungen differentiell, R$E und NRSE. Hier auf Kanal 0 bezogen
Hinter dem Begriff 'Instrumentenverstärker' können sich verschiedene Schaltungen verber gen, deren Details dem Datenblatt des Erfassungsgeräts zu entnehmen sind. Bild 16.34 zeigt eine einfache Ausführung eines Differenzverstärkers.
"
Masse
Bild 16_34 Prinzipschaltung eines Differenzverstärkers, der als Instrumentenverstärker verwendet werden könnte
Je nachdem, ob die zu erfassende Spannung mit Masse verbunden ist (was häufig zutrifft, wenn sie von einem Funktionsgenerator kommt) oder ob sie massefrei ist (z.B. im Falle einer
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.3 USB-Gerljt NI USB-6251
323
Batteriespannung), sind also die in Bild 16.35 gezeigten Schaltungen geeignet, sofern man nicht aufdie differentielle Messung zurückgreifen kann oder will.
l�
Kanal
ICfI
AIGND
Masse I
Masse 2
RSE-Messung
Kanal
+
AISENSE Masse 2 - AIGND
Masse I
NRSE-Messung
Bild 16.35 RSE-Schaltung bei nicht geerdeter Differenz-Spannung, NRSE bei geerdeter Spannung
16.3.2
Zwei Analogwerte mit der NI USB�6S21 1esen
Wir können dazu von 'AnalogEinfachundBesser_LesenMehrfach.vi' in Bild 16.18 ausgehen, zu dem wir einen neuen Task definieren: 'ZweiSpannungenTask' nach Bild 16.36.
t
D , " "" , ___ «
•
.",..
,
hl
"
Bild 16.36 Definition eines Task für
NI USB-6521
Bei entsprechender Beaufschlagung von Kanal 0 und Kanal 1 durch die Spannungen zweier Funktionsgeneratoren erhalten wir die Anzeige von Bild 16.37.
""'" ":r �;t;:j
� ... .-non "., .... -
��
......,.." ...
""''''
-,
�
! ,: , •
LJ.L<."""
00."....""'
.
·
�,
•
,.
� •
"""'" t!h
f\! LJ.L<.""" 00." ",""
,
-.- � '"
I
•
�
· • •
Bild 16.37 Diagramm, entwickelt aus
'AnalogwertEinzelnLesen.vi' in Bild 16.12
Die Anzeige zeigt jetzt Datum und Uhrzeit. Man erreicht das, indem man das polymorphe VI 'DAQmx Read.vi' gemäß Bild 16.38 auf'ID-Signalveriauf' umstellt.
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'
324
16
MesscL1ten-Eingabel-Ausgabe
Bild 16.38 Stellt man die polymorphe Funktion 'DAQmx Read.vi' auf DBL, erhält man beim Anschluss eines Charts Indizes auf der x-Achse. Stellt man aber auf " D-Signalverlauf, erscheint dort die Echtzeit
16.3.3
Triggern mit NI USB·6521
Eine häufige Forderung bei der Messdatenerfassung ist die exakte Bestimmung des Zeit punkts, von dem an die Daten einzulesen sind, man denke z.8. an Hochgeschwindigkeits aufnahmen einer Gewehrkugel. Man nennt das 'triggern'.
C
,.. -
(
Bild 16.39 Triggern einer 10,17 Hz -Dreiecksspannung mit einer 2 Hz-Rechteckspannung
In Bild 16.39. wo die Datenquellen und -senken gezeigt werden, geht es allerdings nicht um Bi l dverarbeitung, sondern um die Verarbeitung von Analogwerten. Bi l d 16.40 zeigt das Diagramm und Bild 16.41 das Frontpanel von 'USB-6251_Triggern.vi'. Dazu wurde der Task 'USB-652 I_Triggern' auf'N Sampies' = I k eingestellt, die 'Rate' auf IOk und 'Physikalischer Kanal' auf 'Devl/aiO'. Die Dreiecksspannung von 10,17 Hz, die vom Funktionsgenerator inks l unten in Bild 16.39 erzeugt und im Oszilloskop rechts oben angezeigt wird, wird erst erfasst, wenn eine steigende Flanke an Kanal Devl/PFIO erscheint. Das geschieht etwa alle 0,5 s, da der Funktionsgenerator (rechts unten in Bild 16.39) dort eine Rechteckspannung von ungefahr 2 Hz einspeist. Erfasst werden immer nur 1000 Analogwerte entsprechend der Einstellung im MAX für den Task 'USB-6521_Triggern'. Da die Scan-Rate 10 kHz beträgt, werden dieAnalogwerte in 0,1 s eingelesen. Danach ruht die Datenerfassung ca. 0,4 s bis zur nächsten steigenden Flanke.
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'
16.3 USB-Gerljt NI USB-6251
325
Bild 16.40 Die DAQmx
,
Funktion zum Triggern findet man unter 'Funktionen' - 'Mess-I/O' 'DAQmx-Datenerfassung'. Die nötigen Parameter kann man der Kontext hilfe entnehmen
c&-,,,,_,,�
Bild 16.41 Frontpanel zum Diagramm in Bild 16.40
IAufgabe 16.5
In Bild 16.41 ist nicht zu erkennen, welche Einstellungen sich hinter dem Task 'USB6521_Triggern' verbergen. Schreiben Sie ein Programm 'USB-6521_TriggernProg.vi', in dem die oben verwendeten Eigenschaften nicht m i MAX, sondern programmatisch fest gelegt werden.
IAufgabe 16.6
Schreiben Sie ein Programm 'USB-6521_TriggernSoft.vi', das jeweils 1000 Analogwerte nach Betätigung eines Schalters auf dem Frontpanel einliest. Hier wird also der Eingang lDev/PFIO nicht benötigt. Man nennt das Soft-Triggern. 16.3.4
Streamlng mit NI USB-6521
Messwerte müssen häufig längerfristig aufgezeichnet werden, damit man sie später, nach Abschluss der Messkampagne, in Ruhe auswerten kann. Zu diesem Zweck sollte man die Daten auf Festplatte speichern. Lesen von Analogwerten für einen bestimmten kurzen Zeitraum Bi l d 16.42 und Bi l d 16.43 zeigen das BeispieJ eines solchen VIs zur Messung von Analogwer ten. Das zugehörige Lese- und Anzeigeprogramm wurde der Einfachheit halber nicht von der Datenerfassung getrennt, es folgt als zweiter und dritter Teil einer flachen Sequenz.
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'
16
326
MesscL1ten-Eingabel-Ausgabe
Bild 16.42 Im ersten Teil der Sequenz werden 5 s lang Analogwerte gelesen und in einer Datei gespei chert. lm zweiten und dritten Teil werden diese Daten gelesen und auf dem Frontpanel angezeigt
,.
Bild 16.43 Frontpanel zu Bild 16.42. Die Daten können mit der Lupe der Graphenpalette auseinander gezogen und im Detail betrachtet werden, wie Bild 16.44 zeigt ""'Li'"'
-• •
j: � •
'= � �
>''''' ' '''.''�LO,"'"
,... -" I
",.:.;, iii ". �' 16.1"''''''''
,=,� ' " "''''''''ß!\! ".10.2030 ,.
,v � , � '� LO,"'"
Bild 16.44 Ausschnitt aus dem Signalverlaufsgraph in Bild 16.45 um die Zeit 20:06:55,6 herum am 16.10.2008
Lesen von Analogwerten mit Schleifentechnik Das Programm in Bild 16.43 liest einmalig 500 000 Analogwerte mit einer Samplerate von 100000 pro Sekunde. Es benötigt also ziemlich genau 5 s und stoppt dann. Was aber macht man bei Langzeitmessungen oder wenn das Ende der Datenerfassung nicht von vornherein feststeht? Dann nutzt man natürlich eine Schleife, die per Stopp-Knopf beendet werden kann. Das erscheint einfach, doch sollte man, ehe man sich ans Programmieren macht, einen Augenblick innehalten und sich zuvor mit den Mechanismus der Messdatenerfassung und der Datenübertragung zwischen Datenerfassungsgerät und pe befassen. Das Prinzip ist in Bi l d 16.44 dargestellt.
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'
16.3 USB-Gerljt NI USB-6251
327 Laptop
NI USß-625\
RingpufTer 6251
L:"� I �
=:::'::'-_"
Bild 16.45 Lesen der Messwerte im NI USB-6251 und in einem Laptop (mit 2GHz, 2 GByte RAM)
USß-s.:hnillStclle
Zunächst erfasst das Gerät NI USB-6251 eine Anzahl von Analogwerten mit einer bestimm ten Scan-Frequenz. Diese Werte kann der Anwender einstellen, siehe Bild 16.46. In diesem Beispiel sind 100 000 Analogwerte zu übertragen, die Scan-Frequenz oder Rate beträgt 100000 Sampies pro Sekunde. Der Vorgang der Datenerfassung dauert also 1 s. Dazu benötigt das USB-6251 einen Pufferspeicher für mindestens 100 000 Analogwerte. Dieser Speicher wurde hier mit 5 M = 5 000 000 angelegt (Sampies pro Kanal in der Funktion 'DAQmx-Timing (Sample-Takt)'). Die Datenerfassung ist auf 'Kontinuierlich' eingestellt, wie Bild 16.47 zeigt. Das bedeutet, dass das USB-6251 während der Laufzeit des VI ständig Daten erfasst, unabhängig davon, ob sie das VI abholt oder nicht. Ist der Puffer von 5 M vollgeschrieben, werden die ältesten Werte überschrieben. Das ist das Prinzip des Ringpuf fers. Man muss die Daten also rechtzeitig abholen, anderenfalls zeigt das VI den Fehler 200279 ('Measurements: Es wurde versucht, Abtastwerte zu lesen, die nicht mehr zur Verfü gung stehen. Der geforderte Abtastwert war zuvor verfügbar, wurde jedoch überschrieben'). Das Programm 'USB-6251_StreamOhneSchleifeTestZeit.vi'. in Bild 16.46 und Bild 16.47 misst die Zeit für die übertragung von 100000 Analogwerten aus dem Puffer des USB-6251 in das RAM des Laptop. Ohne Anzeige der Messwerte m i Signalverlaufsgraphen erhält man 5 ms, mit Anzeige etwa 7 ms (Durchschnittswerte). Anzeigen im Chart statt m i Graph unter sonst gleichen Voraussetzungen benötigt durch schnittlich 9 ms, also etwas mehr als beim Graph. •
-
'.
p--
.-
.tI
,�
-
-
--
O,,,1j""
.
-
� 0
""" I""
1io>ooI ..�
�,
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
' '
"""",o<.,� '
"
efli·Le,,,*biiiI
[j]
Ilill
� I
�
,totes
'w
,
I·,:lri\.� -fl
Bild 16.48 Diagramm 'U$B-6251_Kontinuierlichln$chleife.vi', das über die restlichen Sampies im Puffer informiert
111 ,I 'm l! m ! : ! :l: l n n !l � I ::lI I
Ie;' �ii -
�.
11
..
IsTOPP)
��.
�, -
"""1G.I gf .!!.l
�,
".to�
.......... '" "
-�
- -
<J
I
,-
. � �
,
l.,,�
0
,m
-
=
� = =
'"
'---,
-��
I
0." 1""
,-
Q... ..... ,
.
,\-
"
, " '"
Iill"
� ,-
,
Nf
-' -, -, .'
j.,LL
�
. , .
Bild 16.49 Frontpanel zum Diagramm in Bild 16.48. Momentan befinden sich nach Lesen von 10000 Analogwerten noch 4511 Werte im Ringpuffer des USB-6251 . Aus dem Puffer wird alle 5 ms gelesen. Das reicht, also zeigt die LED 'Lesen schnell genug?' grün
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'
16.3 USB-Gerljt NI USB-6251
329
Eine zweite Frage ist, warum überhaupt eine 'Puffer-Leserate', im Beispiel 5 ms, eingeführt wurde. Am schnellsten erfolgt ja der Datentransfer, wenn diese Größe gleich null gesetzt wird. Dann wird auch 'Scan Backlog' gleich null oder fast null, wovon man sich leicht über zeugen kann. Die Anwort lautet: Man gewinnt so Zeit für Aktivitäten, die paraUeJ ausgeführt werden sollen, z.B. eine Folge von Fouriertransfonnationen oder noch umfangreicheren Berechnungen. Werden die Daten mit hoher Scanfrequenz erfasst, bleibt dafür keine Zeit, weil sonst Daten verloren gehen. Man kann aber, während die Datenerfassung läuft, bereits beginnen, sie parallel zu bearbeiten, z.B. um sich einen ersten Eindruck zu verschaffen. Die hohe Transfergeschwindigkeit USB-6251 � PC lässt dafür etwas Zeit, auch wenn man die Daten nicht komplett bearbeiten kann. Erfasst man sie z.B. mit der Maximalgeschwindigkeit von 125000 Analogwerten pro Sekunde und überträgt sie in Blöcken zu 100000 an den PC, so benötigt man dazu nach Bild 16.46 bei Anzeige n i einem Chart 9 ms. Speichert man die Daten zusätzlich auf der Festplatte, kommen weitere 14 ms dazu. Das sind zusammen 23 ms. Ruft man die Schleife nun mit einer Puffer-Leserate von 100 ms auf, verbleiben 77 ms für andere Aktivitäten. Wir nutzen diese überlegungen zur Erstellung eines Programms, das kontinuierlich Mess daten einliest und auf der Festplatte speichert. Eine Grobanzeige äuft l dauernd mit, jedoch wird die zusätzliche vorgesehene Anzeige für die Ergebnisse einer Fouriertransformation nur auf Anforderung des Benutzers eingeblendet. Nach jeweils 100 ms wird die ablaufinvariante Funktion der Fourieranalyse von der Eventstruktur unterbrochen, damit die wichtigere Speicherung der Daten aufFestplatte nicht gestört wird. Das bedeutet aber, dass diese Trans formation eines Datensatzes parallel zur Erfassung mehrerer neuer Datensätze erfolgt. Sie hinkt hinterher. Damit der Benutzer trotzdem alle Datensätze, die ihn nteressieren, i ansehen kann, werden sie in eine Warteschlange (Queue) gespeichert. Diese wird abgearbeitet, sobald der Benutzer sich hinreichend informiert fühlt und die Fourieranzeige wieder abschaltet. Zur Erhöhung der Geschwindigkeit wird - wie schon in den bisherigen Beispielen - binär gespei chert. Siehe dazu Bild 16.50.
EEl
.� ..
Bild 16.50 Ausschnitt aus dem Diagramm von USB-625,_Streaming.vi, das mit einer Queue und einer
Eventstruktur arbeitet
Bi l d 16.51 zeigt das FrontpaneJ des Programms nach dem Start. In diesem Beispiel würde die eingestellte Pufferleserate von 100 ms ausreichen, auch die Fouriertransfonnation zusätzlich
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'
330
16
MesscL1ten-Eingabel-Ausgabe
durchzuführen. Man würde n i der Queue (Anzeige unten rechts) immer nur den Wert null ablesen. Deshalb wird zur Demonstration die Bearbeitungszeit künstlich um die Warte zeit 'Bearbeitungszeit (ms)' verlängert Im BeispieJ sind es 300 ms, siehe Anzeige Mitte links in Bild 16.51. Sie könnte auch real entstehen, wenn statt der Fouriertransformation eine aufwendigere Bearbeitung der Messdaten vorgenommen würde. Der Anwendet hat in unse rem BeispieJ 'Anzeige Fourier (ms)' auf EIN gesteUt, sodass sich n i der Warteschlange bereits 12 Datensätze gesammelt haben. Schaltet er nun diese Anzeige wieder aus, werden die ge speicherten Datensätze der Reihe nach abgearbeitet und rechts als Fourieranalyse dargestellt. Im Beispiel wurde am Funktionsgenerator eine Sinusfunktion mit sehr rasch wechselnder Frequenz (sogenanntes 'Wobbeln') zwischen etwa 20 und 600 Hz erzeugt, die ein entspre chend auseinandergezogenes Frequenzspektrum iefert. l Bi l d 16.52 ist ähnlich, nur wurden die Datensätze n i der Warteschlange bereits auf7 abgear beitet. In Bild 16.53 ist dieser Prozess abgeschlossen, und die Fourieranzeige verschwunden.
--
-•
---' "
-'• ----,
-..... . .....
Bild 16.51 Der Anwender hat 'Anzeige Fourier' links auf EIN gestellt. Sie ist rechts oben zu sehen. In der Queue haben sich 12 Datensätze gesammelt. die abzuarbeiten sind (Anzeige rechts unten) " --
... ,a '.
>.1
" �.
U
'.1
1.1
>.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' � •
___ (0<) �
� 0,_
't-1II �
_ ... ,
-
""'11""
..:: e r""
",
,, ���
I!:"_ ",...,
-�
SToppl
-...
331
-
-�
-
'0
"
'0
J
,.-,., ,'
[;[] ',
-
'0
"
"
"
--...-� �'
L"�
...
u, ..., _
ro-
'"
..�
.'
- ��
-
•
�
-....-
• _.-
-- ,
-
,
�
�
ro_.;
r;;;-
-
'4
Bild 16.53 Die vom Anwender zwischenzeitlich gewünschten Fouriertransformationen wurden ange zeigt, dieQueue ist wieder leer, das Fourierdiagramm wird nicht mehr durchgeführt oder dargestellt
IAufgabe 16.8 Analysieren Sie den Aufbau und die Funktionen des oben dargestellten Programms '165 1-USB-625 I_Streaming.vi'.
1 6.4
Ältere NI·Karte PCI-MIO-1 6E-4
Bei älteren Datenerfassungskarten (auch 'Legacy' genannt) genügt es nicht, sie in den PC einzubauen. Man benötigt im Allgemeinen noch ein zusätzliches Kabel, das
zu einer Ste
ckerleiste oder zu einem Gerät zur Signalkonditionierung führt. Erst dort werden die erfor derlichen Sensoren angeschlossen.
Auch ist die Behandlung der Software mit dem MAX in anderer Weise geregelt, z.B. fehlt die Trennung n i Task und KanaL An Stelle des Tasks wird nur der symbolische Name für einen Kanal eingetragen. Man wird wahrscheinlich in einiger Zeit auf die Erklärung dieser Details verzichten können. Doch geben viele Anwender h i re teure Hardware nicht von heute auf morgen auf. Deshalb soll die Behandlung der inzwischen veralteten Karte PCI-MIO-16E-4 (NI 6040E) erläutert werden, die früher im LabVIEW-Praktikum der Hochschule Ravens
burg-Weingarten Verwendung fand. Prinzipiell kann das Vorgehen so bleiben, wie schon in der dritten Auflage dieses Lehrbuchs beschrieben. Doch ergeben sich in der neuen Version 4.4.1 des MAX einige kleinere Abweichungen. Bi l d 16.54 zeigt die Konfiguration der Karte PCI-MIO-16E-4 (NI6040E).
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'
332
16
MesscL1ten-Eingabel-Ausgabe
Spannung;'"cßO
I'CI·MT().l6E-4
I O V M....,
NI6040E
pe
AG X2
�.
�,
DG ;_1
'/ i
-,- -"""'"'
Bild 16.54 pe mit Karte NI 6040E, achtpoligem Kabel und Signal konditionierungsbox SC-2345
Theoretisch könnte man die Analog- und Digitaleingänge ebenso wie die Ausgänge direkt an der Datenerfassungskarte abgreifen. Doch wäre das recht unhandlich und anfallig für falsche Verdrahtung. Man könnte damit die wertvolle Datenerfassungskarte zerstören. Ein geschirmtes Kabel ist also praktisch unverzichtbar. Im einfachsten Fall führt es auf eine Steckerleiste. Eine praktische Variante bildet die BNC-Box zum Anschluss von BNC-Kabeln. Besser ist allerdings der Anschluss an ein Gerät zur Signalkonditionierung wie das SC-2345 (SC bedeutet: Signal Conditioning). Der Hauptvorteil besteht darin, dass Fehlverdrahtungen nicht unmittelbar auf die Karte durchschlagen, sondern bis zu einem gewissen Grade von den Einschubelementen der Signalkonditionierungsbox abgefangen werden. Auch gibt es bequemere Anschlüsse wie Bananenstecker. Signalkonditionierung bedeutet aber noch mehr: Die Signale werden verstärkt, die Störungen ausgefiltert usw. Die Bestückung der SC-2345-Box im Falle der Hochschule Ravensburg-Weingarten kann man Bild 16.55 entnehmen. ,V
,. v "-
Bild 16.55 5ignalkonditio " '
-
"'
-
",_,
00.'
- -
nierungsbox 5C-2345 mit fünf Einschubelementen
Die Elemente SCC-AI003 dienen der Konditionierung jeweils eines Analogeingangs. Für den Digitaleingang ist SeC-DIOI zuständig, für den Digitalausgang SeC-DOOl. Für Zusatzauf gaben gibt es das Element SeC-FTOl. Nachdem die Karte NI 6040E n i stalliert ist, zeigt der MAX für 'Geräte und Schnittstellen' eine Liste wie n i Bild 16.56.
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.4 Altere NI-Karte PCI-MIO-16E-4
333
Man öffnet nun durch Wahl von 'Eigenschaften' über dem Kontextmenü der Eintragung 'PCI-MIO-16E-4' (siehe Bild 16.57) ein Konfigurationsmenü gemäß Bild 16.58.
'i§j�:�
.. PCI-MKl-16<-i(
-� =--
Bild 16.56 Anzeige der Geräte und Schnittstellen in einem pe, der über eine Datenerfassungskarte PCl-MIQ-16E-4 verfügt
NI"'...",
t
Ge,ötelrId Sehnt_ion umQnx-Geröte
Bild 16.57 Aufruf 'Eigenschaften
.' im Kontextmenü von
.•
PCI-MIQ-16E-4
r2�
Kon1!� "D,.n vo n (,e ,., 1 PLI MlJ 1 6 1 i
'+I�=S�"'" ",,;;'eh;
" �'''''_h :";,",,,�h '... ,.,tR.,,.,.. :>OC'_A'''.,,, _..ot _Ao""" :;"t�A."""
'-"-","LW (I,W-'"'d-" c.c30140C1:J (I,{)� ,� C ,
_
G"....""",.. ... , übo
SN, ,, n ..."",,,,,e _ _on"-"
Bild 16.s8 Konfigurationsmenü für die Da tenerfassungskarte PCI-MIQ-16E-4 nebst Zubehör
Der erste Schritt besteht darin, das Zubehör zu konfigurieren. Dazu wählt man im Menü nach Bi l d 16.58 die Registerkarte 'Zubehör' und dort SC-2345 unter den verschiedenen zur Auswahl angebotenen Anschlüssen, siehe Bild 16.59. Dann müssen wir 'Konfigurieren.. .' drücken, wasuns zu einer Ansicht gemäß Bild 16.60 führt. Konr,�"" e,.n
wo
Ge,�l 1 PC I-IOIO 1�[ 4
\t/""" S."",,,, �kool...-on."'; I'< G..öt """"""'� U
I�",-,..."
IIrRl '+IiH."s;., 0., ... .... 1>0<" ,-Z�
,""""'d
Bild 16.59 liste zur Auswahl des Zubehörs
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'
334
16
MesscL1ten-Eingabel-Ausgabe
Zunächst steht allerdings 'Leer' hinter allen Ste<:kplätzen. Wir haben dann in diese Liste alle Elemente einzutragen, mit denen die Konditionierungsbox SC-2345 in unserem speziellen Fall bestückt ist. Bild 16.60 iefert l die notwendigen Informationen. Zum Beispiel haben wir zwei Analogeingänge des Typs 'SCC-AI03' an den Steckpätzen l Jl und J2. Also wählen wir Jl und betätigen die Taste 'Hinzufügen'. Das öffnet eine weitere Auswahlliste, in der wir 'SCC-AI03' aufsuchen und bestätigen. Genauso verfahrt man mit '2. Die folgenden Steck pätze l bleiben frei. Nur J9, HO und Ji7 sind noch entsprechend zu bearbeiten. Das betrifft den Digitaleingang 'SCC-DIOl', den Digitalausgang 'SCC-DOOl' und schließlich das Spezial element 'SCC-FTQl '. Ist alles richtig eingetragen, ergibt sich die Liste von Bild 16.60. r � � "� m" " " " OOC Al
:1 m!� J3 l_ )<_l_
iS - L...
,,� J7_l_
.• H•• 13 S[HllOl
J1O_8[C_0001 m _ l... J1,-l= J13_l«< J1._l_ JI5-l= m-l_
� I--.0I
.1
Bild 16.60 Anfänglich leere Liste, welche die Steckplätze der SC-2345-8ox durchzählt. Hier bereits ausgefüllt mit allen Elementen aufden belegten Steckplätzen der SC-2345-Box gemäß Bild 16.55. J17 (hier nicht zu sehen) hat die Belegung SCC-FT01.
Nun müssen die in der Signalkonditionierungsbox SC-2345 enthaltenen zwei Analogeingän ge, der Digitaleingang und der Digitalausgang behandelt werden. Dazu aktiviert man das Kontextmenü von 'Datenumgebung' nach Bild 16.56 und wählt dort 'Neu .. .'. Im nun er scheinenden Fenster selektiert man 'Virtueller Kanal (Trad. NI-DAQ)' und danach sofort 'Beenden', siehe Bild 16.61. 11>.,.r"",,"
(W'
Measuremerrt & Automation Explorer � ii . D �
J I ll fJ-OA
�tt:lttiftliM.HMI
Bild 16.61 Hinzufügen eines neuen virtuellen Kanals (Trad. NI-DAQ)
Nun erscheint ein Fenster entsprechend Bild 16.62, n i dem zuerst die Konfiguration eines Analogkanals angeboten wird.
",,,,,,,, s.,,,,,,," , ,,,,,,,,,,,"-,_ K.o"""'�".'''''''''"''''"'''''''
Bild 16.62 Auswahl eines Analogkanals
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.4 Ältere NI-Karte PCI-MIO-16E-4
335
G.lon s... �..'"" don K�n.- ��••� '"'� ..�-_ ."
Bild 16.63
Fenster zur Vergabe eines symbolischen Namens und eines Kommentars für den Analogein gang
Mit 'Next >' kommen wir zu einem Fenster, in das wir den Namen des Analogeingangs ein tragen müssen, siehe Bild 16.63. Dann wird nach der physikalischen Größe, ihrer Einheit und h i ren Begrenzungen gefragt, siehe Bild 16.64. ....,,,,,, ....,,,,,,,s.,..o< "'" S."''''" "''''''' D.In_os" [
.-
"" ro:ro-- v ""' � "
r"""...""",,,,, ",,,,,,,
Bild 16.64 Wahl der Einheit (Volt) sowie der Minimat
und Maximalwerte der zu elWartenden Spannung
Bi l d 16.64 zeigt die Festlegung der Einheit 'V' für Volt sowie der Maximal- und Minimal spannung. Mehr als ±lO V sind nicht zulässig. Weiß man aber z.B., dass nur positive Spannungen zwischen 0 und 5 V auftreten, kann man die Genauigkeit der Datenerfassung erhöhen, wenn man diese Werte einträgt.
..... """"' [ ..'""'"'""' _. _�_,
r . !h i " ' _ ;; " P ' . ' !II(:J
w
Bild 16.65 Auswahl der Hardware und der Art des Analoganschlusses
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'
16 MesscL1ten-Eingabel-Ausgabe
336
Das Fenster zur möglichen Skalierung wird übersprungen, dagegen das Fenster zur verwen deten Hardware dem Datenblatt entsprechend ausgefüllt, siehe Bild 16.65. Zuletzt schließen wir die Konfiguration mit 'Finish' ab. Entsprechend verfahren wir mit dem zweiten Analog eingang, den wir 'AI_2' nennen. Die digitale EingabelAusgabe erfolgt nach dem gleichen Prinzip: Also virtuellen Kanal (Trad. NI-DAQ) nach Bild 16.61 anlegen und diesmal Digitale 1/0 wählen, siehe Bild 16.66. Dann Namen vergeben (Bild 16.67). r<,,," ,,,, ,.. ... t.","
"""........h. "'mbo ..._.. . , '«<",-""",,,,,
?�I
"oHon�" _"'''" ,, ..",.,�.""""" '��p�" -"-" """"�
IMbe
G
Bild 16.66
Auswahl Konfiguration 'Digitale 1/0'
"obonS. <,,_,Oon,-,,_� _.� ...�,�""'_."
Bild 16.67 Vergabe des symbolischen Namens 01_' für den Digitaleingang
Bild 16.68
'lesen von leitung' wählen. Das heißt. man liest einen einzelnen digitalen Eingang und nicht von einem Port (Anschluss) mit mehreren leitungen
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'
337
16.4 Ältere NI-Karte PCI-MIO-16E-4
Schließlich wählen wir n i Bild 16.68 den Eintrag 'Lesen von Leitung'. Danach weiter mit 'Next >'. Die übrigen FeJdererklären sich weitgehend von selbst. .... " 5 ... _.,,' '''''" ''' '"'''. ""...
I."""'�;o'''' �""",., '''''_''' ..",...�.k...- ..__ .. ""
100
:::J
Bild 16.69
Bestimmung des Anschlusses an die DAQ
Hardware
[j' E�hoften"
Konfiguration
fiI
G Mffi 'Pefl1
AttrW
IIi � D� iiIi i@l'i'tueleKon.loIelü trod, NI·DAQ
§ r�
� Besc"�bo.rJg � ZcJ&;>i9' 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· Gete
El _""9
iiIi .!1 5ef" &PiI'�
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.... _ _ _ "'"""""- -........... _ - ��<......" T�" _"...'.. _, >� _�.. ..�, """" ....... �� ""'" "..-. , � T.... ---, .� ...�, -- _ ....-K____... ""... .... .... """'... ," ._ T... ..-.......
»-
l"W �
Oi s;:r..,k .""""
.... ;; ..�,;;;;;�... U ",.""" 111 T..--""
.. Oe"""
. o[tl>i; -
� ,.".,,-... '''"""" --
.
,..,.,"""
tl "'K""""""" 111 2"*,��,','"",,,
Bild 16.73 Auswahl von Messmethoden für ver schiedene physikalische Größen
KonfIguratIon Ii .o '-'»1:00
ioi . O"�
._., lief"el.Ol 5onn
�-:
� "De-.-l· � �"imllllimm
Iiii-IXI PXI SV""'" (�fiod)
Ii li-
1iii ;Y 5e
51 Soft"o"e
1i-. NI o.,..",
ili O N«"""" �
Bild 16.74 Datenblatt (data sheetj des Beschleunigungssensors4507 B sln 30124 von Brüel & Kjaer
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'
340
16
MesscL1ten-Eingabel-Ausgabe
Brüel & Kjaer erklärt das TEDS-Prinzip seiner Sensoren gemäß Bild 16.75.
Principles of Operation TEDS - Transducer Electronic Data Sheet
Bild 16.75 Wirkungsweise eines TEDS. mit freundlicher Genehmigung von Brüel & Kjaer Eine Verbindung des Sensors mit dem pe unter Verwendung von NI-Karten kann entspre chend Bi l d 16.76 gestaltet werden. Diese Konfiguration wurde auch für das folgende Beispiel verwendet.
/
,(M....so)o...
TEDS-Sensor 4507 B 30124
o.ti..�;..... ,-,
BNC-2096
I
�I
NI PCI-4474
PCI-MIO-16E-4
Bild 16.76 Die Karte PCI-MIQ-16E-4 steuert die Erfassung der Sensordaten Ober das Gerät BNC-2096. Die hochauflösende Karte NI PCI-4474 empfängt die analogen Messwerte
Bemerkung Die oben schon mehrfach als Beispiel angeführte Karte USB NI-6251 kann hier nicht ver
wendet werden. Der Beschleunigungssensor von Brüel & Kjaer misst am Eingang Ladungen.
Zur Umwandlung in eine Spannung benötigt er die Speisung mit einem Konstantstrom von 4 mA, auch IEPE genannt. IEPE oder 'Integrated Electronics Piezo-Ele<:tric' ist eine Indust rienorm für piezoelektronische Sensoren, zu denen auch der oben beschriebene Sensor von
Brüel & Kjaer gehört. Die Karte NI PCI-4474 ist mit einer solchen KonstantstromqueUe ausgerüstet. Doch benötigt man noch eine zweite Karte für die übertragung der Informatio nen im Datenblatt (data sheet). Dafür genügt auch die ältere PCI-MIO-16E-4. Beide Daten ströme laufen über das Anschlussgerät BNC-2096. Die Konfiguration für das Beispiel aus Bild 16.76 wird wie folgt erstellt: Zuerst die neue Karte NI PCI-4474, wie schon früher beschrieben, vom System und vom MAX erkennen lassen, siehe Bi l d 16.77. Das Gerät BNC-2096 einbeziehen über 'Geräte und Schnittstellen' - 'NI-DAQmx-Geräte' 'Neues NIDAQmx-Gerät erzeugen .. .' (zu "Dev3") - 'BNC-2096', siehe Bild 16.78. Nun muss der richtige Eingang und Ausgang am 'BNC-2096' gewählt werden: Im Fenster 'BNC 2096 (Anschlussblock für TEDS-Sensoren)' nach Bild 16.79 einen Kanal wählen, im Beispiel Kanal 0, und dort 'Dev3/aiO' einsteUen. "Dev3" steht für 'NI PCI-4472'. Dann 'Nach TEDS suchen' drücken. Bei hardwaremäßig richtig angeschlossenem Sensor farbt sich die LED neben Kanal 0 grün. 'OK' drücken. Der MAX bringt jetzt die gewünschte Anzeige nach Bi l d 16.79.
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'
16.5 TEDS
341
.. 0 _""'" iii' . O"� .. ii' ...,.. erd Sd-n>t....on
OIl_""""',
""...
." H1 PCl_"'o-".....· 't>o "
§ M i -IrM i,H iI !i .. rn'CHIO-'''-'.",",'"
" ,jJ 'Cl-'''', 'o"ß
...,,"""
""-'>-ln-.....
Fluo-ln-Ii<,'"
Bild 16.77
.. rnK�"'' ' ''Oo-.ß
iii·H.1 m s,,,.., (lhdort.",,)
Karte
NI PCI-4474 vom MAX als "Dev3"
... J1 ""'��'"d'''
1iii·1.iiiiI ,,,,,1>,,,,,10 >lO",<""''''e Ii Q "'*''''9''' ..·61 '«'t""·, 1ii·. M[lnve"
erkannt (zuvor war eine andere als 'Dev2" bezeichnete Karte aus Platzgründen aus dem PC entfernt worden)
Ii 0 ""....""'.....,."
,
,
SOl-eh",",
Trodtm.le >I-OAQ-",iJe
�"' 51-.01""-"V"" �51 Sol",,,, �. mDm""
Bild 16.78
BNC-2096 mit PCI-4474 verbinden
1i () ....ZW«� -l:. IJ'( 20 96 (An.
TWSQ
I
•
111
•
,...... , ," _ ."_ .. -]
• • • • • •
TW5Q
""'e�o,,,.,,, c,, · ,. '[:<0. ," -�
ITEDS!
;�'"
� L2 �"
","no
KoM L<
:�'"
"""� " :...no
'mold"
.....-..cfh>
•
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,,'
"'<'C[-#
"WEBE!!.'
0 """ 1"" "" "''''''''9OO'l
10 "'" "I " �� (\Jnid,rt�,,) iii
.. 1iiI Tr-.... N'-MQ-""." Wi "' '''''''� !J ""'�"",dIO
Bild 16.80 Anzeige im MAX nach erfolgreicher Identifikation des Beschleunigungssensors
ii 5l solt�...
.. . NI"",,, Iii O ,.,.,�
....
=---�
5n
. ""..
"...,., .,,,�..�,,
Z ...
"�I ·",,, ,1 , .
"" , _ ' ,",, 0 '
' - -
" ....... ""..""
o.... "" .. �..
.,
:::=
•• -
Bild 16.81 Erstellung eines Tasks fürdie Aufnahme von Beschleunigungswerten mitdem TEDS-Sensor
�-, ��,li'_ .,.'
."'TfQS � ,
...
....
�,,,
�.u
!"" �«""''''
-,�
.
rm- ,
-"" !CMn ' <
[I] :11
'Whli
""".hw> �"""'" , ....,.. �.
-
!!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. ... � __ _ !:<
.....
�'- �
'"
�
-
Bild 16.89 Frontpanel zum Diagramm von Bild 16.86.
diesmal mit $inus- und Rechteckspannung von etwa 1 MHz
Neustart Startet man das 'ZweiKanalEinfach.vi' nach dem Hochfahren des Rechners ohne die USB Verbindung zum Digitizer, erhält man eine Fehlenneldung in 'niScopeInitialize.vi'. Steckt man dann den USB-Stecker in den PC, erscheint erneut der oben bei der Installation er wähnte Assistent. Diesmal wählt man 'Keine Aktion ausführen', startet 'ZweiKanaIEinfach.vi' erneut und erhält wieder korrekte Ergebnisse. Umwandlung 'NI-Scope Express.vl'
ö
_. •
"
_. •
-
.-
�.
i - -
- -
Bild 16.90 Frontpanel eines umgewandelten Express-Vls
Man kann 'NI-Scope Express.vi' auch in ein eigenes VI umwandeln. Dazu vorgehen wie oben beschrieben, d.h. n i das Diagramm eines leeren Vls einfügen, automatische Installation ab warten und in Bild 16.88 -nach eventueller Modifizierung der Parameter - 'OK' drücken. Dann Rechtsmausklick auf das Symbol des Express-Vb und aufrufen 'Frontpanel öffnen'. Die Frage nach 'Konvertieren' mit ja beantworten und als 'NI-SCOPE-Vorlage.vi' speichern. Man erhält ein VI mit Frontpanel nach Bild 16.90. Das Diagramm ist recht kompliziert, gibt aber eine Fülle von Anregungen, wie man mit lVI-Befehlen auf Low Level Niveau umgehen 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'
Teil IV: Fortgeschrittene Techniken
Teil IV behandelt fortgeschrittene Techniken der LabVIEW-Programierung. Darunter fallt die objektorientierte Programmierung (OOP) sowie Tabellenkalkulation und Datenbank kommunikation unter Window$. Der Aufbau von Programmen als Zustandsautomaten und die vertiefte Behandlung eines TCP/lP-Servers für beliebig viele Clients werden ebenfalls besprochen. Den Abschluss bi l det eine Einführung in das cRIO-System 9012 von LabVIEW nebst FPGA-Programmierung.
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
Professionelle Programmentwicklung
lernziele 1. 2. 3. 4. 5.
LabVIEW-VIs als Sequenz und als Zustandsautomat programmieren können. Begriff Zustandsautomat erklären können. Zustandsautomaten in LabVIEW auf einfache Weise (PoUing) programmieren können. Zustandsautomaten in LabVIEW mit Queues und Events programmieren können. Hilfsmittel zur Erstellung umfangreicherer Programme wie Templates kennen.
1 7.1
Sequenzstruktur
Umfangreichere VIs kann man in Form einer Sequenz gestalten, wie Bild 17.1 zeigt. Dabei raten heute manche Programmierer von der gestapelten Sequenz ab, mit der Begründung, sie würde Code verdecken. 1 0,, 1
•
Bild 17.1 Flache Sequenz mit zwei Rahmen links und das GegenstOck, die gestapelte Sequenz rechts
Nun wird auch anderweitig Code verdeckt, z.B. in einer Case-Struktur, oder in einem Unterprogramm, das m i Diagramm des aufrufenden VIs als quadratisches Symbol erscheint, ohne dass der Leser hinreichend Bescheid weiß, was sich dahinter verbirgt. Gemeint ist mit der 'Codeverdeckung' etwas anderes: In einem Programm mit SubVIs und Case-Strukturen kann jeder mögliche Weg, den die Daten auf Grund äußerer oder innerer Bedingungen nehmen können, offen gelegt und zusanunenhängend dargesteUt werden. Bild 17.2 zeigt ein einfaches Beispiel: Zunächst sieht man im Diagramm des VI, das WinkeJ im Bogenmaß ins Gradmaß oder n i Neugrad umrechnen soll, nur einen Teil seiner Funktionalität.
Bild 17.2 Die Funktionen des VI sind in die sem Diagramm noch weitgehend verdeckt
Wenn man aber einen der beiden Datenpfade, nämich l denjenigen für die Umrechnung vom Bogenmaß in Neugrad, wählt und zusätzlich das SubVI öffnet, hat man für diese A1ternative
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'
349
17.2 Zustandsautomaten
den kompletten Weg der Daten offen geJegt und zusammenhängend dargesteJlt. Siehe dazu Bi l d 17.3.
,
, Q..tei �",tdffi •
anzei9ffi
;'_1
"
Mein C()fffl'..t..::u
,
[Toje!t !\USI"Chffi \,!:erueo..qe Eenste< t!fIe dti>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
PM!e 5trdtuon .J �_!J66om D\.rI::h o;JnI""""e �.--. c-.� �
Professionelle Programmentwicklung
•
�
c-_eWiiQM c_ .-..c. � �o;e..,., Cose IOs
l_. ca.es 6"IIfaTIen
�-
Lmwlfllioln n l'oNInsl1It.rog C...
... st..,,;.,d-C... ......
J GroIl/Kl!lO"l
Bild 17.12 Groß- und Kleinschrei bung ignorieren
"''''.
I
, ' ,
Bild 17.13 Ungültige Zustandsbezeichnungen anzeigen lassen
17.2.2.2 Enum für die Zustandsauswahl Wie Strings bestehen auch Enum-Variable aus Zeichenketten, mit denen man die Lesbarkeit des Programms erhöhen kann. Während aber jeder Steing nur eine Zeichenkette enthält, kann man eine Enum-Variable mit mehreren Zeichenketten füllen und das Ergebnis als so genannte Typdefinition speichern. Bild 17.14 zeigt einen Ausschnitt aus dem Zähler programm von Bild 17.4, diesmal mit einer Enum-Variablen ausgeführt. Die anderen Zustände entsprechen denen von 'ZählerString.vi'. Das Frontpanel ist bei lau fendem Programm praktisch identisch mit dem von 'ZählerEnum.vi'. Nach dem Start sieht man n i heiden Programmen alle 1000 ms einen Zustandswechsel mit identischen Anzeigen.
lW{jl!l
'n,''*'
"'"
.�
[j]
.
.,
Ell::l
EB ,w
�...
Di tll
Bild 17.14 Zustand $2 und seine beiden möglichen Folgezustände in 'ZählerEnum.vi'
Das Füllen des Enum-Feldes auf dem Panel geschieht über das Kontextmenü mit 'Objekt danach einfügen' (oder davor) und anschließendem Löschen eventuell noch leerer Felder. Alternativ ruft man m i Kontextmenü die Funktion 'Objekte bearbeiten . . . ' auf und erhält ein
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'
17.2 Zustandsautomaten
355
Fenster nach Bild 17.15. Dort trägt man die Bezeichnungen für die Zustände ein. Anschlie ßend benötigt man noch die Konstanten 'SO', 'SI' usw. Man erhält sie n i unserem BeispieJ im Kontextmenü der Variablen 'StateEnum' im Blockdiagramm mit 'Erstellen' - 'Konstante'. Sie haben hier Namen wie 'SO' oder '53' in Bild 17.14 und lassen sich mit Linksmausklick auf klappen, siehe Bild 17.16. Man muss dann nur noch den passenden der vier Werte wählen. � flll�"5
x
"'... . CO , """
Bild 17.15 Fensterzum Eintragen von Werten in eine Enum-Variable
lJ'" SI
52 "
Bild 17.16 Aufkiappen der Enum-Konstante 'SO' in Bild 17.14
IAufgabe 17.1 Entwerfen Sie das Zustandsprogramm und das LabVIEW-VI für einen Zähler, der je nach Stellung eines Schalters 'Richtung' aufdem Panel zyklisch von 0 bis 3 vorwärts oder rückwärts zählt, a) mit Strings, b) mit einer Enum-Variablen und c) mit einer Integervariablen (wurde bisher nicht besprochen). 17.2.2.3 Verwendung von Ctl-Elementen bei der Enum-Programmlerung
In Abschnitt 9.5 wurden selbst erstellte Eingabe- oder Anzeigeelemente erwähnt, die mit der Erweiterung 'ctI' für 'Control' auf der Festplatte gespeichert werden. So zeigt etwa Bi l d 9.28 ein solches 'ctl' mit der Bezeichnung 'Element' oben in der Funktionsleiste. Links daneben ist ein Schraubenschlüssel zu sehen. Man kann die Bezeichnung 'EJement' auch gegen die Fest legung 'Typ-Def.' oder 'Strikte Typ-Def.' austauschen. In unserem Fall gehen wir folgendermaßen vor: Wir öffnen ein leeres VI und setzen auf dem Frontpanel ein Enum-Element 'StateEnum'. Dann wählen wir im Kontextmenü 'Fort geschritten' - 'Anpassen'. Nun öffnet sich ein zweites Frontpanel gemäß Bild 17.17. Dort wählen wir 'Strikte Typ-Def.', setzen die vier Zustandsbezeichnungen gemäß Bild 17.15 ein und speichern dieses Bedienelement unter irgendeinem Namen, Z.B. als 'StateEnum.ctl', ab.
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'
356
17
Professionelle Programmentwicklung
Bild 17,17 Frontpanel eines VI mit Enum-Element und zugehörigerTypdefinition
Wenn wir nun ein VI öffnen und das CtI-Element auf dem Panel absetzen, bringt es alle seine Eigenschaften, d.h. Größe und Farbe des Elements, seine Inhalte SO bis 53 U$W., unveränder ich l mit sich, und zwar für alle Instanzen, die man von ihm bildet. Es ist also nicht möglich, dieses Fenster zu vergrößern oder seine Inhalte versehentlich zu ändern. Ändern kann man nur, n i dem man das Cd-Element durch ein anderes ersetzt (auf der Festplatte spei chert). Dazu wählt man am einfachsten im Kontextmenü des Elements bzw. der Konstanten 'Typdefinition öffnen' und wandelt dann wunschgemäß ab. In diesem Fall ändern sich auch im aufrufenden VI alle entsprechenden Anzeigen und Inhalte automatisch. Oder man wählt im Kontextmenü 'Von Typdefinition trennen' und separiert ein einzelnes Frontpanel Element von seiner Typdefinition. Eine Veränderung des zugehörigen Ct1-Elements auf der Festplatte wirkt sich dann nicht mehr auf diese Instanz aus. Hätten wir 'Typ-Def.' statt 'Strikte Typ-Def.' verwendet, könnte man zwar die Form und Farbe des Cd-Elements ändern, doch blieben auch hier die Inhalte der im VI benutzten Instanzen fest mit der auf der Festplatte gespeicherten Datei verbunden.
.... --.. - .. -
Bild 17,18 Ctl-Elemente mitje zwei Instanzen bei Festlegung auf Strikte Typ-Def� Typ-Def. und Element
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'
357
17.3 Milnzautomat
Speichert man schließlich ein Cd-Element mit der Fesdegung ' Element' , sind beliebige Änderungen auch der Inhalte im aufrufenden VI möglich: z.B. 'SO' bis 'S5' oder mit geänderten Namen 'Zustand 0' bis 'Zustand 3'. Bl i d 17.18 fasst die verschiedenen Fesdegungen bei einem Cd-Element und die Auswirkun gen bei der Verwendung in einem VI zusammen. Merke: Für die Auswahl der Zustände vetwendet man im Allgemeinen entweder Strings oder eine Enum-Variable. Im letzteren Fall arbeitet man vorteilhaft mit KontroUelementen, auch 'Cd' genannt. Merke: Als Eigenschaft eines selbst definierten Elements kann man wählen: 'Strikte Typ-Def.', 'Typ-Def.' oder 'Element'.
1 7.3
Münzautomat
Wir woUen nun zu einer komplexeren Aufgabe kommen und einen Münzautomaten nach dem Zustandsdiagramm in Bild 17.19 programmieren.
.-+1
Initialisierc
Produktaus·
wahVPreise
f----I
Initialisiere
ünzwerte M
Wane
""",",., f----I auf'Produkt Zeige
L � 'w � � w " � '...J
kaufen·
Zeige
Miinz_
auswahl
Bild 17,19 Zustandsdiagramm für einen einfachen Münzautomaten
Während es beim Beispiel des flexiblen Automaten in Kapitel 8 um den Vorteil von Konfigu rationsdateien ging,mit denen man einen festgelegten - einfachen - Typ eines Automaten an verschiedene Aufgaben anpassen kann (Verkaufsgegenstand, Warnhinweise, Geldbetrag usw.), handelt es sich hier darum,die variable Struktur eines Automaten zu entwickeln,die später auf einfache Weise höheren Anforderungen wie gesteigerter Funktionalität angepasst werden kann. Bl i d 17.19 zeigt das Zustandsdiagramm für diesen Münzautomaten,den wir in zwei Varianten programmieren werden. Wir wählen eine Enum-Variable für die Bezeichnung der verschiedenen Zustände und ver fahren im übrigen gemäß Abschnitt 17.2.2.3. Das heißt, wir bilden ein Cd-Element mit strikter Typ-Definition entsprechend Bild 17.20. Jetzt können wir m i Kontextmenü von 'State' über ' Objekte bearbeiten .. .' die Tabelle von Bild 17.21 aufrufen und dort die ge wünschten Einträge vornehmen.
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'
358
17
Professionelle Programmentwicklung
Die Enum-Variable kann nun mit dem Auswahlanschluss einer Gase-Struktur verbunden werden. Mittels 'Case für jeden Wert hinzufügen' aus dem Kontextmenü der Gase-Struktur
erzeugen wir rur jeden Zustandswert einen Rahmen. Für möglichst fehlerfreies Programmie
ren empfiehlt es sich, den Eintrag 'Voreinstellung' zu löschen, denn dann wird man beim Hinzufügen eines neuen Eintrags n i der Enum-Zustandsvariablen gezwungen, auch einen neuen Rahmen zu erzeugen. Vergisst man das, ist das VI nicht ausführbar. Eine Vorkehrung wie in Bild 17.13 ist dann bei Verwendung von Enum-Variablen nicht mehr notwendig. Ist dagegen ein Rahmen mit 'Voreinstellung' gekennzeichnet, kann
man
das VI auch laufen
lassen, wenn man einen Rahmen auswählt, den es gar nicht gibt, wei l man vergessen hat, ihn anzulegen. Das VI ist dann zwar ausführbar, arbeitet aber fehlerhaft. QateI � � �o)ef:t &>dthM �...k:!euoe
I'
StrioleTyp-Del.
•
Eenst... �e
13pt�lYft� .
:g'
2i1
l.':' Bild 17,20 Strikte Typdefinition fOr Zustandsvariablen
I>
E,gensct...ften [ur Enum Konstante startzust
Er
I
wm
I
fofmot lrIIl �
otJ� t-rbem1
1l!J
I 0B
ZeI\IO PrO
Worte oo.i"PrOOJ<.t
1aI...,·
"''''""",,",, Worte oo.i""""" ...... 1..., ·
�- B
_
Bild 17,21 Liste dermöglichen Zustände aufstellen
Bi l d 17.22 zeigt das Panel des Münzautomaten beim Start, Bild 17.23 nach der Produktaus wahl und dem Drucken der Taste 'Produkt kaufen'. Man sieht jetzt die Variable 'Münzaus wahl', die bis dahin verborgen war. Das Blockdiagramm besteht auch im Falle des Münzautomaten aus einer While-Schleife und einer Case-Struktur, die fürjeden Zustand einen eigenen Rahmen bereitstellt. Der Automat startet mit dem Anfangszustand 'lnitialisiere Münzwerte', der von außen mit dem Schieberegister der While-Sdlleife verbunden ist, siehe Bild 17.24. Die hier benötigten Daten erhält er über die Konstante 'Daten', die in Bild 17.24 links außerhalb der While Schleife zu sehen ist und über ein zweites Sdlieberegister zur While-Schleife führt. 'Daten' ist eine Clusterkonstante, kein Eingabe- oder AusgabeeJement! Deren lnitialisierung geschieht
folgendermaßen: 'Punktionen' -'Programmierung' - 'Cluster & Variant' aufrufen und von dort 'Clusterkonstante' in der dritten Zeile links in das Blockdiagramm ziehen. Sie steJlt sich zunächst als leerer Rahmen mit Doppelumrandung dar. Diesen Rahmen füllt man nun wie
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'
359
17.3 Milnzautomat
bei einer Clustervariablen mit den drei Arrays 'Münzwerte', 'Preise' und 'Rückgabe' sowie den beiden Integervariablen 'Preis' und 'Rest'. Siehe dazu die Anleitung in Abschnitt 4.5.1. t- 5totcmocnnc"
-
--
, -
Bild 17.22 Münzautomat unmittel bar nach dem Start. Warten auf die Produktauswahl des Kunden
•
,.
"
-
-
-
� ' ==:;:::::::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: �:: l:==� t;.'
, .d
Bild 17.23 Münzautomat nach Produktauswahl und Betätigung der Taste 'Produkt kaufen'
Die Konstante wird zunächst mit den Münzwerten gefüllt, die in 'Münzauswahl' gespeichert
sind. 'Münzauswahl' ist ein sogenannter 'Text- & Grafikring'. Hier sind die Bi l der der Münzen, ihre Stringbezeichnungen sowie die Münzwerte als Integerzahlen in Cents gespei
chert. Der Aufbau von 'Text- & Grafikring' erfolgt nach früher beschriebenen Prinzipien wie
folgt: •
•
'Elemente' - 'Modern' -'Ring & Enum' - 'Text- & Grafikring' aufs Panel ziehen. Münzbilder, die man z.B. unter Google mit dem Stichwort 'Euromünzen' finden kann, auf den eigenen Rechner kopieren und dann mit 'Bearbeiten' - 'Bi l d in Zwischenablage
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'
360
17
Professionelle Programmentwicklung
einfügen . . .' sowie im Kontextmenü von 'Münzau$wahl' mit 'Bild aus Zwischenablage
einfügen' n i 'Text- & Grafikring' kopieren. So verfahrt man mit allen Münzen, wobei man
m i Kontextmenü ab dem zweiten Bild 'Bild danach einfügen' wählt. Siehe dazu auch die ausführliche Beschreibung n i Abschnitt 4.6. Im Kontextmenü von 'Münzau$wahl' aufrufen: 'Objekte bearbeiten'. Man erhält dann
•
wieder das Fenster von Bild 17.15 und trägt dort links Münzbezeichnungen wie 'I Euro' und rechts Zahlenstrings wie ' 100' (gerechnet in Cent) ein. Dazu vorher 'Sequentielle
Werte' deaktivieren! Am Ende hat man eine Tabelle gemäß Bi l d 17.25 geschaffen.
Es ist zweckmäßig, zuletzt im Kontextmenü von 'Münzau$wahl' mit 'Fortgeschritten' -
•
'Anpassen' eine strikte Typdefinition zu erzeugen.
�
,
�abelMh ;; � p;;;:; t:�
�
I"
�
m
Im
D>l
Bild 17.24 Zustandsautomat (5tate MachineJ als MOnzautomat I> Elgen.chaften
lur RIfIII' M ....
z
L
........ ,,1>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
"'ooJ<.t ""'�""
"'_ <non
f1"iZ.·n �: : t ',
'- ". �t�lt=================;;:==j=-1
ilF· �J ", ..
�)
""
"o,.bo
[j]
D!I
011 :
Bild 17,27 Sichtbar- und unsichtbar machen verschiedener Elemente aufdem Panel, Rücksetzen 'Münz Rückgabe'
Der Kunde soll die Möglichkeit haben, am Automaten das gewünschte Produkt zu wählen. Nachdem er die Taste 'Produkt kaufen' betätigt hat, kann er nacheinander Münzen einwer fen. Er hat das Produkt erworben, sobald die eingezahlte Geldmenge größer oder gleich dem Kaufpreis ist. Er kann den Kaufvorgang auch vorher beenden. In diesem Fall bekommt der Käufer alle eingeworfenen Münzen zurück. Nach einer kurzen Wartezeit für die Entnahme der Ware und des WechseJgeldes steht der Automat für weitere Kaufvorgänge bereit. In Bild 17.28 wird der Zustand angezeigt, n i dem gewartet wird, bis der Benutzer das ge wünschte Produkt auswählt. Als Information wird der 'Preis' des gewählten Produkts ange zeigt. Erst wenn die Taste 'Produkt kaufen' gedrückt wurde, wird in den Zustand 'Zeige Münzauswahl' gewe<:hseJt. Solange der Benutzer sich noch nicht entschieden hat, wird der Zustand in Bi l d 17.28 beibehalten (Rückführung, dargestellt als kleiner Kreis im Zustands diagramm nach Bi l d 17.19). Der Kaufpreis wird als 'Preis' und 'Rest' in 'Daten' geschrieben und steht den anderen Zuständen zur Verfügung. Der Folgezustand 'Zeige Münzauswahl' ähnelt dem Zustand 'Zeige Produktauswahl' in Bi l d 17.27. Hier werden alle Frontpanel-Elemente für die Produktauswahl ausgeblendet und dafür die EingabeeJemente für die Münzwahl gezeigt, siehe Bild 17.29.
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'
363
17.3 Milnzautomat
'Rückgabe' im 'Daten'-Cluster wird zunächst auf ein leeres Array gesetzt und enthält später nach dem Kauf das Wechselgeld. Während der Eingabe der einzelnen Münzen sind diese erst einmal im 'Rückgabe'-Array m i 'Daten'-Cluster gespeichert, damit bei Betätigung des Schalters 'Abbruch' alle eingezahlten Münzen n i der Einwurfreihenfolge als Wechselgeld ausgegeben werden. Anschließend erfolgt der automatische Wechsel in den Zustand 'Warte auf 'Münze ein werfen", siehe Bi l d 17.30.
�o "
.
cm .
.0.
[j]
1
Bild 17.2B Zustand Warte auf 'Produkt kaufen'"
"
...",,,,,,,, 5t
"Irih >il,; 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',<0"""'-t. -
�
�Obefach
�. _100
e.e
R e.:
O
==
l �.
1 ..,....
e"
I!i::1 p.w.,.bo
t!!II
� ... ,
.
.
.
• "oe"" Kociob 'Wilfte ..J 'Im . _100' -
J
'"
.
[j]
.
.,
�
�
.. .
� ..
"" I"l
Dm
111
Bild 17.30 Zustand Warte auf 'Münze einwerfen"
In Bild 17.31 wird die Berechnung des Wechselgeldes durchgeführt. 'Rest' enthält nach dem Kauf eine Zahl kleiner gleich null. Deshalb muss vorher der Absolutbetrag gebildet werden. Beginnend vom höchsten Münzwert (2 €) wird innerhalb der FüR-Schleife der 'Rest' durch den Münzwert geteilt und die Modulofunktion 'Quotient und Rest' ausgeführt. Ist der Aus gang 'Quotient' gleich null, geschieht nichts. Für alle anderen Werte wird der Fall 'Vorein stellung' ausgeführt. Dieser erstellt ein neues Array mit 'Quotient' EJementen der entspre chenden Münze und fügt es der 'Rückgabe' zu. Der Ausgang 'Rest' dieser Funktion wird über das Schieberegister n i den nächsten Durchlauf zurückgeführt, bis alle 'Münzwerte' abgear beitet sind. Danach erfolgt der automatische Wechsel n i den Zustand 'Zeige Münzrückgabe ' an , siehe Bild 17.33
" .
�.
�aOOfa
Bild 17.31 Zustand 'Berechne Münzrückgabe'
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'
365
17.3 Milnzautomat
Der Zustand 'Breche Kauf ab' leitet ohne sonstige Aktivitäten direkt zum Folgezustand über. Wir hätten also auch direkt aus 'Warte auf 'Münze einwerfen" zum Zustand 'Zeige Münz rückgabe an' wechseln können. Doch macht es Sinn, auch Leerzustände einzuführen, um so ein besseres Verständnis von Zustandsdiagrammen zu gewinnen. Der Wert 'Rückgabe' im 'Daten'-Cluster enthält die bereits eingeworfenen Münzen. .
"",.... , ...,;
....dO"= "",,,,,,, te
Au.gabefoo:h
"""
ilF �'�'" liiJ
,
e", ...
,
"-
p-
.1-
[il
I-Ze9?""""'ÜCk,ob?on3
""
�.
:�
Bild 17,32 Zustand 'Breche Kauf ab'
Der letzte Zustand 'Zeige Münzrückgabe an' wartet fünf Sekunden für die Entnahme von Produkt und Wechselgeld. Danach springt der Automat von selbst in den Zustand 'Zeige Produktauswahl' zurück und ist bereit für den nächsten Kauf.
Bild 17,33 Zustand 'Zeige Münzrückgabe an'
Beachte:
Das eben behandelte Beispiel eines MOnzautomaten arbeitet mit dem Pollingverfahren, verbraucht also mehr Prozessorzeit als unbedingt erforderlich.
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'
366
1 7.4
17
Professionelle Programmentwicklung
Münzautomat mit Queues und Ereignisstrukturen
Das Beispiel im vorangegangen Abschnitt reagiert auf Zustandsänderungen, indem es un unterbrochen Benutzereingaben abfragt. Es wurde bereits in Abschnitt 14.6 darauf hin gewiesen, dass diese Vorgehensweise nicht optimal ist, wei l durch dieses Polling anderen Prozessen Ressourcen entzogen werden. Mittels Queues und Ereignisstrukturen lässt sich eine bessere, Ressourcen schonende Möglichkeit entwickeln. Wir greifen das vorangegange ne Beispiel aufund ändern es entsprechend.
Bild 17.34 Programm für MOnzautomat als 'QueuedStatemachine.vi'
In Bild 17.34 ist der Zustandsautomat dargestellt. Der untere Bereich unterscheidet sich, abgesehen von den Queue-Operationen, nicht wesentlich von dem in Bild 17.24. Im oberen Bereich wird die benötigte Queue erzeugt und mit dem Anfangszustand 'Initialisiere Münz werte' initialisiert. Unten links steht die Ereignisstruktur für die Benutzereingaben. Für fol gende Bediene1emente wurde das Ereignis 'Wertänderung' definiert, das gleichzeitig zur Zustandsänderung führt:
•
Produkt Auswahl
•
Produkt kaufen
•
Münze einwerfen
•
Abbruch
-7 Aktualisiere Preis
-7 Zeige Münzauswahl -7 Berechne Rest
-7 Breche Kauf ab
Sobald ein Zustand abgearbeitet ist, wird der nächste zu bearbeitende Zustand n i die Queue geschrieben. Anschließend folgen Ausschnitte der Bilder weiterer Zustände. Dabei unterscheiden sich Bi l d 17.35 und Bild 17.36 in ihrer Funktionalität nicht von den entsprechenden Bildern n i Abschnitt 17.3. Dort kann man eine ausführliche Beschreibung nachschlagen.
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'
17.4
Milnzautomat mit Queues und Ereignisstrukturen
367
Bild 17.35 Zustand
'Initialisiere Produkt auswahl/Preise'
Bild 17.36 Zustand
'Zeige Produktauswahl'
Bild 17.37 Zustand
'Aktualisiere Preis'
Der Rahmen 'Aktualisiere Preis' enthält keine Zustandsänderung, das heißt, es wird kein neuer Wert in die Queue geschrieben. Das führt dazu, dass die Funktion 'Aus Queue lesen' nicht ausgeführt wird. Die Ereignisstruktur bewirkt ein beliebig langes Warten - ohne Belas tung des Prozessors - auf ein neues Element. Erst wenn der Benutzer ein anderes Produkt ausgewählt hat, kann wieder aus der Queue geJesen 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'
368
17
Professionelle Programmentwicklung
Bild 17.38 Zustand 'Zeige Münzauswahl'
Der Zustand aus Bi l d 17.38 wird durch eine Wertänderung der Taste 'Produkt kaufen' er reicht. Danach wird automatisch in den Zustand 'Aktualisiere Rest' gesprungen, siehe Bi l d 17.39.
Bild 17.39 Zustand 'Aktuali siere Rest'
In 'Statemachine.vi' im vorigen Abschnitt erfolgte die Aktualisierung und Berechnung des Restbetrags n i einem Rahmen. Dies ist hier nicht mehr möglich. Würde man beide Zustände zusammenfassen, würde der Restbetrag gleich nach 'Produkt kaufen' zum ersten Mal ver ringert werden. Es ist aber nur sinnvoll, den Restbetrag zu korrigieren, wenn der Bed.iener eine neue Münze eingeworfen hat. Daher wird der Zustand 'Berechne Rest' erst dann ausge führt, wenn die Taste 'Münze einwerfen' gedrückt wurde.
Bild 17.40 Zustand 'Berechne Rest'
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.4
Milnzautomat mit Queues und Ereignisstrukturen
369
Vom Zustand 'Berechne Rest' (Bi l d 17.40) aus erfolgt der WechseJ in den Zustand 'Aktuali siere Rest'. Ist der Restbetrag kleiner gleich null, wird ein zweites Element in die Queue ge schrieben. Das bewirkt, dass der Zustand 'Berechne Münzrückgabe' ausgeführt wird, gleich nachdem der Restbetrag am Bildschirm aktualisiert wurde. "6erechne t-01zr
.
"
.,
.,. ""
f\tJ"uwet te
�. •
'Fr � ,
[j]
MOnll'ÜC
� � ...
"iml
•
Vor_e
.
� "
,
'"'
Bild 17A1 Zustand
'Berechne Münz rückgabe'
Bild 17A2 Zustand 'Breche Kauf ab' "'
.
�"
"
"'"
&IR��
� 1iiD ·
Proolit�ahI ...
pi"
n.�l
"""
Bild 17A3 Zustand
'Zeige Münzrück gabean'
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'
370
17
Professionelle Programmentwicklung
Die oben dargestellten Zustände entsprechen denen m i Abschnitt 17.3. Durch die Betätigung der Taste 'Abbruch' wird über die Ereignisstruktur der Zustand n i Bi l d 17.42 ausgeführt. Nachdem die Münzrückgabe erfolgt ist, wird die Produktauswahl angezeigt und der Auto mat ist rur den nächsten Kaufbereit. Merke: Das nunmehr behandelte Beispiel eines Münzautomaten nutzt Queues und Ereignisstrukturen. Es ist daher in Bezug aufsparsame Prozessorauslastung dem Pollingverfahren in Abschnitt 17.2 vorzuziehen.
1 7.5
Programmierhilfen
17.5.1
Arbeiten mit vorgefertigten Strukturen (Templates)
Bei der Erstellung eines Programms fangt man sinnvollerweise nicht jedes Mal von vorn an, sondern benutzt Tei l e früherer Programme. Das können eigene VIs sein, man kann aber auch mit Vorteil die n i der LabVIEW-Umgebung bereitgestellten 'Templates', d.h. vor gefertigte Strukturen nutzen. Wir haben darauf schon n i Abschnitt 17.2.2 hingewiesen, siehe Bi l d 17.6. Diese Struktur ist im Startfenster unter 'VI aus Vorlage. . .' zu finden. Doch gibt es dort noch eine Fülle weiterer Grundstrukturen, z.B. das MasterISlave-Entwurfsmuster, den Handler für Nachrichten-Queues usw., siehe Bild 17.44.
y",_ "" <10"" ''''i>ge ZU! ,,�«oe, W!;t«! """.-<:nt""f,""'.", ""�,,-,,,_. ...d",,= ou>Q
50_"" """ ccdo ..." rufot-...... [:.0 �.�_Sc_", _don """'indIo, ...,.9Oiot-.t
"
"'zu '''.n!""
�r....- donn�ot-.t, ,,,",,,, sic' nder �Op1�D"""b.h--deo,
� bBecmor b DoJct-.u
, !ilPolr-""",*,."YI
E1tJF\'",", \ill_es Proj
�
a _heI<
�l.d,"''''"''" ---
: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<:hlecht.vi. Schon der ungeübte LabVIEW-Programmierer erkennt, dass dieses VI Prozessorleistung vergeudet.
Bild 17.46 Ungeschickte, (PU-Leistung verschwendende Programmierung
Auch wenn der Anwender keine Werte ändert, berechnet das VI die in Bild 17.45 dargestellte Sinuskurve ununterbrochen neu. Man erkennt das schon im Task-Manager, der eine CPU Auslastung von 100 % anzeigt.
Bild 17.47 Anzeige des Task-Managers
Einen genaueren Einblick erhält man mit dem Werkzeug 'Profil - Leistung und Speicher': Man lädt 'SinusGraph_Schlecht.vi' mit 'Werkzeuge' - 'Profil' - 'Leistung und Speicher. . .' und ruft so das in Bild 17.48 gezeigte Fenster auf. Dieses starten (alle Anzeigen werden auf 0 zurückgesetzt), danach das VI starten und später wieder stoppen. Dann m i Profil-Fenster 'Schnappschuss' drücken. Man erhält so Z.B. die Werte von Bild 17.48.
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'
372
17
Professionelle Programmentwicklung
"" ....... ,,<>1:"""
WT
....-Dot ... ...
3 _w,,",�
'1_'"
5Yt1lI-D _
......,.. ..
.I.r, """H
"" '"-t ,,,,..t. ""..,. t.
0,0
Si",'
17'1<0
0,0
0,0
"iS, '
""" ",,,.romYl
t21 , ,
"
"" , <
17
0,0
0,0
"B. ;
L "''' '
,",0 ,", w'o.<
"..,...-rn
SiS,'
"""",ooIl--"�ht,� rn_lPdotetOt""'''i!rI(l. "'_T' ''P ..,.., 'K
'0''' '
�
.....o<E�'''' .;
31.1
"', '
_,0
L=.'
0,0 0O
31,1 ", '
0,0 0,0
0,0
0,0
0,0
0,0
",0
0O
0O
17<<0
0O
0,0
15,.
15,b
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
'7'"
15,6
<2 L , '
17'1'0
0,0
0,0
.
3l,2
� -I Itf.
Bild 17,48 Anzeige der Prozessorzeit für verschiedene Teile des Vis 'SinusGraph_Schlecht.vi'.
Die dritte Spalte zeigt eine Gesamtzeit des VIs von 1093,8 ms. Davon werden allein 984,4 ms für die unnötige Wiederholung der Funktion 'Sine Waveform.vi' verschwendet.
Mit einer einfachen Wartezeit von 10 ms kann man 'SinusGraph_Schlecht.vi' wesentlich verbessern, siehe Bi l d 17.49. Nach ungefähr lOOs Laufzeit ergibt sich das Profil in Bild 17.50.
Bild 17,49 Prozessor entlastende Programmierung in 'SinusGraph_Besser.vi' I> Pror�
,
l�lStun,und SpeIcher
p r....st."" .. " p r....... """''''''
--
5he Wove.vi 5he Wovefcnfl.vi srusGropll_Be,_ .vi ""_r,.., ...,.,,, '"'�'" ''''., . � mo_L<>d....OOO".� ""_�etO'me"�,vi ",,_b.3sicErrc
r
" VI·Z� S....Nl·Di>.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,elwe<' 0,' 0,' li8\,",
KiXzeste 0,0 0,0 li8",,",
, -, DiOOfi>nm 15,6 62,S 15,6 i6,9 lial,", 15,6
0,0
0,0
0,0
0,0
0.0
0.0
0.0
0
0,0 0,0 0,0
0,0 0,0 0,0 x"","
15,6 0,0 0,0
O 15,6 0,0 0,0 �,
.ti!
Bild 17.50 Statistik für 'SinusGraph_Besser.vi', Laufzeit von etwa 100 s, die Prozessorzeit ist viel kürzer
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
373
In 'SinusGraph_Gut.vi' erfolgt eine Berechnung nur noch bei Parameteränderungen. Der Schalter 'Signal zurücksetzen' in Bi l d 17.45 wird dabei allerdings wirkungslos, weil das Wan dern der Sinuskurve im Falle des Nichtzurücksetzens hier nicht mehr sichtbar wird.
l��=:::::::::�������
Bild 17.51 Prozessor noch stärker entiastende Programmierung in 'SinusGraph_Gut.vi' durch Nutzung der Event-Struktur
..
I> Prof,1
l ....tung
und Spe",he'
\1·Z,,",
5i>e W...,.e .'
5i>e W...,.efOfm ,'Gr�_W."; ""'_T,op Fgen P.,._er Error• . '
""'_M
�Vl-o..uer
0,0 15,6 0,0 1015,6 15,6 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0
Stopp
�
0,0
1
I
� . ""'"'"
'" '"
15,6 1031,2 0,0 0,0 0,0 0,0
'" 0
0,0
0
'" '"
1
�
Mtt_t K",ze
�
"""'"
'..... --
0,0
15,6 1015,6 0,0 0,0
0,0 0,0 0,0
I
0,0
15,6 15,6 0,0 0,0 0,0 0,0 0,0 ...
f
Bild 17.52 Statistik für 'SinusGraph_Gut.vi': Hier hat der Anwender 1 1 3 mal einen Parameter geändert. Nur in diesen Fällen entstehen Rechenzeiten für das Unterprogramm 'Sine Waveform.vi'
Im vorliegenden einfachen Beispiel könnte man natürlich auf das Profilbild verzichten. Mit einer gewissen Erfahrung weiß man auch so, was passiert. Für komplexere Programme trifft das allerdings nicht zu.
Merke: Bei der Entwicklung umfangreicherer Programmsysteme ist es sinnvoll, a)
mit vorgefertigten Strukturen (Templates) der LabVIEW Entwicklungsumgebung zu arbeiten und
b)
das Werkzeug 'Pr061 - Leistung und Speicher' zu nutzen.
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
Objektorientierte Programmierung
Lernzl.1e 1. Grundprinzipien derobjektorientierten Programmierung (OOP) erklären können. 2. Einfache Programme nach den Prinzipien der OOP unter LabVIEW entwickeln können. 3. Vererbung und Polymorphismus nutzen können. 4. Mit OOP erstellte Programme vor unbefugtem Einblick schützen können.
18.1
Warum objektorientiert?
Computerprogramme kann man auf sehr verschiedene Weise entwickeln, z.B. nach den Prinzipien der strukturierten Programmierung (siehe Kapitel 3) oder nach der Methode der Zustandsprogrammierung, die später in Kapitel 20 besprochen wird. Ein weiterer Ansatz nimmt sich das natürliche Verhalten von Menschen als Vorbi l d. Ein Mensch kann mit vielen komplexen Dingen seiner Umgebung, den Objekten, umgehen, ohne dass er eine Ahnung von ihrer Struktur hat. Er kennt z.B. einige Eigenschaften eines Hundes, seinen Namen, seine Farbe, seinen momentanen Zustand (müde, gereizt, hungrig . . . ). Er weiß ferner, wie er mit dem Hund umzugehen hat: Er kann ihm Befehle erteilen wie 'Sitz!' oder 'Hierher!'. Er kann
ihn mit einer Wurst locken. Dazu braucht er weder Kenntnisse über den Knochenaufbau des Hundes noch über die Struktur seines Gehirns. Er muss nur einige seiner Eigenschaften
kennen und einige Methoden, ihn zu beeinflussen. Dann kann er den Zustand und das Ver halten des Hundes ändern.
Diese Erkenntnis lässt sich auf die Programmierung übertragen. Hier ist ein Objekt ein Stück Software, das bestimmte Eigenschaften hat und durch bestimmte Methoden verändert wer den kann. Einzelheiten über die Struktur der Software sind nicht bekannt. Sie sind verborgen oder gekapselt (encapsulated). Verschiedene Objekte wirken zusammen, indem sie mit den verfügbaren (public) Methoden aufeinander zugreifen und die verfügbaren Eigenschaften, d.h. Variablen, ändern. Der Mechanismus, mit dem dies erreicht wird, ist die Klasse. Sie ist der Bauplan für eine Datenstruktur mit bestimmten Eigenschaften (Variablen) und Methoden (Funktionen). Sie ist aber noch nicht diese Datenstruktur selbst. Dazu muss die Klasse erst instanzi iert werden. Zum Vergleich mit der realen Welt: Die Skizze eines Hundes ist noch kein lebender Hund. So wie es nun mehrere Hunde einer bestimmten Rasse gibt, so kann es auch mehrere Instan zen einer Klasse geben. Dieses Prinzip ist schon von einfacheren Objekten der Informatik her bekannt: Der Typ einer vorzeichenbehafteten Integerzahl z.B. ist selbst noch keine Inte gerzahl, sondern nur h i r Konstruktionsplan. Erst die Zahlen 5 oder 7 oder -23 sind Instanzen dieses Typs.
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.1
Warum objektorientiert?
375
Verschiedene Instanzen einer Klasse können unterschiedliche Variablenwerte und Zustände haben. Wiederum zum Vergleich mit dem realen Leben: Es gibt nicht nur einen Hund, son dern verschiedene Hunde mit unterschiedlichen Namen, Farben und Gemütszuständen. Bi l d 18.1 gibt einen groben Überbick l über das Arbeiten mit Klassen, wie man es z.B. von
C++ her kennt.
Methode....fruf
(Aufruf"",
6ff.. Uichetl
Funktionen)
A_b"",_IIoIkn (A\ISUU$CII "'" öff..tlicbe
�
__
Objekt A
� O: �'kt B
__ ---__ __
Otrentliche (public) Eigenschaften
Offentliehe (PUblic) Methoden
Instanz von Klasse I
. . LI ------' Andere Klassen
Bild 18,1 Prinzipskizze: Die zwei Software-Objekte A und B wirken mit Hilfe von öffentlichen Eigen schaften (Variablen) und öffentlichen Methoden zusammen
Ein weiterer Aspekt aus dem realen Leben ist die Vererbbarkeit (in Bild 18.1 nicht dar gestellt). Man kann eine sehr allgemeine Beschreibung eines Hundes geben, ohne dabei auf Größe, Rasse und dgl. einzugehen. Alle Hunde sind Säugetiere mit vier Beinen und Fleisch fresser. Ein Dackel ist ebenso ein Hund wie ein Rottweiler. Also besitzen (erben) sie die oben genannten zwei Eigenschaften. Darüber hinaus haben sie jewei l s zusätzliche Eigenschaften, durch die sie sich voneinander unterscheiden. überträgt man das auf die Software, bedeutet dies Folgendes: Bei der Entwicklung einer speziellen Klasse nutzt man eine geeignete über geordnete Klasse, verwendet (erbt) ihre Eigenschaften und Methoden und programmiert nur diejenigen Eigenschaften und Methoden neu, die n i der übergeordneten Klasse nicht auftreten. Was spricht für OOP? Zunächst die Tatsache, dass vieJe Softwareprojekte erfolgreich auf diese Weise durchgeführt wurden. So hat man z.B. auch LabVIEW selbst als großes OOP Projekt entwickelt. Allerdings ließ sich für einen LabVIEW-Programmierer die objekt orientierte Methode bisher nicht zur Entwicklung seiner eigenen VIs nutzen. Er konnte zwar Eigenschafts- und Methodenknoten von LabVIEW verwenden, aber z.8. selbst keine Klassen
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'
376
18
Objektorientiertf Programmierung
bilden. Seit Version 8.2 hat sich das grundlegend geändert. Es gibt eine vereinfachte Versi on objektorientierter Programmierung auch für LabVIEW-Anwender. Eine dieser Vereinfachungen besteht darin, dass es in den Klassen nur noch private Daten gibt. Man kann auf sie ausschließlich mit einer der stets öffentlichen Methoden zugreifen. Somit haben wir hier in Abwandlung von Bild 18.1 eine Situation gemäß Bild 18.2.
Metbodcna.fruf (Aufruf.on ..lli<""" �If
Funktionen)
iI",ta_h V<>II Botochaft""
ObjektA
(AU>IaUoch V
1'--' -.
-.':' Objekt B
_ � _ _ _ _
Private Eigenschaft""
.. ötT""tlichc Methoden
Instanz von Klasse ]
.....
IL
--'
_ _ _ _ _
Andere Kla.'<..�n
Bild 18.2 Prinzipskizze: Unter LabVIEW wirken zwei $oftware-objekte Programm A und Programm B bei objektorientierter Programmierung nur mit Hilfe öffentlicher Methoden zusammen
Wir werden nun mit einfachen Beispielen zeigen, wie die objektorientierte Programmierung
im Falle von LabVIEW funktioniert. Die Frage, ob man dann OOP auch sofort und überall anwenden soll, ist damit noch nicht beantwortet. Als Vorzüge werden genannt:
•
Modularität. Man kann einzelne Bausteine abwandeln, ohne das ganze System zu ändern.
•
Kapselung. Der Anwender hat nur zu den als öffentlich erklärten Eigenschaften und Methoden Zugang.
•
Wiederverwendbarkeit des Codes.
•
vereinfachte Wartungsmöglichkeit.
Trotzdem erfolgt n i der Praxis die Wahl der Programmiennethode eher nach individuellen Gesichtspunkten. OOP allein ist noch kein Garant für die erfolgreiche Umsetzung von Soft wareprojekten, besonders wenn sich der Programmierer nicht mit dieser Methode identifi ziert.
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.2
Erstes Beispiel zur objektorientierten Programmierung
18.2
377
Erstes Beispiel zur objektorientierten Programmierung
In den folgenden Beispielen wollen wir die Funktion z=
F(x,y)
berechnen. Zunächst ist nicht klar, um welche Funktion es sich handelt. Man weiß nur, dass
zu den Werten zweier Variablen x und y nach irgendeiner Vorschrift ein Wert z zu ermitteln ist. Im konkreten Fall könnte z.B. z = x + y sein. Die Variablen x undy sollen Strings darstel len, dagegen z einen Double-Wert (OBi). Anderenfalls wäre es zu einfach. Wir versuchen, diese Aufgabe mit OOP zu lösen.
18.2.1
Bildung einer Klasse
Ab LabVIEW 8.2 bi l det man eine Klasse in folgender Weise: zuerst ein leeres Projekt anlegen (siehe Abschnitt 9.2) und unter geeignetem Namen, z.B. 'Test.lvproj', speichern. Dann ge
i d 18.3 im Kontextmenü von 'Mein Computer' aufrufen: 'Neu' - 'Klasse'. mäß Bl .. ero",kt ,.oloro, test """ '"
"".. hI"1zttilqen.. .
o._ "'"" "'"iloJeo.. .
--
""0""'0.0 �� ...... ..
Bild 18.3 Neue Klasse erstellen
Die Ansicht ändert sich nun entsprechend Bi l d 18.4. Achtung, die Klasse ist noch nicht auf der Festplatte gespeichert. Sie befindet sich nur im Arbeitsspeicher des Computers. I>
�
P'Olekl E.plorer Test I,prol'
�ti
� l: " • r.l PrD;e<:t: Te>t,4
B·
" K�"" l.ctl
: "l Al:�ffi i:; W,j·5pezticot........,
Bild 18.4 Neue Klasse mit dem Namen 'Klasse "
Die Klasse kann jetzt unter einem Namen gesichert werden. LabVIEW sieht für alle Klassen definitionen die Erweiterung
'>t .Ivdass'
vor. Im Gegensatz zu normalen benutzerdefinierten
Bedienelementen, die im Abschnitt 9.5 beschrieben sind, wird das Bedienelement 'Klasse I.cd' nicht unmittelbar auf der Festplatte gespeichert, sondern n i die Ivdass-Datei eingefügt. Es kann also nur indirekt über die Klasse geöffnet werden. In 'Klasse l.et!' kann man die privaten Variablen definieren. Versucht man jetzt, das geänderte Projekt zu speichern, erhält man den Hinweis, dass nicht alle Daten im Projekt auf der Festplatte vorliegen, siehe Bild 18.5. Folglich speichert man erst
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'
378
18
Objektorientiertf Programmierung
das neue Element, normalerweise unter einem selbst gewählten Namen. Hier verwenden wir statt 'Klasse I' den Namen 'Addition' und speichern erst dann.
"";;� ; "'T.:;-:""I :: "Te>l,"""oj" bezieIJ: >ich eJ: neue, lXl9!'>peO:Oe
konn
«>t 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
-�"
5peichefn lXlte< �
Ale �n (die", K�"')
Bild 18.8 Neue Methode ('Dynamisches VI') erstellen
Zur Erstellung einer Methode muss man m i Kontextmenü von 'Addition.lvdass' den Eintrag 'Neu' - 'Dynamisches VI' wählen, siehe Bi l d 18.8. Damit wird automatisch ein VI geöffnet, dessen Frontpanel n i Bild 18.9 und dessen Diagramm n i Bild 18.10 zu sehen ist, nachdem es zuvor unter dem Namen 'Setzen. vi' gespeichert und das Standardsymbol geändert wurde.
- """
Bild 18.9 Frontpanel des automatisch erzeugten dynamischen VI nach Speicherung als 'Setzen.vi'
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'
380
18
<:>
•
•
Ioo � ,.f
' :l
: ""
<1;; .
Objektorientiertf Programmierung
,.-
Bild 18.10 Blockdiagramm des automatisch erzeugten dynamischen VI. Der Name wird zu 'Addition.lvelass:$etzen.vi', nach dem man das VI als 'Setzen.vi' gespeichert hat
•
Da die Methode 'Setzen.vi' für jede Instanz gültig ist, muss angegeben werden, auf welche Instanz sie angewandt werden soll, damit stets die richtigen Daten verwendet werden. Dazu erzeugt das System automatisch zwei LabVIEW-Objekte, hier 'Addition in' und 'Addition Ausgang' im FrontpaneL Sie sind mit dem Anschluss des VI als 'Dynamischer Dispatch Eingang (erforderlich)' bzw. als 'Dynamischer Dispatch-Ausgang (empfohlen)' verbunden. Seide Anschlüsse sind im PaneJ des Programms von Bild 18.9 im Anschlussfeld oben rechts mit einer gestrichelten Markierung dargestellt. Man sieht das, wenn man im Kontextmenü des Anschlusses 'Anschluss anzeigen' wählt. Hier wurde der Name des Dispatch-Eingangs noch in 'Addition Eingang' abgeändert (mit Buchstabe A n i der Werkzeugpalette). Man kann nun erstens das Diagramm mit Eingängen für 'xs' und 'ys' versehen und zweitens das Symbol von 'Setzen.vi' m i Frontpane1 ändern. Dann erhält man ein neues Diagramm gemäß Bi l d 18.11 und ein neues Frontpanel entsprechend Bild 18.12 mit den Eingabe elementen 'xs' und 'ys', die mit dem Anschlussfeld des VIs verbunden sind. anz-, erojolot ,o,ushh.... 'l'lerl
&.o '! ..t
l��tart
•
Bild 18_11 Diagramm 'Addition.lvclass:$etzen.vi' mit Eingangsvariablen ')(5' und 'ys'
Die Programmierung des Diagramms wird so durchgeführt: Dem 'Addition Eingang' werden nun die Werte für 'xs' und 'ys' zugewiesen (die Namen dieser privaten Variablen sind der
Klasse schon aus 'Addition.ct1' bekannt). Die Zuweisung erfolgt durch 'Funktion' 'Programmierung' - 'Cluster & Variant' - 'Nach Namen bündeln' und anschließend im Kon
textmenü der Eingänge 'xs' und 'ys' mit 'Erstellen' - 'Element'. Ferner sind 'xs' und 'ys' als Eingänge im Anschlussfeld einzutragen (siehe Abschnitte 5.2.1 und 5.2.2)! Nur so kann der
Anwender die privaten Variablen von außen beschreiben.
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.2
Erstes Beispiel zur objektorientierten Programmierung
381
- .!J 0
l��iiii=�::::==:::: :: :::::: ==!: :: �� �Corrt'.l:..
•
I.....
::T
•A
Bild 18.12 Frontpanel 'Addition.lvdass:$etzen.vi' mit den Eingangsvariablen 'xs' und 'ys'. Auch im Anschlussfeld sind 'xs' und 'ys' als Eingangsvariablen einzutragen
Ganz entsprechend der Methode 'Setzen.vi' werden die Methoden 'Konvertieren.vi' und 'Addieren.vi' programmiert. 'Konvertieren.vi' wandelt die Zahlenstrings in Variablen vom Typ Double um und 'Addieren.vi' steht für die Bildung von x + y. Dabei sind für den Anwender nur 'Setzen.vi' und 'Addieren.vi' von Interesse, weil er damit Daten ein- und ausgeben kann. Das dritte Programm 'Konvertieren.vi' dient dem Arbeiten mit den privaten Klassendaten. Die Diagramme dieser beiden anderen Methoden (oder dynamischen Vls) finden sich in Bi l d 18.13 und Bild 18.14. Zu beachten ist, dass 'Addieren.vi' die Funktion 'Konvertieren.vi' als Methode (dynamisches Unterprogramm) verwendet.
j
Bild 18.13 Diagramm
'Addition.lvdass:Konvertieren.vi' mit den privaten Variablen 'xs', 'ys' und den Ausgängen 'x' und Y
Bild 18.14 Diagramm
'Addition.lvdass:Addieren.vi' mit der Ausgangsvariablen 'x + y. Sie ist im Anschlussfeld als Ausgangsvariable einzutragen. Hier wird auch das oben beschriebene dynamische VI 'Konvertieren.vi' verwendet
Der Projekt-Explorer besitzt nun Eintragungen gemäß Bi l d 18.15.
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'
382
18
Objektorientiertf Programmierung
PrOjekt EHpiorer Iest!vproj :.J.gJ� I �ei �-.,.., � tr� �"" Werheugt �
I>
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.
A
Geor�.ef<.rition,Jv.;�s ......
...
Bild 18.19 Eingabedialog 'Vererbung ändern'
Der Dialog in Bild 18.19 enthält eine hierarchische Liste aller Klassen, die im aktueUen Projekt enthalten sind. Die ausgemalte Raute markiert die aktueUe Klasse, deren Verer bungseigenschaft geändert werden soU. Wir klicken jetzt auf 'AbstrakteFunktion.lvelass' und aktivieren 'Vom gewählten Objekt ableiten', Man erhält so die geänderte Vererbungshierar chie nach Bild 18.20 und bestätigt mit 'OK'. I>
Add,t,on Ivela.. Kla••en�,gen.chaften "
.
x
AIQeme;ne Enst� DoI<J..mertotün
Obje+1_
Bild 18.20 GeänderteVererbungshierarchie
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'
Weitere Beispiele zur OOP
18.3
385
Tun wir dasselbe auch für die Subtraktion, sehen wir m i Projekt-Explorer einen Zwischen stand nach Bi l d 18.21.
Ei
lW Pro;e+1: Te>tU,voj
8 ' Me;n Compo..te<
� • Abstrooktef'lXlktoo.O--d ", .. Abstroktef'lXlktoo.ctl � SetZffi.'; � 1' .p d §!!h e l � • AddItoo.O--d", .. Additoo.ctl � _ffi.'; 8 . 5ct>trooktoo.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.
SUJtrol<öon.�
-
AddItoo.MIos.
B•
"
"
=:::3'- D:.:c
';b
[::1'-1r-11__ �7g' , .,
•
�"
�
lm lJl
--
GJ
El
-_......
- � - -)
!
,�
� '"
Bild 18.22 Diagramm von Test.vi
T?,
_ c....
� .,..
'M
,.
�
'"
Bild 18..23 Frontpanel von Test.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'
386
18
Objektorientiertf Programmierung
Zum überprüfen der Funktionalität dient Test.vi. Es entspricht dem Objekt A in Bild 18.2. Diagramm und Frontpanel sind n i Bild 18.22 und Bi l d 18.23 dargestellt Zur Bildung von Test.vi zieht man 'Addition.lvdass' und 'Subtraktion.lvelass' vom Projekt Explorer aus auf das Frontpanel. Danach holt man sich in gleicher Weise die Methoden 'Setzen', 'Addieren' und 'Subtrahieren' ins Diagramm und verbindet alle Symbole nach dem Schema von Bild 18.22. Wie erhält man die Symbole mit Plus- und Minuszeichen für die Klassen? Standardmäßig sieht
man
hier einen Würfel mit einer Nummer, welche die Reihenfolge der Bildung im
Projekt-Explorer angibt. Antwort: 'Addition.cd' aufrufen und dann im Kontextmenü des Anschlussfeldes 'Symbol bearbeiten . . . ' wählen. Anschließend wie üblich ein eigenes Symbol editieren. Entsprechend geht man mit 'Subtraktion.ctl' vor.
IAufgabe 18.3 Ergänzen Sie das Projekt 'TestLivproj' um Klassen zur Multiplikation und Division, die ebenfalls von 'AbstrakteFunktion.lvdass' erben sollen. Schreiben Sie die individuellen Programme 'Multiplikation.lvdass' und 'Division.lvdass' sowie ein Testprogramm, das auch diese beiden Operationen mit überprüft.
Merke: Bei der objektorientierten Programmierung (OOP) ist ein wichtiger Vorteil die Möglichkeit, von einer Basisklasse aus Eigenschaften und Methoden an untergeordnete Klassen zu vererben. Man muss die dynamischen VIs, welche die Methoden bilden, nur einmal in der Basisklasse programmieren. Die Wahl, welche Klasse von welcher anderen erbt, wird im Kontextmenü der
unterzuordnenden Klasse unter 'Eigenschaften' getroffen.
18.3.2
Polymorphie
Die im letzten Abschnitt beschriebene Methode hat den Nachteil, dass die Vls für Addieren, Subtrahieren usw. jeweils mit einem eigenen Namen neu entwickelt werden müssen. Elegan ter wäre es, eine Methode 'Rechnen.vi' in der Basisklasse 'AbstrakteFunktion.lvdass' einzu führen, die von den verschiedenen abgeleiteten Klassen nur noch zu modifizieren ist. Die Idee dabei ist, dass 'Addition.lvclass', 'Subtraktion.lvdass' usw. die Methode 'Rechnen.vi'
zunächst erben, dann aber so modifizieren ('überschreiben'), dass sie F(x,y) = x + y bzw.
F(x,y) = x -y bilden und so fort.
Wir entwickeln also ein Projekt 'Test2.lvproj'. Da die Programme für die Operationen
F(x,y) = x + y, F(x,y) = x - y usw. alle den gleichen Namen 'Rechnen. vi' haben sollen, kann man sie nicht mehr wie bisher in einem einzigen Verzeichnis unterbringen. Wir benötigen Unterverzeichnisse, die wir mit den Namen 'Addition', 'Subtraktion' usw. versehen. Der Projekt-Explorer zeigt sich nach der Behandlung von Addition und Subtraktion nunmehr entsprechend Bild 18.24. Die Verzeichnisse, in denen die Klassen und VIs gespeichert sind, verdeutlicht Bild 18.25. 'Rechnen.vi' in der Basisklasse 'AbstrakteFunktion.lvdass' ist in Bi l d 18.26 dargestellt.
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'
Weitere Beispiele zur OOP
18.3 I>
387
'I!llii E
Projekt EHplorer Test21vproJ
Q.otei �",tdffi AnzeiQe<1 Pro;e+1 AusfChffi We
" Ei lW Pro;e+1: Te>l2.,">
Te>l.\oi
Bild 18..24 Polymorphie: Die Methode 'Rechnen.vi' taucht in drei verschiedenen Klassen auf
Y �ffi
·it Buid-5pezthtOrief1
't W 1 li1iH@ij@f'h In q.;i!1!t!
r Q.otei
�",be
"" - - " � �� l it" M" 'm10 Ade:;:,. lu O:\lotlYl'W .....coeh,...,.. PdJ.>ge\�\""\Gec<""",,d g Woch> J.
Or
<>-
� �Sct.troktoo
� l.bstrokt.rlX"lktoo.�c�, ilMdetffi." ID torwe
,, " 11 1'1
� T'""?'''"'''' < Te>l2.,">
"
•
�
T
Dot_
""
m
27KB
.IJ TA"'_"""
lobVIEW Project lobVIEW Jnstr,"""",,
�
ffi zu
22.(15.2007 16:58 22.(15.2007 16:58 22.(15.2007 16:20 22."".20070"0'
22.05.2007 16:21 22.05.2007 16:21 22.05.2007 16:21 22.05.2007 05:07 ??,",,?m7 ",'" 22.05.2007 16:59 22.05.2007 16:17
l .!.l
Bild 18.25 Verzeichnis mit dem Projekt 'TesU.lvproj', der abstrakten Klasse, verschiedenen Metho den und dem Testprogramm. Die abgeleiteten Klassen für Addition und Subtraktion befinden sich neben den Varianten von 'Rechnen.vi' in den UntelVerzeichnissen 'Addition' und 'Subtraktion'
Bild 18.26 Muster für 'Rechnen.vi' in der Basisklasse 'AbstrakteFunktion.lvclass'. Der Ausgang 'F(x,y)' ist nicht verbunden. weil die Art der Funktionsbildung noch offen ist. Jedoch ist 'F(x,y)' im Anschlussfeld des Frontpanels als Ausgang einzutragen
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'
388
18
Objektorientiertf Programmierung
Der Ausgang 'F(x,y)' ist im Anschlussfeld des VI als Ausgang markiert, doch ist er nicht mit den anderen Teilen des Diagramms verbunden, weil n i der Basisklasse noch nicht festgelegt werden kann, wie F(x,y) später gebildet wird. Deshalb sollte 'Rechnen.vi' aus der Basisklasse auch nicht aufgerufen werden. Geschieht es versehentlich doch, weist Fehlerausgang 5000 mit einem entsprechenden Text darauf hin. Diese Fehlerkonstante ist ein Cluster, das man erhält, indem man bei 'error out' im Kontextmenü 'Erstellen' - 'Konstante' anfordert und dann die entsprechenden Daten einträgt. Im Case-Fehlerteil ist 'error n i (no error)' mit 'error out' verbunden. Nun müssen die Klassen 'Addition.lvdass' U$W. eine geänderte Rechenfunktion erhalten.
Dazu im Kontextmenü von 'Addition.lvdass' wählen: 'Neu' - 'Überschreib-VI'. Man erhält ein Fenster nach Bild 18.27 mit einer Auswahl aller Funktionen der Basisklasse. � Neu
U b ." sch,e,ben
_: DM �eId"NoetJ· Ci>ermebe
�eId�he�aoJweist ....-.d aoJ dom o..tent,. ��.
C«
I
Abbredwl
I
....
Bild 18.27 Fenster zur Auswahl der Funktionen aus der Basisklasse, die man in einer abgeleiteten Klasse überschreiben möchte
Hier wählen wir 'AbstrakteFunktion.lvdass:Rechnen.vi', bestätigen mit 'OK' und erhalten eine veränderte Funktion mit einem Diagramm gemäß Bi l d 18.28.
Bild 18.28 Durch 'Neu' - 'Überschreib-Vl'
in der Klasse 'Addition.lvelass' abgeleitete Rechenfunktion. Der Block in der Mitte deutet an, dass hier die Funktion 'Rechnen' der Basisklasse aufgerufen wird, die nun durch die jeweils passende Funktion zu ersetzen ist Nun ersetzen wir das 'Rechnen'-Symbol n i der Mitte von Bild 18.28 durch 'Konvertieren.vi', korrigieren den Ausgang für F(x,y) und kommen schließlich nach Änderung des VI-Symbols zu einer Funktion entsprechend Bild 18.29.
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.3
Weitere Beispiele zur OOP
389
Bild 18..29 Hier wurde aus F(x,y) die spezifische Funktion 'x+y' gebildet
'
Der Ausgang 'x + y muss im AnschlussfeJd des Frontpanels als Ausgang eingetragen sein. Anderenfalls ist das VI fehlerhaft. Es benötigt nämich l als abgeleitete Funktion stets dieselbe Anschlusskombination wie das VI der Basisklasse, von der es geerbt hat.
IAufgabe 18.4
Ergänzen Sie m i Projekt 'Test2.lvproj' die noch fehlenden Klassen für Multiplikation und Division. Bilden Sie die entsprechenden abgeleiteten Funktionen 'Rechnen.vi' und über prüfen Sie Ihre Ergebnisse in einem erweiterten 'Test.vi'.
Merke: Bei der objektorientierten Programmierung kann man von einem Programm der Basisklasse beliebig viele gleichnamige Programme mit jeweils unter schiedlichen Funktionen ableiten (Polymorphie). Doch gehören diese in ver schiedene Unterverzeichnisse. Das Anschlussfeld der abgeleiteten Funktion muss die gleiche Struktur wie das der Funktion der Basisklasse haben.
Bemerkungen: 1. Macht man einen Fehler, z.B. indem man vergisst, die Anschlussfelder abgeleiteter VI
gleich zu strukturieren, werden alle Methoden der Klasse und der abgeleiteten Klassen fehlerhaft. Es ist dann oft mühsam, den Fehler zu entdecken. Man geht in diesem Fall am besten durch die Diagramme aller VI und sucht nach gebrochenen Verbindungen und h i ren Ursachen. Ferner sollte man n i den Anschlussfeldern der Frontpanels 'Anschluss zeigen' aufrufen und die Eintragungen überprüfen, besonders hinsichtlich der Überein stimmung bei abgeleiteten Funktionen. 2. Im Beispiel von 'Test2.lvproj' hat die Methode 'Konvertieren.vi' zwei Aufgaben: Konvertierung von String nach DBL, - Ausgabe von zwei DBL-Variablen, die nunmehr für den Anwender verfügbar sind. Es ist üblich, besonders n i komplexeren Fällen, diese beiden Funktionen auch auf zwei verschiedene Methoden zu verteilen. In unserem BeispieJ heißt das, eine Methode 'Holen. vi' getrennt von 'Konvertieren.vi' zu entwickeln.
' ' 3. In 'AbstrakteFunktion.ctl' kann man auf alle privaten Variablen außer 'xs' und ys ver
zichten. Bild 18.30 zeigt das. Die anderen Variablen werden daraus errechnet. Würde
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'
390
18
Objektorientiertf Programmierung
' '
man dagegen auch 'xs' und ys weglassen, erhielte man bei der Programmierung von 'Setzen.vi' eine Fehlermeldung, weil man dann aus dem Eingang der abstrakten Funktion nicht mehr mit 'Punktionen' - 'Programmierung' - 'Cluster & Variant' - 'Nach Namen ' bündeln' Werte für 'xs' und 'ys einführen könnte. "-"�
�"tdon
!>oz"'>on
--� -
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 , che<1
(GZ):
10 100 __ l00J
__
�'.--,Zeiche<1 __
�
--
(HZ):
" =
-
)
,
�"
P' I l!I
r,;; "'e "'-J
''''' �""'
� E
I�l
"
...de
beOe C"",·5tn.ttl..-e", ;o
o/I!K"'inschr�ibur>Q 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 _'''''''''
&nzeiQ
!\C>fCh!!<1 \,!:e
I
"tlQjij
•
:".
�.
".
rnr·
m",,,
�
/:::
I tl'J
I
•
Bild 18.33 'Konvertieren.vi' im Falleder Umwandlung römischer Zahlenstrings P Te st vl
,., �,
,.,
.�
"""
-� .
Bild 18.34 Rechnen mit römischen Zahlen: 503 + 4 507 und 503 - 4 499 ==
==
Wir können nun im einfachsten Fall im Projekt 'Test2.1vproj' die Methode 'Konvertieren.vi' im Sinne von Bild 18.28 ändern. Rufen wir dann 'Test.vi' auf, erhalten wir beispielsweise ein Panel wie n i Bild 18.34. Der Nachteil des Überschreibens von 'Konvertieren.vi' besteht darin, dass nun das Rechnen im üblichen arabischen Zahlensystem nicht mehr möglich ist. Man sollte die Auswahl haben, in beiden Zahlensystemen rechnen zu können. Die Idee dazu ist:
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
393
1. Anwendung einer zweistufigen Vererbung. 'Konvertieren' wird zuerst von 'Abstrakte Funktion.lvelass' vererbt, dann von 'Addition.lvelass' zu 'Roemisch_Addition.lvelass', von 'Division.lvelass' zu 'Roemisch_Division.lvelass' usw. 2. Die Vererbung erfolgt als 'Oberschreib-VI', d.h., n i der abgeJeiteten Klasse ändern sich die Eigenschaften von 'Konvertieren'. 3. Wenn die Zeichenkette eine gültige römische Ziffernkombination liefert, wird mit dem VI nach Bi l d 18.32 gearbeitet. Anderenfalls erfolgt die übliche Konvertierung mit der Bibliotheksfunktion für arabische Zahlenstrings.
4. Wir benötigen nun endgültig eine Methode 'Holen.vi'. Anders haben wir nämlich mit dem abgeleiteten 'Konvertieren.vi' keinen Zugriff mehr auf die Daten der Basisklasse. Wir versuchen nun, die Aufgabe mit 'FvonX_Y.lvproj' zu realisieren. Die Struktur der Ver zeichnisse ist in Bild 18.35 dargestellt.
s o��
tl /Mtm tl Divi>ion tl fUopil<.>too
tl Roe_h_MdOn tl Roe_hJ>ivi
'" '"
Iil e ."-'F'GA lil i:J lobNO Iil t:J lobru:h Iil i:J lmro:hßltorne< I!lt::l lOSOJ1:)ef1
,
-
IoJMdbo" CI"·-
ClfU�oo
ClRoerrnhj'dditoo ClRoerrnh_"""'1On CJRoerrnhJ'tJt�Koton I;,.)Roerrnh_5ct.tr"-too
t)5ct.trofb:n [§o,wrolteflXll1m.odm
l!Ifvcn;O.iM<e, lW-fvcn;O.'voJ
Il Hoiffi . � iaKortVe
IlR0ffiJi9:hH.ochDtJ. .,; Il�,on..,; Ii '."A! ";
""_dnoo ""�",dnoo
�-� �-� �-� �-�
�2'.05.200709.33 20.05.200709." 20."".20070''-'2 "."".200709.13 "."".200709.13 29.05.200709.13
c..t_<Tie< 29.05.200709. 13 c..t_dne< 29.05.200709.33 21KB l.tNIEWl.tNEWC�, 2/.05.2007 19. 16 1 KB i'LIASES-D.tei 29.05.200709.3'1 5'1KB liob\'lEWProje[t 29.05.200709.31 18KB liob\'lEWlnstr>Xfl
Bild 18.35 Aufbau der Verzeichnisse und UntelVerzeichnisse fOr das Projekt 'FvonX_Y.lvproj'
l d 18.36. Der Projekt-Explorer zeigt für 'FvonX_Y.lvproj' eine Struktur nach Bi Eines der Unterverzeichnisse n i Bild 18.35 heißt 'Roemisch_Addition'. Sein Inhalt ist in Bild 18.37 dargestellt. Zuerst werden nun die Methoden 'Setzen.vi', 'Holen.vi', 'Konvertieren.vi' und 'Rechnen.vi' programmiert. 'Setzen.vi' bleibt unverändert, wie in Bild 18.11 gezeigt. Nur das Symbol wur de gemäß Bild 18.38 angepasst: Mit der Bezeichnung 'n.nn' im Kopf soll angedeutet werden, dass es sich zunächst um die gewöhnliche arabische ZahlendarsteIlung handelt. Das Diagramm der Methode 'Holen.vi' ist n i Bild 18.38 dargestellt. Es entspricht in seinem Aufbau der Methode 'Setzen.vi', nur speist es keine Daten in die Klasse ein, sondern gibt sie nach außen 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'
394
18
Objektorientiertf Programmierung
_ C<>oW..
•
Abstrold:eFtrltinlvd.3.>s
.. __critOon,ctI L, � _ . 'Ii
L
H il lti!n·vI � I§ Reo:men.vI L ijj
•
Ko,werti".."•.,;
ilddbon,Nd4s.
" Aden..,
Blkl 18.36 Aufbau des Projekts 'FvonX_Y.lvproj'
�:� 1� Ado"*" Or'*-
-I
�P'f. [....OrU<\ .
- t
E !Ir"
� ��
:.JQW
, �-
/mi -
D:U.obVfEWJ:� 3. AI.tIaQe\Beispiele\l(I�\;\RoenOKh.J'
O '�'I
"
}
_.
ilirOO'lYeftierffi.vI
t"E':l!n1
�Roerniodl_Addt""'.I.,.d.... -I
�� , ,�
lob�1EW 1nstf\IJlffit
.
10 ·
�--· I
I GNn:Iort ..
L"'�IEW L"'�IEW a...
28 .OS. 200 7 18:59
28.05.200718:59
I .!..I
Bild 18.37 Ordner 'Roemisch' mitdem zweimal abgeleiteten 'Konvertieren.vi' und der Klasse 'Roemisch_Addition.lvclass'
Bi l d 18.39 zeigt das Diagramm von 'Konvertieren.vi'. Dieses VI hat sich gegenüber der alten Methode gleichen Namens verändert. Die Daten werden nicht mehr direkt durch Auf schlüsseln der privaten Daten von 'AbstrakteFunktion.lvclass' gewonnen, sondern mit Hi l fe der Methode 'Holen.vi'. Die Methode 'Holen.vi' ist notwendig, damit auch eine 'erbende' Klasse wie z.B. 'Roemisch_Addition' aufdie Daten der Basisklasse zugreifen kann. 'Rechnen.vi' ist mit der in Bild 18.25 dargestellten Methode identisch, abgesehen vom geän derten VI-Symbol, das in Bild 18.40 rechts oben zu sehen 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'
18.3
Weitere Beispiele zur OOP
395
Bild 18.38 Diagramm der
Methode 'Holen.vi'
-(y>z� r.. Qol. ��r . (;>
-."'.'_ "...0 ....
-
"
0,," �....
I
•
"....,,"'
,
�.
� '" '''''' �_ftort .
' 0'
rm ..•
..t()( �lm "'torl
�.-
.
;.,.
-."'.,_ ....
" ..
r'.i..
.
�
..",,
I
(�,I . ....
-.... �
J
ill
Bild 18.39 Diagramm der Methode 'Konvertieren.vi'
Wir leiten nun, wie schon n i Abschnitt 18.3.1 beschrieben, die Methode 'Rechnen.vi' für die Klassen 'Addition.lvdass', 'Division.lvdass', 'Multiplikation.lvdass' und 'Subtraktion.lvdass' durch 'Neu' - 'überschreib-VI' im Kontextmenü ab. Die Methode 'Addition.lvdass: Rech nen.vi' hat dann nach entsprechender Korrektur durch Einfügen von 'Konvertieren.vi' ein Diagramm gemäß Bi l d 18.40. "'.
Bild 18.40 Diagramm von
'Addition.lvelass: Rechnen.vi' nach dem Einfügen von 'Konvertieren.vi'. Das vom System zunächst automatisch erzeugte VI wurde bereits in Bild 1828 dargestellt
Sinngemäß sind die Varianten für das abgeleitete 'Rechnen.vi' bei den übrigen drei Klassen zu entwickeln. Der nächste Schritt besteht nun darin, die Methode 'Konvertieren.vi' an die in zweiter Stufe abgeJeiteten Klassen 'Roemisch_Addition.lvdass', 'Roemisch_Division. lvdass', 'Roemisch_ Multiplikation.lvdass' und 'Roemisch_Subtraktion.lvdass' zu vererben und dort individueU zu modifizieren. Im Kontextmenü von 'Roemisch_Addition.lvdass' hat man zunächst mit
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'
396
18
Objektorientiertf Programmierung
'Eigenschaften' - 'Vererbung' für eine Abhängigkeit gemäß Bild 18.41 zu sorgen. Entspre chend ist mit den drei anderen Klassen zu verfahren. RoemlSch_Add,tlon Ivela•• Kla••ene,genschaften
I>
rot......,.
AIQeme;ne Enst�
x
,.
Doi<J..mert.bon Objektein
Bild 18.41 'Addition.lvclass' erbt von 'AbstrakteFunktion.lveiass' und 'Roemisch_Addition.lveiass' erbt von 'Addition.lvclass'
Bild 18.42 Diagramm des vom System automatisch erstellten VI für die abgeleitete Methode 'Konvertieren,vi' I>
Roeffilsch_Add,t,on Ivela•• KonvertIeren VI Blockd,agramm auf Me", Computer "
erret)
Bild 18.43 Modifikation des Musters für 'Konvertieren.vi' aus Bild 18.42 für 'Roemisch_Addition.lveiass'
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
397
Nun ist 'Konvertieren.vi' zu modifizieren. Im Kontextmenü von 'Roemisch_Addition.lvdass' erhält man mit 'Neu' - 'überschreib-VI' nach Auswahl von 'AbstrakteFunktion.lvdass: Set zen.vi' zunächst ein Standard-VI gemäß Bi l d 18.42. Dieses VI wird entsprechend dem Bei spiel in Bild 18.43 für jede der vier Roemisch-Klassen modifiziert. Der Sinn dieser etwas mühsamen Umfonnung ist folgender: Das Holen-VI versorgt die unteren beiden Blöcke in der Mitte, die das Symbol für das in Bild 18.32 dargestellte Kon vertierungsprogramm römischer Strings in Zahlen darstellen ('RoemischNachDbl.vi'), mit den Strings 'xs' und 'ys'. Der darüberliegende Block mit dem Symbol zum Aufruf der über geordneten Methode 'Konvertieren.vi' erhält dieselben Daten direkt aus der Leitung 'Roemisch_Addition Eingang'. Ist nun z.B. der String 'xs' nicht römisch, iefert l 'Roemisch NachDbl.vi' als Wert die Zahl O. In diesem Fall wird über die 'Auswählen'-Funktion rechts der Zahlenwert von der übergeordneten Konvertierungsfunktion geholt, die arabische ' ' Strings konvertiert. Entsprechendes geschieht mit ys . Das bedeutet, dass der Anwender die Strings auch gemischt eingeben kann, etwa einen römischen String für 'xs' und einen arabi ' schen für 'ys oder umgekehrt. Bi l d 18.44 zeigt ein Beispiel.
f(',v) •
f3,,.,;
-- � , � .....
I
�
Bild 18.44 Gemischtes Rechnen mit römischen und arabischen Zahlen
Das Diagramm des Testprogramms 'TestAll.vi' ist in Bild 18.45 zu sehen. Man beachte die im Vergleich zur doch recht anspruchsvollen AufgabensteIlung sehr übersichtliche Anordnung, die dank OOP möglich wird. I> Te.tAU v, Blockd,agramm auf'1em Computer
" " " . Fl>"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 do<_ K�_�""",",
VI "Test,.;" """'" ',IMIowt I,.; tabVIEW
KIossem>et"""," • 5<.ClVl • R.ec""l."'" bei
einem Adri.J """ "Test."'"
Bild 18.48 Fehler· meldung auf Grund der automatischen Umbenennung dynamischer Vis
andernfalls muss LabVlEW alle Vb mit demselben Namen umbenennen. Das wird dem Benutzer in einer Warnung nach dem Build-Vorgang angezeigt. In unserem Fall trifft das z.B. auf'Rechnen.vi' der abgeleiteten Klassen zu. Ruft man später das Testprogramm mit den
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'
400
18
Objektorientiertf Programmierung
umbenannten VIs auf, erhält man eine Fehlenneldung nach Bild 18.48. Das Programm ist nicht mehr lauffiihig, weil die dynamischen VIs der abgeleiteten Klassen nicht mehr unter den Namen 'Rechnen.vi' gefunden werden können. In der Kategorie 'Zusätzliche Ausschließungen' (Bild 18.47) können weitere Einstellungen vorgenommen werden, die Einfluss auf die Paketgröße haben. Wir verzichten hier darauf und betrachten dafür die Kategorie 'Einstellungen der Quelldateien' etwas näher. In Bild 18.49 sind die 'Einstellungen der Quelldateien' gezeigt, die man benötigt, um die Quellen vor unerlaubter Einsicht zu schützen. Das bedeutet, dass ein unbefugter Benutzer die Diagramme nicht einsehen kann. Trotzdem lässt sich während der Entwicklungsphase das Diagramm jederzeit ansehen, sofern man nur das Passwort kennt. Wurde für jedes VI dasseJbe Passwort verwendet, muss man nur dieses eine eingeben. LabVIEW speichert die verwendeten Passwörter in einem Cache. Mit Beendigung von LabVIEW wird der Cache allerdings gelöscht. Im Menü 'Werkzeuge' - 'Optionen. . .' kann man in der Kategorie 'Um gebung' über die Schaltfläche 'Passwort-Cache löschen' alle Passwörter löschen und somit eine Neueingabe forcieren. I> ra••wort_ge,ehuetzt E,gen.eh.ften
!Je [ m l!! !F !!il tr l n ;sm �.• t
il Te>t,� V_ffi
("Irrne< i>JS>C_ (" Enbeziefoe<1, "'""" vefl'.e
jiifOfi fzedriS " z. ',",;
"'� rür
""" !/teo
« w�
o
P ss\\ t·E
(" K"'" PlISs"""tondeflr"l (" P.",,,,,t, ertfefneo
r. �s PIISS""t v«_
VI-EW� für oie ertMolem<1 Dot_ Ii ("
cn
, CI
,t<6....
, rr<>;1Ic'
(" Beru(zord '''''ort
lI-Er�ellJ)Qffi "--
Bild 18.49 Eingaben für den Passwortschutz
Für die Passwortvergabe müssen nacheinander für jede LabVIEW-K1asse folgende Ände rungen der VoreinsteIlung vorgenommen werden: Durch die Auswahl 'Neues Passwort ver wenden' unter 'Passwort-Einstellungen' wird das darunterliegende Eingabefeld aktiviert. Hier wird das zu benutzende Passwort, z.B. 'geheim', eingetragen. Die Einstellungen werden nur auf den ausgewählten Eintrag aus 'Projektdateien' angewandt. Daher müssen sie für alle weiteren Einträge wiederholt angegeben werden. Die Option 'Passwort für alle enthaltenen Dateien' vereinfacht nur die Passworteingabe.
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.4 Schutz einer Klassenbibliothek
401
Für 'Test.vi' wird kein Passwort vergeben. Dieses VI dient als Beispiel für den Anwender des Quellpakets und sollte daher einsehbar und veränderbar sein. Versucht der Anwender aber, das Diagramm von 'AbstrakteFunktion.lvclass:Rechne.vi' über das Testprogramm einzu sehen, erhält er eine Aufforderung zur Passworteingabe entsprechend Bild 18.50.
-_.
-- -.
_-.n.tirn.Ivdoss:Redne.yj i
ZUlIqel.." ...
.-
-
--
...._-'"
---""5 Bild 18.50 Aufforderung zur
Passworteingabe
Merke: Man kann die Quellen selbst erstellter Vb vor unbefugtem Zugriff schützen, indem man unter 'Build-SpezifIkationen' den Punkt 'Neu' - 'QueUcodepaket' im Kontextmenü auswählt und dort entsprechende Eintragungen vornimmt.
IAufgabe 18.7 Versuchen Sie, das Projekt 'FvonX_Y.lvproj' durch ein Passwort zu schützen, ohne dabei die Funktionalität der einzelnen Module zu zerstören.
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
labVIEW:Tabellenkalkulation, Datenbanken
Lernzl.1e I. Schreib-/Lesebefehle zur Tabe1lenkalkulation mit CSV-Dateien nutzen können. 2. Prinzipien von ActiveX verstehen.
3. Datenaustausch LabVIEW f-7 Excel programmieren können (mit Hilfe von ActiveX).
4. Von LabVIEW aus Funktionskurven in ExceJ darstellen können. 5. Grundfunktionen von Diadem beherrschen 6. Datenbankanbindung von Access zu LabVIEW verstehen.
19.1
Schreib·/Lesebefehle zur Tabellenkalkulation
LabVIEW stellt unter 'Punktionen' - 'Programmierung' - 'Datei-I/O' die zwei Funktionen 'In Tabellenkalkulationsdatei schreiben' und 'Aus Tabellenkalkulationsdatei lesen' zur Ver fügung, siehe Bild 19.1. Diese Funktionen schreiben und lesen CSV-Dateien (Comma Sepa rated Value). Das sind ASCII-Dateien, deren Werte durch ein Komma, einen Tabulator oder irgendein anderes, nicht zu den Daten selbst gehörendes Zeichen getrennt werden.
In Ta[,.,U.nkalkulotionsdat.i sd...kn [W'k' To """aclsh<
FOm�('lo ' :f) Dateipfad(M:>g, � � 10 ""'on ln""��7(""""". transponiefeo' (oo:f)
� ' ,, ,
N
� a ? •
�o,,'�x ,,,.�
Aus Tabol.okalkulationsdat.i I...., [Rom r;-"., 5p<.�d.h=" rlo.y;]
Bild 19.1
LabVIEW-Funktionen Schreiben in und Lesen aus eine(r) Tabellenkalkulationsdatei. Darunter die entsprechenden Erläuterungen aus der Kontexthilfe Bi l d 19.2 zeigt Diagramm und Frontpanel eines noch nicht gestarteten VI, das die Daten eines 2-dimensionalen Arrays in einer Datei speichert, von dort sofort wieder ausliest und im VI rechts zur Anzeige bringt. Der Inhalt des Frontpanels nach dem Start ist n i Bild 19.3
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'
19.1 Schreib-ILesebefehle zur Tabellenlmlkulation
403
sehen. Da das VI kein Eingabeelement zur Eingabe des Dateipfades aufweist, wird dieser im Dialog abgefragt. Wir haben hier den Namen 'Testdatei.xIs' gewählt. Die Erweiterung 'xIs' bewirkt, dass beim Aufruf der Datei mit Doppelklick das Office-Programm ExceJ gestartet wird und die Werte der Datei in einer Excel-Tabelle angezeigt werden. Siehe dazu Bild 19.4.
�. ID'
.
'
.
00.
(>'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
!1I'e �. :Q:. �T -
P;i: ' ===�:::::::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: :::::: �:: !:==�� • .4
.!::
A
,
C
LI
[;
i'- -+- +
f
+
Bild 19.3 Frontpanel des VI aus Bild 19.2 nach dem Start
co
Bild 19.4 Ausschnitt aus 'Testdatei.xls', in die das LabVJEW-Programm 'TestExcel.vi' geschrieben hol
Bemerkung: Man darf aus der Darstellung der Daten in einer ExceJ-TabeJle nicht den Schluss ziehen, dass die LabVIEW-Schreibfunktion 'In Tabellenkalkulationsdatei schreiben' eine Excel-Datei erzeugt. Sie erzeugt eine CSV-Datei, die man z.B. auch mit einem Editor wie Wordpad öffnen kann, siehe Bild 19.5.
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'
404
19
r lestdatel.K's -
EdItor
2 5
' ....
_
LabVIEW: Tabellenlmlkuultion, Datenbanken
CI 2!J
3 6
Bild 19.5 Öffnen einer CSV-Datei mit dem Editor
Wenn wir dagegen Excel aufrufen, dieselben Werte wie oben eintragen, speichern und dann mit dem Editor anschauen, erhalten wir ein völlig anderes Muster, wie in Bild 19.6 zu sehen ist. Auch ist eine echte Exce1-Datei wesentlich größer (im Beispiel 14 KByte gegenüber
I KByte bei derCSV-Datei). Excel kann jedoch CSV-Dateien lesen und nach entsprechender manueller Einstellung auch schreiben. Im NonnalfaU erzeugt jedoch Excel ein eigenes Format, das sich nicht einfach von der LabVIEW-Funktion 'Aus Tabellenkalkulationsdatei lesen' verarbeiten lässt. Wir benöti gen deshalb andere Hi l fsmittel, auf die in den nächsten Abschnitten eingegangen wird. Eines dieser Hilfsmittel ist 'ActiveX'.
"'. ,,-� ...... ""'" 1 D l o a ; % o .1 , " 007 " " .. . . 0 0 o \ , U " " ) oy Oy ,. . y 0 , " " , "
E n t
-I
Pi , " A. .
" " # , # # 0 Oy u " " " " J "
: \
y
r
-
"
WW 001 0 .. 01..:.1 U " " , OY So<� y " " " "
0 o \
,
o
00
�WY
':iW:i':iY:i:i 0
1
Bild 19.6 Öffnen einer Excel-Datei mitdem Editor
IAufgabe 19.1 a)
Schreiben Sie ein VI ähnlich dem in Bild 19.2, das einen Vektor in eine Zeile einer CSV-Datei schreibt und wieder ausiest. l Verwenden Sie Dezimalzahlen mit Nach kommaste1le(n) als Eingabe.
b)
Wie a), aber der Vektor soll in eine Spalte geschrieben werden.
Merke: LabVIEW besitzt zwei Funktionen, mit denen man 1- oder 2-dimensionale Arrays in eine CSV-Datei schreiben bzw. aus ihr lesen kann.
Excel erzeugt im Nonnalfall einen eigenen Dateityp, der sich mit der Funkti on 'Aus Tabellenkalkulationsdatei lesen' nichtlesen lässt!
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.2
Allgemeines über ActiveX
19.2
405
Allgemeines über ActiveX
'ActiveX' ist eine von Microsoft entwickeJte Methode, mit der verschiedene Anwendungen miteinander kommunizieren können. So lässt sich z.B. von Microsoft Word aus Microsoft Excel aufrufen, eine TabeUe und die zugehörige Grafik erstellen und ins Word-Dokument einbetten. Programme, die unter Linux laufen, haben diese von Microsoft etablierte Schnitt stelle nicht. Hier muss man andere Methoden verwenden. Programme, die unter Windows laufen und mit ActiveX arbeiten, etablieren eine Server Client-Beziehung, wobei der Client öffentliche Methoden des Servers aufruft und öffentliche Daten austauscht. Das Prinzip ist in Bild 19.7 dargestellt. Vergleiche auch Abschnitt 18.1.
Automation Client Holt oder setzt ..:
�
Eigenschaften (Att ribute)
Fühn
Methoden aus
Automation Server
------
-
Bietet an AetiveX-Objekt mit
-. Eigenschaften (Attribute) •
M""""'"
Bild 19,7 Ein Automation SelVer bietet dem (lient an, sich bestimmter ActiveX-objekte zu bedienen
Das LabVIEW-System kann ab Version 5.1 sowohl 'ActiveX Automation Server' als auch 'ActiveX Automation Glient' sein. Das bedeutet, dass LabVIEW z.B. Funktionen von ExceJ aufrufen kann. Dann ist LabVIEW Client. Oder man kann LabVIEW von Excel oder einer anderen geeigneten Anwendung mit ActiveX-Merkmalen aus aufrufen und starten. Dann ist LabVIEW Server.
19.2.1
ActlveX-Contalner In LabVIEW
Damit man verschiedene Softwarepakete mit ActiveX-Eigenschaften nutzen kann, enthält LabVIEW eine Sammlung von ActiveX-Elementen, die sich aufs FrontpaneJ ziehen lassen. Dazu dient ein Rahmen, der 'ActiveX-Container' genannt wird, siehe Bild 19.8 rechts. Die Verbindung zwischen Server und Glient wird dann in der Weise gebildet, dass man ActiveX-Elemente (ActiveX Controls) aufs Panel zieht und ihre Funktionalität nutzt. Ein einfaches Beispiel ist die Einbettung eines Web-Browsers in ein LabVIEW-VI (siehe auch
[8], Kapitel 16). Dazu ruft man 'Elemente' - '.NET & ActiveX' - 'ActiveX-Gontainer' auf und zieht das zu nächst leere Quadrat ins Frontpanel. Im Kontexmenü wählt man danach 'ActiveX-Element einfügen'. Nun erhält man eine Auswahlbox gemäß Bild 19.9. Sie zeigt eine Fülle von Soft warepaketen mit ActiveX-Schnittstellen, soweit sie auf dem speziellen Rechner installiert sind. Hier wählen wir den Microsoft Web Browser, markieren ihn und bestätigen mit 'OK'.
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'
406
19
I @"soo.I.n � AnsicTt·I
LabVIEW: Tabe/lenlmlkuuuion, Datenbanken
•
�
• MOOom
· -• """" "
•
Expres,
• R� o..n:I Sindobon • Zusa(�e . _ .......
Element ..... w-!hIen . . ,
..
, tlET &. Active)(
�
�
.NET-Corhne, _.......
Li)
RichTeXlflox
Eill
1'iiil
Activex-ccn...
� Go/Meld
�
.-
W«Iows Med..
Bild 19.8 LabVIEW enthält eine Sammlung von ActiveX-objekten, die auf installierte Objekte wie Excel, Word usw. hinweisen. Man kann sie in einen ActiveX-Containerziehen P A�t,veX Objekt aus..ahlen
Adobe PDF Reader Axis Cortrol Axis Cortrol 2,Q _0., a.5et�0&<$
AlbllChen
I
...
Bild 19.9 AuswahlboxfOr ActiveX-Objekte
Bi l d 19.10 zeigt das sehr einfache Diagramm und Bild 19.11 das Frontpanel mit der Horne page der Hochschule Ravensburg-Weingarten.
Erläuterungen zur Programmierung des Vis in Bild 19.10 1. Nachdem man den Web-Browser aus der Auswahlbox auf das Panel gebracht hat, muss man ihm die Internetadresse (URL) der Seite mittei l en, die man besuchen möchte. Dazu m i Diagramm unter 'Funktionen' - 'Konnektivität' - 'ActiveX' (siehe Bild 19.12) aufrufen 'Methodenknoten', ins Panel ziehen und mit dem Web-Browser-Symbol verbinden (grüne Linie in Bi l d 19.10, Referenz auf den Web-Browser). 2. Der zweizeilige Methodenknoten ändert seine Überschrift durch das Verbinden von 'Automation' in 'IWebBrowser2'. 'Methode' n i der zweiten Zeile anklicken und aus dem sich öffnenden Popup-Menü 'Navigate' wählen.
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.2
Allgemeines fiber ActiveX
407
3. Den Eingang von 'URL' mit einem Stringeingabeelement versehen, eine Internetadresse eintragen und dann starten.
J
..
Bild 19.10 VI zur Erzeugung des Frontpanels in Bild 19.11 mit einem ActiveX-Element
. _
. -
_ .. _.... .... -- -
• ,... � ... --
r=-��
" .. -
. __. . .
..._ ..._ - - - .._----
,,. --» _
Bild 19.11 Microsoft Web Browser als ActiveX-Element in LabVlEW. Zu sehen ist die Homepage der Hochschule Ravensburg-Weingarten
IAufgabe 19.2 Versuchen Sie, in entsprechender Weise wie oben mit dem Web-Browser eine Verbin dung zu Excel herzustellen. Exce1 ist in der Auswahlliste nach Bi l d 19.9 zu finden unter 'Microsoft Office Spreadsheet. . . '.
Merke: LabVIEW besitzt einen ActiveX-Container, wo man andere Anwendungen nutzen kann.
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'
408
19
19.2.2
LabVIEW: Tabellenlmlkuultion, Datenbanken
ActlveX In LabVIEW zur Steuerung von Anwendungen
Im Beispiel von Abschnitt 19.2.1 ging die Steuerung an den Web-Browser über. Ergebnisse werden vom Anwender abgerufen, ndem i er mit dem Web-Browser arbeitet und nicht mehr mit LabVIEW. Doch wünscht man häufig, im Rahmen von LabVlEW zu bleiben. Man will von einer anderen Anwendung Daten programmgesteuert holen oder sie setzen und Me thoden aufrufen, ohne sich aufdas Arbeiten mit einem fremden System einzulassen. Dazu nutzt man wie im vorigen Abschnitt 'Punktionen' - 'Konnektivität' - 'ActiveX', wobei man die Palette in Bild 19.12 erhält. "
'""""
� AnsicH: •
I���I
�
=
ActiveX-Obje". Referenz schi. ,.
�
��. . .
Bl
�
� ..
Nach Y.w-t
E..I
E'�..
y",...-.: MCh '" E,eqisre-gist...
st.otis
Bild 19.12 Palette der ActiveX-funktionen
Wir werden im folgenden Abschnitt mit diesen Funktionen arbeiten.
1 9.3
Beispiele zur Anwendung auf Excel
Excel ist ein weit verbreitetes Werkzeug nicht nur zum Anlegen von Tabellen und zum Rechnen mit ihnen, sondern auch für das Erstellen von Grafiken. So kann man z.B. zu einer Excel-Tabelle nach Bi l d 19.13 eine Grafik entsprechend Bild 19.14 erstellen.
''!l "'" ,
+ -+ ..:+ + -it Ta +\t-
A
,......., ,
• 9
16
" "
..
54
.,
_7 B
--I
i
"Xl
12 "
Bild 19,13 In der Spalte A stehen die Quadrate der Zahlen 1 bis 10, die den Indizes der Zeilen links daneben entsprechen. Man markiert sie und gewinnt daraus eine grafische Darstel lung nach Bild 19.14
Dazu geht man wie folgt vor: •
•
Excel aufrufen und Quadratzahlen I bis 100 eintragen. Zahlen markieren, wie n i 19.13 zu sehen. Bild Aufrufen von 'Einfügen' - 'Diagramm'. Es zeigt sich ein Diagramm-Assistent, in dem man links 'Linie' und rechts als Diagrammuntertyp die Linien n i der linken oberen &ke wählt.
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.3
•
Beispiele zurAnwendungaufExcel
409
Mit 'Weiter' kommt man zur Anzeige der Tabellenwerte. Man markiert 'Spalten', falls nicht schon voreingestellt. Danach 'Weiter'.
•
Markieren von 'Hauptgitternetz'. Dann 'Weiter' und als 'Objekt in Tabelle l' fertig stellen.
Danach hat man noch viele andere Möglichkeiten, wie Farbe und Strichstärke der Kurve zu ändern, Markieren der Punkte (1,1), (2,4) . . . (10,100), Beschriften der Achsen usw. Kann man diese Aktionen von LabVIEW aus steuern, ohne dass der Bediener direkt in das Excel-Blatt eingreifen muss? Die Antwort lautet: Ja. Wir bedienen uns dazu des ActiveX Konzepts entsprechend Bild 19.7, sofern wir unter Windows arbeiten. I 'l!: ....
...... M
--jl
1
2 3 • 5 6 7
9
16 25 OE
49 64
B 9
B1
Hll
� 11
Iil·
..-
B
"'-
C
E!;I:ras
"''''
D
E
""""
,
- '"
F
G
••
•
/
•
•
/
I
....,1..
•
•
il.J. � 15
""""
•
•
•
•
•
•
•
•
•
•
Bild 19.14 Grafische Darstellung der Funktion y= ';, wobei x die Zeilenindizes und ydie Werte in Spalte A verkörpert
Wir versuchen nun, die Anfertigung einer grafischen Darstellung wie in Bild 19.14 von Lab VIEW aus durchzuführen, und gehen dabei in kleinen Schritten vor:
19.3.1
Öffnen und Schließen von Excel
Das Programm 'TestExceIOpenClose.vi' aus Bild 19.16 öffnet Excel, wie man im Task Manager erkennen kann. Dann wartet das VI n i einer While-Schleife auf den Anwender Stopp. Anschließend wird sowohl Excel.exe als auch die Referenz auf diese Applikation ge schlossen. Vorgehen:
•
'Funktionen' - 'Konnektivität' - 'ActiveX' - 'ActiveX-Objekt öffnen', Symbol ins Diagramm ziehen und am oberen Eingang links (ActiveX-Refnum) mit 'Erstellen' 'Element' das Terminal 'Excel._Application' erzeugen.
•
Im Kontextmenü des Terminals 'ActiveX-Klasse auswählen' - 'Excel._Appication' l ein stellen. Falls 'Excel._Application' noch nicht angeboten wird: 'Durchsuchen' (Browse) wählen. Nach einiger Zeit erscheint ein Fenster, das Typbibliotheken anzeigt. Im oberen Fenster wählen: 'Microsoft Excel 11.0 Object Library Version 1.5' und weiter 'Application (ExceI.Application.ll)', siehe dazu Bi l d 19.15. Nun enthält das Kontextmenü der ActiveX-Klasse mindestens 'Excel._Application'.
Ausleihe: 31.07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427dS929S1cf089d91b1gecaOOaO. Zentral- u 2009.07.31 21:42:39 +02'00'
410
•
19
LabVIEW: Tabellenlmlkuultion, Datenbanken
Excel beenden, indem man 'Funktionen' -'Konnektivität' - 'ActiveX' -'Referenz schlie ßen' auswählt und ins Diagramm zieht. Zu den Einzelheiten siehe Bild 19.16. I>
Ob",ktaus Typb,b'oth�k aus"ahl�n
�"'.
17 � «,�e Obie+1e ""'e
=--_.:J
(!'xc�,,-,-,") Quo
Wcrfhcok ([xc�,5heet,8) Wcrfsreet (Exc�,"'oet,8)
Bild 19.15 Auswahl der richtigen ActiveX Klasse
Bild 19.16 Einfaches Testprogramm zum Öffnen und Schließen von Excel
19.3.2
SIchtbarmachen einer Excel·Tabelle
Beim manuellen Aufruf von Excel öffnet sich eine Mappe (Workbook), die per Voreinstel lung den Namen 'Mappe1' trägt. Jede Mappe enthält - wiederum per Voreinstellung - drei Tabellen mit den Namen 'Tabelle1', 'Tabelle2' und 'Tabelle3' CSheetl', 'Sheet2', 'Sheet3'). Nichts davon ist beim Aufruf von Excel durch LabVIEW gemäß Abschnitt 19.3.1 zu sehen, kann aber mit Hi l fe von Eigenschafts- und Methodenknoten sichtbar gemacht werden. Das Vorgehen dazu ist in Bild 19.17 dargestellt: 'Funktionen' - 'Konnektivität' - 'ActiveX' 'Eigenschaftsknoten' ins Diagramm ziehen, an die 'Excel._Application'-Verbindung anhän
gen und m i Kontextmenü die Eigenschaft 'Visible' aussuchen. Dann Knoten auf 'Schreiben' umstellen und den Eingang mit der Konstanten 'TRUE' verbinden. Auch die Fehlerleitung wird jetzt wie üblich durchgeschleift. Startet man das Programm, sieht man allerdings zunächst nur eine leere graue Fläche. Die bekannte Excel-Tabelle bleibt vorerst noch unsichtbar. Will man auch diese sehen, muss man den Eigenschaftsknoten erweitern um 'Workbooks', von dort aus den Methodenknoten 'Workbooks' aufrufen und dann die Methode 'Add' wählen. 'Add' erzeugt ein neues Workbook. Bild 19.18 zeigt das Prinzip. Startet man dieses
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'
Beispiele zurAnwendungaufExcel
19.3
411
Programm, sieht man die Fläche einer Excel-Mappe mit den oben erwähnten drei Tabellen wie in Bild 19.19. � �ojeld: &.dlhen �� tenst... t!ife
xc..!.
,15 tritat Ita ft QI 13pt Anwendunr,K
11
I· 6·
Bild 19.17 Öffnen von Excel. Man sieht nur eine graue Fläche. die nach Drücken der Stopp-Taste wieder verschwindet. Excel wird aus dem Hauptspeicher entfernt
P><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
I
Co, co 0; "
,
, " " •
�
, " , ,
,oe
+
"
'
E ,�
, " ,
•
,
'
�
" � �
"
,
,Co110
" � •
ce "
, ,
+
Bild 19.22 Ergebnis des VI von Bild 19.21. das 'Mappe1 ' erzeugt und später unter dem Namen 'Xaver.xls' speichert
Bemerkung zum VI in Bild 19.20:
Die auf dem Frontpanel sichtbare Tabelle erhält man mit 'Elemente' - 'Modem' - 'Liste & Tabelle' - 'Tabelle', wobei man im Kontextmenü des entstehenden Tabellenbedienelements
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
414
LabVIEW: Tabellenlmlkuultion, Datenbanken
mit 'Sichtbare Objekte' - 'Zeilentitel' und 'Spaltentitel' rur das gewünschte Erscheinungsbild sorgt. In diese Tabelle kann man anschließend die oben dargestellten Inhalte eintragen.
---
--
�
Bild 19.23 SubVl zum Setzen eines Zahlenwerts in einer Excel-Tabelle, hier 1$,3 in Zeile 2, Spalte 6
Bild 19.24 Diagramm zum SubVi in Bild 19.23 � RowCol To Rang" Format.v. Blockd,agramm
Bild 19.25 SubVi 'Row Col To Range Format.vi', verwendet links in der Case-Struktur von Bild 1924
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'
19.3
Beispiele zurAnwendungaufExcel
415
Das Programm 'Set Cell Value.vi' wird für das Einfügen von Daten n i eine Excel-Tabelle nach Bild 19.22 mehrfach aufgerufen. Es verwendet das SubVI 'Row Col To Range Fonnat.vi' inks l in der Case-Struktur, dessen Aufgabe darin besteht, die Zeilen-/Spaltenindizes n i Excel Bezeichnungen zu transformieren, also z.B. die Angabe '3 5' in 'E3' oder '65536 256' in 'IV65536' (Maximalwerte für Zeilen und Spalten). Erst danach kann man mit Hilfe von ActiveX einen Zahlenwert in diese Excel-Zelle schreiben.
IAufgabe 19.3
Analysieren Sie die Funktion von 'Row Col To Range Format.vi' für den Fall Zeile = 3, Spalte = 30, indem Sie den Datenfluss über die eingeschaltete Highlight-Funktion verfol
gen.
IAufgabe 19.4
Analysieren Sie 'Set Cell Value.vi' für den Datensatz Zeile = 3, Spalte = 30, Wert = 20,7. Bemerkung: Dieses Programm erzeugt, alleinstehend getestet, eine Fehlermeldung, weil die Referenznummer Excel._Worksheet = 0 ungültig ist.
19.3.5
Geschwindigkeit der DatenspeIcherung
Vereinfacht man das Programm 'WriteTableToXL_Test.vi', indem man einerseits die Ober schriften von Zeilen und Spalten weglässt, andererseits aber eine Zeitmessung einbaut, kann
man die Zeit für die Speicherung von 10 x 100 = 1000 Zahlen in Stringform ermitteln, siehe Bi l d 19.27.
Bild 19.26 Zeitbedarfvon knapp 4 s zur Speicherung von 1000 Daten bei Verwendung des SubVls 'Set Cell Value.vi'
IAufgabe 19.5 Modifizieren Sie 'WriteTableToXL_Test.vi' zu 'WriteTableToXLEinfach_Test.vi' (siehe Bild 19.21). Das FrontpaneJ soll so aussehen, wie Bild 19.26 zeigt.
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
416
LabVIEW: Tabellenlmlkuultion, Datenbanken
Der Zeitbedarf von 3,957 s zur Speicherung von nur 1000 Werten ist recht hoch. Man kann
ihn drastisch verringern, wenn man die Funktion 'In Tabellenkalkulationsdatei schreiben'
verwendet. Es ergeben sich etwa 0.3 s (siehe Bi l d 19.27), wenn man das VI aus Bild 19.28 nutzt. Darin ist auch das Öffnen von Excel mit enthalten. Ist Excel bereits geöffnet, sinkt die
reine Speicherzeit auf ca. 0,05 $. P.
WrtteTableToXlSchneU_Te.t VI F,ontp""el
Bild 19.27 Speicherzeit für 1000 Werte bei Verwendung der Funk tion 'In Tabellenkalkulationsdatei schreiben'
Bild 19.28 Diagramm zu Bild 19.27
19.3.6
Erstellen von Makros zum Umwandeln einer Tabelle In eine Grafik
Die in Abschnitt 19.3 zu Beginn beschriebenen Schritte zum Erzeugen einer Grafik aus einer gegebenen Datenreihe lassen sich in einem so genannten Makro speichern und später über ActiveX von LabVIEW aus aufrufen. Ein Makro in Excel und anderen Office-Programmen von Microsoft ist ein unter Visual Basic geschriebenes Programm, mit dem man den Ablauf einer Folge von Bedienerhandgriffen z.B. in Excel automatisieren kann. Das Makro lässt sich entweder wie jedes andere Statement-orientierte Programm Zeile für Zeile niederschreiben oder man kann es von Excel selbst erstellen lassen, indem die manuell durchgeführten Be dienungsschritte aufzeichnet werden. Wir geben ein Beispiel: Angenommen, wir haben nach Öffnen von Excel eine Datenreihe mit den Quadratzahlen
I bis 100 entsprechend Bild 19.13 vorliegen. Nun durchlaufen wir folgende Schritte: I. Man wählt 'Extras' - 'Makro' - 'Aufzeichnen'. Es erscheint ein Fenster, siehe Bild 19.29. Mit 'OK' quittieren, eventuell nach Namensänderung von 'Makroi'. Von nun an wird je der manuelle Bedienerhandgriff n i ein Visual-Basic-Programm eingetragen. 2. Diagramm-Assistent in der Funktionsleiste von ExceJ wählen. Es erscheint ein Fenster gemäß Bi l d 19.30, n i dem man 'Linie' (dritte Zei l e) aktiviert, dann den Diagrammtyp links oben, zuletzt 'Weiter >'. 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
h
,��
e',, 1'1' ,<,"'.,,,
k2
E""l
"
.
. .
"
Bild 19.32 Vervollständigung der gewünschten Grafik
5. Der letzte Schritt der GrafikersteIlung ässt l uns die Wahl, ob diese in einem neuen Blatt dargestellt wird oder innerhalb von TabelleI. Wir entscheiden uns für die zweite Option. ,
O'�Q",mm AssIStent · Schrott 4 von 4 · D"'O,,,,,,,,,,, latll�,,,no
X
DIoo;J..,... eI:"Ifügen:
[@I m
(' AIs_�:
"I-=�-='----
r. AlsQ!>jel1r.: i\blnchen
I
< �Cd
I
Blld19.33 Wo soll die Grafik gezeigt werden?
6. Danach sieht man die Grafik auf dem Excel-Blatt entsprechend Bild 19.34. b4i.:q " " 1Il ;g ' ,, 3 " -, .-. �." O .:HI Il c:I o.lI Gl
...,.'i:' .,,
,
•
,
,
;1>
, 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
Bild 19.35 Visual Basic-Programm, wekhesdas Makrol bildet
19.3.7
Aufruf von Makros In LabVIEW mit Hilfe von ActlveX
Mit Hilfe eines geeigneten Methodenknotens kann man Makros auch von LabVIEW aus abrufen. Bi l d 19.36 zeigt das Beispie1 von 'WriteTableMakroGrafik_Sinus.vi'. Beim Aufruf dieses Programms wird n i die Exce1-Datei geschrieben, die das Makro enthält. Gespeichert wird allerdings in eine andere Datei, deren Namen im Panel eingestellt werden kann. Versucht man, in eine Datei zu schreiben, die schon existiert, läuft der Vorgang nicht vollständig automatisch ab: Der Benutzer wird gefragt, ob er wirklich überschreiben will. Diese Frage muss er beantworten. Verneint er, erzeugt das VI eine Fehlermeldung. Der Hauptnachteil des Programms ist wieder die lange Laufzeit. Im Beispiel wird das nicht so deutlich, wei l nur 10 Zahlen darzuste1len sind. Erweitert man auf 10000 Zahlen, ergeben sich beträchtliche Laufzeiten, wie das VI von Bild 19.36 bzw. Bild 19.37 zeigt.
IAufgabe 19.6
Entwicke1n Sie aus dem Programm in Bild 19.36 ein VI, das 20000 Sinuswerte der Ampli tude 2,5 darstellt. Nehmen Sie dazu ein I1t = 0,001.
Merke: Man kann in LabVIEW mit Hilfe von ActiveX auch Makros aufrufen, die in Visual Basic geschrieben wurden oder durch Aufzeichnung entstanden sind.
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
420
LabVIEW: Tabellenlmlkuultion, Datenbanken
Bild 19.36 Aufrufeines Makros im LabVIEW-Programm 'WriteTableMakroGrafiIcSinus.vi'. Es erzeugt zu den 10000 links im Diagramm gebildeten Sinuswerten eine Grafik ähnlich der von Bild 19.34, benötigt dazu allerdings ungefähr 13 Sekunden
..... Vl ruft . � �..• .... ... dir ""'*'01· iii'iiMd_t Ist
--
1:I,\LabYIEW�3, � �J.�.•
f5
_-'(no_) -
'""
� � :jJj ....
I
T'
EI
! \1::19\
--
r
_ .....
..J
I
"' Coo)
113255 I
�
11]
Bild 19.37 Frontpanel des Programms von Bild 19.36
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'
19.3
Beispiele zurAnwendungaufExcel
19.3.8
421
Erhöhung der Geschwindigkeit
Wie schon erwähnt, beruht die geringe Geschwindigkeit des VI n i Bild 19.36 hauptsächich l auf dem wiederholten Aufruf von 'Set Cell Value.vi'. Das Programm benötigt auf dem hier verwendeten Laptop ca. 13 Sekunden! Eine bessere Methode arbeitet mit der Funktion 'In Tabellenkalkulationsdatei schreiben'. Dabei hat man allerdings das Problem, dass eine CSV-Datei erstellt wird und keine Excel-Datei, die ja das Makro zur Umwandlung der Daten in eine Grafik enthalten soll. Eine Lösung besteht darin, dass man in einer getrennten
Excel-Datei, z.B. mit Namen "Projekt.xls", ein Makro schreibt, das auf die zu erstellende Excel-Datei, etwa "Schreiben.xIs", Bezug nimmt. Die Erstellung des Makros erfolgt zu
nächst durch Aufzeichnung im Projekt.xls und verläuft wie in Abschnitt 19.3.6 beschrieben. Danach rufen wir mit 'Extras' - 'Makro' - 'Makros' - 'Bearbeiten' das Makro auf und fügen von Hand die Anweisung 'Windows("Schreiben.xls").Activate' hinzu, siehe Bi l d 19.38. Fer ner ändern wir, ebenfalls manuell, einige Anweisungen zur Bi l dung der überschrift und zur Beschriftung der x-Achse und y-Achse sowie die Bereichsangabe 'Range("AI :AlOOOO")'. Das Makro in 'Projekt.xls' bewirkt dann, dass die Daten von 'Schreiben.xls' (und nicht von 'Projekt.xls' wie bisher) in eine Grafik innerhalb von 'Schreiben.xls' umgewandelt werden. Wichtige Voraussetzung dabei: 'Schreiben.xls' muss bereits geöffnet sein, damit das Makro in 'Projekt.xls' fehlerfrei arbeiten kann! Bi l d 19.39 zeigt das SubVI 'UP_SpeichernQuit.vi', das in 'WriteTableMakroGrafilcSinus.vi' in Bi l d 19.36 rechts verwendet wird. Bi l d 19.41 und Bild 19.42 verdeutlichen Panel und Diagramm des leistungsfähigeren Programms 'WriteTableMakroGrafik_SinusSchnell.vi'. Es wird mit 'UP_StopSchreib.vi' beendet, dessen Diagramm in Bild 19.40 dargestellt ist. Bi l d 19.43 zeigt das Ergebnis einer Rechnung.
IMOk'01
(Allgemein) Sub lIa�r o l l )
I'
lIakrol lIakro lIakrD
an>
03. 07. 2007
von ".or"i
auf"... ichut
llindo..� I "Sehr� ib�n . X l�") . .let ivat� Ran<;/� 1 " .I. l : .I.lOOOO") . S�l�et Chut� . .ldd .letiv�Chart . ChartTyp� -
xlLin�
.letiv�Chart .S�tSoure�Data Soure. -Sh��t� I 'Sehr�ib�n") . Ran<;/� 1".I.l: .I.lOOOO") ,
P lotEy
: - x lColutm� .letiv�Chart . Loeation Vh�r� -xlLoeation.l�N...Sh��t llith
.i.ctiv.Chart
.HMTitl�
-
Tru�
.ChartTitl�. Charact�r�
T�xt -
"runktion�n"
·
.lx�� IxlCat�<;/ory,
xlPrimar y ) . HMTitl� - Tru�
·
.lx�� IxlCat�<;/ory,
xlPrimary) . .lxi�Titl• . Charaet�r� T�xt
. .lx��l xlValu�, ·
.lx�� IxlValu�,
xlPrimary) .Ha�Titl�
-
Tru�
xlPrimary) . .lxi�Titl�. Charaet�r�. T�xt
-
"x"
- "t
Ix) "
En:! llith .letiv�Char t . HML�<;/�nd -
ral��
.letiv�Char t . P lot.lr�a.5�1�et
•
End Sub
I
Bild 19.3B Visual-Basic-Programm von Projekt.xls. Es wurde manuell aus dem Programm von Bild 19.35 entwickelt. geändert hinsichtlich der Texte zur Beschriftung des Excel-Blattes und ergänzt um den Befehl Windows ("Schreiben.xls").Activate'
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'
422
19
LabVIEW: Tabellenlmlkuultion, Datenbanken
Bild 19.39 Unterprogramm, verwendet im VI von Bild 19.36 rechts. Es dient zum Speichern einer Datei und zum Schließen von Excel
11"#1#"#=,,'"Iockd..,.. amm
Bild 19.40 Unterprogramm, verwendet im VI von Bild 19.42 rechts. Es dient zum Schließen der Projektdatei und von Excel
�
WrlteTableMakroGrafik_SIflusSchnoM VI Frontpane�
�otei �",tdffi fr>z
�
...
I
11
EI
dti>ft . 1:'9: ArIwe
:o. �.
• x
Bild 19.41 Die Speicherung mit dem
.
..
Befehl 'In Tabellenkalkulationsdatei schreiben' erhöht die Geschwindigkeit wesentlich: ca. 0,6 s statt 1 3 si Siehe auch Bild 19.42
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'
19.3
Beispiele zurAnwendungaufExcel
423
�L
lD
�
...
, - _.
....... -
"" ,," , , , , , , , " "
11
..
" " , , ,,. , '>'! ,
Bild 19.42 Diagramm von 'WriteTableMakroGrafik_SinusSchnell.vi'
runktlonen
"
,------,
, " ,,, " " , 4\'" 46' , .. "1046 " " "
, "'i "'
" f-1-f-1-+',+1-+1-t1-t1-H-H-H-H-ft--,f+--1f+--1+--1+1 J
"\
,."
J1
" t-+T--1++t-+t-+I--+I-++-++-+++ r+-++--++-+ -++-+ + +--+1
�.
�
.
,
"
. ---------:;;;;;;;;;�''''.a ; ==========::::l:"".::!�';;;;;;::: :::v�_ -'· ':",_
Bild 19.43 Ergebnis der Berechnung von WriteTableMakroGrafilcSinusSchnell.vi' in Bild 19.42
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
424
19.3.9
LabVIEW: Tabellenlmlkuultion, Datenbanken
Schreiben mehrerer Dateien
In der Praxis faUen häufig sehr viele Messdaten an, die man nicht in einer einzigen Excel Tabelle darsteUen kann. Entweder speichert man diese in mehreren Dateien, deren Namen mit einem angehängten Index durchgezählt werden. Oder man speichert sie in einer Excel Mappe n i verschiedenen Tabellen (auf Deutsch auch 'Diagramm' genannt). Das Programm 'SchreibenMehrfach.vi' verfolgt den ersten Weg. Man kann auf dem Front panel Anfangs- und End-Index vorgeben, ferner den Diagrammtitel, die Beschriftung der x- und y-Achse und anderes mehr, siehe Bild 19.44. Es wurde 'ProjektmitParametern.x1s' eingetragen, dessen Visual-Basic-Programm in Bi l d 19.45 zu sehen s i t.
Bild 19.44
VI zur Erzeugung mehrerer Excel-Dateien. lm Beispiel werden die Dateien 'VSchreib_OO1.xls' bis 'VSchreib_Ol0.xls' erzeugt
](Angemein) Sub
Gr�phD�t� ID�t�in""", .I.� Str l n..,
�trin.,.,
X
��
(Oupl".n"t.
lIakrc
'trin.,.,
Y b
.1.,
D�t�irumpt
Strirq,
B�r�ich,n""",
.."
Str i r ...,
Tit.l
.I.�
�trin.,.)
".ho
am 1 6 . 0 6 . 2 0 0 5
von .."or�i �ut... "�,ch""t
lIiOOo", (Ddt�in","",, ) . k t i..."to
Ch�rt� . .l.dd .l.ctiv�Ch�rt .Ch�rtTV"�
- xlLin�
.l.ctiv�Ch�rt . s.,tSourc�D�t� Sourc� ·Sh.�t� (D�t�irumpt) . R�nlJ" (E.r�ich�n","",, ) , P lOUy: -xlColumn�
.l.ctiv�Ch�rt . Loc�tion """r� : -xlLocation.l.��"Sh�.t lIith .I."tiv�CMrt .HuTith
_ Truo
.Ch�rtTitl�. Ch�r�ct�r� T�xt
- Tit�l
. .I.<��lx lC�t��ory,
xlPrimary) .RMTitl�
. .I.<��lx lC�t��orv.
xlPrimary) . lxi,Titl�. Ch�r�ct�r� T�xt
- Tru�
. .I.<�� IxlValu.,
xlPrimary) .HMTitl�
- Tru�
. ...' � � l x lV"lu",
,lPrima.y) .J.xi,Titl�. Ch"."ct�r�.T�xt
-
- X Y
End lIith .l.ctiv�Ch�rt IIa�L...�nd - r�l�� .ktiv.Chart
PloUr..
_ Sd.�t
End Sub
Bild 19.45 Visual-Basic-Programm von 'ProjektmitParametern.xls'. Man findet es nach Aufrufder Excel Datei mit 'Extras' - 'Makro' - 'Visual Basic-Editor'
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'
19.3
Beispiele zurAnwendungaufExcel
425
'ProjektmitParametern.xls' geht aus 'Projekt.x1s' durch folgende Änderungen hervor: •
•
•
In die Klammer nach 'Sub MakrolO' werden alle Parameter geschrieben, die von außen vorgegeben werden sollen, also 'Dateiname', 'Dateirumpf usw. Der Typ dieser Parame ter ist durch 'As String' (oder auch 'As Integer', 'As Double' usw.) anzugeben. Alle betroffenen Konstanten sind durch die Parameter zu ersetzen, z.B. 'Windows ("Schreiben.x1s").Activate' durch 'Windows(Dateiname).Activate' u.dgl. Nach Speichern des gemäß Bild 19.45 modifizierten Visual-Basic-Programms ist dieses m i Makro des VI von Bild 19.46 wirksam.
Bemerkungen: •
•
•
Die Parameter sind mit den Argumenten 'Argi', 'Arg2' usw. in derselben Reihenfolge einzutragen, wie sie in der Klammer von 'Sub Makrol ( ....)' auftreten. Die Datenerzeugung erfolgt im SubVI 'UP_DatenerzeugungWahlweise.vi' auf vierfache Weise als Sinus, ParabeJ, Sägezahn und Dreieck n i Abhängigkeit vom Index modulo 4. Die Verarbeitungszeit beträgt durchschnittlich 0,3 Sekunden pro 10000 Messwerte, also etwa 40-mal weniger als bei der Verwendung der Funktion 'Set Cell Value.vi'.
IAufgabe 19.7 Analysieren Sie das Programm 'WriteTableMakroGrafil,-Sinus.vi'. Versuchen Sie, die nicht erklärten SubVIs von Anfang an neu zu entwickeJn.
IAufgabe 19.8 Analysieren Sie das Programm 'WriteTableMakroGrafik_SinusSchnell.vi'. Versuchen Sie, alle noch nicht erklärten SubVIs von Anfang an neu zu entwickeln. Merke: Visual-Basic-Makros kann man auch mit Parametern aufrufen_ Damit lassen sich z.B. Parameter aus dem LabVIEW-Frontpanel in Excel-Tabellen über tragen.
IAufgabe 19.9 Versuchen Sie, das in LabVIEW abgefragte Datum nebst Uhrzeit (mit 1/100 Sekunden) durch Parameterübergabe in mehrere ExceJ-Blätter zu übertragen.
IAufgabe 19.10 Versuchen Sie, über LabVIEW die x-Achse in den Excel-Bättern l mit Zeitmarken statt mit Indexnummern zu versehen.
IAufgabe 19.11 Versuchen Sie, ein VI zu entwickeJn, das nach der eingangs erwähnten zweiten Methode arbeitet und mehrere Diagramme in einer einzigen Excel-Datei speichert.
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'
426
19
LabVIEW: Tabellenlmlkuultion, Datenbanken
•
Bild 19.46 'SchreibenMehrfach.vi' verwendet Parameter beim Makro-Aufruf. Gegenüber dem Programm in Bild 19.44 leicht verändert: Die Zeitmessung ist hier eliminiert
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'
19.3
Beispiele zurAnwendungaufExcel
427
'SchreibenMehrfach.vi' ist insofern nicht praxisbezogen, als es selbst seine Daten erzeugt. Will man Messdaten mittlerer Frequenz bis zu etwa 100 Hz einlesen und parallel zur Erfassung in Excel-Tabellen speichern, sind Modifikationen notwendig. Im Programm 'SchreibenMehrfachMessdaten.vi' nach Bild 19.47 ist das geschehen. Das Frontpanel wurde dabei kaum verändert. Lediglich das SubVI 'UP_DatenerzeugungWahlweise.vi' mit dem Icon 'Datenerzeugung 4-fach' in Bild 19.46 wurde durch 'UP_Messdatenerzeugung.vi' mit dem Icon 'USB-Messdaten' ersetzt. Dieses SubVI entstand durch Abwandlung des n i Abschnitt 15.4 beschriebenen Unterprogramms 'USB_Analos-Chart.vi'. Bild 19.48 zeigt eines der mit 'UP_Messdatenerzeugung.vi' erzeugten Excel-Diagramme.
� :il!I=
�
�
� m'
I
,ff
�
,
"- � �
,
5r
,
,--' � c= � L-
1 '--= t= F t= :t:::
�
t= t= :t::= :t::: t= :t::: t= :i=
m
= t= ;= = dE
Bild 19.47 Datenerfassung und Schreiben in Excel erfolgen parallel. Die Daten werden im SubVi 'UP_Messdatenerzeugung.vi' mit dem Symbol 'USB-Messdaten' über eine USB-Schnittstelle eingelesen
IAufgabe 19.12 Analysieren Sie '&hreibenMehrfachMessdaten.vi' von Bild 19.47 und bauen Sie vor allem das SubVI 'UP_Messdatenerzeugung.vi' neu auf. überzeugen Sie sich davon, dass Ihr Programm ähnliche Excel-Blätterwie n i Bild 19.48 erzeugt.
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
428 -'!l
""
•
.. ;oto,.,
.
-
""
,�. ;<
-
-I.
.. ,
...
0_- �-
,
LabVIEW: Tabellenlmlkuultion, Datenbanken
"
.
-
•••
�
,
• • . ••""',,
!'cO<
#-
• _
_ -
�Ä
"' - 4 "
Funktionen
, ., • "
, "
, "
I
I
I
"
111
IU
0 I
.
16 �1 46 61
I
U
I 11
I I
,
11111 1II I i
IUU IU
---
1i i I I
.
---
I
.
1 I
-
76 91 100 121 136151 166 181 196 211 2'26 241 206 271 :1136 3D1 31, S�1 3016 361 316 391 400 421 496 451 466481 496
I�--....,� ..
.""n••
�.
'"
..:
Bild 19.48 Excelblatt. erzeugt mit 'UP_Messdatenerzeugung.vi'. Der Experimentierplatine von Vellemann (siehe Abschnitt 15.4, Bild 15.19) wurden per Funktionsgenerator verschiedene periodische Spannungsfunktionen mit einer Frequenz von etwa 1 0 Hz zugeführt
1 9.4
Microsoft-Datenbank Access
19.4.1
Einführung
LabVIEW lässt sich nicht nur mit Programmen zur Tabellenkalkulation wie Excel verbinden, sondern auch mit Datenbanken. Das soll hier am Beispiel von MS Access (Microsoft Access) gezeigt werden. Das Prinzip ist dasselbe wie bei der Tabellenkalkulation: Man benutzt die ActiveX-Punktionen: In einem neuen VI aufrufen 'Punktionen' - 'Konnektivität' - 'ActiveX' - 'ActiveX-Objekt öffnen' und ins Diagramm ziehen. Am Eingang des Symbols oben links m i Kontextmenü von 'ActiveX-RefNum' zu 'ActiveX-Klasse wählen' gehen, dort 'ADODB._Connection' holen und, wie übich, l einen Pehlereingang vorsehen, siehe Bi l d 19.49.
Bild 19.49 Beginn einer Datenbank-Programmierung
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.4
Microsoft-DatenbankAccess
429
Danach Öffnen der Datenbank im Kontextmenü des Ausgangs 'ActiveX-Refnum' mit Aufruf von 'Erstellen' - 'Methode' - 'Open'. In dieser Weise arbeitet man weiter und erhält so ein einfaches VI zum Auslesen einer Zeile der Datenbank (Bild 19.50, Bild 19.51).
Bild 19,50 Fertiges Programm, sehr einfache Variante zum Auslesen einer oder mehrerer Zeilen aus einer Datenbank
f:i�:::�E::::::J
11°""'''''''' ''''' ''' ; ,
- .-
1
----
-� """-)
'":"
-� � -
I-___�
'''''''''' 1 .0.. 1 ..... 1 . "",rl ' '''''''''' ' 1 ' _ 1 ''''''' '
f\!:' ::=-_- �����������������C==]:� ' .4
�
Ein Blick aufdas Frontpanel von Bild
Bild 19.51 Frontpanel zum VI in Bild 19.50
19.5 I wirft verschiedene Fragen auf:
I. Was bedeutet die Eintragung 'DSN=MeineVersuche' unter 'Datenbankverbindung'?
2.
Was bedeutet die Eintragung im Feld 'Kommandozeile'?
19.4.2
Verbindung mit der Datenbank
Antwort zu Punkt I : DSN oder 'Data Source Name' gibt den Namen der Datenquelle an, die hier 'Meine Versuche' genannt wurde. Ihr wird der Name einer Datenbank zugeordnet. Auch wenn diese Datenbank bereits existiert, hat man zunächst von LabVIEW aus noch keine Verbindung zu ihr. Sie muss erst n i der Systemsteuerung hergestellt werden. Dazu 'Systemsteuerung' - ' Verwaltung' aufrufen. Man erhält eine Anzeige wie in Bild 19.52. Nun auswählen 'Datenquellen (ODBC)'. Das bedeutet 'Open Database Connectivity' und meint einen standardisierten Zugang mittels der ebenfalls genormten Datenbanksprache SQL oder 'Structured Query Language', mit der die bekannten relationalen Datenbanken bearbeitet werden. Man erhält eine Anzeige entsprechend Bild 19.53. Dort 'System-DSN' wählen und mit 'Hinzufügen' einen Treiber zur Quelle 'MeineVersuche' benennen, hier 'Microsoft Access-Treiber (.....mdb)', siehe Bild 19.54.
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'
430
I
19
�-
o
�ott>e
. z"'"',
&ns>:rt
... 1.. ,"'''°'' ·"''>
' ''''· '
�
[avor.",
,.
•
l
"""'"
S!.l
CooopUO""MO'uno
Dot� (COOC)
cl) -
y..kropf......, ,,",
, S
Eltr"
Iiih
LabVIEW: Tabellenlmlkuultion, Datenbanken
o.on."
[}
do>hloo n
Bild 19.52 Anzeige der Verwaltung in der Systemsteuerung bei Einstellung der Ansicht auf Symbole
�
, ,
Micmooft .>Er ,,
-
'o<�..ru-.,
..
"�OOBC D.t.nqu.lI.n Admm ba' o, V,,�-PooiO-9 S�,II
I
Da
0,;""
M;uoool dil o>e D,�o< (".
.
In ,.,.. ODBC-8en1z",doI:e� _iIeO Irtccn.>:one
W III.
I
Bild 19.53 ODBC-Datenquellen Administrator. Dient zum Herstellen einer Verbindung mit einer existieren den Datenquelle (Datenproviderj. Dazu hat man '$ystem-DSN' aufzurufen
••U" O,'.nq••" "" " .n W_s;,,_T,_,"�f"_S._O-.,..... .,�-"""",,,,
,
��: ;; =:=: =:,rr:::'�' ("t" 'ml :1 ,1 "'�" """"",,," , """"r""l "'�"""_,,,"" oco(''''J "'�,,"" _,"', P�;ohI'·J "'�e< ",' 0 �.aoodtV;,"" F",p,.
:. ;; 'r : . iß ";j , " -m. ""',osol: 111010 Dr�"'.
"
,o,", -"".,.JJ
.,_" ,,",,'
, ,
G
:
eir '" Bild 19.54 Auswahl eines Treibers
Nach 'Fertig stellen' erhält man ein weiteres Fenster gemäß Bild 19.55. Dort trägt man die Bezeichnung 'MeineVersuche' als Datenquelle ein und in der zweiten Zeile, falls gewünscht, einen Kommentar. Die Verbindung mit der bereits unter dem Namen 'Datenbank zum Lernen.mdb' gespeicherten Datenbank erhält man durch den Aufruf von 'Auswählen' und Angabe des Pfades dorthin. Woher kommt die oben erwähnte Datenbank? In vielen Fällen existiert sie bereits. Sonst müssen wir sie selbst anlegen, wie z.B. 'db_2008_1O_30ZumLernen.mdb'. Wir sind hier vom fiktiven Beispiel einer Kurklinik ausgegangen, die ihre Patienten mit Namen, Wohnort, Krankheit und Allergien n i einer Datenbank verwaltet. Die Eintragungen wurden mit
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.4
Microsoft-DatenbankAccess
431
MS Access unter dem Tabellennamen 'Tabi ' gespeichert. Das VI in Bild 19.50 und Bild 19.51
�,��;�.c�m�...�,.�,;=======�;ci,��·1
bezieht sich aufdiese Datenbank. OOtil. Mocrosoft "ce.. . ""tup P�...... '000.,;00,-" o.� D-.b.n<
"""'"
.
D I ..I,[) . _ "",
1
"",_··
1
1',�··
1
l.m. n.,.-dI,
a....en·· ...
rCUP....'.. "
.JZO S::
�. 93IZMJI Wller 93IZMJl M�1er 93IZMJ' M��, 9O)H L l l1 M��, 90)'= M��, 90)'= ���, ���, ��I.. """""l ' ��I..
911J!' '''! 911J!=1
�)�Ek,,"," � "" ",,,,, """"""" """", =:f��;: "
9U21-'J' So"",,, 9U2'U' So"",,, 9U2'.ffi s.ow"
19,4.3
"-� f,i, f'i, f'" ""
Bild 19.55 Zuordnung der Datenbank 'Datenbank zum Lernen.mdb',gespeichert unter dem pfad 'D:\...\Datenbank zum Lernen.mdb' zur Datenquelle mit der Bezeichung 'MeineVersuche'
�» I "
... �. .,,, .,,,
".,."'" "�."'" 1J.751 �' 1J.75,_�m, 1J.75'_� =ro 1J.711·':JX13
.-
._ .,," H.""....
lob.. lob.. lob.. �" c,.
'"" ' I "',
Bild 19,56 Tabelle Tab" aus der Datenbank 'Datenbank zum Lernen.mdb', die man unter der Datenquelle 'MeineVersuche' findet
SQL
Antwort zu Punkt 2: 'SELECT '" PROM Tabl WHERE Vorname = 'Alma';' ist eine SQL
Anweisung, die besagt, dass man alle Zei l en aus Tabl, n i denen der Vorname Alma steht, angezeigt haben möchte. Das Zeichen '...' steht für alle Zeilen. Interessiert man sich nur für die Telefonnummern der Patienten mit dem Vornamen Max, müsste man schreiben SELECT Telefon PROM Tabl WHERE Vorname = 'Max'; Das Programm 'ADO_Abfragen.vi' aus Bild 19.51 zeigt dann das Ergebnis von Bild 19.57. 751·55687
711·18167
Bild 19,57 Telefonnummernabfrage Die Datenbanksprache SQL kann hier nur im Ansatz besprochen werden. Der interessierte Leser sei auf ein einschlägiges Lehrbuch verwiesen oder z.B. auf das Internet, in dem man eine gut verständliche Einführung finden kann unter http://w3 ww.w schools.com/SQl!default.asp
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'
432
19
LabVIEW: Tabellenlmlkuultion, Datenbanken
SQL zerfallt in zwei Teile, die DML oder 'Data Manipulation Language' und die DDL oder 'Data Definition Language' Die wichtigsten Befehle der DML sind: SELECf (zur Auswahl), UPDATE (zum Ändern), DElETE (zum Löschen) und INSERT INTO (zum Hinzufügen neuer Daten). Zur DDL gehören vor allem eRRATE DATABASE (Erstellen einer neuen Datenbank), ALTER DATABASE (Modifizieren, z.B. Anlegen einer neuen Tabelle), eRRATE TABLE (Tafel neu erstellen), ALTER TABLE (Tafel modifizieren), DROP TABLE (Tabelle löschen), CREATE INDEX (Index erstellen, z.8. Primärindex zur Schlüsselsuche) und DROP INDEX (Index löschen). Wir bringen noch ein Beispiel zum Ändern von Daten mit dem UPDATE-Kommando. Dazu dient 'ADO_Oberschreiben.vi', dargestellt in Bild 19.58 und Bild 19.59. ..- �en � e
11
!\U
I� �scr.lurt .
���::===::J iii
Ig. ;0;;;. 1IIt. <"'I. '-_ ...
,..... � ...
-
,..,) ,... � . � -
....---��
I·
Bild 19,58 Herr Max Müller aus A_Dorfwurde ohne Allergie eingetragen (Wert NULl. Das war ein Imum, er ist gegen Katzen allergisch. Hier wird es korrigiert. Mit 'ADO_Abfragen.vi' kann man sich davon überzeugen
Bild 19,59 Diagramm zum VI in Bild 19.5B
Die Abfrage 'SELECT " FROM Tabl WHERE Vorname ='Max';' liefert jetzt das n i Bi l d 19.60 gezeigte Ergebnis.
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'
19.4
Microsoft-DatenbankAccess
433 Bild 19.60
Die Katzen-Allergie von Herrn Max Müller aus A_Dorf ist nun mehr eingetragen
19.4.4
Verwendung von SubVls
Es ist sinnvoll, zur Bearbeitung einer Datenbank SubVls einzusetzen. Man kann sich selbst eine Liste geeigneter Unterprogramme erzeugen, ähnlich den bisher gezeigten 'ADO Anzeigen.vi' oder ADO_Oberschreiben.vi'. Einfacher ist es jedoch, auf bereits vorliegende Bibliotheken zurückzugreifen, wie sie hier im Unterordner 'LABSQL ADO functions' ge sammeJt sind. Sie sind Teil einer frei verfügbaren Bibliothek, die von Jeffrey Travis, dem Verfasser von [8] schon 2002 angelegt wurden. Details sind bei labsQl@jeffreytrav;s.com zu finden, ferner bei den Beispielen zu Kapitel 19 unter 'Access' - 'LabSQL ADO functions' in 'README_FIRST.txt'.
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
I nternet, Server und Client
Lernzl.1e I. Ethernet-Prinzip erklären können. 2. MAC-Adresse und IP-Adresse erklären können. 3. Datenaustausch zwischen zwei pes nach dem DataSocket-Prinzip n i LabVIEW programmieren können.
4. TCP/IP-Prinzip und Port-Nummer erklären können. 5. Datenaustausch zwischen Server und Client nach dem TCP/lP-Prinzip in LabVIEW programmieren können.
6. Schwächen des Ansatzes 'Ein Server - ein Client' beschreiben können. 7. Protokoll zur Kommando- und Datenübergabe für mehrere Clients verstehen.
8. Bildung unabhängiger Threads ('Forking') programmieren können.
20.1
Allgemeine Bemerkungen zum Internet
Das Internet dient nicht nur dem weltweiten Informationsaustausch. Man kann es auch zur Überwachung von Maschinen und Fabriken einsetzen. Stellen Sie sich z.B. eine Maschine in Australien vor, die in Deutschland hergestellt wurde und vorbeugend gewartet werden soll. Dazu braucht man heute keine Spezialisten mehr, die lange und teure Flugreisen unterneh men, um nach dem Rechten zu sehen. Diese Art von Wartung kann per Internet erfolgen: Spannungen, Ströme, Geräusche, welche die Maschine produziert, lassen sich über das Internet nach Deutschland übertragen und dort von Fachpersonal überprüfen. Treten Un regelmäßigkeiten auf, kann die Bestellung und der Austausch von Ersatzteilen angeordnet werden.
20.1.1
Ethernet
Heutzutage wird im Internet hauptsächlich Ethernet verwendet (erfunden von Dr. Robert M, Metcalfe, später genormt nach IEEE 802.3). Die Rechner hängen an einem Bus. Jede Station, die senden möchte, prüft, ob der Bus frei ist (Potenzial 0 Volt). Ist er frei, beginnt die Station mit 0,85 V für die logische I und -0,85 V für die logische 0 zu senden. Dabei hört sie die eigene Nachricht ab. Beginnt zufallig im selben Zeitpunkt eine andere Station zu senden, kommt es zu einer so genannten 'Kollision'. Diese wird von beiden bemerkt, da auf der Leitung jetzt eine Mischung aus den Nachrichten entsteht, die mit keiner der beiden ursprünglichen Nachrichten übereinstimmt. Beide Stationen stoppen und nehmen nach einer von Zufallsgeneratoren bestimmten kurzen Zeitspanne h i ren Sendeversuch wieder auf. Aller Wahrscheinlichkeit nach kommt dann eine Station etwas früher zum Zuge und kann
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.1
Allgemeine Bemerkungen zum Internet
435
ihre Nachricht absetzen, da nunmehr die andere Station bemerkt, dass die Leitung belegt ist. Man nennt diese Methode auch CSMAlCD-Protokoll, was 'Carrier Sense Multiple Access/Collision Detection' bedeutet. Die Datenübertragungsrate ist in den letzten Jahren auf 100 Mbitls oder sogar auf einige GbitJs gestiegen. Allerdings dürfen die Stationen nicht weiter als SOO m voneinander entfernt sein. Für größere Strecken braucht man eine Art von Verstärker, der als 'Repeater' bezeichnet wird.
20.1.2
Ethernet-Karten, MAC· und IP-Adresse
Ein PC enthält heute normalerweise bereits standardmäßig eine so genannte Ethernet-Karte, die für den Datentransfer über das Internet auf der physikalischen Ebene sorgt. Es besteht die wichtige Vereinbarung, dass jede dieser Netzwerkkarten eine weltweit einmalige Adresse hat. Das ist eine Hardwareadresse, die 'MAC'-Adresse genannt wird (Media Access Control) und nach der Produktion der Karte nicht mehr geändert werden kann. Sie identifiziert ein deutig jeden Knoten im Internet, wie zum Beispiel die MAC-Adresse OO-A3-41-DE-E9-89. Man darf sie nicht mit der für den Anwender wichtigen IP-Adresse verwechseln. Die IP-Adresse kann per Software an jedem PC beliebig eingestellt werden. Doch strebt man auch hier Eindeutigkeit an, was durch verschiedene Organisationen gewährleistet werden soll. Man erfahrt beide Adressen des eigenen Computers, indem man n i einem DOS-Fenster (Eingabeaufforderung) das Kommando ipconfiglall absetzt. Dabei zeigt sich Folgendes:
Merke: Eine IP-Adresse hat meist die Form aaa.bbb.xxx.yyy Hierin bedeuten 'aaa', 'bbb', . . . jeweils ein dezimal geschriebenes Byte (neuerdings gibt es auch IP-Adressen mit 6 Byte). Da ein Byte 8 Bit hat, entstehen 2S6 Möglichkeiten, so dass man die Zahlen zwischen 0 und 2SS erhält. Mit 'aaa' und 'bbb' werden größere Organisatio nen (Domains) bezeichnet. Diese Zahlen teilt das Network Information Center (NIC, Inter netadresse: http://www.nic.com) n i den USA zu. Die Hochschule Ravensburg-Weingarten hat z.B. die Ziffern 141.069. Sie gehört zum Bereich '.de', also Deutschland, der seit Dezem ber 1996 vom 'Interessenverband DE-NIC' betreut wird (Adresse: http://www. denic.de). Die Adressteile
'xxx'
und 'yyy' werden von den Systemadministratoren in den durch die
ersten beiden Ziffern bestimmten Organisationen zugewiesen. Folgende Ausnahme gilt:
Merke: Jeder Computer kann auf seine eigene Ethernet-Karte mit der IP-Adresse 127.0.0.1 zugreifen. Sie wird symbolisch als 'Iocalhost' bezeichnet.
20.1.3
TCP/IP·Pro.okoll
Daten zwischen zwei Computern kann man nur austauschen, wenn man sich an gewisse, zuvor festgelegte Vereinbarungen hält. Schon am einfachen Beispiel der seriellen Datenüber tragung über eine RS 232 (siehe Abschnitt IS.l) sieht man, dass der Sender nicht einfach mit der übertragung von Daten beginnen kann. Er hat zuerst ein Startbit in positiver Logik zu
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
436
senden, dann die Daten in negativer Logik. Ferner muss die Geschwindigkeit von Sender und Empfanger bis aufwenige Prozent übereinstimmen usw. Die Menge dieser Vereinbarungen wird Protokoll genannt. Computer mit einem Betriebs system, das unter UNIX oder Linux arbeitet, verwenden schon seit über 30 Jahren das so genannte TCPIIP-Protokoll. Darin bedeuten: TCP
=
Transmission Control Protoeol
IP
=
Internet Protocol
Merke: Ein Protokoll ist die Menge aller R�eln, die man zu beachten hat, wenn
Daten aufzuverlässige Weise vom Sender zum Empfiinger übertragen werden sollen.
Merke: Eines der bestbekannten Protokolle für den Datentransfer im Internet ist TCP/IP.
Wie schon der Name sagt, besteht TCP/IP aus zwei 'Schichten'.
IP hat die Aufgabe, eine
Verbindung zwischen Sender und Empfänger herzustellen. Es enthält Vereinbarungen über die Bildung der Adressen. Man kann das mit den Vereinbarungen der Post über die weltweit eindeutige Bezeichnung von Orten durch Länderkennzahlen und Postleitzahlen vergleichen. TCP dagegen kümmert sich um die Übertragung selbst. Um beim Beispiel zu bleiben: Wo werden die Briefe gesammelt? Aufwelche Weise werden sie befördert usw.? IP ist ein
verbindungsloses ProtokolL
Das bedeutet, der Sender schickt seine Daten, ohne
dass zuvor eine Verbindung zum Empfänger hergestellt wurde, wie das
beim Telefonieren
üblich ist. Der Sender ist normalerweise Teil eines Subnetzes. Alle Computer n i diesem Sub netz empfangen die Nachricht. Befindet sich der Adressat auch im Subnetz, behält er die Daten, anderenfalls ignoriert er sie. Im Subnetz ist ferner ein Router. Er entscheidet, wohin eine Nachricht weitergeleitet wird, die keinen Adressaten m i Subnetz hat. Um Zufallsent scheidungen zu vermeiden, benötigt er dazu eine gewisse Kenntnis der Netzstruktur. Beim verbindungslosen Versenden von Daten ist nicht vorherzusehen, ob und wann der Empfänger die Nachricht erhält. Bei komplizierten Netzwerkstrukturen kann es zu einer Verdoppelung der Nachrichten kommen, wenn sie von zwei Routern weitergegeben werden.
Da die Nachricht in kleinen Paketen von wenigen Bytes verschickt wird, kann es auch ge
schehen, dass die Pakete in der falschen Reihenfolge ankommen. Auch können Datenpakete infolge von Leitungsstörungen verloren gehen. Das IP-Protokoll kümmert sich nicht darum. Dies ist vielmehr Aufgabe des TCP-Protokolls, das verbindungsorientiert arbeitet. TCP stellt eine Verbindung zwischen Sender und Empfanger her und löst diese nach übertragung aller gesendeten Daten auf. Unter einem Multitaskingbetriebssystem wie UNIX, das verschiedene Tasks quasiparalle1 bearbeitet, kann ein Sender mehrere Empf änger bedienen. Die einzelnen Verbindungen müssen dann auseinandergehalten werden. Das geschieht beim TCP/IP-Protokoll mit Hi l fe der so genannten 'Port-Nummer'. Wir werden darauf in Abschnitt 20.4 zurückkommen.
20.2
Einfaches LabVIEW·Beispiel: Ping
Wenn wir wissen wollen, ob ein Computer mit einer bestimmten IP-Adresse ansprechbar ist, d.h. ob er eingeschaltet wurde und seine Ethernet-Karte sowie die entsprechende Software
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.2 Einfaches LabVJEW-Beispie/: Ping
437
funktionsfähig sind, so können wir das erfahren, indem wir ihm ein 'Ping'-Kommando schicken. Das geht von einem DOS-Fenster (Eingabeaufforderung) aus mit der En i gabe von 'ping
s_
PING-Kommando J
Bild 20.1 Panel und Diagramm eines Ping-VI. Es sendet alle 10 Sekunden einen Ping an die im Panel links eingestellte IP-Adresse
Bild 20.2 Ergebnis eines Ping-Kommandos an den 'Iocalhost', also die eigene Ethemet-Karte Rufen wir dagegen dasselbe Programm mit der IP-Adresse eines Computers auf, der abge schaltet ist (z.B. 141.69.58.133), erhalten wir eine Reaktion wie im Bi l d 20.3.
Bild 20.3 Antwort. wenn eine IP-Adresse nicht verfügbar ist Die IP-Adresse des Rechners, an den man den Ping gesendet hat, erscheint oben in der Ant wort. Aus Bild 20.2 können wir so entnehmen, dass der Ping an die eigene Netzwerkkarte
gn i g (IP 127.0.0.1) und dass der Rechner den Namen 'PC-Georgi' hat. Im Fall von Bli d 20.3 hat der Computer mit der IP-Adresse 141.69.58.133 nicht geantwortet.
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
438
Bemerkungen zum Programm Plng.vl Im Diagramm wird die Stringkonstante 'ping , (das Leerzeichen am Ende ist wichtig. damit wird der Systembefehl 'ping' von der IP-Adresse getrennt) mit der am Panel einge stellten IP-Adresse verkettet und der Funktion 'Systembefehl ausführen' in 'Funktionen'
- 'Konnektivität' - 'Bibliotheken & Programme' zugeführt.
Diese Funktion hat oben einen Eingang 'Auf Abschluss der Operation warten'. Er muss aufFALSE stehen, sonst kann man die Antwort des Systems nicht sehen.
20.3
Programmieren mit DataSocket
Ist die Verbindung mit einem zweiten Computer über das Internet möglich, möchten wir Daten übertragen. Dazu hat National Instruments eine recht bequeme Methode entwickelt, die allerdings nicht unter UNIX bzw. Linux verfügbar ist. Wir werden sie deshalb nur kurz anhand eines kleinen Beispiels streifen. Bi l d 20.4 zeigt ein einfaches Server-Client-Paar, hier als Sender und Empfänger bezeichnet.
EJ
Bild 20,4 Sender-Empfänger-Paar. Bewegt man beim Sender den Zeiger des Drehinstruments, folgt ihm sofort der Zeiger im Empfänger
Zum Testen des Programms ist es sehr bequem, beide Programme auf einem Rechner zu haben. Das ist der große Vorteil des 'Iocalhost', dass er genau dieses ennöglicht. Nachdem die Vls auf einem Rechner getestet wurden, kann man Sender und Empfänger auf verschiedenen Rechnern laufen lassen. Man muss dann nur im Empfänger statt 'Iocalhost' dessen IP-Nummer eintragen, etwa 141.69.58.134. Man startet auf diesem Rechner 'Sender.vi' und aufdem Rechner 141 .69.60.68 'Empfänger.vi'. Ist die Verbindung in Ordnung, leuchten auf den Panels beider Programme die kleinen Rechtecke rechts oben neben den Drehinstrumenten grün, anderenfalls rot. Bei Rot stoppt
man den Empf anger und startet ihn erneut. Meist ist der Fehler dann behoben. Nun kann
man vom Rechner mit dem 'Sender.vi' aus das Drehinstrument auf dem anderen Rechner mit 'Empfanger.vi' steuern. Bild 20.5 und Bild 20.6 zeigen die Diagramme von Sender und Empfanger.
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.3 Programmieren mit DataSocket
439
Bild 20.5 Diagramm des Senders
j$ mp fäO(Jel'I
Bild 20.6 Diagramm des
Empfängers
Erläuterungen zum Sender (Bild 20.5) 1. Das DataSocket-Konzept erfordert den Start eines LabVIEW-Serverprogramms namens cwdss.exe. Man kann diese EXE-Datei manuell starten. Sie ist zu finden im Verzeichnis . .\National Instruments\DataSocket'. Vergisst man das, laufen die Vls nicht. Also star tet man cwdss.exe besser automatisch. Das VI dazu ist nicht unmittelbar in der Palette
der Funktionen zu finden. Man sucht daher unter 'Funktionen' - 'VI wählen . . . ' und dort '...\LabVIEW 8.2\vi.lib\Platform\dataskt.llb\DataSocket Server ControLvi'. Es ist per Kontextmenü mit einer Konstanten zu verbinden, welche die vier Möglichkeiten 'Iaunch', 'show', 'hide' und 'dose' bietet. Die Marke Sl im Diagramm des Senders zeigt, dass hier 'Iaunch' gewählt wurde, was Starten von cwdss.exe heißt.
2. Jedes Bedien- oder Anzeigeelement (Marke S3), das Daten nach der DataSocket Methode übermitteln soll, muss dafür vorbereitet werden. Man ruft im Kontexmenü des Elements 'Eigenschaften' auf, wählt die Registerkarte 'Datenbindung' ganz rechts und er hält das n i Bild 20.7 gezeigte Fenster. Dort macht
man
die dargestellten Eintragungen.
Dazu gehört 'dstp:lflocalhost/temp', was bedeutet, dass auf dem Rechner, auf dem 'Sender.vi' läuft, der DataSocket-Server ein internes Verzeichnis (temp) zur Zwischen speicherung zur Verfügung stellt. Von dort aus kann der Rechner mit dem Programm 'Empfanger.vi' seine Daten abholen. Ferner ist für den Sender 'Nur Schreiben' einzutra gen. Die Marke S2 in Bi l d 20.5 weist daraufhin, dass die obige Adresse 'dstp:lflocalhostl temp' auch der Schreibfunktion (Marke S4) mitgeteilt werden muss. 3. Die Schreibfunktion (Marke S4) in Bild 20.5 findet man als 'DataSocket: Schreiben' unter 'Funktionen' - 'Datenkommunikation' - 'DataSocket' (Mitte erste Zeile). Sie benötigt als Eingangsparameter einen String, der die Adresse bezeichnet, an die zu schreiben ist, und zweitens die Daten selbst.
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'
440
20 P E,g""schaften f", Dr�h.chalt.,r Oreh,nstru"",nt
Internet, Se",er und Client
x
"",.-
"�
NatioNIIr>
Bild 20.7 Fenster zum Herstellen einer Data Socket-Verbindung
4. Nachdem man die While-Schleife von 'Sender.vi' durch Stopp beendet hat, wird der DataSocket-Server cwdss.exe mit 'dose' beendet (Marke 55).
Erläuterungen zum Empfänger (Bild 20.6) 1.
Die Adresse, von der der Empfanger lesen soll, wird per Stringverkettung (Marke EI) zusammengesetzt aus dem Typ (dstp:l!), der IP-Adresse des sendenden Rechners, z.B. 141.69.58.134, und dem Unterverzeichnis (hier Iternp), n i dem 'Sender.vi' die Daten ge speichert hat.
2. Die Lesefunktion (Marke E4) hat den Namen 'DataSocket: Lesen' und ist in der gleichen Palette zu finden wie die Schreibfunktion. Sie benötigt neben der Adresse, von der sie le
sen soll, den Datentyp (hier DBL, weil das Drehinstrument standardmäßig DBL-Daten liefert), der durch eine beliebige Konstante des gewünschten Typs (hier 0, Marke E2)
repräsentiert wird. Außerdem wurde die Timeout-Zeit, die standardmäßig 10000 ms =
10 s beträgt, auf eine Sekunde herabgesetzt (Marke E3), damit das VI nach Stopp nicht
noch 10 Sekunden wartet, bevor es beendet wird. 3. Die von der &hreibfunktion gelieferten Daten werden auf dem Drehinstrument des Empfangers angezeigt (Marke ES). Das Drehinstrument ist wie beim Sender in dem Fenster von Bi l d 20.7 zu konfigurieren, nur wählt man hier 'Werte simultan anzeigen'. Beide Vb haben in ihren Whi l e-Schleifen Zeitverzögerungen von 50 ms. Man darf diesen Wert nicht zu klein wählen, wei l sonst wegen des Zeitbedarfs der Betriebssysteme auf den kommunizierenden Rechnern die Datenübertragung gestört würde. Hier muss
man
ein
wenig experimentieren. Bemerkung: Bis LabVIEW 7.1 konnte man die Datenverbindung im Kontextmenü des Bedien- oder AnzeigeeJements unter 'Datenoperationen' - 'DataSocket-Verbindungen' erzeugen.
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
441
Programmieren mit TCP/IP
20.4
Programmieren mit TCP/IP
20.4.1
Server und Cllent
Man kann die Bezeichnung 'Server - Client' n i einer ganz simplen Weise als Bedienung und Kunde verstehen. Der Kunde hat einen Wunsch, z.B. n i einem Restaurant, und die Bedie nung erfüllt den Wunsch. Diese Bedeutung wurde auf die Software übertragen: Ein Pro gramm, Client genannt, stellt eine Anforderung, z.B. eine Information vom Internet
zu ho
len. Ein anderes Programm, Server genannt (manchmal meint man damit auch den Compu
ter, auf dem dieses Programm gespeichert ist), erfüllt sie. Tabelle 20.1 zeigt das Prinzip beim Arbeiten mit dem Internet. Tabelle 20.1
Entwicklung von Server- und (lient-Software auf zwei verschiedenen Rechnern Server-
mit
Computer
Software und der IP-Adresse
TCPIIP-Verbindung mit
Computer mit Client-Soft-
Ethernet-Karte
ware und der IP-Adresse
141.69.60.114
141.69.58.134
.........•
Bei der Entwicklung von Server- und Client-Software ist es unbequem, mit verschiedenen Rechnern zu arbeiten, besonders wenn diese nicht nahe beieinanderstehen. Man könnte daher das Modell von Tabelle 20.1 ersetzen durch das von Tabelle 20.2, bei dem man ein und denselben Rechner sowohl für die Entwicklung der Server- als auch der Client-Software benutzt. Tabelle 20.2
Computer Software
Entwicklung von SelVer- und (lient-Software auf einem einzigen Rechner mit und
Serverd"
[P-
TCP/IP-Verbindung
mit
Ethernet-Karte
Adresse 141.69.60.114
.
.....
Computer mit Client-Software und der IP-Adresse 141 .69.60.114
..
Schließlich muss man nicht die zufällige IP-Nummer 141.69.60.114 verwenden, sondern kann sich aufjedem Rechner auf den 'localhost' mit der Nummer 127.0.0.1 beziehen, wie das Tabelle 20.3 zeigt. Tabelle 20.3
Computer Software
Entwicklung von $elVer- und (lient-Software unter Bezugnahme auf den 'Iocalhost' mit und
Serverd"
IP-
TCP/IP-Verbindung Ethernet-Karte
Adresse 127.0.00. 1 (local-
•........•
mit
Computer mit Client-Software und der IP-Adresse 127.0.0.1 (localhost)
host) Auf die letztgenannte Weise wurden auch die beiden Vls programmiert und getestet, die in Abschnitt 20.4.2 besprochen werden.
20.4.2
Beispiel für die Übertragung von SInusdaten über TCP/IP
Das Server-Programm 'TcpServerMitEinemClient.vi' erzeugt n i diesem Beispiel sinusfönni ge y-Werte vom Typ DBL, die mit der TCP-Schreibfunktion auf die Leitung gesendet wer den. Das Client-Programm 'TcpEinClient.vi' empf angt sie und zeigt sie n i einem Chart an. Die wichtigsten Funktionen für beide Programme findet man unter 'Punktionen' - 'Daten kommunikation' - 'TCP' (links oben). Die Palette ist n i Bild 20.8 dargestellt.
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
442
l!Jl
�
�
TCP:t_
TCP: Yerbi-
11' ....... 51:,"'11
5tfTV """" 11'
TCP: Ao.t5q> .. , 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,<,�.dwtt... . : "' - �. ..ErD ie
Wein"
,
"',
'-"
-
�
F;;I!; ,.:�.
0
!O,OI
r
- I, ..�
-
'
....
7 ��
-
.,.
i:iI:i •
f,;o JE
�
I ,...,.
.... �
-" �
..
- , ,. :-
I
�I
0
. ..
Bild 20.28 Parameterwerte aus der Stringrepräsentation zurückgewonnen
Der Client empfangt die Daten vom Server mit 'CliencreadData.vi', siehe Bild 20.29, das zyklisch aufgerufen wird. Der Benutzer darf im Eingabefeld 'Interval' der Client-Oberfläche vorschreiben, n i welchem zeitlichen Abstand auf den Eingang neuer Daten geprüft werden solL Der Server kann die Daten aber in kürzerem Abstand verschicken. Man darfdaher nicht nur einen Wert lesen, sondern muss alle zu diesem Zeitpunkt verfügbaren zur Kenntnis nehmen. Dazu wird das SubVI 'TCPJead.vi' innerhalb einer While-Schleife mit einem Timeout von 0 Millisekunden aufgerufen. Empfangt das VI in diesem Moment Daten, werden sie in 'Data' (DBL-Array innerhalb des Clusters 'Data') an der Stelle 'Index' eingetra gen. 'Data' selbst ist als Ringspeicher implementiert. Der Schreibzeiger 'Index' wird auf null zurückgesetzt, wenn der Schreibvorgang die maximale Anzahl von Datenpunkten (hier
1024, siehe 'ClienUnit.vi') überschreiten würde, Danach wird der nächste Schleifendurch lauf gestartet, bis keine weiteren Daten mehr über die TCP/IP-Verbindung eingehen und 'TCP_read.vi' mit einem 'Command' ungleich 'SetData' beendet werden kann. Achtung: Der Eingang 'Systemdezimalzeichen verwenden (T)' an der oberen Seite der Funk tion 'Bruch-/Exponential-String nach
Zahl' ist unbedingt auf FALSE zu setzen. Andernfalls
werden die Daten nicht richtig vom Client empfangen, wenn der Server infolge der regiona
len Einstellungen in der Systemsteuerung des Computers ein Komma an Stelle eines Dezi malpunktes überträgt.
Merke: Es ist möglich, Daten verschiedenen Typs zusammenzufassen und in einen Gesamtstring umzuwandeln. Das Umgekehrte gilt ebenfalls.
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.7
Client/Server-Anwendung
455 "5etDot,"
Lflo.,
. .
,�.
. '
,
ConnectünID Erre< ..,
l!lW
...L
0-
,..
lIi!I
::fE:L
.
�
0., ,�.
I r""'
.,
[j]
!I
�r
�� e------------------------""" ��oct Bild 20.29 Daten vom $elVer empfangen ('ClienCreadData.vi')
20.7.2
Server mit einem Cllent
Das SubVI 'ServecSingieClient.vi' des Hauptprogramms 'ServecSingieCiencmain.vi' l besitzt keine Oberfläche zur Ein-IAusgabe von Daten. Es wird gestartet und bearbeitet ein gehende Anforderungen des einzigen Clients. Bild 20.30 zeigt das Diagramm. KN"IFeNer ...
c�
[j]
r.-�LJ � D!l illl
Bild 20.30 Diagramm von '$elVer_SingleClient.vi'. das der Kommunikation mit einem einzigen Client dient
Dieses SubVI erzeugt mit der Funktion 'TCP: Listener erstellen' eine neue 'Listener 10', die dem Server erlaubt, auf eingehende Verbindungen zu reagieren. Tritt bei der Ausführung dieser Funktion ein Fehler auf, wird der Server sofort beendet. Das könnte z.B. daran iegen, l dass 'Port' bereits durch eine andere Anwendung belegt ist. Abhilfe schafft n i diesem Fall die Vergabe einer neuen Port-Nummer, die dann natürlich auch im Client verwendet werden muss. Dagegen wird bei fehlerfreier Ausführung die Funktion 'TCP: Auf Listener warten' in der While-Schleife aufgerufen. Meldet sich nun ein Client an, wird die Funktion 'TCP: Auf Listener warten' verlassen und 'ServecSingleCliencmain.vi' aktiviert, das die Anforderung des Clients bedient. Nach Beendigung des Clients wird aufdie nächste Verbindung gewartet. Bi l d 20.31 zeigt das Diagramm des Server-Hauptprogramms, das die Anforderungen des Clients bearbeitet. Dieses Diagramm ähnelt dem des Clients in Bild 20.23, abgesehen davon, dass die obere While-Schleife keine Ereignisstruktur enthält. Hier wird alle 20 Millisekunden (Timeout von 'TCP_read.vi') in den Zustand 'WriteData' gewechselt, wenn der Server keine Daten vom Client empfangen hat. Das Erzeugen und übertragen der Daten erfolgt m i VI 'ServecSingieClient_writeData.vi'. Das VI in Bi l d 20.32 berechnet mit den vom Client erhaltenen Parametern einen Funktions wert der ausgewählten Kurve. Dazu dienen Funktionen aus der Palette 'Signalverarbeitung' 'Punkt für Punkt' - 'Signalerzeugung (Punkt für Punkt)'. Nach der Berechnung wird der Wert in eine Zeichenkette konvertiert und an den Client gesandt.
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
456
,
��,
r"
I"" , ..
.
[TI
i";
rt
..
�I
,
[TI Bild 20.31 Diagramm des Server-Hauptprogramms 'Server_$ingleClienLmain.vi'
"
�
D.t,m
""
�
!o "
.,g,
_CIlI
�
Bild 20.32 Diagramm von 'Server_SingleClienLwriteData.vi': Bearbeitung des Zustandes WriteData' Achtung: Der Eingang 'Systemdezimalzeichen verwenden (T)' an der oberen Seite der Funk tion 'Zahl nach Steing (Fließkommadarstellung)' muss auch hier unbedingt auf FALSE ge setzt werden, siehe Bemerkung am Ende von Abschnitt 20.7.1.
Merke: Das 'Systemdezimalzeichen' kann Punkt oder Komma sein, je nach Einstel
lung in der Systemsteuerung. Wählt man 'Systemdezimalzeichen' = FALSE,
wird stets mit dem Dezimalpunkt gearbeitet.
20.7.3
Server mit mehreren Cllents
In der Praxis sollte ein Server aufAnfragen von mehreren Oients reagieren können. Sobald nach erfolgreicher Verbindungsaufnahme mit dem ersten elient eine Berechnung gestartet ist, bleibt der Server aus Bi l d 20.30 bis zum Abschluss der Berechnung blockiert. Das liegt
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.7
Client/Server-Anwendung
457
damn, dass dort das Programm 'ServecSingieClient_main.vi' abläuft, das vom Listener keine neue 'ConnectionID' akzeptiert, bevor es seinen Dienst beendet hat. Bis dahin kann den Server kein weiterer Client kontaktieren. Wie lässt sich das ändern? Gewünscht ist ein modifiziertes Server-Programm, das einen 'Klon' für die Berechnung er zeugt, der eigenständig mit dem Client kommuniziert, während das Server-Programm da nach sofort bereit für die Aufnahme der ConnectionID eines weiteren Clients ist. Zur Lösung dieses Problems könnten wir daran denken, mit der schon in Abschnitt 5.3.2 beschriebenen dynamischen Bindung zu arbeiten, doch reicht das nicht. Wir übernehmen den Server aus Abschnitt 20.7.2 und ändern nur das Hauptprogramm geringfügig ab, siehe Bi l d 20.39. Auch 'ServecMultipleClients_main.vi' muss ablaufinvariant definiert sein, da parallel mehrere Instanzen desselben VIs zu starten sind.
Erweiterte dynamische Bindung Unter den Methoden der VI-Klasse findet man auch 'VI ausführen'. Sie wird mit zwei optio nalen Parametern aufgerufen. 'Warten bis beendet' gibt an, ob der Methodenknoten so lange blockieren soll, bis die Ausführung des gestarteten VIs beendet ist. Der Standardwert ist 'TRUE'. Der zweite Parameter 'Ref automatisch schließen' legt fest, auf welche Weise die dynamische Referenz geschlossen werden soll. 'FALSE' (Standardwert) beseitigt die Referenz nach Beendigung nicht automatisch. Dies muss vielmehr das aufrufende VI tun. Wird der Parameter dagegen auf 'TRUE' gesetzt, wird die Referenz automatisch von LabVIEW geschlossen, sobald das SubVI beendet ist. Bild 20.33 zeigt die Verwendung der Methode. Das VI öffnet eine Referenz auf 'VI_ausfuehren_SubVI.vi' und startet es über die Methode 'VI ausführen'. Der Methodenknoten blockiert, bis das SubVI abgelaufen ist. Erst danach wird die Referenz freigegeben. •
•
-+
,D
"
J.·",t�n b, tJN:--j.""
·t,.-� ,-N ,..,.,
Bild 20.33 Methode 'VI ausführen' mit
Standardwerten für die Parameter
'VI_ausfuehren_SubVI.vi' ist ein einfaches Programm, das sich nach einer gewissen Zeit automatisch se1bst beendet. Im Anzeigeelement 'gewartet' wird die tatsächlich gewartete Zeit in Millisekunden angezeigt. Bild 20.34 zeigt das Diagramm. Das aufrufende Programm wird im Methodenknoten für die Dauer von 'Zu wartende ms' mal 'Zähler' verzögert, was der Laufzeit des aufgerufenen VIs entspricht. Startet man nun das Hauptprogramm, scheint keine merkliche Verzögerung aufzutreten. Dies liegt daran, dass das ausgeführte VI ausschließlich mit seinen Standardwerten für die beiden Bediene1emente arbeitet, die in unserem Beispiel jeweils auf den Wert null gesetzt sind. Der Nachteil gegenüber der Funktion 'Aufruf über Referenz' ist bis jetzt, dass dem VI keine Werte übergeben werden können. Das kann man aber einfach mit einer weiteren Methode der VI-Klasse korrigieren. Mit 'Bedienelementwert' - 'Festlegen [Variant]' kann der Wert eines jeden Elements im Frontpanel gesetzt werden. Dazu muss nur der Name des zu setzen den Elements bekannt sein. Sinngemäß existiert die Methode 'Bedienelementwert' - 'Setzen [Serialisiert]" welche die Daten als Strings erwartet. Wir erweitern nun das aufrufende Pro gramm, damit sich beide Werte in 'VI_ausfuehren_SubVI.vi' setzen lassen. Nun können wir die Werte über das aufrufende VI einstellen undden Aufrufverzögern.
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·
458
20
Internet, Se",er und Client
Bild 20.34 Diagramm von 'VI_ausfuehren_SubVl.vi': einfaches Programm zu Demonstrationszwecken. Es durchläuft eine While-Schleife im 'Zu wartende ms'-Takt, bis die durch 'Zähler' vorgegebene Zahl der Sc.hleifendurchläufe erfolgt ist
Bild 20.35 Erweiterter dynamischer Aufruf mit ParameterObergabe
Entsprechend den Methoden zum Setzen von Frontpanel-Elementen, exIstieren auch Methoden, um Werte aus dem Frontpanel auszulesen. Wir erweitern das Programm um den Aufruf 'Bedienelementwert' - 'Abfragen (Variant]" um den Wert 'gewartet' aus dem SubVI in Bi l d 20.34 auszulesen. Siehe dazu Bild 20.36.
Bild 20.36 Erweiterter dynamischer Aufruf, zusätzlich mit Auslesen des Rückgabewerts
Das VI in Bild 20.36 hat bis jetzt noch dieselbe Wirkung wie 'Aufruf über Referenz', d.h., es blockiert das aufrufende VI weiterhin. Dies können wir korrigieren, indem wir 'Warten bis beendet' der Methode 'VI ausführen' auf FALSE setzen. Achtung: In diesem Fall wird das Auslesen des Rückgabewerts in den seltensten Fällen den richtigen Wert liefern, da die Aus führung von 'VI_ausfuehren_SubVI.vi' meistens länger dauert als die Ausführung des Methodenknotens. Wir wollen nun alle bisher besprochenen Schritte zusammenfassen und eine Lösung für unser Server-Problem vorstellen. 'VI_ausfuehren_SubVI.vi' wird jetzt n i direkt über ein wei teres VI aufgerufen, welches das Setzen der Parameter und das Starten übernimmt. Es ist so
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.7
Client/Server-Anwendung
459
angelegt, dass es leicht an geänderte Anforderungen angepasst werden kann. Dafür sind nur
Zahl und Typ der Bedienelemente sowie der VI-Name zu ändern. Außerdem muss dann für jedes neue Element ein entsprechendes Gegenstück mit demselben Namen im aufgerufenen VI existieren.
Bild 20.37 Aufruf eines SubVis mit ParameterObergabe. ohne dass das aufrufende VI blockiert wird Das VI in Bild 20.37 ermittelt zuerst die Namen und Werte der eigenen (Bedien-)Elemente. Dazu dient die Methode 'Bedienelementwert.Alle ermitteln', die ein Array von Clustern zurückliefert, das jeweils Name und aktuellen Wert des Bedienelements enthält. Hier muss der Parameter 'ßedienelemente' auf 'TRUE' gesetzt sein. Gibt man 'FALSE' vor, wird ein Array mit Anzeigeelementen geliefert. Bi l d 20.38 zeigt das angepasste Diagramm für die gleichzeitige Kommunikation eines Servers mit mehreren Clients. Für jede Gient-Anfrage wird dynamisch eine neue Instanz des Vb 'Server_MultipleClients_main.vi' erzeugt, das die Anfragen paralleJ abarbeitet. Man benötigt die Konstante 'x8' am Eingang 'Optionen' der Funktion 'VI-Referenz öffnen'. Sie bereitet das VI als auflaufinvariant vor, siehe dazu auch die Kontexthilfe zu 'VI-Referenz öffnen'. Dieses Vorgehen wird auch 'Forking' (abgeleitet von fork gleich GabeJ) für 'Verzweigen' genannt.
ConnectmID I:JI
Bild 20.3B Diagramm von 'Server_MultipleClients_fork.vi': Anfragen von mehreren Clients bedienen � Feter ...
•
c�
-�
III
DlI fi1l
Bild 20.39 Diagramm von 'Server_Multiple Clients.vi': Server-Anwendung für die gleichzeitige Kommunikation mit mehreren Clients. Das Pro gramm ist mit dem VI in Bild 20.30 nahezu iden tisch, nur wird hier statt 'Server_SingleClienc main.vi' das SubVI 'Server_MultipleClients_fork.vi' aufgerufen
Bisher wurden nur die wichtigsten Elemente der Server-/Client-Software vorgestellt. Das
ganze System in seiner Entwicklung ist wesentlich komplexer. Die einzelnen VIs sind in einem Projekt zusammengefasst, das in Bild 20.40 bis Bild 20.43 dargestellt 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'
20
460
O>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
s lW 'ma·w"am B • _ CorrvJ:er
s Q eiert S· fJ 5efVef_�ipleCiert,
..,•
S e 5efvor_5ino;JeCiert IW TCP_CornrrJ.YldType,ctl
TCPJ"ndlef'rrC<,,; TCP_P"'omsTo5tr......,; TCP_PoromsType,ctl TCP_reod,,; TCP_5tr....ToP"'oms,,; . TCP_",le,,; �ffi .i:; Buid-5pezti
Bild 20.40 Übersicht über das Projekt TCP.lvproj'
8;lzeiQ
Internet, Se",er und Client
-
Bild 20.41 V1s im Unterverzeichnis '(Iient' von
'TCP.lvproj'
Die hier im Ordner 'Client' gespeicherten VIs sind n i Bild 20.41 zu sehen, die 'Server_MultipleClients' in Bild 20.42 und die in 'ServecSingieClient' in Bi l d 20.43. I>
in
Projekt EHPIoo� T[P Ivproj --- --
s e 5emf_��1eC1ern il ""'vO!'_�Clbn",v;
L.. [U 5
:..·il 5
,.. Ill 5
Bild 20.42 V1s im Unterverzeichnis 'Server_MultipleClients' von 'TCP.lvproj'
..:J Bild 20.43 V1s im Unterverzeichnis 'Server_SingleClient' von 'TCP.lvproj'
IAufgabe 20.5
Verschaffen Sie sich einen überblick über das Projekt 'TCP.lvproj' und versuchen Sie, die hier nicht beschriebenen Programme zu entwickeln.
Merke: Das Bilden unabhängiger Threads zum Zwecke des Boo.ienens mehrerer Clients durch einen Server wird auch 'Forking' genannt.
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
Compact RIO-System und FPGA
lernziele 1. Begriffe RIO und FPGA erklären können. 2. Einfache Programme für das Zusammenspiel zwischen pe und RIO-System entwickeln können. 3. Einfache Programme für den Ablauf auf einem FPGA in Zusammenarbeit mit einem pe programmieren können. 4. Einfache Programme für den Standalone-Betrieb eines RIO-Systems unter Verwendung des FPGA entwickeln können.
2 1 .1
Definition
RIO bedeutet Real Input Output System. National Instruments hat hierzu verschiedene Typen entwickeJt, unter denen wir das System 'NI cRIO-9012' näher betrachten wollen. eRIO steht für Compact RIO, weil das RIO-System selbst eine kleine kompakte Box von nur etwa 70 x 70 x 80 mrn' ist. An diese kann man einen größeren Träger (FPGA-Chassis) an docken, der eine FPGA enthält und n i den man vier oder acht Einschübe zur Aufnahme von Ein-/Ausgabe-Modulen stecken kann. Wir arbeiten hier mit dem Träger NI 9104 und den Modulen NI cRIO 9215 für die Analogeingabe, NI 9401 für die Digital-Ein-/Ausgabe und NI 9263 für die Analogausgabe. FPGA bedeutet Field Programmable Gate Array, d.h. ein im Feld programmierbares Gate Array. Im 'Feld programmierbar' heißt, dass man kein spezielles Programmiergerät benötigt, sondern dass man alle Einstellungen am Gate Array unmittelbar vom Computer aus, z.B. bei der Arbeit mit einem Laptop, durchführen kann.
Bild21.1 Obersichts
I..obVIEW ro,WI_
LabVl� RNI-T�I
L.WEWfi>GA
bild mit PC, Compact Rlo-System und FPGA (übernommen von National Instruments)
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'
462
21
Compacl RIO-System und FPGA
Ein Gate Array ist eine Anordnung von Gattern wie AND, OR, Flipflops U$W., die nicht fest verdrahtet sind wie n i einem fertigen Je, etwa dem rfL-Baustein 7404 mit seinen sechs In
vertern, sondern die erst noch vom Anwendet zu verbinden sind. Sieht dieser später, dass die
Verdrahtung fehlerhaft war oder dass er sie nicht mehr benötigt, kann er sie auflösen und
durch eine neue ersetzen. Das geschieht nicht mit dem Lötkolben und auch nicht auf einem Programmiergerät, sondern vom Computer aus mit einer speziell für diesen Zweck geschrie benen Software. Diese wandelt das L abVIEW-Programm n i VHDL (Very High Definition Language) um und erzeugt anschließend mit einem VHDL-Kompiler das entsprechende Verdrahtungsmuster, siehe Bi l d 21.2. Mit einem Gate Array kann man hohe Geschwindigkeiten erzielen, z.B. arbeitet das NI 9104 mit bis zu 200 MHz, was einer Taktzeit von 5 ns entspricht. Der voreingestellte Standardwert beträgt 40 MHz gemäß einer Taktzeit von 25 ns. Ferner können hier vom Anwender programmierte Prozesse wirklich parallel ablaufen, nicht nur quasiparallel wie aufPCs mit einem Prozessor. Man benötigt dann natürlich auch Hardware für jeden einzelnen der parallelen Prozesse. Der NI 9104 arbeitet mit einem FPGA-Chip der Firma Xilinx'" mit 3 Millionen Gattern. Die einzelnen Gatter sind zu 'Logic Slices', also 'logischen Teilen', zusammengefasst, deren Zahl mit 14336 angegeben ist. Eine andere, äquivalente Aussage betrifft die Zahl der logischen Zellen (32256 Logic Cells). Der Kern der Kompilier-Software, der ein LabVIEW-VI n i ein Verdrahtungsmuster auf dem FPGA umwandelt, kommt ebenfalls von der Firma Xilinx
Soort.: XJLNX
Bild 21.2 Struktur eines FPGA und mögliche Funktionen (nach National Instruments)
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.2
lnstalliltion
RoII·lim.
ProctUOf
Hiih SpHd
6",
463
Ro
FI'6A
c.,,,,..ct,,,
Di!litinJi .nd lsol.�on
ß:ock
s.o..,ro .nd AClllIOf l '
Bild 21.3 cRIü-901 2-Architektur mit FPGA-Ein-/Ausgabe-Modulen (nach National Instruments)
2 1 .2
Installation
Schritt 1 LabViEW 8.2 (oder 8.5) installieren, sofern noch nicht geschehen. Aufrufen LabViEW 8.2 und dort 'Leeres Vi' wählen. Danach 'Werkzeuge' - 'Measurement & Automation Explorer' (MAX). Nun erhält man eine Ansicht gemäß Bild 21.4. Unter 'Netzwerkumgebung' links unten finden sich noch keine Einträge.
National Instruments Measurement &: Automation Explorer Über den Mellsurement & AUlOm"tion [ >
Def Me,,,rem," & Autom,M, E>:p,re' ("" Xl 'omöoJ'-cht _ 'll9'iff .ur "', [r., Pr""u'te vrn ",,;0.10' [nstrumen".
Möoliche Arbeitsschrille
.. ""'".".,,00 'IT;""'" .n1i 'r'" ""• ..., �l ,",00 m · ' ;.r t onc ,, !t w � . ,'0'" , 1 "" "I W " IlMl ' IJ Y orw
.. ,...... . ''''' ,rt,. "' ."• •
01", T.",'"'(.m,"
iII h l ol oo " 00c l ..; o w ", V ii""'y " ;. ..r " 1O rn oo t
• 'C"" "11mV(TY ' I·'" tf["
" ..K \} " 1 H'...r ll"",·t..",.I:.O �·."'·" '· 'Ü< G",';'.
l!J, "inw�i. ""90 '''"9''';''' ' ''''' <J«"'_"'_' "" w,", >L
1'11.".", I,fo"",'''''''' "" .It.n Soo on 'on :.t.== "". M*" "" "'on" H""'. ,,, 1"..,,,,.... LJn'.",u'ar.g odor .,,,.... Inf,,,,,,_ ,u I"", H,",w'" "".""....n Soo �.O<. Wob",. ,, ,.. ",'","n•." "c�,
11
1 .1 .
Bild 21.4 MAX nach Installation von LabViEW 8.2
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'
464
21
Compacl RIO-System und FPGA
Schritt 2 Installieren von der DVD: 'NI ACADEMIC SITE LICENSE (FALL 2006)' für 'Control, Simu lation and Mechatronics Software' sowie 'Embedded Systems Software' oder von einer ent sprechenden DVD: •
LabVIEW 8.2 FPGA Module
•
LabVIEW 8.2 Real-Time Module ETS (für PCS mit PCI-Bus)
•
NIRI02.1
Weil NI RIO 2.1 auf der DVD noch nicht ganz ausgereift war, wurde hier die weiterentwi ckelte Treibersoftware NI RIO 2.1.2 vom Internet geladen. Dazu ist in http://www.ni.com/ downloads 'Drivers and Updates' und dort 'Current Versions' aufzurufen, bei denen man unter 'Measurement Hardware' und 'Reconfigurable 110' den gewünschten Treiber findet und den Download-Prozess starten kann. Es handelt sich um eine ZIP-Datei, die anschlie ßend zu entpacken und mit 'Autorun.exe' zu n i stallieren ist. Nach dem Abschluss dieser Prozeduren bietet der MAX eine Ansicht gemäß Bild 21.5. �
Mein System
Mea.urement 11: AutomatIon Expl orer
RIX1·n·f1e 7.1 RIX1·Trne 8.0.1 RIX1·Trne 8.2.1 .0 Me05O.Xeme"Jt & A<.tC<Mtioo Exphor .. NISpy f§I NI·HWS .t NI-PAl ')I' NI·RIO !} NI·Sor� ')I' NI·USI �, � NHI5A .o Netzwor�
Bild 21.5 MAX nach Installation der drei Soft warepakete 'LabVlEW 82 FPGA Module', 'LabVIEW 8.2 Real-Time Module ET$' und 'NI RIO 2.12'
Schritt 3 Zusammenstellen der Hardware, also des Controllers NI cRIO-9012 mit dem FPGA-Chassis 9104, in das in unserem Beispiel zunächst nur die Module NI cRIO-9215 für die Analog eingabe sowie NI 9401 für die digitale Ein-/Ausgabe eingefügt wurden. Das FPGA-Chassis 9104 bietet Platz für insgesamt acht Module, von denen wir später noch zum Teil Gebrauch machen werden, etwa für das Modul NI 9263 zur Analogausgabe. Zur (Gleich-)Spannungsversorgung genügen 9 bis 35 V. In unserem Fall wurden 15 V gewählt. Die Masse des Labornetzgerätes wurde mit der Buchse C auf dem NI cRIO-9012 verbunden, die positive Spannung mit der Buchse VI (Skizze dazu siehe TiteJblatt von 'OPERATING INSTRUCTIONS CompactRIOTM cRrO-9012'). Die fünf kleinen DIP Schalter stehen alle auf OFF. Weitere Details sind dem Handbuch 'INSTALLATION IN STRucrrONS CompactRIO"" Reconfigurable Embedded System cRIO-9101/9102/9103 19104 Chassis' zu entnehmen.
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.2
lnstalliltion
465
SchrItt 4 Verbinden des Controllers cRIO-9012 über TCP/IP mit dem Computer. Man kann dies mit einer direkten Kopplung cRIO E--7 Computer erreichen, doch benötigt man dann ein UTP Nullmodemkabel (UTP = Unshielded Twisted Pair, verwendet für lokale Netze). Nonna lerweise benutzt man aber gewöhnliche UTP-Kabel, die den Rechner mit einem Hub verbin den. In diesem Fall geht man also zuerst vom PC aus ins Intranet einer Hochschule oder Finna und kommt von dort zum cRIO-Controller. Wir haben hier den zweiten Weg beschritten. Das erfordert eine freie IP-Adresse für das cRIO-System. An der Hochschule Ravensburg-Weingarten war die IP-Adresse 141.69.60.34 verfügbar. Die Verbindung wird folgendermaßen hergestellt: im MAX mit Rechtsmausklick auf 'Netzwerkumgebung' und 'Neu' ein Fenster für 'Hinzufügen . . . ' öffnen gemäß Bild 21.6. H
.'.''Il"
Measurement & Automation Explorer
I..W �
Bild 21.6 Hinzufügen von cRlo9012 zum Netz
i das man die für das cRIO Mit 'Weiter >' öffnet man ein Fenster entsprechend Bild 21.7, n System verfügbare Adresse einzutragen hat. H
.'.''Il" ''''''' ''' ",,_,� I'"ht •.,f ...... ...... .. " ,••,,) Measurement & Automation Explorer
IW" �
:u. L.ok"'�"", � ........,._.'� ,.nmit �
"
"'''''' '-'-_'.1>''''" ''' ''''_"_ ••IP__�.""G.�"., W ,,_ _on
...
,"",, ����u'�""'''''_ ' '_''''''''
Bild 21.7 IP-Adresse für cRIQ9012 eintragen
Nach 'Beenden' zeigt sich der Measurement & Automation Explorer (MAX) entsprechend Bi l d 21.8. Möglicherweise erscheinen nicht alle Einstellungen für IP-Adresse, Subnetzmaske, Gateway und DNS-Server sofort so, wie dort rechts oben angezeigt. Setzen Sie sich dann mit Ihrem Netzwerkadministrator zusammen, um eine passende Lösung zu finden.
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
466
Compacl RIO-System und FPGA
Sehr wichtig ist vor allem, dass der Haken zu 'Bei TCP/IP-Fehler System anhalten' entfernt wird. Anderenfalls sind keine Standalone-Anwendungen möglich, weil das '-RIO-System sofort stoppt, sobald man das Internetkabel entfernt. Auch wird empfohlen (wie hier geschehen), eine feste IP-Adresseeinzustellen statt sie vom DHCP-Server zu beziehen.
O ....,... .. "" .. P""""',
""",---" ,;' ,0-
......-.. 1'·'·'-') .-..... .. ,,.._. ."'
Bild 21.8 MAX nach Installation einerTCP!IP-Verbindung zwischen Pe und cRlo-9012
Nach den oben genannten vier Schritten sind Sie so weit, dass Sie Programme für das cRIO System entwickeln können. Es läßt sich dabei eine Reihe verschiedener Konfigurationen vorstellen: •
Ein Programm läuft auf dem cRIO-9012 und schickt seine Ergebnisse über TCP/IP an den PC, an dem sie angezeigt werden. Das FPGA wird nicht genutzt.
•
Das Programm auf dem cRIO-9012 erhält Daten, z.B. Analog- und Digitalwerte über die Sensoren, die an das FPGA angeschlossen sind, verarbeitet diese und sendet die wichtigsten Ergebnisse über TCP/IP an den PC.
•
Das Programm auf dem cRIO-9012 arbeitet autonom im Standalone-Betrieb. Nach der Programmentwiclclung wird die Verbindung zum PC getrennt. über das FPGA kom muniziert das cRIO-System mit der Umwelt und bildet z.B. einen Teil eines Regelkreises, n i dem es Daten erfasst und Steuersignale über die Analogausgänge zurücksendet.
Zu allen diesen Optionen werden nachstehend einige Beispiele gegeben.
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.3
Programmierbeispiele
467
2 1 .3
Programmierbeispiele
21.3.1
Zusammenarbeit cRIO�9012 mit einem Laptop
Wir wollen nun zwei VIs entwickeln, das eine für den cRIO-9012 mit dem Namen 'RIO-Sinus.vi', das andere für den Laptop namens 'Laptop.vi'. Das erste Programm soU Sinuswerte berechnen und über TCP/IP an das Laptop-Programm senden. Dort sollen sie in einem Signalverlaufsdiagramm angezeigt werden. Wir können dabei wie folgt vorgehen: 1. Im Startfenster von LabVIEW 8.2 unter 'Dateien' ein 'Leeres Projekt' starten (Echtzeit Projekt ist auch möglich, aber noch nicht geeignet für Anfanger). Man erhält ein Fenster entsprechend Bild 21.9. 2. Projekt speichern mit 'Datei' - ' Speichern' unter dem Namen 'Laptop_RIO.lvproj'. Da nach Rechtsklick auf die erste Zeile 'Projekt: Laptop_RIO.lvproj' und 'Neu' - 'ZieJe und Geräte' wählen. Man erhält dann ein Fenster gemäß Bi l d 21.10. po Pro Jekt-EHplorer - unbenanntes Projekt
B·
(Q
e
1
��
Projekt; lklbenemtes Projekt 1
• '11*'*'1'"AI
f- y L.
en
�
Buid.5pezifMtionef"l
Bild 21.9 Erster Schritt
bei der Erzeugung eines neuen LabVIEW-Projekts fOr den cRlo-9012 zOoIouodGo<". r. ,�.lIoj �Gerlit
,,-
r _dwaor....� hm4
[r"''-ro
se ".�·T'" ComoodRIO Sb R."'Tm D<>ltcp @e O.�·T'" PXl
�
I ·...,-I
Bild 21.10 Einbeziehen des cRlo-Systems in das Projekt
3. Erste Zeile 'Real-Time CompactRIO' anklicken und das System suchen lassen. Nach einigen Sekunden findet es das RIO-System, und wir erhalten nach dem Markieren von 'cRIO-9012' eine Ansicht wie in Bi l d 21.1 1.
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
468
Compacl RIO-System undFPGA
I> lopt.p RIO l,pro1 21�1. und Gerat. hOlzufuqen. LoIo"""�...
r. v--".ZioI ..-...", r
Sucht bo"t"'-do zOolo 00.. ..."'.
cdefGef�';�;;;.;. ;;;;;;pJ
....<110... ., einem rr�_z E� Gef!l _,5ctne!ze,�....twd � Me,,,,, �,
r � aeIodor Geriit
Erst"" reue> Z�
Bild 21.11 Hinzufügen des cRIQ-9012 zum Projekt 'Laptop_RIO.lvproj'
4. Weiter mit 'OK'. Das Projekt zeigt nun nach Speichern und 'Alle Erweitern' (im Kon textmenü des obersten Knotens) ein Aussehen gemäß Bild 21.12. �.. �M � �O)ekt �en _beuge E-'"
'Il <3 " e � 10019'""*.
�' I .I t, V 'it; -� _ C<:
L ,1: "I
"' . ...
E1I. .... cRIo-9012 (Hl.69.60.3'I) Uj·Spelft..'lt.lonef'l
tV -� e B<jd.Speztt.abonon
Bild 21.12 Projekt nach Einbeziehung des RIQ-Systems
5. Nun erst beginnt die eigentliche Programmierung. Man fügt ein leeres VI m i Kontext menü von 'Mein Computer' mit 'Neu' - 'VI' ein und in gleicher Weise ein zweites im Kontextmenü von 'cRIO-9012'. Speichert man diese Programme unter den Namen 'Laptop.vi' und 'RIO-Sinus. vi', erhält das Projekt jetzt ein Aussehen wie n i Bild 21.13. � PrOjekt EHplorer laptop IUOJvprol �ei �en
"
� Etc)ett
'tj tJ U i? 1
II I'- ii: � =-
e
Uj-Spezttmonen
.... dl.lo-9OI2(1�1.69.60.3'I) . R1O-Si-oJs.'o'i
1-'1 _ " ii:
Uj-Spezttmonen
� ��
\f irC.
=-'" E_er
l5: � iI�
J
Bild 21.13 Projekt mitden neu gebil deten Vls 'Laptop.vi' und 'Rlo-Sinus.vi'. Sie sind zunächst noch leer
6. Die beiden unter Punkt 5. genannten Programme sollen Daten austauschen. Dazu ver wenden wir die unter LabVIEW 8.0 neu eingeführten Umgebungsvariablen. Sie sind in 'Programmierung' - 'Strukturen' - 'Umgebungsvariable' links unten zu finden. Zieht man sie in ein Diagramm, erscheinen sie als Icon ohne Beschriftung, siehe Bi l d 21.14.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS929S1cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
21.3
Programmierbeispiele
469
Bild 21,14 Umgebungsvariable ohne Variablenverknüpfung
Man muss sie mit einem Variablennamen verknüpfen, der m i Projekt zu speichern ist. Hier entnimmt man aus Bi l d 21.17 und Bild 21.18, dass wir die Umgebungsvariablen 'Frequenz', 'SinusWert' und 'Stopp' verwenden wollen. Sie sind im Projekt unter 'Mein Computer' zu speichern, und zwar via Kontextmenü mit 'Neu' - 'Variable'. Das öffnet ein Fenster, in dem man die Eingabefelder 'Name' und 'Datentyp' ausfüllt, siehe Bild 21.15.
-,
Bild 21.15 Namensgebung für eine Umgebungs variable
Nach 'OK' wird im Projekt eine Bibliothek angelegt, die zunächst nur eine Variable enthält. Ähnich l wie 'SinusWert' erzeugt man anschließend 'Frequenz' und 'Stopp', dies mal allerdings vom Kontextmenü der neu gebildeten Bibliothek ausgehend. Anderenfalls würde zu jeder einzelnen Variablen eine neue Bibliothek gebi l det. Das Projekt zeigt sich nun nach Umbenennung der Bibliothek per Kontextmenü, wie in Bild 21.16 dargestellt. P Proje.t E>
Bild 21.16 Projekt nach Einfügen und Umbenennen einer Bibliothekfür Um gebungsvariable
7. Das Programm 'RIO-Sinus.vi' hat die n i Bild 21.17 gezeigte Struktur, das Pe-Programm 'Laptop.vi' ist in Bild 21.18 zu sehen.
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'
470
21
�-
.
��-t . 11
�
"'" �",f.hon 1jl"",0UQ0 , .... ,"'
�"
1,,-
r�E-'"1
Cii I:Li""l,: I.,·=� ��'�-��' m-rnJ E [j)� .
h"'�'e
..,... "'"
•
HiI-o
1'1>1'�",f<1ft...
Compacl RIO-System undFPGA
.
�
� '" I
•
eI;
0
j
ill
Bild 21,17 Diagramm von 'Rlo-Sinus.vi', das später auf dem 'cRIQ-9012' laufen soll. Dieses VI velWendet 'Funktionen' 'Signalverarbeitung' 'Punkt für Punkt' 'Signalerzeugung' 'Sinusschwingung'
Auf dem FrontpaneJ von 'RIO-Sinus.vi' wird nichts angezeigt, denn das RIO-System hat keinen Bildschinn. Dagegen befindet sich aufdem Frontpanel von 'Laptop.vi' ein Signal verlaufs-Diagramm entsprechend Bi l d 21.20.
' I:�.I
!!iI--L-
[j]
__ Bild 21,18 Diagramm von 'Laptop.vi', das später auf dem PC laufen soll
8. Wie erhalten nun die anfangs unverknüpften Umgebungsvariablen ihre Namen? Dazu entweder Doppelklick oder im Kontextmenü auf 'Variable auswählen . . . ' gehen. Im Fenster nach Bi l d 21.19 die gewünschte Variable markieren und 'OK'. Die Umgebungs variable ändert dann ihr Erscheinungsbild, wie in Bild 21.17 und Bild 21.18 zu sehen.
1,,,, , o>ocO""(1,"-,
"'_o�""'''-"�.,._,ü""'''''''''',,.,,, '' -� EI·' """cer"",,,
B�. rr"�� , ,,,.
"
,,,,",
[-
� u-t..w-rt. ,u«t.' 1.Mb
-
f·L"""�'.-t ,
LJ
-"
F"", u",,
J"
Bild 21.19 Auswahl eines
� .""�,""I �
Namens für eine Umgebungs variable
9. Nun startet man aus dem Projekt-Explorer heraus 'Laptop.vi'. Man sieht ein Fenster gemäß Bild 21.21, das den Verteilungsprozess beschreibt. Das Laptop-Programm liefert die beiden Umgebungsvariablen 'Frequenz' und 'Stopp' (beim Starten von 'RIO-Sinus.vi'
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.3
Programmierbeispiele
471
wird diese Variable aufFALSE gesetzt) und erhält von 'RIO-Sinus.vi' die Werte der Vari ablen 'SinusWert', die entsprechend Bild 21.20 angezeigt werden. Es handelt sich um ein
zelne Werte und kein Array. Mit dem Anhalten von 'Laptop.vi' wird der Wert 'Stopp' =
TRUE als Umgebungsvariable auch an das RIO-System übertragen, was den Stopp von 'RIO-Sinus.vi' verursacht.
,
Bild21.l0 Frontpanei von 'Laptop.vi' nach dem Start. Die Sinuswerte werden im cRIQ-9012 mit 'RIQ-Sinus.vi' erzeugt I> Ve,'eden.
['"'--"'." D
Bild 21.21 Verteilungsprozess eines VI auf
den cRIQ-9012 10. Das VI 'RIO-Sinus.vi' auf dem cRIO-9012 (Bild 21.17) wird ebenfalls aus dem Projekt Explorer heraus gestartet. Vor dem Schleifeneintritt wird Stopp aufFALSE gesetzt, damit das VI nicht gleich anhält, wenn es zufallig zuerst gestartet wird. Bemerkung: Im vorliegenden Fall hätte man das Projekt vom LabVIEW-Startfenster aus auch als 'Echtzeit-Projekt' unter 'ZieJe' starten können. Der Vorteil dieses Verfahrens iegt l darin, dass dem Anwender dabei eine Fülle von Optionen angeboten wird, z.B 'Continuous communication architecture' oder 'State machine architecture' usw. Auch erhält er zusätzlich den Rahmen bereits vorgefertigter Programme. Der Nachteil für den Anfanger liegt darin, dass er nicht ohne weiteres die im konkreten Fall günstigste Option finden kann.
IAufgabe
21.1
Versuchen Sie das oben entwickelte Projekt 'Laptop-RIO.lvproj' unter anderem Namen aus einem Echtzeit-Projekt (statt aus einem leeren Projekt) heraus zu entwickeln. Auch soll diesmal keine Sinus-, sondern eine Sägezahnkurve angezeigt 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'
472
21
Compact RIO-System und FPGA
Merke: Umgebungsvariablen haben eine ähnliche Funktion wieglobale Variablen. Während diese aber den Datenaustausch zwischen verschiedenen VIs nur auf einem PC ermöglichen, erlauben Umgebungsvariablen auch den Datenaus tausch zwischen VIs, die aufverschiedenen Systemen laufen.
Merke: Projekte für Realtime-Anwendungen lassen sich aufsehr verschiedene Weise entwickeln. Man kann z.8. einfach ein leeres Projekt öffnen, muss sich dann
aber selbst um alle Details kümmern. Oder man öffnet ein Realtime-Projekt.
Dann erhält man vom System eine Reihe von Hilfestellungen.
21.3.2
FPGA-Anwendung auf dem cRI0-9012 mit LaptopunterstOtzung
Im folgenden Beispiel wollen wir auch das FPGA nutzen, das sich in der Anschlussbox 9104 zum cRIO-9012 befindet. Das Programm auf dem RIO-System soll eine von außen angelegte Sinusspannung analysieren und beim überschreiten einer einstellbaren Schwelle einen digitalen Rechteckimpuls erzeugen. Es soll also einen Schmitt-Trigger realisieren. Beide Spannungen sind aufeinem handelsüblichen Oszilloskop anzuzeigen. Anders als n i Abschnitt 21.3.1 werden hier Spannungswerte benötigt, d.h. Daten, die von außen kommen und nicht vom Computer (z.B. dem cRIO-9012) erzeugt werden. Dazu benötigt man Eingabe-/Ausgabeeinheiten in den Steckplätzen der Erweiterungsbox 9104, die über das FPGA mit dem cRIO-9012 kommunizieren. Im Beispiel wurden verwendet 1. NI cRIO-92IS zur Erfassung von Analogwerten 2. NI 9401 zur Eingabe und Ausgabe von Digitalwerten Diese Einheiten werden in die Slots (Einschubrahmen) 1 und 2 der Erweiterungsbox 9104 eingeklinkt. Die Pin-Belegungen der Einheiten sind den Heftchen 'Operating Instructions' zu CompactRIO"'" cRIO-921S bzw. zu NI 9401 zu entnehmen. Genutzt wurden:
1. Beim NI cRIO-921S zur Analogwerterfassung Pin 1 zusammen mit Pin 9 (in der Bedie nungsanleitung mit Terminal 1 und 9 bezeichnet) als Masse, Pin 0 als Eingang für die von einem Frequenzgenerator ausgegebene Analogspannung (wechseJweise Sinus, Sägezahn usw. verschiedener Frequenz).
2. Beim NI 9401 entnimmt man der Anleitung, dass die digitalen Ein-/Ausgänge in Grup pen zu konfigurieren sind. Wir haben die Kanäle 0 bis 3 als Ausgänge bestimmt, dagegen die Kanäle 4 bis 7 als Eingänge. Die Konfiguration erfolgt später per Software, wie noch besprochen wird. Vor dem Beginn der FPGA-Programmierung ist zu beachten: •
Für den Datenaustausch mit anderen Programmen stehen keine Umgebungsvariablen mehr zur Verfügung, sondern nur noch globale Variablen. Allerdings ist auch die übliche Datenübergabe zwischen aufrufendem VI und FPGA-Unterprogramm möglich. Das ist in Bild 21.22 dargestellt.
•
Die Palette 'Programmierung' - 'Funktionen' ist stark eingeschränkt, andererseits gibt es neue, spezielle FPGA-Funktionen, siehe Bi l d 21 .23.
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.3
Programmierbeispiele
473
Umgebungsvariable
Umgebungsvariable
alpha
Laptop-VI
alpha GlObale Variable
I
cRlO-VI (nonnal)
S ta
Call mit Daten-
austausch GIObale Variable
I � SUchef>I � AIIsid>t ... f'rC9"1IrOO"IinO
� � � ll::A.. �
'ru,"�
FPGA M"th &.
. •
I� � hl �
FPGA
••
1/0
� � � �
Closter &. Veri• • •
0
""""
(FPGA)
�
IP
.....,
'...
cRlo-vr
Bild 21.22 Daten austausch zwischen normalen Vls und FPGA-Vls
•
Arrey
-,
�
'-
MemJry &. FIFO
Syn:/YorUation
..�'"
Bild 21.23 Palette der Funktionen in einem FPGA-Vl. Sie erscheint nur, wenn man ein VI innerhalb eines Projektes in der FPGA-$ektion definiert hat
Fav
""'" " ..
Die Entwicklung der wiederum zwei benötigten Programme beginnt zunächst wie in Abschnitt 21.3.1. Die ersten vier Schritte sind identisch. Also:
I. Projekt anlegen, diesmal mit dem Namen 'RIO_FPGA.lvproj', danach 'cRIO-9012' finden lassen. Nun gibt es Änderungen: 2. Im Kontextmenü von 'cRIO-9012 . . .' aufrufen: 'Neu' - 'Targets and Devices. . .' Es öffnet sich ein Fenster gemäß Bild 21 .24, in dem man diesmal das FPGA suchen ässt. l Sobald es gefunden ist (Anzeige: 'RIO::INSTR (cRIO-9104)'), markieren und 'OK'.
1
�::':;':" ZieI oder r.etR
5ud-.t ketohorde zde od« """'e.
r
Ha,d"a", in .in.m f..md
r _. _ _ _...
,
Bild 21.24 Das System hat die Erweiterungsbox cRI0-9104 entdeckt
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
474
Compacl RIO-System und FPGA
3. Wir könnten nun unter 'Mein Computer' wie m i früheren BeispieJ ein VI definieren, das mit dem cRIO-System zusammenarbeitet. Doch ist das nicht nötig. Das System lässt nämlich zu jedem VI, das aufdem cRIO-9012 1äuft, automatisch eine Art von Spiegelbild auf dem Laptop laufen, auf dem man sich die Ergebnisse anschauen kann. Anders als beim BeispieJ des Projektes 'Laptop_RIO.lvproj' im vorigen Abschnitt machen wir nun von dieser Möglichkeit Gebrauch. Wir definieren folglich nur ein VI im Kontextmenü von 'cRIO-901 2 ( ... )' mit 'Neu' - 'VI' und speichern es als 'AufruCFPGA.vi'. 4. Ferner definieren wir im Kontextmenü von 'FPGA Target (RIOO . . .)' mit 'Neu' - 'VI' ein FPGA-VI, das Analogwerte einlesen und Digitalwerte ausgeben soll. Sein Name ist 'ACDO.vi'. 5. Der Projekt-Explorer zeigt nun Einträge entsprechend Bild 21.25.
,
I I I I
"
10 _ Orboord Orl.
FPGA 1�(R1OO::lNS1R, cR10-9UH)
Bild 21.25 Projekt-Explorer für Analogeingabe und Digitalausgabe 'AI_DO.vi' nach vorläufiger Konfigura tion eines FPGA·Projektes
6. Nun müssen die in der Erweiterungsbox 9104 enthaltenen Einschübe zur Analogwert erfassung und Digital-Ein-IAusgabe für die Software verfügbar gemacht werden. Das geschieht im Projekt-Explorer: Im Kontextmenü von 'FPGA Target (RIOO . . . )' wählen 'Neu' - 'c Series Modules' und vom System die Einschübe 'NI 9215 (Slot I)' und 'NI 9401 (Slot 2)' entdecken lassen. Beide gemäß Bild 21.26 markieren und mit 'OK' ins Projekt übernehmen. , ... u-d "".. ,
� --... .... ......... ""�"",....... ",,. _ ...>t.
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=<;,,""',....,.. ...,'" "'
·
, ,
"'
�
'"'''
D,,,"'l,..""""
"
"91" ,,,,, [,,,,, ... ,,,,,, '' �, � � �
·
-
o.
r
_ "'
""'>I''' "' '' '''rolOO "" "" ro"'''' .�.
"" �,
--"'-'.J """",", I
�, """"''''>'NO.ood,,","", " ""
i1
·
..... [10
�
.
t
-
r.: �",, _�O"_
= I>
Projekt EHplorer RIOJPGA IvproJ
�ei §e",tdffi
,, �
U
(o"rl
=
f
1: I�
Bild 21.27 Aus wahl der benötig ten leitungen
T.JEJ:8
anzeio;lffi �o;e+1 &u
X
8- ..... cRlO-9012 (1-11.69,60,3-1)
ii Wn,J FPGA,,;
IrvJ: � �� "i: ��!I!!Ii-
eB IJ
DiQltoi lne
8 fj NI '>\m
e fJ
ond CVp<J:
.. DIOO (NI '>\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
"'"
�1"'" ""':lv q�_A'-")-""'''''"> (O"hl:"" '" '__""""'0),
00'8_"0013-,",> 00 r
Bild :n.34 Zweites Fenster, dassich beim Start eines noch nicht Obersetzten FPGA-V1s öffnet I> 5ucc�."'uI (omplle Re_t
[ievice !Jtilization Su...."ry Nullber of BUFGlfUXs Nu.ber of Exterll41 roBs Nu.ber cf LOCed IOSs Nuaber of SLICEs
3 147 147 783
out out olH out
ot of of of
16 19% U4 JO% 147 100% 14336 5%
Cleck !ldtes (Requested rat= dre adjusted for j itt= dlld accuracy) Base clcck 40 11Hz Onboard Clock Reque",tcd R
.=l
Bild 21.35 Abschlussprotokoll in einem dritten Kompilierungs-Fenster
rek
JL
• Stop
M Pos: 0.000<;
eH,
KopplurJg
11
Bandbreite
,SHZ
lIoIts/Div,
liIi
Tast�opf
l1li
CH1 2,OO'f
CH2 S.oOIl
M SOm
CH' f -7.2011
Bild 21.36 Erzeugung einer Recht eckfunktion durch 'AI_DO.vi', die auf einem OSZilloskop auf Kanal 1 (un ten) angezeigtwird. Frequenz ca. 10 kHz
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS929S1cf089d91b1gecaOOaO, Zentral- u 2009_07_31 21:42:39 +02'00'
21.3
Programmierbeispiele
479
Bemerkungen: 1. Als Ergebnis der übersetzung schreibt der Kompiler ein so genanntes Bitfile in ein
Unterverzeichnis 'FPGA Bitfiles', das direkt unter dem Verzeichnis angelegt wird, in dem das übersetzte VI steht. In unserem Beispiel hat es den Namen RIO_FPGA.lvpro;_FPGA Target_AI_DO.vi.lvbit Wir brauchen uns hier noch nicht um diese Datei zu kümmern, doch werden sich Bitfiles m i folgenden Abschnitt als unverziehtbar für den Aufbau von Standalone-Anwendungen erweisen. 2. Das Diagramm n i Bild 21.32 ist nicht optimal. Es entspricht der eher sequenziellen
Denkweise, die Programmiersprachen wie C mit h i rer sequenziellen Statement-Struktur nahelegen. Damit wird aber das FPGA, das anders als ein pseudoparalleJ arbeitender Computer mit nur einem Prozessor wirklich parallel arbeitet, nicht richtig genutzt. Eine bessere Variante zeigt 'AI_DO]arailel.vi' in Bi l d 21 .37.
I �"�
m
I::�:::�:I�::�::::::I I"'''''oel ]ii
"' ,. """' -
I;!;r.=I "
Im
m
� ,-
ililI
m
.
,
�.
� . tJn
i
'>J'
' . lI! �-iI!
I'i:r'
.
{l>
'"
Bild 21.37 Diagramm von 'AI_DO_Parallel.vi' mit derselben Funktion wie 'ACDO.vi'
Hier arbeitet die untere Schleife (aus 'Functions' - 'Programming' -'Structures') als so genannte 'Zeitgesteuerte Schleife' im Takt des FPGA, also mit mindestens 40 MHz, Man fragt sich nun, warum nicht auch die obere Schleife in gleicher Weise programmiert wird. Die Antwort lautet: Der AD-Wandler zur Analogeingabe ist wesentlich langsamer. Eine Umwandlung benötigt 4 ps oder 4000 ns, ein Takt des FPGA nur 25 ns oder weniger. Der AD-Wandler ist also mindestens 160-mal so langsam und wird deshalb als Element einer zeitgesteuerten Schleife auf dem FPGA derzeit nicht unterstützt (führt zu einem Kompi lierfehler). 3. Will man die Schmitt-Trigger-Funktion von 'ACDO.vi' oder von 'AI_DO_Parailel.vi'
vernünftig nutzen, benötigt man pro Sinuswelle mindestens 10 Abtastpunkte. Mit ande ren Worten: Die Frequenz der eingelesenen Sinuswelle sollte nicht größer als 250 kHz/1O oder 25 kHz sein (250 kHz entsprechen einer Taktzeit von 4 �s). Bild 21.36 zeigt die Funktion von 'AI_DO.vi' bei einer Frequenz von 10 kHz. Erhöht man die Sinusfrequenz auf 50 kHz, sieht man deutlich die Zufallsschwankungen in der Breite der Rechteck funktion: Die Triggerung funktioniert nicht mehr korrekt, siehe Bild 21.38.
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
480 Tek
JL
• $top
M PO!: O.OOl5
Compacl RIO-System und FPGA
CH1
�opplunq
I!I
...oIti/Oi....
EI
TasUopf
l1li
CH1 2,0011
CH2 .0011
M 10»>
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� PE
",_oo_,..oId.� '" "'" ('*"< 1)
", ••m ("",) A>h� ,,"",·�,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«
3 U�'I
R.",,,.P � R;>"1 \'oto«1Cp
5ha. "'00' !Iut'on AIoooi _taO:>se_ �I,MxIoI _Ho, n., ... --� - ,-
5ha. 5crdl �"" A",,-Cento! �I,M>';"'-'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<, 09.r.o.oo,,,
[0'- ..
� �
� W..,
..
.,-
E"'''on
- , '"'''' � I "'Ji"U' W''''!n�ti"'''''''i
fIil"""'", "' O '�""_
", I Nbcil""', ", . ,,,,,,,,,,,",,",,,,, ,,,,
.. '--"",
"' . ... . "'.t � iil rtJ "1.<',W,"
"
,' .'oe'uol "'...u ••n In'<"," , . ... .,
�"'ht
"'-�"
•
I
- �I rn � r..i".f.Jl'''''_Url",l''ffil,_"
I;l cl.t.
� r..i,"'-_f!'''''_Url'�'''''
fll:] '""''''''u" M,_ "M. "-I.55-O"� 31H'
• �O
94 Ort.
�O
""'''
11,05 2OO7 "',eo 09,",2007 1LI2
RTDE-=.
09,",2007 11,12
"-I"ES.O"�
11,00; 2OO7CW6
RTDE-D
11,00; 2OO7CW6
'" Iil n
"' * aI
"' �rlot.
'" fij ,,
I!I � '",
, -
Bild 21.48 Übersicht über die Verzeichnisse und Dateien auf dem cRIQ-9012
Man sieht, dass dort im Verzeichnis 'startup' neben der Standarddatei 'startup.rtexe' (und 'startup.aliases') die Anwenderdatei 'AufruCFPGA_ControIFPGA.rtexe' steht. Sie sorgt dafür, dass beim Einschalten der Spannungsversorgung automatisch das kompilierte
Programm 'AufruCFPGA_ControIFPGA.vi' gestartet wird. Es ruft seinerseits, wie dem Dia
gramm in Bild 21.52 zu entnehmen ist, 'ACAO_ControIFPGA.vi' auf, vertreten durch das zugehörige Bitfile im Unterverzeichnis 'data'. Siehe dazu Bi l d 21 .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'
21.4
[Q.aI«
Eine regelungstechnische Anwendung
487
.. ftp //141 69 60 66/nt-rt/start,-,,/data/ '1icrosoft Internet EKplo",r
t,ei>ft«ffi i\n
C lC<ück ') 5l>:hffi 'M,�"" III ftP:iilil.69,;o,66}rO-rti'ti>ftlJllido/:'i •
•
Iit �_ I!l 0 EQffie 1!l 8 M>cit""" I!l ty Netzwer�bo..o.l
Dale;",
x
&� '
EJ ·
I
� �
.. RIJ
FPGA Actono<JfP�)8 FPGA Ti>'geI: .11 AO C_oFPGA,,;,W
&060
1,25 ME
«
..
l" 'EH-D
W Papiefk
e I,t«"" Exon«
1!l @ 1'Il.69,;o,66 [J liI nh'
I!l � _',-" I!l �� 1!l :t:J ,ystem 1lI 1i1 '�
•I
.!.l
Bild 21.49 Bitfile zum FPGA-Programm von 'AI_AO_ControIFPGA.vi'
Will man dieses Programmsystem durch 'AufruLFPGA_Control.vi' und das zugehörige Unterprogramm 'AI_AO_ControLvi' ersetzen, löscht man einfach das ursprüngliche Bitfile und Startup-Fi l e und ersetzt sie durch die gewünschten neuen, wobei man sich der übichen l Prozedur bedient: Das neue Projekt wird im Projekt-Explorer übersetzt, wie in Abschnitt 21.3.3 erklärt. Nur die Betätigung des Schalters 'NO APP' nach Punkt 7 ist jetzt nicht mehr erforderlich. Die zuletzt erwähnten Vls findet man im Projekt 'RIO_FPGA_AutonomControLlvproj', siehe Bild 21.50. Hier erfolgt die Regelung m i aufrufenden VI. Das FPGA-Programm 'ACAO_ControLvi' liest nur Analogwerte und gibt die vom aufrufenden Programm errech neten Analogwerte zurück.
Merke: Mit Hilfe des FTP-$erverskann man Programme aufdem cRIO-9012 löschen. Achtung! Nur die vom Benutzer definierten Startup-Dateien unter den Verzeichnis 'ni-rt' - 'startup' gegebenenfalls entfernen, nicht dagegen die Standarddatei 'startup.rtexe'.
Ferner kann man die Bitfiles in 'ni-rt' - 'startup' - 'data' löschen.
Neue Dateien für das autonome Anfahren des cRIO-Systems nach den Regeln vonAbschnitt 21.3.3 aufspielen. Der Schalter 'NO APP' muss dann nicht mehr betätigt werden.
IAufgabe 21.4 Führen Sie die oben beschriebene Prozedur mit dem FTP-Server und eigenen Program men durch und überzeugen Sie sich davon, dass die Methode funktioniert.
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
488
Compacl RIO-System und FPGA
- ,""
ACAO.Control.";
� 1ft! cn.o.d Oock
NI 'nlS (Siot 1) NI 9263 (Sk:t 3)
_M 6Yld-5po�
Bild 21.50 Projekt zur Regelung einer
konstanten Spannung
Das Panel von 'AufruCFPGA_Control.vi' während des Regelungsprozesses ist in Bild 21.51 dargestellt, das Diagramm in Bild 21.52. Der Sollwert (setpoint) ist aufS V gestellt, was im Diagramm aufWerte zwischen -32768 und 32767 für den ADe mit seinen 16 Bit umgerech net werden muss.
Bild 21.S1 Frontpanel von 'AufruCFPGA_Controtvi'. Sollwert (setpoint) ist hier eine Spannung von 5 V. Die Konstanten (PID gains) des PID-Reglers sind verstellbar und mOssen der Regelstrecke angepasst werden. Der Parameter 'dt (5) -1' bedeutet eine automatische Wiederholung des Regelprozesses in jede Millisekunde =
Der Funktionsgenerator liefert im Beispiel von Bild 21.51 als Störgröße eine Rechteckspan nung von 100 Hz und ca. 5 V Spitze - Spitze. Der Erfolg der Bemühung um Regelung auf konstante 5 V ist in Bi l d 21.53 (ohne Kondensator) und Bi l d 21.54 (mit Kondensator) zu sehen.
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'
21.4
Eine regelungstechnische Anwendung
489
Bild 21.52 Diagramm von 'AufruCFPGA_Control.vi'. Der PID-Regler läuft hier auf dem cRIO-Computer,
nidlt auf dem FPGA
Tek
JL
• StClp
M Pos: 2.16üms
MESSUNll
l!l!I!IIl Typ
m
Freq, 131.:9 Hz?
" " " " " " " " " " " ,.,; " " " ; " " " " " " " , , ,
keir.e
! :
Mi\\elwtr\ 4.9�\I
m
i:
,
CH1 5,CIOV
Tek
CH2 5.00'II
JL
m
;:
llliI
Pmiode
! :
?
M 1ms
CH1 i.. 6 OmV
• S\CIP
M Pos: 2,160ms
! "
Bild 21.53 Regelung auf 5 V bei R= 1,2 kr.! ohne Kondensator in der Regelstrecke. Oben die Störspannung, unten u.
MESSUNll
l!l!I!IIl Typ
m
Freq, 93.11 Hz?
' " ' ' ' ' ' ' ' ' ' ' ' ' " " ' " ,!';" ' " , ; " , " " " " ' ' ' ' ' ' ;" ! :
.
Mi\\elwer\ 4.8�\I
,
CHl 5,001/
•
keir.e
llliI
CH2 5.0011
M 2.5ms
Periode 10,Ons?
CHl i.. -{;O mV
Bild 21.54 Regelung auf 5 V bei R= 1,2 kr.! mit einem Kondensator von 22 � in der Regelstrecke. Oben die Störspannung. unten u.
Diese Ergebnisse der Regelung können wesentlich verbessert werden, wenn man den PID Regler nicht auf dem cRIO-Computer, sondern auf dem FPGA laufen lässt. Denn hier sind die Reaktionszeiten um Zehnerpotenzen kürzer. Zu beachten ist allerdings, dass auf dem FPGA derzeit noch keine Gleitkommarechnungen möglich sind. Das hat Einfluss auf die
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'
490
21
Compacl RIO-System und FPGA
Gestaltung des Diagramms n i Bi l d 21.55 und auch auf die des Frontpanels in Bild 21.56. Das Diagramm des aufgerufenen SubVls 'ACAO_ControIFPGA.vi' sieht man in Bild 21.57.
�
!3
'"
1:31
Bild 21.55 Diagramm von 'AufruCFPGA_ControIFPGA.vi' •
, W
... .. -
c;;;]
,00
_N
t3
•
s
i
_ ..
,',-
�
Bild 21.56 Frontpanel von 'AufruCFPGA_ControIFPGA.vi'
Bild 21.57
Diagramm von 'AI_AO_ControIFPGA.vi'
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'
Eine regelungstechnische Anwendung
21.4
491
Entsprechende Ergebnisse mit denselben Parametern wie oben sind in Bild 21.58 und Bild 21.59 dargestellt. Die angestrebte Konstantspannung wird hier viel genauer erreicht. Die Frage, welche Parameter sinnvollerweise am PID-Regler einzustellen sind, ist ein Problem der Regelungstechnik, das hier nicht behandelt werden kann.
I!III i · "
"
"
"
"
"
"
"
"
"
"
!:
' '
' "
"
'
, .
!
freq, ? ' "
, , , ,
"
"
"
' "
I!III
I�
,
Mi1telwert 5.0W
i -
CHl 5,OOV
rek
l!liI
Periode
, . , .
CH2 5,OOV
M
lms
CHl \. -
• Stop
JL
M
Pos: O.OOOs
OmV
Bild 21.58 Regelung auf5 V bei R= 1,2 kr.! ohne Kondensator und Induktivität in der Regelstrecke. Oben die Störspannung, unten u.
MESSUNG
!I!IlIIl Typ
I!III
"
"
"
"
"
"
"
"
"
"
"
i: +: , .
freq,
m.l Hz? "
"
"
1
"
"
"
"
"
"
"
' "
I!III
!-
Mittelwert 5.00V
i:
,
, .
CHl ,OOV
H2
, .
M
l!liI
Periode
10.D8ms?
,5m!
Hl \. -
m
Bild 21.59 Regelung auf 5 V bei R= 1,2 kr.! mit einem Kondensator von 22 fiF in der Regelstrecke. Oben die Störspannung, unten u.
Bemerkungen: •
Die oben erwähnte Umrechnung von Volt in Integerzahlen zwischen -32768 und 32767 für den Analogeingang AI und den Ausgang AO bedeutet bei einem Spannungsbereich zwischen -10 V und +10 V einen Umre<:hnungsfaktor von 3276,7 oder gerundet 3277. Praktisch haben die Einschübe NI 9215 und NI 9263 aber gewisse Ungenauigkeiten, die
durch Software-Kalibrierung zu beheben sind. Deshalb ist auch im Diagramm von Bild
21.55 auf empirische Weise der Faktor 3020 ermittelt und für dieses Demo-Programm verwendet worden. Für professionelle Anwendungen sollte man auf Kaibrierprogramme l von National Instruments zurückgreifen.
•
Die Parameter für den PID-Regler wurden in unserem Beispiel ebenfalls empirisch be stimmt. Eigentlich sollten sie auf Grund regelungstechnischer überlegungen ermittelt
werden. Das kann man z.B. mit Hilfe von MATLAB-Simulink tun. LabVIEW bietet neu
erdings auch eine Schnittstelle zur übertragung dieser Ergebnisse. Siehe dazu z.B. die Hilfe zu 'mit der MATLAB-Syntax geschriebene Skripte importieren'.
Ausleihe: 31_07_2009 00:00:00 - 08_08_2009 00:00:00, ID:7ac0427dS92981 cf089d91b1gecaOOaO. Zenlral- u 2009_07_31 21:42:39 +02'00'
492 •
21
Compacl RIO-System und FPGA
Die Funktion für den auf dem Computer laufenden PID-Regler findet man unter 'Punktionen' - 'Reglerdesign und Simulation' - 'PID' als 'PID.vi' links oben. Dagegen er
hält man die entsprechende Funktion für den FPGA in der eingeschränkten Palette, die erscheint, wenn man eine unter 'FPGA Target . . . ' subsummierte Funktion wie z.B. 'ACAO_Control.vi' lädt und dort im Diagramm mit Rechtsmausklick 'Punctions' auf ruft. Dort unter 'FPGA Math & Analysis' (links unten) - 'Control' - 'Discrete Linear Systems' die Funktion 'Discrete PID' anklicken und ins Diagramm ziehen. •
Die vorgestellte Regelung ist eine Ad-hoc-Lösung. Die kapazitiven und n i duktiven Ein
flüsse der ziemlich langen Leitungen (siehe Bild 21.46) wurden nicht berücksichtigt.
Auch lässt die Vergleichbarkeit der RegIereinsteIlungen bei der Prozessor- und der FPGA-Lösung zu wünschen übrig. Gezeigt werden sollte hier nur ein Beispiel für die viel seitige Verwendbarkeit des cRIO-Systems mit FPGA.
Merke:
Will man mit einem Prozessor eine quasistetige Regelung erzielen, wählt man üblichelWeise die Abtastzeit zu 10 % der Summenzeitkonstante des Systems. Anders ausgedrückt: Bei I ms Abtastzeit der Regelfunktion auf dem cRIO-Prozessor kann man Prozesse mit einer Summenzeitkonstante von 10 ms regeln. Dagegen erreicht man mit der FPGA-Funktion eine
Abtastzeit von ca. 4 flS (der größte Anteil flillt aufdie Analogwandlung),
kann also Prozesse mit einer Summenzeitkonstante von nur 40 flS = 0,04 ms regeln!
Nachteilig ist, dass die FPGA-Funktionen derzeit noch nicht mit Gleitkom mazahlen arbeiten können, sondern nur mit Integervariablen. Es gibt hier deshalb auch nicht die normale Division, sondern nur die Integerdivision 'Quotient und Rest'.
IAufgabe 21.5 Wie verhalten sich die heiden vorgestellten Regelungsprogramme bei höheren Frequen· zen, z.B. bei 1 kHz, 10 kHz, 1 MHz?
IAufgabe 21.6 Machen Sie Versuche mit anderen FPGA-Regelungsfunktionen.
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'
Literatur
Literaturangaben zu LabVIEW werden hier - mit Ausnahme dreier englischsprachiger Lehr bücher am Ende - nicht gemacht. Auf mögliche Hilfen wurde schon ausführlich in Abschnitt 9.8 hingewiesen. Die folgenden Hinweise beziehen sich deshalb auf weiterführende Literatur aus den Bereichen Simulation, Regelungstechnik, Signalverarbeitung, Bussysteme U$W.
[1]
BosseJ, H.: Modellbi l dung und Simulation. Vieweg Verlag Braunschweig, Wiesba den 1994; ISBN 3-528-15242-7
[2]
Hütte: Die Grundlagen der lngenieurwissenschaften, 29. Auflage. Springer Verlag Berlin, Heidelberg 1991; ISBN 3-540-19077-5
[3]
Hering, E. - Steinhart, H. u.a.: Taschenbuch der Mechatronik. Fachbuchverlag Leipzig 2005; ISBN 3-446-22881-0
[4]
Tietze, U. - Schenk, eh.: Halbleiter-Schaltungstechnik, 12. Auflage. Springer Verlag Berlin, Heidelberg, New York u.a. 2002; ISBN 3-540-42849-6
[5]
Stearns, S. D. - Hush, D. R.: Digitale Verarbeitung analoger Signale, 7. Auflage. Oldenbourg Verlag München 1999; ISBN 3-486-24528-7
[6]
Back, R. J. H. - Von Wright, J.: Refinement Calculus. Springer Verlag 1999; ISBN 0-387-98417-8
[7]
Etschberger, K.: Controller Area Network. IXXAT Press, Weingarten 2001
[8]
Travis, J. - Kring, J.: LabVIEW for Everyone, 3. Auflage. Person Education, Inc. 2007; ISBN 0-13-185762-3
[9]
Johnson, W. G. - Jennings, R.: LabVIEW Graphieal Programming, 4. Auflage. McGraw Hill Companies 2006; ISNB 0-07-145146-3
[10]
Blume, P.A.: The LabVIEW Style Book. Pearson Edueation, Ine. 2007;
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'
Index
A
Ablauf abJaufinvariant (reentrant) 101 - eines Vis parallel oder sequentiell 243 - Testen ablaufinvarianter Vls 1 1 1 Abschließende Nullen unterdrücken 51 Absolutes Zeitformat 66 Abtastfrequenz 134 Abtastinformation 134.207 Abtastzeit - Analogwandler beim eRIO-System 475 Access 402 ActiveX 46 ActiveX-Container 405 ACliveX-E1emente (controls) 405 ActiveX-Objekte 406 Beispiel einer Homepage 407 Datenaustausch mit Access 402 Datenaustausch mit Excel 409 LabVIEW als Server oder Client 405 Addition Beispiel 26 - von Matrizen 77 - von numerischen Sirings 103 Adresse, MAC- und IP-Adresse 402, 434 AI Scan Rate Siehe Abtastzeit Aktualisierungsmodus 118 Aktuelle Werte als Standard 54, 55, 75 Aktuelles Datum 70 Aliasing 202, 2 1 1 Alternative 49, 56 Alternative als Gase-Struktur 56 Amplitudengang 204 Amplitudenspeklrum 202 Analogausgabe 317 Analogeingang 332 Analogr«hnerprinzip 227 Analogwert Ausgabe über USB 274
- erfassen mit NI cRIO-92 IS 472
�) Stichwone mit Seitenzahlen der Form INx-nn (z.B. IN2-18) velWeisen auf Kapit el, die nicht im Buch, sondern nur im Intern et unter wwE w.GeMf-LabYI W.df zu finden sind. - erfassen mitNJ USB-6251 311 Animationen, Programmierung von 48 Anschluss 32 Aufteilung Anschlussfeld 96 eines VI 96 erforderlich, empfohlen, optional 98 LabVJEW-SubVI 93 trennen 98 von Eingängen und Ausgängen 98 welches Feld gehön zu welchem Panelelement 98 Anwendungssteuerung. Unterpalette 48 Anzeigeelement 27 - erstellen SI - verbergen 53 Application Builder 178 Approximation durch Fourierreihe 213 Arithmetisches Mittel als Tiefpass 215 Array 73 Arrayvon Oustern 131 Aufziehen eines Arrays 74 Beispiel Array-Konstante 361 Beispiele 2-dimensionaler AITaYs 76 Bildung, Definition, Dimension 73 Dimension 75, 80 einzelne Elemente 81 - Funktion zum Initialisieren 75 Funktionenunterpalette 47 höherdimensionales 75 - Index 73 Indexfenster bei Arrays aufziehen 75 inüialisieren 73 - komplexer Zahlen, Darstellung 208 Lesen/Schreiben auf Festplatte 159 programmgesteuerte Initialisierung von Arrays 75,76 Rechnen mit Arrays 76
Typ boolesch, numerisch, String 74 venauschen 143 Zweistufiger Prozess zur Array Erzeugung 73
Ausleihe: 31 .07.2009 00:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cf089d91b1gecaOOaO, Zentral. u 200R07.31 21:42:39 +02'00'
Index
495
Array & Cluster. Unterpa1ette 45
Bewegen a1ler Objekte 43
ASCII-Code 270
Bibliothek
Asynchron 269
- eigene LLB anlegen 192
- konvertieren in LLB 192
Audio-Ausgabe 172
- konvertieren von LLB 192
Aufruf
- LLB in LabVIEW 188
erster Aufrufeiner Funktion 230 - rekursiver SubVIs 93, 101
Bi l d-Ring, Erzeugung 90
- von LabVIEW 22
Binärdatei 1/0 aufFestplatte 159
Aufschlüsseln
Binärzahl 66
- einer Waveform 132
Bindung
- eines Clusters 86
- dynamische 105,106
Aufwärtskompatibilität der LabVIEW
- eIWeiterte dynamische 457 - statische 105
Versionen 21
Aufzählung Siehe Enum
Bitmitte 269 Bit-serielle Ein-/Ausgabe 268
Ausfuhrung
ablaufinvariante (reentrant) VIs 10I
Blockdiagramm 23.36
- mit Synchronisierung von Threads 255
- gekoppeltes Feder-Masse-System 237
- quasi-parallele von VIs 244
- im MATLABO-Stil 239
Ausgabeelement Siehe Anzeigeelement
Bode-Diagramm 215
Ausgang aus Schleifen 63, 64
Boolesch 56
Ausrichtung
- Bedien- und Anzeigeelemente 68
- Ausrichtungsgitter 36, 39
- Datentyp. Funktionen 68
- von Symbolen 39
- Konstanten TRUE, FALSE 56,69
Ausschneiden Objekt 34
- Unterpa1ette 45,47
Automat und Konfigurationsdatei 171
- Werte AN, AUS 56
Automatische
Breakpoint 43
Erzeugung von Eingängen und
Bündeln
Ausgängen für Funktionen 81
- Ousterfunktion 85
Namensvergabe beim Kopieren 77
- einer Waveform 132
Verdrahtung 37,38
- zur Oustererzeugung. Beispiel 85
Werkzeugwahl 42
Butterworth-Filter 218
B
c
Balkendiagramm 121
C++, Microsoft Visua1 C++ 194 CAN-Bus
Bandpass, Bandstopp 214
Bargraph Siehe Ba1kendiagramm
Basis 2 oder 16 zur ZahlendarsteIlung
- a1s Feld-Bus 278
66
- Beispiel zur Veranschaulichung 290
Basisklasse, Eigenschaften 145
- CANopen-Protokoll 294
Bedienelement 24,26
- Controller (USB-to-CAN 280)
Beispiel 58
- Datenaustausch zwischen zwei PCs 289
- eigenes Bedienelement 190
- Identifier 279
- klassisches 84
- LabVIEW-Programmierung 283
Bedienungsanleitung zu LabVIEW 190
- mehrere USB-to-CAN-Controller an
Bessel-Filter 220
Betriebsmittel Siehe Ressource
Betriebssystem, Zuweisung von Prozessorzeit 246
einem PC 285 - mit einem Sensor 292 - mit mehreren Sensoren 297 - mit zwei PCs 287
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'
Index
496 CPU-Auslastung 245
CAN-Bus (Fortsetzung)
cRIO
Normung 279 279 t - Prioriätssteuerung
Aufbau des cRIO-9012 462
- Protokoll 279
Auswahl einzelner Digital
CANopen 294
/Analogkanäle 474
Case-Struktur 47,56,354
Beispiel 'Laptop.vi' und 'RIO-Sinus.vi'
Ausgabetunnel 60
468
Boolesche Selektorsteuerung 58
Beispiel mit 'ACDO_parallel.vi' 481
Enum-Selektorsteuerung 354
Definition 461
Groß-/Kleinschreibung 353
'Echtzeitprojekt' 471
Herausfuhren von Variablen 59
Erweiterungsbox NI 9104 472
Integer-Selektorsteuerung 355
FPGA-Chassis 9104, Analogeingabe 461
String-Selektrosteuerung 352
FTP-Server 486
C-Code einbinden 194
n i stallieren Hardware/Software 463
Chart 113
Löschen nicht mehr benötigter Dateien mit FTP 487
Chart (Signalverlaufs-Diagramm) 117 Historie 118, 119
NI 9263 für Analogausgabe 461
Legende 121
NI 9401 für Digitaleingabe/-ausgabe 461
löschen 119
NI cRIO 9215 für Analogeingabe 461
mehrere Kurven in einem Chart 120
'NO APP' kann übergangen werden 487
Ska1ierung der Ordinate 122
regelungstechnische Anwendung 485
Sweep, SerolI, Scope 118
RIO-Ergebnisse am PC anzeigen 474
elF-Knoten 197
rtexe-Datei 462
Client 434
Schalter 'NO APP' 484
- Beispiel TCP/IP-Client 450
Startup-Datei 'startup.rtexe' 481
- sendet Anforderungen an Server 450
System arbeitet ohne Host 466, 480 TCPIIP-Verbindung zum PC 462
Cluster 45
wichtige Einstellungen bei TCP/IP
Änderung einzelner Elemente 85 Aufschlüsseln 47,86
Verbindung 466
automatisch Rahmen skalieren 84
Cd 191, 192
Beispiel einer Clusterkonstante 358
Enum-Auswahl Zustandsautomat 355
bündeln beim Chart 120
'Element', 'Typ-Def." 'Strikte Typ-Def.'
bündeln, umwandeln 47
355
Definition 83
fürTCP/IP-Client 450
Erzeugung durch 'Bündeln' 85
Klassenbildung 377
Erzeugung in zwei Stufen 83 Funktionenunterpalette 47
RefNum 142 Cwdss.exe, automatischer Start 439
nach Namen aufschlüsseln 86 nach Namen bündeln 86
D
programmgesteuerte Erzeugung 88
DAQ-Assistent 310
Reihenfolge der Elemente 83
- NI-DAQmx-Code 319
Steuerung durch oberen Anschluss 85
- Programmierung mit 318
vertauschen 143
DAQmx-Funktionen 313
XY-Graph als Cluster-Typ
130
zur Fehlerbehandlung 83
Darstellung Genauigkeit 65
Code, wieder verwendbarer 113
m i Bode-Diagramm 216
Conrad Elektronik, DLL K8055D.dll 274
logarithmische Darstellung 216
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'
Index - Parameterdarstellung eines Kreises 129 - Speicherersparnis Gleitkommazahlen 65 Data Acquisition Board Siehe Datenerfassungskarte DataSocket Konzept und cwdss.exe 439 Lesefunktion 440 Prinzip in LabVlEW 434 programmieren mit 438 Schreibfunktion 439 Verfugbarkeit 438 Vorbereitung der Verbindungen 439 Datei aktue1ler Pfad zum VI und zur EXE Datei 162 Beispie1 für Dateioperationen 151 Binärdatei 1/0 aufFestplatte 159 CSV-Datei 402 Cd-Element 192 Dateikonstanten 155 Dateioperationen 150 Erweiterung 'txt' 151 EXE-Datei 148 fortgeschrittene Funktionen 151 Funktion 'Dateiposition festlegen' 153 Funktion 'Öffnen, Erstellen, Ersetzen' I5! Funktion 'RefNum nach Pfad' 153 Konfigurationsdateien 169 Lesezeiger, Schreibzeiger 152 LVM-Datei 163 Messwerte in Datei schreiben 164 öffnen, schließen 151 Protokolldatei 153 Schlüssel einer Konfigurationsdatei 171 TDM-und TDMS-Dateien 163 überschreiben ohne Warnung 154 verketten Schreib-/Lesefunktionen 159 Zeichen in Datei lesen, schreiben 151 Datei-I/O, Unterpalette 47 Daten Austausch zwischen Prozessen 243 Datenabhängigkeit und Sequenz 176 Datenabhängigkeit von zwei While Schleifen, Beispiel 244 Datenaustausch globale Variablen 231 Typ DBL.SGL 159
497 - Verbindung mit Datenpfad 43 Datenabhängigkeit erzwingt Sequenz 81 Datenbank 428 - Abfrage 432 - Datenquelle 429 - DSN 429 - Inhalt ändern 432 - Sprache SQL 429 - Verbindung mit Datenquelle 430 - Verbindung mit LabVIEW 428 - VI-Bibliothek 433 Datenbits bei RS 232 269 Dateneingabe 43 Datenerfassung. simu1ierte 313, 315 Datenerfassungskarte - NI USB-6251 304 - NIDAQ PCI-MIO-16E-4 305 - vonNI 304 - andere Anbieter 304 Datenerfassungs-VI, Autbau 312 Datenfluss - als LabVIEW-Prinzip 22 - Erzwingung des korrekten Datentlusses 177 - LabVIEWais datenflussorientierte Programmiersprache 176 Datenoperation 'Element entfemen' 80 Datenpaket bei serieller Übertragung 269 Datenpfad, komplettsichtbar 349 Datentyp - boolescher 65.68 - 'Enum' 59 - 'Menü-Ring' 59 - numerisch 65 - Pfad 65 - String 65.70 - 'Text-Ring' 59 Datenumgebung, Kontextmenü m i MAX 334 Datenvergleich 47 Datum - aktuelles 70 - Datum/Zeit in Sekunden 71 - Datum/Zeit-String lesen, formatieren 71 - Format. BetriebssystemeinsteIlung 71 dB. Definition 216 DBL (Datentyp) 27
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'
Index
498 Debuggen 30 ablaufinvarianter VIs 1 1 1 - Fehlersuche 43 - großerProgramme 185 Defaultwert Siehe Standard Deployment Siehe Verteilen Dezimalpunkt, lokaler 36 OFT (Diskrete Fouriertransformation) 209 Diadem 167 Diagramm - anzeigen, Panel 34 - gestalten 92 Dialogfunktionen 46 Differenzialgleichung 224 Beispiel eines Analogrechner Blockdiagramms 227 Beispiel eines Systems 240, 241 Beispiel mit vereinfachtem Blockdiagramm 231 Beispiel Tourismus - Umweltqualität 242 Lösen mit ODE-Funkt. 224,237 Lösen mit Analogrechnerprinzip 227 MATLAB·-Blockdiagramm 227 Schrittweite 225 System in MATLAB-Simulink° 240 Systeme von Dgl. 224,236 Umwandlung n i System von Dgl. 224 Digitalanzeige 72,292 DigitalausgangSCC-DOOl 332 DigitaleingangSCC-DIOl 332 Digital-1I0 318 Digitalwert E/A mit NI 9401 472 Dijkstra 247 Dimension - eines Arrays 80 - eines Vektors 80 DLL - einbinden mit elF-Knoten 194 - K8055D.dlI ( Conrad Elektr.) 274 Doppelte Genauigkeit 65 Drähte, Verbindungslinien 32,46 Drahtrolle a1s Werkzeug 42, 43, 96 Dreiecksberechnung 94 Dynamische Bindung von SubVIs 94 Dynamischer Dispatcheingang bei OOP 380
E
Echtzeit, Beschriftung der X-Achse 136 Editieren 39 Editor, grafischer 175 Effektivität - eines VIs 371 - Werkzeuge zur Bestimmung 371 Eigene Elemente 190, 355 Eigenschaft a1lgemein nach spezifisch 145 Basisklasse 145 Klassenbezeichner-Konstante 145 Vererbung von Eigenschaften 143 Eigenschaftsknoten 113 Aktualisierungsmodus 118 Beispiel 113 Darstellung im Frequenzbereich 209 finden 113 Klassenbezeichner 145 Kontextmenü 114 Scope-Modus 118 Scroll-Modus 118 'Sichtbar' 114 StringsUndWerte[] 360 'TastenFokus' 116 Eindimensionales Array oder Vektor 73 Einfügen Objekte 34 Eingabe abschließen, quittieren 29, 116 Eingabeelemente 44 Einheitsmatrix erzeugen und initia1isieren 80, 81 Einstellungen Datei - VI-Einstellungen 35 Erscheinungsbild Frontpanel 99 von VIs 99 Werkzeuge - Optionen 35 Element 24,26 Beispiel 58 erstellen 26 gleich Anzeigeelement 27 gleich Bedienelement 26 klassische Bedienelemente 84 Endlosschleife 69 Enum 58,89 - Datentyp 45,59 - Variable 72 EOF-Zeichen 148
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'
Index EOL-EOF-Test 150 EOL-Zeichen 149 Ereignis
499 F
FALSE 58 Farbe
durch Wertänderung 263
- einer Kurve 113
Frontpanel-Ereignis 258
- Farbpalette 121
Stopp 261
- setzen 43
Timeout 263
- übernehmen 43
Wertänderunggenerieren 263
Farbgebung 57
Ereignisstruktur m i Zustandsautomaten 366
Feder-Masse-System - Beispiel 224
Erster Aufrufeiner Funktion 230
- DifferenziaJgleichung 224
Eselsohr, Gestaltungselement der FOR
- gekoppeltes System 236
Schleife 61 Ethernet CSMA/CD-Protokoll 435
Federschwingung 240
Feedbackknoten Siehe
Rückkopplungsknoten
Datenübertragungsrate 435
Fehler
Kollision 434
- Dreiecksbeispiel 95
Prinzip 434
Event Siehe Ereignis Excel 48
- einfacher Fehlerbehand1er 84 - Erzeugung Fehler-Cluster 84 - Fehler-Cluster 83,225
Datenaustausch mit LabVIEW 402,409
- suchen (debuggen) 30,43
Datenerfassung, Schreiben parallel 427
Fehlerliste öffnen 34
Excel-Datei und CSV-Datei 404
Feinheit des Gitters 40
Grafik erstellen 416, 423
Feld, Array 45, 73
Kommunikationsgeschwindigkeit Excel
Feld-Bus 278
- LabVlEW 415
Fenster
Macro für höhere Geschwindigkeit 421
- aktives 100
Macros erstellen durch Aufzeichnen 416
- Erscheinungsbild anpassen 100
Mappe (Workbook) anzeigen 410
- Größe ändern, minimieren 100
NI-Beispiel zum Daten eintragen 412
- schließen 100
nützliche SubVIs 412
- Typ (gleitend, Standard, modaJ) 100
Nutzung Makros in 'Projekt.xls' 421
FernübelWachung 20
öffnen/schließen unter LabVIEW 409
Festplatte, Lesen/Schreiben 148
Schreiben mehrerer Dateien mit
FFT oder Fast (schnelle)
modifz i ierten Namen 424 'Set Cell VaJue.vi' 415
Fouriertransformation 209
FIFO aJs Prinzip bei Queues 248
Tabellen (sheets) sichtbar machen 411
Filter
VisuaJ Basic-Programm 419
- anaJoge Filter 214,215
EXE-Datei 179 aktueller Pfad zu einer 161
- arithmetisches Mittel als TiefPass 215 - Beispiel eines digitaJen Filters 215
- Erstellung 161,180
- Beispiele reaJer Filter 219
- Runtime-Bibliothek 179
- Bessel-Filter 220
Experimentierplatine Vellemann 274
- ButtelWorth-Filter 218
Experimentierplatine Vellemann 278
- digitaJe Filter 214,215
Exponentialdarstellung von Gleitkommazahlen 66 Express-VI 138, 139, 198
- Filter vom Typ FIRIIIR 218 - ftltern im Frequenzbereich 214, 220,223 - FrequenzgangiGrenzfrequenz 214,219
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'
Index
500 Filter (Fortsetzung)
FPGA
idealer Bandpass, Bandstopp 215
Abtastzeit eingelesene Sinusfunkt. 479
idealer Filter 214
Beispiel eines VI 477
Idealer Hochpassrriefpass 215
Bitflle 479 o Chip von Xilinx 462
LabVIEW-Filterfunktionen 214,218 Ordnung von Filtern 219
Definition und Bedeutung 461
Tschebyscheff-Filter 218
FPGA1/0 Node 476
Überschwingen beim Tschebyscheff
m i cRIO-9012 462
Filter 220
keine Umgebungsvariable mehr 472
Filtertyp 219
Parallelarbeit nutzen! 479
Finite State Machine Siehe
spezielle Funktionspalette 472 VHDL-Compiler 462
Zustandsautomat
FIR-Filter 218
Frequenz
Fixieren einer Palette 44
Balkendiagramm Frequenzbereich 205
flache, gestapelte Sequenzstruktur 52
bei serieller Übertragung 269 Formel Frequenzauflösung 202, 212
Fließkommazahlen 66
Folge-Struktur Siehe Sequenz Forking 459
Format & Genauigkeit 51, 66
Frequenzbereich 202 Frontpanel 23, 36 beim Aufruf anhalten 106 beim Aufruf anzeigen 106
FüR-Schleife 49,53, 60
als Kartenstapel 61,62
beim Laden öffnen 105
'Eselsohr' 61
Erscheinungsbild 99 lokale Einstellungen 105
Indizierung Datenpfad 79 i-Terminal 60
Funktion
N-Eingang 61
Bibliothek 22
Realisierung eines Zählers 60
boolesche 69
Steuerung durch Arrays 79
erster Aufrufeiner Funktion 230
Zahl der Durchläufe 64, 79, 80
Funktionen Prozesskommunikation 249
Fourier
grafische Darstellung 45
OFT (Diskrete Transformation) 209
m i Gegensatz zur Relation 129
Eindeutigkeit der Fourierreihe 204
logische Funktionen 69
einseitige, zweiseitige Transformation
periodische Funktion 202
202, 205,206
se1bstentwickelte Funkt. fur user.lib 190
endliche Fourierreihe 204
zum Transponieren 127
FFT oder Fast (schnelle) Fourier
zur Bildung des Matrizenprodukts 78
Transformation) 209 inverse Fouriertransformation 220 Koeffizienten in LabVIEW 208 komplexer Ausgangsvektor bei Transformation n i LabVIEW 208 reelle Fouriertransformation 203 Reihe als optimale Näherung 204 Reihe komplexer Exponentialfunkt. 205 Satz von Fourier 203 Sinus-/Kosinus-Reihe 204 Transformation n i LabVIEW 206 unendliche Fourierreihe 203
G Gate Array - Definition 461 - hohe Geschwindigkeit 461 Gaußsche Zahlenebene 205 Genauigkeit der ZahlendarsteIlung
66
doppelte 51 numerischer Verlahren 224,232 Vergleich bei verschiedenen Schrittweiten 233
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'
Index
501
Genauigkeit (Fortsetzung) Vergleich n i grafischer Darstellung 234
Hex-Anzeige 'String' 73 Hierarchie bei Vererbung 144
- Vergleich Runge-Kutta und Euler 233
Hilfe
- VI zur Ermittlung der Genauigkeit 235
- Beispiele suchen 198
Gestaltungselemente 57
- Kontexthilfe, LabVlEW-Hilfe 198
Gestapelte Sequenz 53
- Developer-Zone 198
Glättung durch Filterung mit Tiefpass 216
Hintergrundfarbe 57
Gleitkommazahlen 65
Hinweisstreifen, Hinweisleiste, auch
Geschwindigkeit: VI und EXE 179
- Funktionen-/Anwendungshilfe 198
'Tipstrip' 55
Darstellung 'automatisch' 66 - Darstellung 'Fließkomma',Exponential,
5166
Historie-Daten, Historie-Länge 119 Hochpass 214
Globale Variable 47,231 laden wie ein Unterprogramm 232 - mehrere Globale Variablen 232 - Rezept zur Nutzung 232
- idealer Hochpass 215 [
1/0, Unterpalette 45
GND, 'Ground' oder 'Erde' 269
132, Integer mit 32 Bit 65
GObjekt beim VI-Server 144
Icon Siehe Symbol
GPIB-Bus 299
IEEE 488 Siehe GPIB-Bus
- Beispiel-VI 302
Indizierung Datenpfad aktivieren 79
- NI-Software 300
Initialisieren
Grafik & Klänge, Unterpalette 48
- Einheitsmatrix 81
Grafik, Beispiel 31
- programmgesteuert initialisieren 75
Grafik, unter LabVIEW erstellt in Excel 423
- Schieberegister 61
Grafik-Ring 89
Installation von EXE-Programmen 183
Grafische Ausgabe 113, 1 1 7
Installer 183
Grafische Programmierung 22
- dynamische Erzeugung für jeden Client
Graph 45, 124 Abszisse mit absoluter Zeit 135
Instanz 459
Abszisse mit relativer Zeit 128
- einer Klasse 375
Array von Bildpunkten 124
- einer Zahl 375
einer Sinuskurve 124
Instrumenten-I/O 268
Farbänderung 124
Integration
Legende 124
- Eulerverfahren 228
mehrere Kurven in einem Graph 126
- Laplace-Symbolik mit 's' 231
skalieren der Abszisse 127
- mit einem einzelnen SubVI auch bei
Unterpalette 45 Zeit statt Index anzeigen 127
mehrfacher Integration 229 - verschiedene SubVIs bei mehrfacher Integration 229
Grenzfrequenz - Definition beim Filter 219
Internet 434
- obere, untere Grenzfrequenz 219
- Beispiele und Lösungen zu LabVIEW 21
Größenänderung von Objekten 43
- Fernüberwachung 20
Gruppierung von Objekten 92
- Hilfe suchen im Internet 31 - vorbeugende Wartung 434 Interpolation 121
H Hauptdiagonale Matrix 8 1 Hexadezimalzahl
66
Interpretieren oder kompilieren 175 Inverse einer Matrix 80
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'
502 Inverse Fouriertransformation 220, 221 Invertierungsoperator 'NICHT' 64 IP-Adresse 434 127.0.0.1 (localhost) 435 Aufbau 435 finden 435 partielle Festlegung durch Systemadministrator 435 Vorgaben NIe und DE-NlG 435 Isolierte Punkte 121 I-Typ, Integer mit Vorzeichen 65 IVl Beispiel-VI 345 Definition 343 Geräteklassen 344 Installation NI USB-S133 344 NI-Scope Express.vi 346 Vorteile 343 IXXAT, CAN-Produkte 280 K Ka1ibrierung mit Konfigurationsdatei-VIs 174 Kanal Abtastfrequenz 312 - physikalischer Kanal 311 - virtueller Kanal 312, 337 Kapse1n 113 Keithley und GPIB-Bus 300 Klang Siehe Grafik & Klänge Klasse 113 allgemein nach spezifisch 146 Bildung in LabVIEW 8.2 377 GObjekt 144 Hierqarchie anzeigen 398 Kapseln von Funktionen und Variablen 113, 375 Klasse 'Bedienelement' 146 Klasse 'DigitaJ' 147 Klassenbezeichner 143 K1assenbezeichner-Konstante 143 LabVIEW-Objekt 384 Methode 379 private Daten 376 Klassische Elemente, UnterpaJette 46 Klon eines VI 1 1 1 Knoten 32, 51
Index
Kolorieren 43 KommasteIlen 57 Kommentare 43 Kommunikation, UnterpaJette 48 Kompilieren oder interpretieren 175 Komplexe Zahlen 65,68 Konfiguration ClF-Knoten 196 ClF-Knoten für eine Experimentierplatine 275 Express-VI 113 Konfigurationsdateien 169 Konfigurieren statt programmieren 138 NI USB-625I 307 Zubehör wie SignaJkondit.-Box 333 Konstante numerische Konstante 65 - pfadkonstante 156 - Stringkonstante 71 Konsument und Produzent, Beispiel 253 Kontexthilfe ein-/ausschaJten 34 Kontextmenü 35 für Anschluss eines VI 96 für Datentyp 65 Objekt wählen 55 öffnenmit linker Maustaste 43 Kontrast Gitter - Hintergrund 40 Kontrollelement Siehe Cli Kopieren Objekte 34,77 Kosinusfunktion 120 Kurve Farbe, Linienstil 121 Strichstärke 1 I3 wandernde 240 L LabVIEW ActiveX-Container 405 aJs ActiveX Automation Server und Client 405 Anbindung an C 20 Application Builder 178 Ask Dr. VI 176 Aufrufvon LabVlEW 22 Aufwärts-/Abwärtskompatiblität 21 Bedeutung 19 Bedienungsan1eitung 190
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'
Index
503
bedingte Deaktivierungsstruktur 185
LeererVektor 119
Beispiel zur ProjektvelWaltung 178
Legende Siehe Chart oder Graph
Beispiel zweistufige Vererbung 397
Leitung, gekreuzt, nicht gekreuzt (RS 232)
Berichterzeugung 48, 139 Bibliotheken 188
270 Letzten Schritt wiederholen, zurücknehmen
Dateioperationen 168
34
Datenflussorientierte
Linienbreite 121
Programmiersprache 176
Linux 21, 278
Debuggen ablaufinvarianter VIs 1 1 1
Linux und Tabellenkalkulation IN19-351
Diagramm-Deaktivierungsstruktur 185 Editor 175 englische LabVIEW-Version 41
Liste & Tabelle, Unterpalette 45 LLB
- Anzeige im Windows-Explorer 193
Erfmder 19
- konvertieren 190
Filterfunktionen 214,218
- Nutzen 200
Grafik in Excel erstellen 423
Localhost und IP-Adresse 435
Hilfen 198
Logische Funktionen, Operatoren 47, 69
Klasse 'LabVIEW-Objekt' 384
Lokale Sequenzvariable 53.54,55
Klone eines VI 1 1 1
Lokale Variable 47,55
Laufzeit VI und EXE-Datei 184
- für Anzeige- oder Bedienelement 55
Makros in Visual Basic aufrufen 420
- Lesen/Schreiben 55
mit Optionen speichern 2 1
- wann wird sie gebraucht? 56
OOP ab LabVIEW 8.2 376
Lokaler Dezimalpunkt 36
Projekt-Explorer 188
LVM-Datei 163, 165
Projektverwaltung 178 rechnen mit arabischen und römischen
M
Zahlen 393
MAC-Adresse finden mit 'ipconfiglall' im
Runge-Kutta 224
Makro für höhere Geschwindigkeit beim
Server-Client-Paar 438 Shortcuts 34 Signalfluß im Diagramm, mögliche
DOS-Fenster 435
Datenaustausch 421 Marken beim Semaphor 253
Änderung 242
Markierung von Objekten 92
Startseite 22
Maschinencode, -programm 175
Systemfunktionen in vi.lib 191
MATLAB'" 224
Template 190
Matrix 83
Testen großer Programme 185
- Addition 83
Umgebungsvariable 468
- e1ementweises Multiplizieren 78
Unterschiede VI und EXE-Datei 176 VHDL-Compiler 462
- Hauptdiagonale 81
- Inversion 80
Windows2000, XP, Linux 21
- Matrix oder 2-dim. Array 73,75
ZIP-Dateien 168
- Multiplikation 78,83
Zustandsdiagramm 351
- Spalten-, Zeilenindex 75
LändereinsteIlungen 36
- transponierte 126,238
Laplace-Symbolik mit 's' 231
Mauszeiger fünffingrige Hand 44
Latch (verriegelt) 69 Laufzeit VI und EXE-Datei 184
MAX (Measurement & Automation Explorer) 304
Laufzeitfehler 256
- Aufruf 306
LED, Anzeigeelement 68
- Geräte und Schnittstellen 332
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'
Index
504 MAX (Fortsetzung)
NI BNC-2096 340
Installation eines RIO-Systems 463 Konfigurationsmenü 333
- PCI-4474 340
Minimal- und Maximalspannung 335
- NI 6040E, mit MAX konfigurieren 332
physikalischer, virtueller Kanal 3 1 1
NI USB-625l Beispiel mit zwei Spannungen 323
Sprache Deutsch 306
Eigenschaften 32l
Mechanisches Scha1tverhalten 69 Mehrfachalternative 49,56
Elemente in der Queue 330
Mehrfacharithmetik 87
noch verfUgbare Sampies 328
Melder auch Notification
Parrulelverarbeitung 327, 329
- Beispiel Produzent - Konsument 256
Streaming 325
- Wann soll man sie einsetzen? 257
triggern 324
Menü, eigene Palettenmenüs 190
Normung RS 232 269
Menü-Ring 59,89
Notification Siehe Melder
Messdatenerfassung
Nullen nach dem Komma erhalten 65
- Überblick 268
Nullmodem 269
Mess-1I0 268
Numerisch
Messsignal, Störung, Filterung 202
Bedien- und Anzeigeelemente 68
Messwerte n i Datei schreiben 164
Datentyp 65
Methode
Funktionen 68
einer KJasse 379
Konstante 65
'Holen.vi' 389
rechnen mit Clustern 86
'Setzen.vi' 381
Unterpalette 45,47
zur Manipulation privater Daten 380
Numerische Verfahren, Genauigkeit 224
Methode der kleinsten Quadrate 213
Nyquisttheorem 210
Methodenknoten 113, 146 Metronom 60
o
Microsoft Access 428
Objekt, Objekte
Modulaustausch bei aop 390
rule bewegen 43
Modus 'Wiederholt ausführen' 77
ausrichten, anordnen 92
Multiplikation von Matrizen 78
ausschneiden, kopieren, einfügen 34, 58
Mu1tiprocessing, -tasking, -threading 245
bearbeiten, Kontextmenü 60
Münzautomat
markieren 92
Zustandsautomat mit Queues 366
mit Maus platzieren 44
Zustandsdiagramm 357
Objektgröße verändern 92 Suchen, suchen nächstes Objekt 34
N
Objektorient. Programmierung l13, 374
Nachkommastelle 66
Occurrence 248, 252
Namen
ODE
automatische, manuelle Vergabe 77
Bedeutung der Abkürzung 224
Cluster nach Namen aufschlüsseln 86
Beispiel 225
Cluster nachNamen bündeln 86
Parametrierung vereinfachen 226
symbolische im MAX 310 National Instruments 19
Runge-Kutta in LabVIEW 224 Offset einer Sinuskurve 122
N-Eingang FOR-Schleife 79
OK-Schalter 68
NET 46
Oktruzahl 66
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'
Index OOP 113, 143, 374 abgeleitete Klasse 386 abstrakte Funktion 'Rechnen.vi' 388 abstrakte Funktionen 383 Basisklasse 386
505 Path Siehe Pfad PCI-Bus 305 Pfad 45,70,148
- aktueller Pfad zum VI und zur EXEDatei 162
Rechnen mit römischen Zahlen 390
- erstellen, zerlegen 155
Dynamische Dispatch-Anschlüsse 380
- Pfad zu einer Datei 148
kapseln 374
- Pfad zum aktuellen VI 47, 156
Klasse 374
- pfadkonstante Standardverz. 156
Fehlersuche 389
- Pfadname einer Textdatei 155
Modularität 376
- relative Pfadangabe 156
Modulaustausch 390
- Stringkonvertierung 71
öffentliche (public) Methoden 374
Pfeiltasten PC-Tastatur 40
Rechnen mit arabischen und römischen
Phasengang 204
Zahlen 393
Ping-Kommando m i Internet 436
Schutz Klassenbibliothek 398
Plus-Operator
Überschreiben einer Basisklasse 388
- Matrixaddition 77
Vererbbarkeit 375
- Polymorphie 76, 103
Vorteile, Wiederverwendbark. 375,376
Polling, Verzicht auf 258
Operatoren für Addieren usw. 47
Polnische Notation 176
p
- bei OOP 386
Polymorphie Palette 42
- des Plus-Operators 77
ActiveX 405
Matrixaddition 77
Benutzerdefinierte IN2-37
von SubVIs 93
fixieren 44
Port
Synchronisierung von Prozessen 248
- lesen Port Datenerfassungskarte 336
ZahlendarsteIlung 65
- TCP/IP 436
Paletten und Unterpaletten, Anwendungsbeispiel 47 Panel gestalten 92 - PaneVOiagr. neben-/untereinander 34
Positionieren von Objekten 43
private Daten einer Klasse 378 Probedaten, Probes 43
Produzent und Konsument, Beispiel 253 Profll - Leistung und Speicher 373
- Platz schaffen auf dem Panel 81
ProgrammablaufPlan
Parallel
- Äquivalenz zum Zustandsdiagramm 351
parallele Ausführung von While
- Strukturen 49
Schleifen, Beispiele 243
Programmieren
Parallelverarbeitung 51
ereignisgesteuerte 258
quasi-parallele Verarbeitung 176
grafisch mit LabVlEW 22
Parameter
- in G bzw. LabVlEW 176
eines CLF-Knotens 196
mit DataSocket 438
mit dem Programm speichern 54
mit TCP/IP 441
Parameterdarstellung Zykloide 130
objektorientiert 374
Parameterdarstellung eines Kreises 129 Passwort-Anzeige eines Strings 73 Passwortschutz bei Klassenbibliotheken 400
Programmiersprache APL 177 - Schnittstellen zu anderen Programmiersprachen 177 - strukturiert programmieren 49, 113
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'
506 Programmieren (Fortsetzung) - Testen großer Programme 185
Index Rechnen mit Arrays 76
- Übersetzen eines Programms 175
- mit Clustern 86
Programmiersprache. universelle 20
- mit numerischen Strings 103
Programmierung mit VISA 273
Reentrant 93,101
Projekt
Referenz
Anlegen einer Bibliothek beim cRIO
auf Bedien- und Anzeigeelemente 141
System 469
aufLabVIEW-Objekte 46
FPGA-Projekt braucht Bitftle 479
Schließen ist notwendig! 107
rurOOP 394
Vorteile 143
'TCP.lvproj' 460 Projekt-Explorer ab LabVIEW (8.0) 187 Protokoll - verbindungsloses (IP) 436 - verbindungsorientiertes (TCP) 436
Zahlenwert einer Referenz 141 RefNum
- sichtbar machen aJs Zahlenstring 107 - Unterpalette 46 Regelung
ProtokoUdatei 153
Ergebnisse beim cRIO-System 488
Prozess
mit dem cRIO-Computer 488
benötigte Prozessorzeit 245
mit dem FPGA 489
echt paraJleler AblaufaufFPGA 462
PID-Regler 491
Eingänge und Ausgänge der wichtigsten Funktionen 249
quasistetige 492 Registerkarte 190
Synchronis. mit Datenaustausch 256
- Beispiel mit drei Registerkarten 191
Synchronis. ohne Datenaustausch 252
- Erzeugung mehrerer Karten 190
Prozessor eines Computers 175 - Verringerung der Auslastung durch Ereignissteuerung 260
Regler Siehe Regelung Reihe - als DLL in C++ programmiert 194 - Berechnung in LabVIEW 51
Pubic l (öffentlich) 113
Reihenfolge
Punkt
- bei Cluster-Elementen 83
Form, Größe 121 - isolierte Punkte 121
- der Bits bei RS-232-Übertragung 269 Relation - Darstellung im XY-Graph 129
Q Quasi-parallele Verarbeitung 177
- Relation und Funktion 129
Queue 258
Rendezvous 248,255
auch Warteschlange 248 Datenübertragung mit Queues statt mit Meldern 258 FIFO-Prinzip bei Datenspeicherung 248 neuen Wert in Queue schreiben 367 Referenzen aufQueues 448
im Zustandsautomaten 366
Quittieren Eingabe 116 R
Raster 40
Relatives Zeitformat 128 Rendezvous mit zwei Schleifen unbestimmter Ausführungsdauer 255 Ressource erzeugen, nutzen 248 freigeben, schließen 248 Name, Typ einer Ressource 249 Schonung durch Zeitbegrenzung (Timeout) 252 zur Synchronisation 248 Rezepte zum Arbeiten mit LabVIEW 33
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'
Index Ring
507 Sedezimalzahl Siehe HexadezimaJzahl
Anzeige-/Bedieneiement 90
Selektor
Bi l d-Ring 90
- Beschriftung 53
Datentyp 45
- für polymorphes VI 104
Ring und Gase-Struktur 89
- Zusammenfassen mehrerer Fälle 59
Verknüpfung Zahl <--> Text (Bild) 89
- Ausführung verhindert, wenn Marke
Unterpalette 'Ring & Enum' 59
zyldische Anordnung 89
Ring & Enum 45, 89
Ringspeicher 454 RIO 461
Römische Zahlen 390 Router, Aufgabe im Internet 436 RS-232
Semaphor 247,248,253 fehlt 253 - Beispiel Produzent - Konsument 253 - Marken 253 Sensor
- Brüel & Kjaer für Beschleunigung 339 Sensor, CAN-Bus fähig 292
Sequenz 49, 51
Bitfolge 270
- Ausführung 55
Bitmitte 269
- Datenabhängigkeit 8 1
Datenbits 269
- flache und gestapelte 49,349
Nullmodem 269
- lokaJe Sequenzvariable 53, 55
Startbit, Stoppbit 269
- Verzicht aufSequenzstruktur 177
Rückkopplungsknoten, Funktion aJs Schieberegister 228
- zeitgesteuerte Sequenz 243 Sequenzstruktur
Runge-Kutta 224
- Nachteil 349
Runtime Engine 182
- zum Autbau eines Vls 348
Runtime-Bibliothek, Zweck 179
Seriell, Bit-serielle Ein-/Ausgabe 268
S
- öffnen und schließen 272
SC-2345, SignaJkonditionierungs-Box 332
- Vorteil 269
Scanfrequenz 207
Server 434
Serielle Schnittstelle
größer als nach Shannon gefordert 2 1 1
LabVIEW-Beispiei mit TCP/IP 441
- im Gegensatz zur Frequenz der
- Server-Qient aufeinem oder auf
SchaJter, mechanisches VerhaJten 68
- Server-Qient-Paar in LabVIEW 438
abgetasteten Funktion 207
SchaJtverhalten, mechan., 6 Typen 68, 70 Schieberegister 61,79 bei FOR-Schleife 61
verschiedenen PCs mit TCP/IP 441
- Server-Qient-Paar zum Nachführen eines Drehinstruments 438 Shannon, Satzvon 202, 210
- InitiaJisierung 62
Shortcuts 25,34
- Speicherung interner Zustand IOI
Sichtbare Objekte bei Bedien- oder
Schleife, Struktur 47,49,60 Schlüssel einer Konfigurationsdatei 171
Anzeigeelementen 72 SI-Darstellung von Gleitkommazahlen 66
Schnittstelle, serielle 268
SignaJ
Schrittweite bei numerischer Lösung von
- aJs Summe von Sinussignalen 202
Differenzialgleichungen 225 Schutz Klassenbibliothek durch Passworteingabe 398,400
- AusfIltern von Störungen 332 - Ein-IAusgabe, UnterpaJette 45 - periodisches 202
Schwingung, Beispiel erzwungene S. 226
- Verstärkung 332
SCIP (Standardkommandos) 302
SignaJf1uß in LabVIEW-Diagrammen,
Scope- und Scroll-Modus 1 1 8
mögliche Änderung 242
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'
Index
508 Signalkonditionierung mit SC-2345 332
Standarddatenverzeichnis 158
Signalverlauf Siehe auch Waveform
Standardeinstellung numerische
Signalverlaufs-Diagramm Siehe Chart Signalverlaufs-Graph Siehe Graph oder
Datentypen 65 Standardverzeichnis ändern 157
Waveform{-Graph)
Startbit bei RS 232-Schnittstelle 269
Unterpalette 48
Startseitevon LabVIEW 22
Signifikante Stellen, Ziffern 57, 65, 66
Statische Bindung
Simulation, Geräteauswahl 315,316
- Nachteile 105
Simulink*
- SubVIs 93
Beispiel eines Ergebnisdiagramms 241 - Darstellung eines Differenzialgleichungssystems 240 Sinus Berechnung 95 Funktion 95, 119
Steuerung des Case-Selektors mit Enum 58 Stopp 261 - n i einer Ereignisstruktur 261 - Stoppbit bei RS-232 269 Störung durch weißes Rauschen 220
Sinuskurve 113
- eines Messsignals 202
wandernde Sinuskurve 135
- zuflillige Störung 220
Skala ausblenden 57
Strikte Typdefinition 358
Skalarprodukt
String 45,47,70
- n-dimensionaler Vektoren 81
drei Anzeigetypen: Nonnal, Passwort,
- von Vektoren, einfaches Beispiel 78
Hex-Anzeige 73
Skalieren
Konstante 71
grafIsche Ausgabe 1 1 3
Länge 71
X-Achse 127
Pfadkonvertierung 71
X-Achse mit Echtzeitwerten 135 Y-Achse 123 Solaris 20 Spaltenindex einer Matrix 75 Spannung, maximale und minimale m i MAX fest1egen 335 Spannungsmessung
String & Pfad 70
Teilstring 71
verknüpfen, verketten 47, 71 Zahlkonvertierung 71
String & Pfad, Unterpalette 45 Struktogramm 49
Strukturen, Unterpalette 47
differentiell 321
Strukturierte Programmierung 49, 1 1 3
NRSE-Verlahren 321,331
SubVI
RSE-Verfahren 322 Wahl des Verfahrens 322 Speicherersparnis bei Gleitkommazahlen 66
ablaufinvariantes 110 Anordnung der Anschlüsse 97 Austausch während der Laufzeit 108 Dummy-Anschlüsse 97
Speichern eines VI 29
dynamisch einbinden 94
Spektrum
einführendes Beispiel 94
- Amplitudenspektrum 202
Erstellung 93
- Phasenspektrum 204
Erstellung eines polymorphen 103
Sprachenwahl 41
erzeugen aus bestehendem VI 99
SQL, Anweisungen 429, 431
kompatible SubVIs 108
Standalone-Betrieb 486
mit gleichem Anschlussfeld 108
Standard
platzieren 97
aktuelle Werte als Standard 54 -
für Variablenwerte festlegen 75
rekursiver Aufruf 110 statisch einbinden 93
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'
Index SubVI (Fortsetzung) Verhalten SubVI-Fenster (gleitend. Standard. modal) 100 Zahl der Anschlüsse 97 Suchfenster öffnen 34
509 - SubVIs 445 - trennen Daten und Kommandos beim Oient 447 - Verbindung PC - cRIO-System 465 - warten aufListener 442
Sweep-Modus 1 1 8
TOM-Datei 163,166
Symbol 35
TDMS-Datei, Palette 166. 167
eines VI 96
für ein VI gestalten 97
'Panel' (Eigenschaftsknoten) 145 Symbole der Werkzeugpalette 42 Synchronisation
TEDS - Bedeutung 338 - Beispiel-VI 342 - Datenblatt 340 - Konfiguration bei NI 340
mit Datenübertragung. Melder, Queues
- Vorteile 338
247
Templates 190,370
ohne Datenübertragung 247
Terminal 32, Siehe Anschluss
Unterpalette
Testen großer Programme 185
Synchronisierungsfunktionen 249 von Prozessen 243 von Tasks und Threads 256
Text- & Graflkring 89 Textdatei 148
Text-Ring 59,89
Systemdezimalzeichen 454
Textsuche 34
Systemzeit, Beschriftung der X-Achse 136
TiefPass 214 - arithmetisches Mittel als TiefPass 215
T
Tabelle, Liste & Tabelle, Unterpalette 45 Tabellenkalku1ation mit CSV-Datei 402 Tank-Symbol 57 Task bei simulierten Geräten 316 - Beispiele zur Simulation 317 - programmatische Erstellung 320 Task, Definition 312 Task-Manager Microsoft Windows 246 TCP/IP Anforderungen an den Server 445 aufListenerwarten 455 Aufgabe und Bedeutung von 436 eigene Kommandosprache nützlich 445 Fehleruntersuchung und -behandl. 447 'Klone' fürjeden Client 457 Lese-. Schreibfunktion 442
lesen, einfaches Beispiel 446 Listener erzeugen 442.455 Prinzip 434 schreiben, einfaches Beispiel 446 Server mit einem Client. verbesserte Struktur 455 Server mit mehreren Clients 456
- Beispiel der Auswirkung auf ein gestörtes Signal 216
- Beispiel für Realisierung im Frequenzbereich 222 - glättende Wirkung 216 idealer TiefPass 215 - im Frequenzbereich 221 - realerTiefPass 216 Timerwert auslesen 51 Tipstrip, auch 'Hinweisstreifen' 55 Tools Palette Siehe Werkzeugpalette Top-Down-Methode 93 Transparente Beschriftungsfelder 37 Transponieren einer Matrix 126, 238 Treiber - DAQmx 306 - vonNI 305 Treppenfunktion 121 Triggern 324 TRUE 57,58 Tschebyscheff-Filter 218 Typ einer Variablen, auffinden 45 - UI6 bei Ringen 89
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'
Index
510 U
Verbindungspunkte an Kreuzungen 37
Überschreiben einer Datei 154
Verdeckter Code 348
Übersetzen eines Programms 175
Verdrahtung, automatische 37,38
Übersetzung englisch-deutsch 41
Vererbung 1 B, 143, 145
Uhrzeit und Datum 61
Beispiel 383
Umfärben 43
Hierarchie 384 in LabVIEW festlegen 384
Umgebungsvariable neu ab LabVIEW 8.0
468 Umwande1n
zweistufige Vererbung 396 Vergleichen, Unterpalette 47
Anzeigeelem. <--> Bedienelem. 77
Verkettung von Strings 71
Cluster <--> Array 47
Versionen von LabVIEW 20
Slnng <--> Pfad 47
Vertauschen mit Referenzen aufVariable 142
von Daten in Strings 158
von Format & Genauigkeit 67
von ganzen Zahlen in Hex-Zahlen 66 Undo 34
- von Clustern, Arrays 143 - von zwei Variablen 140 Verteilen von VIs auf dem cRIO-System
Unterabtastung, Beispiel 211 Unterprogramm Siehe SubVI
469 Verzeichnis, Unterverzeichnis für 'FPGABitfiles' beim cRIO-System 480
USB Bedeutung 268,273
VI
Experimentierplatine von Conrad
als Unterprogramm oder als
EJektronik (Vellemann) 274
Hauptprogramm 97
in LabVIEW 268
Aufrufeines FPGA-SubVls 472
Geschwindigk. Version LI und 2.0 273
NI U58-6251 321
Anschlussfeld 96 Beispiel Datenaustausch mit Excel 423
U-Typ, Integer ohne Vorzeichen 65
Beispiel für Programmierung eines
V
dynamischer Aufruf 108
polymorphen VI 104 Variable globale 47,231, 232 lokale 55 lokale Sequenzvariable 55
Einstellungen 99 ersten Aufrufandersbehandeln 102 Express-VIs B8 LabVIEW-Umgebung 179
Namen ändern 58
laden 29
vertauschen 140
öffnen, schließen 34
Variant, Konvertierung Daten n i 'Variant' und umgekehrt 450 Vektor 83 als I-dimensionales Array 73 - Dimension 73
Ping.vi 437 polymorphes VI als Container 103 Referenz aufVI 106 speichern 29,34 Standardsymbol 96
- leeren Vektor erzeugen 119
starten, stoppen 29
Verbindung
Steuerung von Vl's 48
cRIO-Computer - FPGA 466
- PC - cRIO-Computer 466, 467 - PC - cRIO-FPGA 466,472
Verbindungslinie, Drähte 32,46 doppeh ausgezogen 77 - konstituierend für LabVlEW 175
VI mit internem Zustand 101 VI-Server 144 zur seriellen RS 232 DÜ 271 VISA 270 beim GPIB-Bus 299 - fürGPIB-Programme 303
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'
SI I
Index Visual Basic, Erstellen Makro durch Aufzeichnen 419 Vordergrundfarbe 57
z
Zahl
Basis 2 oder 16 zur Darstellung 66 Darstellung an Größe anpassen 146
W Warteschlange
Siehe Queue
Wartezeit bei TCPIIP-Verbindung 443
ganze Zahl, l-Typ und U-Typ 65 Gleitkommazahl, DBL und SGL 65
Integer, vorzeichenbehaftet 68 Integer, vorzeichenlos 68
- Enlastung des Prozessors 245
komplexe 65
- While-Schleife ohne 245
Stringkonvertierung 71
Waveform 132
Zahl der NachkommastelIen 66
als spezieller Datentyp 48 Elemente tO, dt, Y 132
Zahlensystem, Basis 66 Zähler mit FüR-Schleife 60
Funktionen zum Bündeln und
Zeichenkene 70
Aufschlüsseln 132
Zeilenindex einer Matrix 75
Mehrere Kurven, ein Fenster 135
Zeit
mit Waveformgraph (Graph) 133
absolutes, relatives Zeitformat
Parameter 134
aktuelle 136
66, 128
Web Browser und ActiveX 405
exaktere Durchlaufzeit 265
Werkzeug zum Verbinden 96
momentane Uhrzeit und Datum 47. 7 1
Werkzeugpalette 24, 42 Werkzeugtaste 'A' 77 Werkzeugwahl, automatische 42 While-Schleife 49,60,63 Ausgang 63
Bedingungsterminal 64
finden 63
Speicherung interner Zustand 101 Zahl der Durchläufe 64
Wieder verwendbarer Code 113. 376
Zeit & Dialog 47,71 Zeitbereich 202
Zeitformat einer Zahl 66 Zeitfunktionen 47 Zeitgesteuerte Strukturen 265 Zeitmessung 51 Zeitschleife 265 Zeitstempel 136 ZILA Elektronik GmBH Sensoren für CAN-Bus 292
Wiederherstellung früherer
- Temperatursensor TSL-CAN-03 292
Programmierschritte 40
- Temperatursensor TSR-CAN-03 297
Wiederholt ausführen (Modus) 29 Windows 2000, Windows XP 20
X Xilinx· - Compiler 462 - starten VHDL-Compiler 477 XV-Graph 1 13, 129 Darstellung einer Zykloide 131 löschenXY-Graph 130 mehrere Relationen in einem XY Graphen 131
ZILA-Sensor für CANopen 294 ZIP-Dateien ab LabVIEW 8.0 168 Zustand Beschreibung in LabVIEW häufig mit 'String' oder 'Enum' 351 Zustandsauswahl mit 'Enum' 354 Zustandsauswahl mit 'String' 353 Zustandsautomat Darstellung durch gerichteten Graphen
350 Darstellung im Zustandsdiagramm 351 Server und Client bei TCP/IP 447 unter labVIEW 349
Ausleihe: 31.07.200900:00:00 - 08.08.2009 00:00:00, ID:7ac0427d592981cI089d91b1gecaOOaO, Zentral- u 2009.07.31 21:42:39 +02'00'
SI' Zustandsautomat (Fortsetzung) Verwendung Konfigurationsdateien 362 - VoreinsteIlung 358 - Vorteil 350 Zustandsdiagramm Äquivalenz Programmablaufplan 351
Index Zweidimensionales Array oder Matrix 73 Zwischencode 176 Zweidrahtleitung CAN-Bus 298 zyklische Anordnung bei Ringen 89
Zykloide, Darstellung als XY-Graph 130
Folgezustand 362 Münzautomat 357 Umsetzung n i LabVIEW 351 Zähler 350
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'
W dar _
--....
www.hanserde