elektronische messdatenverarbeitung - betzler.physik.uni ... · 1 detektoren und sensoren 1 1...

158
Elektronische Messdatenverarbeitung Klaus Betzler Universit¨ at Osnabr¨ uck Wintersemester 2006/2007 Inhaltsverzeichnis 1 Detektoren und Sensoren 1 1.1 Temperatur .................................... 1 1.1.1 Widerst¨ ande ............................... 1 1.1.2 Thermoelemente ............................. 2 1.1.3 Band-Gap-Referenz-Diode ........................ 3 1.1.4 Kapazitive Sensoren ........................... 4 1.2 Koordinaten (Ort und Winkel) ......................... 5 1.3 Licht ........................................ 6 1.3.1 Zur Charakterisierung von Photodetektoren .............. 6 1.3.2 Photomultiplier .............................. 9 1.3.3 Photodioden, Phototransistoren ..................... 14 1.3.4 Photoleiter ................................ 18 1.3.5 Thermische Detektoren ......................... 19 1.4 Teilchen ...................................... 20 1.4.1 Szintillationsz¨ ahler ............................ 20 1.4.2 Halbleiterdetektoren ........................... 21 1.4.3 Sekund¨ arelektronenvervielfacher .................... 22 [email protected] 14. Oktober 2006

Upload: lydieu

Post on 10-Aug-2019

228 views

Category:

Documents


0 download

TRANSCRIPT

Elektronische Messdatenverarbeitung

Klaus Betzler ∗

Universitat Osnabruck Wintersemester 2006/2007

Inhaltsverzeichnis

1 Detektoren und Sensoren 11.1 Temperatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 Widerstande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2 Thermoelemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.3 Band-Gap-Referenz-Diode . . . . . . . . . . . . . . . . . . . . . . . . 31.1.4 Kapazitive Sensoren . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2 Koordinaten (Ort und Winkel) . . . . . . . . . . . . . . . . . . . . . . . . . 51.3 Licht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3.1 Zur Charakterisierung von Photodetektoren . . . . . . . . . . . . . . 61.3.2 Photomultiplier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.3 Photodioden, Phototransistoren . . . . . . . . . . . . . . . . . . . . . 141.3.4 Photoleiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.3.5 Thermische Detektoren . . . . . . . . . . . . . . . . . . . . . . . . . 19

1.4 Teilchen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.4.1 Szintillationszahler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.4.2 Halbleiterdetektoren . . . . . . . . . . . . . . . . . . . . . . . . . . . 211.4.3 Sekundarelektronenvervielfacher . . . . . . . . . . . . . . . . . . . . 22

[email protected] 14. Oktober 2006

Inhaltsverzeichnis ii

2 Aktoren 232.1 Externe Gerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2 Leistungsschalter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.3 Schrittmotoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.4 Servos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.5 Altgerate-Recycling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.6 Piezostellelemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.7 Entstorung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3 Signalverarbeitung 303.1 Strom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.2 Spannung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.3 Widerstand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.4 Lock-In-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.5 Ladung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.6 Ereignis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.7 Zeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.7.1 Transientenspeicher . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.7.2 Boxcar-Technik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.7.3 Zeit-Impulshohen-Wandlung . . . . . . . . . . . . . . . . . . . . . . . 35

4 D/A- und A/D-Wandler 364.1 Digital/Analog-Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.2 Analog/Digital-Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.2.1 Parallel-A/D-Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . 384.2.2 Kaskaden-Wandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.2.3 Integrations- und Zahlverfahren . . . . . . . . . . . . . . . . . . . . . 394.2.4 Wageverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2.5 Spannungs-Frequenz-Wandlung . . . . . . . . . . . . . . . . . . . . . 44

4.3 Potentialtrennung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444.4 Digitale Regelung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5 MATLAB I : Messdatenerfassung 485.1 Hardware-Zugriff mit MATLAB-Funktionen . . . . . . . . . . . . . . . . . . 495.2 Externe Programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.3 MEX-Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.4 MEX-Funktionen und ‘Microsoft Foundation Classes’ . . . . . . . . . . . . . 535.5 MEX-Funktionen mit GCC oder G++ . . . . . . . . . . . . . . . . . . . . . 545.6 MATLAB als ‘Engine’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555.7 ActiveX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575.8 Dateiformate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Inhaltsverzeichnis iii

5.9 Graphische Benutzeroberflachen . . . . . . . . . . . . . . . . . . . . . . . . . 59

6 MATLAB II : Messdatenverarbeitung 636.1 Filterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

6.1.1 Gewichteter Mittelwert . . . . . . . . . . . . . . . . . . . . . . . . . 646.1.2 Gradientenfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656.1.3 Savitzky-Golay-Filter . . . . . . . . . . . . . . . . . . . . . . . . . . 66

6.2 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716.3 Fouriertransformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

6.3.1 Frequenzanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736.3.2 Datenfilterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

6.4 Fits, Anpassung an Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . 776.4.1 Polynome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776.4.2 Parameterlineare Fits . . . . . . . . . . . . . . . . . . . . . . . . . . 786.4.3 Anpassung an beliebige Funktionen . . . . . . . . . . . . . . . . . . . 79

6.5 Graphische Darstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

7 Schnittstellen und Programmierung 837.1 Die serielle Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

7.1.1 Grundlagen und Schnittstellennorm . . . . . . . . . . . . . . . . . . 837.1.2 Quittungsbetrieb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857.1.3 Andere Ubertragungsnormen . . . . . . . . . . . . . . . . . . . . . . 867.1.4 Programmierung unter Windows . . . . . . . . . . . . . . . . . . . . 867.1.5 C++ und Microsoft Foundation Classes . . . . . . . . . . . . . . . . 897.1.6 C-Programmierung mit Stream-IO-Funktionen . . . . . . . . . . . . 897.1.7 Linux-Spezifisches . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.1.8 Programmierung in MATLAB . . . . . . . . . . . . . . . . . . . . . 91

7.2 Direkte Port-Ein/Ausgabe unter Windows 32 . . . . . . . . . . . . . . . . . 927.2.1 Portzugriff unter Windows 2000 . . . . . . . . . . . . . . . . . . . . 937.2.2 Test: PC-Lautsprecher . . . . . . . . . . . . . . . . . . . . . . . . . . 947.2.3 Bit-Operationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

7.3 Zeit und Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977.3.1 Systemzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977.3.2 Zeitmessung in MATLAB . . . . . . . . . . . . . . . . . . . . . . . . 977.3.3 Performance-Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . 987.3.4 Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987.3.5 Timer in MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . 997.3.6 Multimedia-Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

7.4 Parallele Schnittstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007.4.1 Die Druckerschnittstelle alter Art . . . . . . . . . . . . . . . . . . . . 1017.4.2 Druckerport und Multimedia-Timer zur Schrittmotoransteuerung . . 102

Inhaltsverzeichnis iv

7.4.3 Servo-Ansteuerung: Multimedia-Timer und Performance-Counter . . 1057.4.4 Enhanced Parallel Port (EPP) und Extended Capability Port (ECP) 1067.4.5 Der programmierbare Parallel-E/A-Baustein 8255 . . . . . . . . . . 106

7.5 Der IEC-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1107.5.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1107.5.2 Datenformat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127.5.3 Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

7.6 Universal Serial Bus (USB) . . . . . . . . . . . . . . . . . . . . . . . . . . . 1147.7 TCP/IP-Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

7.7.1 Sockets und Ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1187.7.2 Socket-Server in C/C++ . . . . . . . . . . . . . . . . . . . . . . . . 1197.7.3 Socket-Client in C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . 1217.7.4 Socket-Client in MATLAB/Java . . . . . . . . . . . . . . . . . . . . 121

8 Windows-Programmierung mit Visual C++ 1238.1 C, C++ und MFC, Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . 123

8.1.1 Windows-Programmierung in C . . . . . . . . . . . . . . . . . . . . . 1238.1.2 Objektorientiert mit C++ und MFC . . . . . . . . . . . . . . . . . . 1268.1.3 Programmunterstutzt in Visual C++ . . . . . . . . . . . . . . . . . 127

8.2 Dialogorientierte Programme . . . . . . . . . . . . . . . . . . . . . . . . . . 1288.2.1 Visuelle Dialogerstellung mit dem Ressourceneditor . . . . . . . . . 1298.2.2 Funktionen und Variablen . . . . . . . . . . . . . . . . . . . . . . . . 130

8.3 MFC-Zeitfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318.3.1 Systemzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318.3.2 Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

8.4 Dokumentorientierte Programme . . . . . . . . . . . . . . . . . . . . . . . . 1328.4.1 Dateizugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1338.4.2 Graphik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1348.4.3 Drucken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1368.4.4 Zwischenablage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378.4.5 Dialogfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378.4.6 Benutzeroberflache . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1398.4.7 Mehrere Dokumentfenster . . . . . . . . . . . . . . . . . . . . . . . . 1398.4.8 Bitmap-Graphiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408.4.9 Fenstereigenschaften . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

8.5 Sockets mit MFC-Unterstutzung . . . . . . . . . . . . . . . . . . . . . . . . 1468.5.1 Server-Socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1468.5.2 Client-Socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1498.5.3 Mail-Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

Literatur 152

1 Detektoren und Sensoren 1

1 Detektoren und Sensoren

Experimentelle Messgroßen liegen im Regelfall nicht in ‘EDV-kompatibler’ Form vor. Dieseherzustellen, d. h. die physikalische Große in eine geeignete elektrische umzuwandeln –geeignet letztlich zur Weiterverarbeitung mit einem Interface und einem Computer – istdie Aufgabe von Detektoren und Sensoren. Die Abgrenzung zwischen den beiden Begriffenist nicht immer eindeutig; will man abgrenzen, so kann man den Begriff Detektor furden Nachweis von Teilchen (Elektronen, Photonen), den Begriff Sensor fur die Wandlunganderer physikalischer Großen (Temperatur, Lichtintensitat) benutzen.

Bei der Anwendung eines Detektors oder Sensors sollte man sich in jedem Fall zunachstdie zugrunde liegende physikalische Wirkungsweise klar machen, daher:

Behandeln sie einen Detektor oder Sensor erst dann als black box,wenn sie wirklich wissen, was drin ist.

Wichtig sind die Fahigkeiten und die Grenzen eines Systems.

Das gesamte Gebiet ist sicherlich zu groß, um es in einer Vorlesung auch nur annaherndvollstandig behandeln zu konnen, wir beschranken uns daher auf einige Beispiele aus ty-pischen Bereichen.

1.1 Temperatur

Praktisch alle physikalischen Eigenschaften sind mehr oder weniger stark temperaturab-hangig, konnen also prinzipiell zur Temperaturmessung eingesetzt werden; anschaulichstesBeispiel ist die thermische Ausdehnung bei Festkorpern, Flussigkeiten oder Gasen. Furdie Anwendung in Sensoren besonders interessant und fast ausschließlich verwendet sindtemperaturabhangige Anderungen der elektrischen Eigenschaften, die auf einfache Weiseautomatisch detektiert und elektrisch weiterverarbeitet werden konnen.

1.1.1 Widerstande

Speziell zur Temperaturmessung und -regelung entwickelte PTC- und NTC-Thermistoren,d. h. Widerstande mit positivem oder negativem Temperaturkoeffizienten (Kaltleiter, Heiß-leiter), fanden und finden in der technischen Elektrik breite Verwendung. Ihr Anwendungs-bereich ist allerdings meist auf Temperaturen beschrankt, in denen technische Gerate,Haushaltsgerate etc. arbeiten.

In einem weiteren Temperaturbereich einsetzbar und daher fur physikalische Experimen-te interessanter (aber auch teurer) sind Platin-Widerstande mit besonderen Spezifikatio-nen (Pt 100), die eine sehr ausgepragte, gut definierte und dokumentierte Temperatu-rabhangigkeit zwischen etwa 10 K und 1000 K aufweisen.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 2

Fur tiefe Temperaturen (1 K bis 100 K) geeignet sind Kohle-Widerstande und spezielleHalbleiter-Widerstande (Ge) oder -Dioden (Si), die man auch mit genauer, individuellerstellter Eichung (dann sehr teuer) kaufen kann.

Bei der Temperaturmessung mit Widerstanden ist – insbesondere bei tiefen Temperaturen– darauf zu achten, dass die zur Messung benotigte Leistung und damit die Warmezufuhrmoglichst gering ist.

1.1.2 Thermoelemente

Thermoelemente nutzen die materialspezifische Temperaturabhangigkeit der Ladungs-tragerverteilung in Metallen oder Halbleitern aus (detaillierte Beschreibung in Lehrbuchernzur Festkorperphysik [1] oder Halbleiterphysik [2]). Obwohl der thermoelektrische Effekt(Thermokraft) im allgemeinen in Halbleitern großer ist, werden aus naheliegenden prak-tischen Grunden geeignete Kombinationen aus verschiedenen Metallen oder Metall-Legie-rungen verwendet. Einige gebrauchliche Thermopaare sind in Tabelle 1 zusammengestellt.

Thermopaar Temperaturbereich Diff. Thermospannung bei 0 ◦C

Gold Eisen – Nickel Chrom -270 ◦C. . . 0 ◦C 20 μV/K

Kupfer – Konstantan -200 ◦C. . . 600 ◦C 40 μV/K

Eisen – Konstantan -200 ◦C. . . 900 ◦C 52 μV/K

Nickel Chrom – Konstantan 0 ◦C. . . 1000 ◦C 63 μV/K

Nickel Chrom – Nickel -200 ◦C. . . 1370 ◦C 40 μV/K

Platin Rhodium – Platin 0 ◦C. . . 1750 ◦C 55 μV/K

Wolfram Rhenium 5 – 26 0 ◦C. . . 2500 ◦C 10 μV/K

Tabelle 1: Typischer Anwendungstemperaturbereich und differentielle Thermospannunggebrauchlicher Thermoelemente.

Die Vorteile von Thermoelementen liegen in ihrem großen Anwendungstemperaturbereich,ihrer relativ einfachen Handhabung und dem gunstigen Preis. Nachteilig ist das geringeelektrische Signal, das ein empfindliches Messgerat bzw. eine stabile Verstarkung erfordert,und die Notwendigkeit einer Referenzstelle (Eisbad) mit definierter, konstanter Tempera-tur (andere Moglichkeit s. 1.1.3).

Bei der Herstellung von Thermoelementen ist insbesondere auf guten elektrischen Kon-takt zwischen den beiden Materialien zu achten (Punkt- oder Mikroschweißung). TeureThermoelemente konnen mit Ausgleichsleitungen angeschlossen werden. Genauer ist diesin den Datenblattern der Hersteller beschrieben, die meist auch ausfuhrliche Tabellen dertemperaturabhangigen Thermospannungen enthalten.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 3

1.1.3 Band-Gap-Referenz-Diode

Die Strom-Spannungs-Kennlinie einer Halbleiterdiode wird in guter Naherung durch

I = IS(expeU

kT− 1) (1.1)

beschrieben. Dies wurde schon in der Fruhzeit der Halbleiterphysik von Shockley herge-leitet und experimentell verifiziert [3].

U

IAbbildung 1: Strom-Spannungs-Kennlinien ei-ner Diode nach Gleichung 1.1 fur zwei ver-schiedene Temperaturen (10 ◦C und 50 ◦C); derStrom im Sperrbereich ist um 104 uberhoht dar-gestellt.

Im Durchlassbereich (U � kT/e) kann man die −1 in Gl. 1.1 gegen die Exponential-funktion vernachlassigen, bei konstantem Strom I ist dann der Zusammenhang zwischenSpannung U und Temperatur T annahernd linear (die Temperaturabhangigkeit des Satti-gungssperrstroms IS ist bei dieser Betrachtung nicht berucksichtigt). Basierend auf diesemEffekt lassen sich Temperaturfuhler mit sehr gut linearer Kennlinie bauen [4]. Ein typischesBeispiel ist der integrierte Schaltkreis AD 592 von Analog Devices.

Abbildung 2: Idealisierte Kennlinie undBauform des IC AD 592; aus [5].

Der AD 592 liefert in einem Betriebsspannungsbereich 3 V. . . 30 V einen sehr gut tempe-raturproportionalen Strom, der Proportionalitatsfaktor ist genau 1μA/K (Abb. 2), diesim Temperaturbereich -25 ◦C. . . 105 ◦C. An einem Lastwiderstand von beispielsweise 10 kΩergibt dies eine gut messbare Spannung von einigen Volt. Die Nichtlinearitat der Kennlinieliegt – auf die Temperatur umgerechnet – in der Großenordnung von ±0.5 K. Die Bau-form (Plastikgehause) bedingt allerdings eine relativ große thermische Zeitkonstante undschlechte Warmeabfuhr, die diesbezuglichen Daten sind in Tabelle 2 zusammengestellt.

Bevorzugte Anwendungsgebiete sind mithin solche mit langsam veranderlicher Tempe-ratur, beispielsweise die Temperaturregelung von Halbleiterlasern oder die Messung der

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 4

Art der Kuhlung Warmewiderstand Therm. Zeitkonstante

Ruhende Luft 175 K/Watt 60 sec

Ruhende Luft + Kuhlblech 130 K/Watt 55 sec

Bewegte Luft 60 K/Watt 12 sec

Bewegte Luft + Kuhlblech 40 K/Watt 10 sec

Flussigkeit 35 K/Watt 5 sec

Aluminiumblock + Warmeleitpaste 30 K/Watt 3 sec

Tabelle 2: Warmewiderstand und thermische Zeitkonstante des AD 592 fur verschiedeneAnwendungsarten. Die Erwarmung durch die im Schaltkreis umgesetzte Leistung kanndemnach im ungunstigsten Fall bis zu 2 K betragen.

Referenztemperatur bei Thermoelementen. Einen Vorschlag zur Referenzstellenkompen-sation zeigt Abbildung 3.

Abbildung 3: Referenzstellen-kompensation mit dem ICAD 592 bei der Temperatur-messung mit einem Thermo-element (Schaltungsvorschlagaus dem Datenblatt des IC-Herstellers Analog Devices);aus [5].

1.1.4 Kapazitive Sensoren

Die bisher beschriebenen Temperatursensoren werden ungenau, wenn große Magnetfelderam Messort vorhanden sind. Fur diesen Spezialfall konnen kapazitive Sensoren verwendetwerden, die als physikalisches Messprinzip die Abhangigkeit der Dielektrizitatskonstantenvon der Temperatur ausnutzen (die Kapazitatsmessung ist allerdings deutlich aufwendi-ger als etwa eine Widerstandsmessung). Besonders geeignet dafur sind Materialien, diein der Nahe der zu messenden Temperaturen einem strukturellen Phasenubergang (para-elektrisch → ferroelektrisch) zustreben. Ein Beispiel ist Strontiumtitanat bei sehr tiefenTemperaturen, die Dielektrizitatskonstante nimmt gegen 0 K deutlich zu, ohne dass einPhasenubergang tatsachlich erreicht wird.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 5

1.2 Koordinaten (Ort und Winkel)

Die klassischen Sensoren fur diesen Bereich sind Potentiometer, lineare oder Drehwi-derstande, die – direkt oder uber mehr oder weniger aufwendige Getriebe mit der Messstelleverbunden, mit konstantem Strom oder konstanter Spannung betrieben – eine orts- oderwinkelabhangige Spannung liefern. Soll’s genauer sein, kann man bei kleinen Wegen kapa-zitive oder piezoelektrische Prinzipien verwenden, bei großeren optische Phasenmessungen(Interferometer), bei sehr großen optische oder elektrische Laufzeitmessungen.

Im Werkzeugmaschinenbereich werden derzeit hauptsachlich exakte mechanische Maß-stabe oder Teilscheiben verwendet, die optoelektronisch abgelesen werden. Auf Spezial-glassubstrate werden hochgenaue Teilungen oder Kodierungen aufgedampft, Beispiele furTeilscheiben zur inkrementellen oder absoluten Winkelmessung zeigt Abbildung 4.

Abbildung 4: Teilscheibe eines inkrementellen Drehgebers (links) und eines Code-Drehgebers (rechts), beide etwa in naturlicher Große (entnommen einem Katalog der Fir-ma Heidenhain, Traunreut). Die Code-Teilscheibe rechts ist im Gray-Code kodiert, einembinaren Code, bei dem sich von einem Wert zum nachsten immer nur ein Bit der Ko-dierung verandert; auf diese Weise konnen keine Ablesefehler auftreten, wenn die Scheibezwischen zwei Werten steht.

Die mit solchen Teilscheiben aufgebauten inkrementellen Drehgeber liefern in der Regelzwei um π/2 gegeneinander phasenverschobene Sinusspannungen, die in der zugehorigenAnzeigeelektronik ausgewertet werden. Die aktuelle Winkelposition kann uber eine Stan-dardschnittstelle (Seriell oder parallel) in einen angeschlossenen Rechner ubernommenwerden. Benotigt man die Messpunkte in schneller Abfolge, bietet es sich an, die Sinus-signale uber Analog-Digital-Wandler direkt vom Rechner zu erfassen und auszuwerten.Die mechanische Genauigkeit der Teilscheiben und der optoelektronischen Ablesung ist sogut, dass pro Sinusperiode mehrere hundert Subschritte interpoliert werden konnen. Da-mit kann eine Genauigkeit der Winkelmessung erzielt werden, die in der Großenordnungvon 1/1000 Grad liegt.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 6

1.3 Licht

Zum Nachweis von Licht konnen unterschiedliche physikalische Effekte ausgenutzt wer-den. Einerseits sind dies Quanteneffekte (außerer oder innerer Photoeffekt), mit denensehr empfindliche Detektoren realisiert werden konnen, andererseits Effekte, die in irgend-einer Form die Temperaturanderung nachweisen, die durch den mit Licht verbundenenmakroskopischen Energiestrom bewirkt wird (eine ausfuhrliche Beschreibung der bei Pho-todetektoren genutzten physikalischen Effekte und der damit realisierten Bauelemente gibtbeispielsweise [6]). Wegen der wesentlich besseren Empfindlichkeit sind fur physikalischeExperimente in erster Linie die auf den Photoeffekten basierenden Detektoren interessant.Thermische Detektoren werden generell nur dort eingesetzt, wo entweder sehr hohe Licht-leistungen zu messen sind oder wo in Wellenlangenbereichen gemessen werden muss, diefur andere Detektoren nicht zuganglich sind.

1.3.1 Zur Charakterisierung von Photodetektoren

Innerer und außerer Photoeffekt sind als ‘Bandstruktureffekte’ sehr stark material- undenergieabhangig. Ladungstrager konnen – sieht man von in der Regel vernachlassigbarenMehrquanteneffekten ab – nur von Photonen ab einer bestimmten Quantenenergie an-geregt werden. Die Nachweisempfindlichkeit ist auch oberhalb dieser Grenzenergie starkwellenlangenabhangig. Bei thermische Detektoren ist im Vergleich dazu der Empfindlich-keitsverlauf wesentlich weniger dramatisch. Zur Charakterisierung von Detektoren wird dieEmpfindlichkeit mit ihrer Wellenlangenabhangigkeit angegeben – als Responsivity R(λ),gemessen beispielsweise in Ampere/Watt, bei Photodioden oder als Quantenausbeute, ge-messen in %, bei Kathoden von Photomultipliern.

NEP-Wert: Bei geringen Lichtsignalen stellt das Detektorrauschen eine ganz wesentli-che Begrenzung dar, es ist daher ublich, dieses Rauschen bei der Empfindlichkeitsangabeimplizit zu berucksichtigen. Als Maß fur die so definierte Empfindlichkeit wird die Licht-leistung angegeben, die notwendig ist, um ein dem Rauschen aquivalentes Ausgangssignalzu generieren (NEP-Wert – N oise Equivalent Power).

Detektivitat: Detektoren sind umso besser, je kleiner ihr NEP-Wert ist. Da große Wer-te jedoch allgemein beliebter und vor allem werbewirksamer sind, wird haufig die dazureziproke Große, die Detektivitat D = 1/NEP verwendet.

Spezifische Detektivitat: Das Detektorrauschen hangt nicht nur von der Detektorartab, sondern auch von der Detektorgroße sowie von den Messbedingungen (Detektortempe-ratur, Verstarkerbandbreite). Weiterhin kann der Erfassungswinkel von Detektoren unter-schiedlich sein. Als statistische Große ist das Rauschsignal in guter Naherung proportionalzur Quadratwurzel aus der Detektorflache A und der Bandbreite B. Man objektiviert da-her ublicherweise von den genannten Nebenbedingungen durch Angabe der spezifischenDetektivitat D∗ (D-Stern):

D∗ = (NEP)−1 · A1/2 · B1/2 . (1.2)

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 7

Einige Autoren bzw. Firmen definieren zusatzlich ein D-Doppelstern D∗∗ = D∗ sin Θ, daszusatzlich den Erfassungswinkel (Θ = halber Erfassungswinkel) berucksichtigt.

Einen Uberblick der Detektivitatskurven verschiedener Detektortypen geben die Abbil-dungen 5 und 6, Abbildung 5 fur Anwendungen im sichtbaren Spektralbereich sowie imnahen Ultraviolett und Infrarot (Photomultiplier und -dioden), Abbildung 6 fur den In-frarotbereich zwischen 1 und 1000μm (Photoleiter und thermische Detektoren).

Abbildung 5: Detektivitat D von Photomultipliern (PM), Photoleitern (PL), Photodioden(PD) und Lawinenphotodioden (APD); aus [6].

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 8

Abbildung 6: Spezifische Detektivitat D∗∗ von thermischen Detektoren und Photonende-tektoren; aus [6].

Rauschen und Energiebereich: Wahrend bei ausreichenden Lichtintensitaten das De-tektorrauschen keine große Rolle spielt, ist es bei der Messung geringer Intensitaten diebegrenzende Große fur die minimal messbare Intensitat. Bei Photonendetektoren wirddas Rauschen bei geringen Lichtintensitaten (Dunkelrauschen) im wesentlichen durch diethermische Anregung von Ladungstragern verursacht. Die Aktivierungsenergie fur die-se thermische Anregung ist generell kleiner als die fur optische, daher ist das thermischgenerierte Detektorrauschen umso großer, je geringer die optische Anregungsenergie ist,d. h. je langwelliger ein Detektor nutzbar ist. Durch Kuhlung des Detektors lassen sich

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 9

die Verhaltnisse zwar etwas verbessern, man wird im allgemeinen jedoch immer einen furdie jeweilige Messaufgabe optimierten Kompromiss schließen mussen. Fur geringe Inten-sitaten sieht der oft so aus, dass man einen Detektor verwendet, mit dem der gewunschteWellenlangenbereich gerade noch abzudecken ist.

1.3.2 Photomultiplier

Zum Nachweis extrem geringer Lichtintensitaten im sichtbaren, ultravioletten und nah-infraroten Spektralbereich verwendet man meist Photomultiplier. Ihre Funktionsweise be-ruht auf dem außeren Photoeffekt und der Sekundarelektronenemission: aus einer Pho-tokathode (im Vakuum) werden durch Lichtquanten Elektronen ausgelost, die durch eineSpannung von etwa 100 V zur nachsten Elektrode (Dynode) beschleunigt werden, wojedes mehrere Sekundarelektronen auslost. Solche Verstarkungsstufen werden kaskadiert(ca. 10), so dass an der letzten Elektrode (Anode) ein gut messbares Ladungssignal ent-steht (Sekundarelektronen-Vervielfacher). Mit dafur optimierten Anordnungen konnen soproblemlos einzelne Photonen nachgewiesen werden (photon counting). Den prinzipiellenAufbau eines Photomultipliers zeigt Abbildung 7.

Abbildung 7: Typische Geometrie eines Photomultipliers mit Frontfensterkathode (ge-brauchliche Durchmesser liegen zwischen 10 und 100 mm); aus [7].

Kathodenmaterialien: Fur Photokathoden werden Materialien aus drei Substanzklassenverwendet: Metalle mit niedriger Austrittsarbeit (meist Mischungen aus Alkalimetallen)fur den sichtbaren Spektralbereich, Halbleiter (Telluride, Oxide) fur das Ultraviolette undIII-V-Halbleiter (GaAs, GaInAs), bei denen mit geeigneter Beschichtung eine negativeElektronenaffinitat erreicht wurde, fur das nahe Infrarot. Die typischen Bandstrukturen(Energienivaues im Ortsraum) sind in Abbildung 8 skizziert.

Die Kathoden sind entweder als dunne semitransparente Schicht innen auf das Frontfen-ster aufgedampft oder als massivere Beschichtung auf ein Metallblech aufgetragen. DieKathodengroßen liegen fur optische Anwendungen zwischen einigen Millimetern (rausch-arme Photonenzahlanwendungen) und einigen Zentimetern.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 10

Abbildung 8: ‘Optische’ Elektronenaustrittsarbeit WA bei Metallen (linkes Bild), Halblei-tern (mittleres Bild) und Halbleitern mit negativer Elektronenaffinitat, d. h. Evak < EL

(rechtes Bild). EF: Fermi-Energie, EV: Valenz-, EL: Leitungsband, Evak: Vakuumniveau.

Empfindlichkeit: Das Maximum der Quantenausbeute bei Photomultipliern liegt je nachKathodenmaterial zwischen 0.1 und 30 %, d. h. jedes tausendste bzw. dritte auf die Pho-tokathode treffende Photon lost dort ein Elektron aus. Der spektrale Verlauf ist im lang-welligen Bereich durch die Austrittsarbeit bestimmt, im kurzwelligen Bereich in der Regeldurch das Fenstermaterial 1. Eine Ubersicht uber die spektralen Empfindlichkeitskurvenverschiedener Kathodenmaterialien2 zeigen die Abbildungen 9, 10 und 11 (aus [8]).

Abbildung 9: Empfindlichkeitskurven von Photomultipliern fur Ultraviolettanwendungen.

1Empfindlichkeit im ferneren UV kann auch durch Szintillatormaterialien erreicht werden, die kurzwel-liges Licht absorbieren und langerwellig lumineszieren.

2Die teilweise verwendeten Bezeichnungen S4, S11 usw. sind gebrauchliche Trivialnamen fur bestimmteMaterialmischungen.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 11

Abbildung 10: Empfindlichkeitskurven von Photomultipliern fur Anwendungen im sicht-baren Spektralbereich.

Dynoden werden aus Materialien mit guter Sekundarelektroneneffizienz hergestellt, vor-wiegend aus BeO (gute Hochtemperatureigenschaften) oder Cs3Sb.

Zeitverhalten: Die Gesamtlaufzeit der Elektronen von der Kathode zur Anode betragt jenach Bauform zwischen 10 und 100 nsec. Durch eine Optimierung der Dynodenanordnungkann man erreichen, dass die Laufzeitstreuung, damit die Verbreiterung eines Pulses, deut-lich unter diesen Zeiten bleibt. Erreichbar sind Werte in der Großenordnung einer Nano-sekunde. Dies begrenzt grundsatzlich die mit Photomultipliern erreichbare Zeitauflosung,aber auch die fur Photonenzahlanwendungen maximal mogliche Zahlrate.

Verstarkung: Typische Verstarkungen der verwendeten Dynodenanordnungen liegen zwi-schen 104 und 107. Dass dies ausreicht, zeigt eine Abschatzung des fur ein einzelnes nach-

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 12

Abbildung 11: Empfindlichkeitskurven von rot- und infrarotempfindlichen Photomultipli-ern.

gewiesenes Photon an der Anode entstehenden Spannungsimpulses

Upuls = e · V · R · τ−1 . (1.3)

An einem Lastwiderstand R = 75 Ω werden bei einer Verstarkung V = 107 und einerLaufzeitstreuung τ = 10−9 sec etwa 100 mV erreicht.

Versorgungsspannung: Die Verstarkung einer einzelnen Dynodenstrecke ist leicht sub-linear von der Beschleunigungsspannung abhangig, V1 ∝ Ux

1 mit x = 0.7 . . . 0.9, bedingtdurch die bei hoheren Energien großere Eindringtiefe. Bei n Dynoden ist die Gesamt-verstarkung

V ∝ (Ux1 )n = Unx

1 ∝ UnxB , (1.4)

mithin sehr empfindlich von der Betriebsspannung UB abhangig. Wegen dieser Abhangig-keit muss die Versorgungsspannung sehr gut konstant und storungsfrei gehalten werden.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 13

Die einzelnen Dynodenspannungen werden durch einen hochohmigen Spannungsteiler ein-gestellt (meist im Gehause direkt am Sockel aufgebaut). Der Spannungsteiler soll einerseitshochohmig sein, um wenig Verlustwarme zu produzieren, andererseits niederohmig genug,um zu gewahrleisten, dass sich bei den im Betrieb auftretenden Lichtintensitaten die Span-nungsverhaltnisse an den Dynoden nicht merklich verandern. An der Kathode liegt die(negative) Betriebsspannung an, der Anodenstrom wird zur Betriebsspannungsmasse hingemessen3.

Mikrokanalplatten: Eine Sonderform der Sekundarelektronenvervielfacher sind Mikro-kanalplatten. Die Vervielfachung findet dort nicht diskretisiert auf Dynoden sondern qua-sikontinuierlich in geeignet beschichteten ‘Kanalen’ statt. Vorteile der Mikrokanalplatten

Abbildung 12: Sekundarelektronenvervielfachung in einem ‘Kanal’ einer Mikrokanalplatte.

sind kompakte Bauform, Unempfindlichkeit gegen Magnetfelder und die Moglichkeit einerortsaufgelosten Vervielfachung (Bildverstarker), Nachteil ist der durch den großen Herstel-lungsaufwand bedingte hohe Preis.

Abbildung 13: Photomultiplier mit einer Mikrokanalplatte als Sekundarelektronenverviel-facher; aus [7].

3Bei Impulsanwendungen (Szintillationszahler) macht man’s im allgemeinen umgekehrt, die Kathodeliegt auf Masse (großere Betriebssicherheit), der Ladungsimpuls an der auf Hochspannung liegenden Anodewird durch einen Kondensator ausgekoppelt. Fast alle Hochspannungsversorgungsgerate fur Photomulti-plier konnen zwischen diesen beiden Betriebsarten umgeschaltet werden.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 14

1.3.3 Photodioden, Phototransistoren

Die Funktionsweise von Photodioden und Phototransistoren istin Lehrbuchern zur Halbleiterphysik meist recht ausfuhrlich be-schrieben [9]. Die Skizzenfolge der nebenstehenden Abbildung 14soll die grundlegenden Mechanismen verdeutlichen, skizziert sinddie Energieverhaltnisse im Ortsraum (Bandstruktur).

p-n-Ubergang im Gleichgewicht: Bringt man (was sonaturlich nur theoretisch moglich ist) einen p- und einen n-dotierten Halbleiter miteinander in Kontakt, so stellt man dadurcheinen ‘abrupten’ p-n-Ubergang her. Die Fermi-Energie EF bzw.das chemische Potential liegt beim p-Halbleiter in der Nahe desValenzbandes (EV), beim n-Halbleiter in der Nahe des Leitungs-bandes (EL) – Teilbild (a). Beim Kontakt fließen solange beweg-liche Ladungen (Elektronen und Locher) aus dem kontaktnahenBereich ab, bis die Fermi-Energie im gesamten System konstantist (b). Die ionisierten Akzeptoren (Dichte NA) und Donatoren(Dichte ND) bleiben als ortsfeste Raumladungen in der Raumla-dungszone zuruck (c). Die genauen Verhaltnisse lassen sich durchdie Integration der Poisson-Gleichung

Δϕ = − ρ

εε0bzw. eindimensional

d2ϕ

dx2= −ρ(x)

εε0(1.5)

berechnen. Einmalige Integration liefert den Feldverlauf (Felderaußerhalb der Raumladungszone = 0), nochmalige Integration denPotentialverlauf (Potentialdifferenz = ursprungliche Differenz derbeiden Fermi-Energien).

Einstrahlung von Licht: Werden Lichtquanten eingestrahlt, de-ren Energie ausreicht, um Elektronen aus dem Valenzband insLeitungsband anzuheben (hν > EL − EV), so werden zusatzlicheElektron-Loch-Paare gebildet. Geschieht dies im Bereich derRaumladungszone, werden sie durch das dort vorhandene Feldrasch getrennt (d), Drift-Strom fließt. Außerhalb der Raumla-dungszone ist die Trennung relativ unwahrscheinlich, da dort keinFeld vorhanden ist (e); ein geringer Diffusions-Strom kann flie-ßen durch Ladungstrager, die zum p-n-Ubergang diffundieren,uberwiegend findet jedoch Rekombination statt. Durch intensi-vere Lichteinstrahlung werden die Potentialverhaltnisse am p-n-Ubergang merklich geandert, die Ladungstragerkonzentrationen,die im Gleichgewichtsfall mit einer einheitliche Fermi-Energie be-rechnet werden konnte, werden nun formal durch zwei Quasifermi-niveaus beschrieben (f). Die von der Photodiode gelieferte Span-nung entspricht der Differenz der beiden Fermi-Energien.

Abbildung 14: p-n-Photodiode, Band-strukturen.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 15

Die in Teilbild (f) dargestellten Potentialverhaltnisse stellen sich bei photovoltaischer Ver-wendung einer Photodiode ein (Photoelement, Solarzelle). Bei Detektoranwendungen be-treibt man die Diode meist mit angelegter Sperrspannung (g). Durch diese Betriebsartwird die Raumladungszone verbreitert und das dort vorhandene elektrische Feld erhoht.Beides verbessert die Detektoreigenschaften (großeres empfindliches Volumen, geringereKapazitat, schnellere Ladungstragersammlung).

Kennlinie und Arbeitspunkt: Die Strom-Spannungs-Kennlinien einer Photodiode sindin Abbildung 15 skizziert. Bei Beleuchtung verschiebt sich die Kennlinie uber einen sehrgroßen Bereich linear mit der Lichtintensitat zu negativen Stromen.

C B AU

IAbbildung 15: Strom-Spannungs-Kennlinien ei-ner Photodiode ohne (obere Kurve) und mitLichteinstrahlung (untere Kurve). A, B und Csind typische Arbeitspunkte.

Wichtige Arbeitspunkte sind:A: Leistungsoptimierung, Diode als Spannungsquelle, Produkt aus Strom und Spannungmoglichst groß, wird verwendet bei Solarenergieanwendungen.B: Kurzschluss, einfachste Detektorbetriebsart, Strommessung ohne zusatzlichen Auf-wand, der Kurzschlustrom ist proportional zur Lichtintensitat.C: Sperrspannung, die Diode wird in Sperr-Richtung betrieben, der Strom setzt sich ausKurzschlussstrom (proportional zur Lichtintensitat) und Sperrstrom zusammen. Standard-betriebsart insbesondere fur p-i-n-Strukturen (Teilchendetektoren, vgl. 1.4.2).

Lawinenphotodioden: Bei hohen Sperrspannungen werden durch das große Feld in derRaumladungszone die Ladungstrager so sehr beschleunigt, dass bei Stoßen weitere La-dungstrager angeregt werden, es kommt zum Lawinendurchbruch, der Sperrstrom erhohtsich drastisch. Die Diodenkennlinie knickt im Sperrbereich nach unten, d. h. zu hohenSperrstromen hin ab. Dieser ublicherweise unerwunschte Effekt wird bei speziell dafurkonstruierten Photodioden zur Stromverstarkung genutzt, die Verstarkung liegt zwischen10 und 1000. Durch die zusatzliche Verstarkung in der Raumladungszone erreicht man mitLawinenphotodioden in gunstigen Fallen Einzelphotonenempfindlichkeit, dies mit deut-lich hoheren Quantenausbeuten (60. . . 80 %) als bei Photomultipliern. Bei der Herstel-lung sind uber die gesamte Detektorflache sehr enge Toleranzen einzuhalten, damit derVerstarkungseffekt nicht zu sehr ortlich variiert, großflachige Detektoren sind dadurchnicht herstellbar. Eine interessante Anwendung (bei dem die Detektorflache nur eine un-tergeordnete Rolle spielt) sind hochempfindliche Empfangerdioden bei der optischen Nach-richtenubertragung.

Halbleitermaterialien: Der fur optische Anwendungen wesentlichste Materialparameterbei Halbleitern ist die Breite der verbotenen Zone, die Bandlucke (Bandgap, Eg). Sie be-stimmt einerseits die langwellige Grenze des nutzbaren Wellenlangenbereichs, andererseitsaber auch die Aktivierungsenergie fur die thermische Anregung von Ladungstragern und

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 16

damit den Dunkelstrom. Fur eine große Empfindlichkeitsbandbreite muss man auch beiSperrschichtphotodetektoren mit hohem Dunkelstrom, damit verbundenem hohen Rausch-signal bezahlen. Durch Kuhlung kann man die Verhaltnisse insbesondere bei langwelligenDetektoren deutlich verbessern. Einige gebrauchliche Materialien mit ihren Anwendungs-bereichen sind in Abbildung 16 zusammengestellt.

Abbildung 16: Anwendungsbereiche fur verschiedene zur Herstellung von Photodetek-toren verwendete Halbleitermaterialien; aus [10]. Als derzeit im Bereich der optischenNachrichtenubertragung (1.3 oder 1.55μm) sehr prominenter Halbleiter fehlt die III-V-Mischverbindung InGaAs mit einem Anwendungsbereich, der etwa dem von Ge entspricht.Die Abkurzung MCT steht fur Mercury Cadmium Telluride (Hg1−xCdxTe), einer II-VI-Mischverbindung mit stark zusammensetzungsabhangiger Bandlucke.

Der Verlauf des Absorptionkoeffizienten fur Licht in der Nahe der Bandlucke (hν � Eg),d. h. nahe der langwelligen Empfindlichkeitsgrenze eines Halbleiters wird wesentlich vonder Form der Energiebander im k-Raum bestimmt. Bei Halbleitern mit indirekter Band-struktur (Si, Ge) steigt der Absorptionskoeffizient zunachst nur maßig an, bei solchen mitdirekter (praktisch alle anderen) dagegen sehr steil. Fur die Herstellung bedeutet das, dassbei Halbleitern mit indirekter Bandstruktur eine Optimierung fur den jeweiligen Verwen-dungszweck erforderlich ist: gute Empfindlichkeit in der Nahe von Eg erfordert z. B. einebreite Raumladungszone. Einen Uberblick uber unterschiedlich optimierte Si-Photodiodeneines Herstellers gibt Abbildung 17.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 17

Abbildung 17: Empfindlichkeitskurvenfur unterschiedlich optimierte Silizium-Photodioden; aus [11]. Mit eingezeich-net ist die ‘Idealkurve’ fur 100 % Quan-tenausbeute. Im UV-Bereich ist dieEmpfindlichkeit zusatzlich vom Fen-stermaterial abhangig.

Bei Halbleitern mit direkter Bandstruktur ist eine solche Optimierung in der Regel nichtnotig, der Absorptionskoeffizient ist knapp oberhalb von Eg schon sehr hoch. Eine ex-emplarische Empfindlichkeitskurve fur eine Photodiode aus einem Halbleiter mit direkterBandstruktur (InGaAs) zeigt Abbildung 18.

Abbildung 18: Typische Empfindlichkeitskurve furInGaAs-Photodioden (Halbleiter mit direkter Band-struktur); aus [12].

Phototransistoren: Die Funktionsweise von Phototransistoren wirdaus dem Ersatzschaltbild (Abbildung 19) deutlich: Der Photostromeiner Photodiode (beleuchtete Basis-Kollektor-Sperrschicht des Tran-sistors) wird um den Faktor der Stromverstarkung des Transistorsverstarkt. Der Signalstrom ist zwar wesentlich hoher, die Linearitatjedoch schlechter als bei Photodioden, da die Stromverstarkung vomBasisstrom abhangig ist.

Abbildung 19:Phototransistor,Ersatzschaltbild.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 18

Benotigt man eine Verstarkung des Messsignals mit guter Linearitat direkt am Detektor,sollte man statt Phototransistoren besser integrierte Bausteine verwenden, bei denen einePhotodiode mit einem geeigneten Operationsverstarker im gleichen Gehause kombiniertist.

Detektor-Arrays: Zur ortsaufgelosten Messung von Lichtintensitaten werden zuneh-mend ein- oder zweidimensionale Anordnungen von Photosensoren benutzt. Eindimen-sionale beispielsweise zur Messung eines kompletten Spektrums an einem Spektrometer,zweidimensionale vorzugsweise zur Bilderfassung. Als Detektormaterial wird wegen derdafur vorhandenen Technologie in erster Linie Silizium verwendet, zumindest fur densichtbaren Spektralbereich, allerdings nicht in bipolarer, sondern in MOS-Technologie. Furinfrarotempfindliche Arrays sind neben Spezialmaterialien wie PtSi auch miniaturisiertePhotoleiteranordnungen oder auch Mikrothermoelemente gebrauchlich. Zum Auslesen derArrays werden zwei Techniken verwendet:

• Bei CCDs (Charge Coupled Devices) werden durch getakteten Ladungstransfer diein den Pixelelementen gesammelten Ladungen durch die Spalten und Reihen desArrays zum Ausgang verschoben. Relativ billig in der Herstellung, nicht allzu genau.

• CMOS-Auslesearrays lesen dagegen jedes Pixelelement individuell durch eine An-ordnung von einzelnen integrierten CMOS-Transistoren aus. Relativ aufwendig undteuer, aber sehr genau.

1.3.4 Photoleiter

Die Bedeutung von Photoleitern hat mit der Entwicklung neuer Materialien fur Photodi-oden deutlich abgenommen. Eine neue Anwendung fanden sie jedoch in jungster Zeit –miniaturisiert und integriert – im Bereich der infrarotempfindlichen Bildsensoren.

Photoleiter sind Materialien – in der Regel Halbleiter, deren Leitfahigkeit durch die opti-sche Anregung von Ladungstragern verandert wird. Diese Anregung kann uber drei Pro-zesse erfolgen:

Intrinsische Photoleiter: Die Ladungstrager werden durch Anregung vom Valenzbandins Leitungsband erzeugt, dies entspricht dem Anregungsprozess bei Photodioden.Gebrauchliche Materialien sind III-V-Verbindungen wie InAs oder InSb und II-VI-Verbindungen wie CdS, Hg1−xCdxTe sowie PbS oder PbSe.

Extrinsische Photoleiter: Die Ladungstragerdichte wird durch optische Ubergange vonStorstellenzustanden ins Valenz- oder Leitungsband geandert. Ein klassisches Ma-terial war Germanium mit unterschiedlichen Dotierungen (Hg, Au, Cu, Ga); dieminimale Anregungsenergie (Abstand vom Storstellenniveau zum Leitungs- bzw.Valenzband) – damit die langwellige Grenze des Detektors – ist abhangig vomStorstellentyp. Derzeit noch interessant ist dotiertes Silizium, da es mit modernerTechnologie (Planartechnik) strukturierbar ist.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 19

Intraband-Photoleiter: Durch optische Anregung werden Ladungstrager innerhalb ei-nes Bandes zwischen Zustanden unterschiedlicher Beweglichkeit verschoben; es wirdnicht die Dichte der Ladungstrager verandert, sondern deren Beweglichkeit. DieLeitfahigkeit andert sich als Produkt aus Dichte und Beweglichkeit. Wenig verwen-det, praktisch einziges bekanntes Material ist n-Typ-InSb.

1.3.5 Thermische Detektoren

Wie bei der Temperaturmessung konnen auch zur Messung von Strahlungsintensitaten(insbesondere im infraroten Wellenlangenbereich – Warme-Strahlung) alle temperatur-abhangigen physikalischen Großen (und das sind praktisch alle) genutzt werden. Der großeVorteil thermischer Detektoren liegt in dem weitgehend wellenlangenunabhangig konstan-ten Empfindlichkeitsverlauf, ein Nachteil in der gegenuber Quantendetektoren geringerenMaximalempfindlichkeit (vgl. Abbildung 6). Auch hier wieder nur eine Auswahl typischerDetektorprinzipien, Ausfuhrlicheres liefert z. B. [6] und die darin zitierte Primarliteratur.

Pneumatische Detektoren: Ausgenutzt wird die thermische Ausdehnung von Gasen.Am bekanntesten ist die Golay-Zelle [13], die mit Xe gefullt ist (Gas mit geringer Warme-leitfahigkeit). Das Gasvolumen ist mit einer Membran abgeschlossen, deren Auslenkungoptisch gemessen wird. Obwohl vor uber 50 Jahren entwickelt, ist die Golay-Zelle immernoch einer der empfindlichsten IR-Detektoren fur Raumtemperaturbetrieb.

Pyroelektrische Detektoren beruhen auf der Anderung der spontanen Polarisierungmit der Temperatur. Der Effekt tritt grundsatzlich bei allen Ferroelektrika auf. Man be-nutzt kondensatorahnliche Anordnungen, ein ferroelektrisches Material zwischen 2 aufge-dampften Metallelektroden. Temperaturanderungen andern die Polarisierung, mithin diezwischen den Elektroden messbare Spannung. Gebrauchliche Materialien sind Triglyzin-sulfat (TGS), Strontium-Barium-Niobat (SBN), Lithiumniobat und Lithiumtantalat.

Bolometer sind temperaturabhangige Widerstande, zur Strahlungsmessung sind sie um-so besser geeignet, je ausgepragter die Temperaturabhangigkeit ihres Widerstandswertsist. Verschiedene physikalische Konzepte sind naheliegend:

Speziallegierungen und Metalloxide in Dunnschichttechnik, dadurch mit kurzen Ansprech-zeiten und geringer Warmekapazitat. Als Arrays teilweise auch in IR-Bildsensoren.

Supraleiter knapp unterhalb des Sprungpunkts, sehr empfindlich aber auch sehr aufwendigim Betrieb, da die Temperatur sehr genau konstant gehalten werden muss.

Kryo-Bolometer meist aus Halbleitern, die bei tiefen Temperaturen (4 K) sehr große Wi-derstandsanderungen zeigen.

Thermoelemente zeichnen sich durch Robustheit und einfache Handhabung aus, leideraber auch durch relativ geringe Empfindlichkeit. Durch Serienschaltung kann man dieGroße des Messsignals deutlich erhohen (Thermosaulen, meist in Dunnfilmtechnik), neuereEntwicklungen arbeiten mit miniaturisierten Anordnungen auf Halbleiterbasis (deutlichgroßere Thermokraft als bei Metallen).

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 20

1.4 Teilchen

Teilchendetektoren werden in der Hochenergiephysik, der Kernphysik und der Oberflachen-physik, außerdem als wichtige Nachweisgerate in der Rontgentechnik verwendet. Unterdem Begriff ‘Teilchen’ sind einerseits Elementarteilchen und Ionen, andererseits aber auchQuanten elektromagnetischer Strahlung oberhalb einer nicht exakt definierbaren Minde-stenergie zu verstehen. Die Funktionsprinzipien einiger typischer Detektortypen aus denBereichen der Kern- und Oberflachenphysik werden kurz erlautert.

1.4.1 Szintillationszahler

Zu den altesten Nachweistechniken fur radioaktive Strahlung gehoren Szintillations-Vor-gange, d. h. die Erzeugung von schwachen Lichtblitzen in geeigneten Materialien (Zinksul-fid-Schirme zum Nachweis von Alpha-Strahlen etc.). Wahrend in den Anfangszeiten derKernphysik das dunkeladaptierte Auge des Experimentators eine große Rolle spielte, wer-den die Szintillationen inzwischen fast ausschließlich mit Photomultipliern nachgewiesen.Szintillatormaterial und -geometrie wahlt man passend zur nachzuweisenden Strahlung,das Kathodenmaterial des Photomultipliers passend zum Emissionsspektrum des Szintil-lators.

Geladene Teilchen (Alpha-, Betastrahlung) regen im Szintillatormaterial – einem Isolator– durch Coulomb-Wechselwirkung Elektronen an und verlieren dadurch Energie. Gamma-oder Rontgenquanten verlieren einen Großteil oder ihre gesamte Energie in einem primarenStoßprozess (Compton- oder Photo-Effekt), das dabei erzeugte schnelle Elektron verhaltsich wie ein Beta-Teilchen. Die zunachst hoch ins Leitungsband angeregten sekundarenElektronen thermalisieren zur Bandkante (Phononenanregung) und rekombinieren mitDefektelektronen an der Valenzbandoberkante. Mit gewisser Wahrscheinlichkeit wird da-bei jeweils ein Lichtquant erzeugt; die Ubergangswahrscheinlichkeit fur diese strahlendeRekombination wird haufig durch Dotierungssubstanzen4 erhoht, Thermalisierung undRekombination laufen dann uber geeignete Energieniveaus der Storstellen. Der mittle-re Energieverlust pro generiertem Elektron-Loch-Paar ist uber einen weiten Energiebe-reich eine nur vom Szintillatormaterial abhangige nahezu konstante Große (typischerweise10. . . 100 eV). Damit ist die Gesamtzahl der Lichtquanten proportional zur Anfangsenergiedes Teilchens, somit auch die Anzahl der aus der Kathode des Photomultipliers ausgelostenElektronen und die Große des Ladungsimpulses an der Anode5: Energiespektroskopie istmoglich.

Energieverlust pro Elektron-Loch-Paar, konkurrierende nichtstrahlende Rekombinations-prozesse, Lichtsammelwirkungsgrad und Quantenausbeute der Photokathode haben insge-

4Natriumjodid, das wichtigste Szintillatormaterial fur Gammadetektoren, wird mit etwa 1 % Thalliumdotiert, um eine kurze Lumineszenzabklingzeit, damit auch eine gute Lumineszenzausbeute zu erreichen.

5Durch eine geeignete Bauform ist sicherzustellen, dass das Szintillatorvolumen groß genug ist, damitdas nachzuweisende Teilchen seine Energie vollstandig verliert, und dass reproduzierbar alle Lichtquantenoder zumindest ein konstanter Bruchteil die Photokathode erreichen.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 21

samt einen Energieaufwand von etwa 1 keV pro an der Photokathode erzeugtem Photoelek-tron zur Folge. Bei charakteristischen Teilchenenergien von 1 MeV entstehen somit ca. 1000Photoelektronen. Deren Wahrscheinlichkeitsverteilung (Poisson- bzw. Gauß-Verteilung)begrenzt prinzipiell die Enegieauflosung der Szintillationszahler auf gunstigstenfalls etwa5 %, einen Wert, der deutlich schlechter ist als bei Halbleiterdetektoren. Fur spektrosko-pische Anwendungen (Gammaspektroskopie) haben Szintillationszahler daher inzwischennur noch eine geringe Bedeutung, wohl aber fur solche Messanwendungen, bei denen es aufeinfache Handhabung (keine Kuhlung notwendig) oder große Detektorvolumina (Flussig-oder Kunststoffszintillatoren) ankommt.

1.4.2 Halbleiterdetektoren

Halbleiterdetektoren zum Teilchennachweis werden alsp-i-n-Diodenstrukturen gebaut. Die p- und n-Gebietebegrenzen eine undotierte eigenleitende (intrinsic) Zo-ne (Abbildung 20). Durch eine an die Diode angelegteSperrspannung wird ein elektrisches Feld erzeugt, dasdie vom ionisierenden Teilchen generierten Elektron-Loch-Paare quantitativ trennt, der Ladungsimpuls istproportional zur Teilchenenergie bzw. zum Energie-verlust. Da der mittlere Energieaufwand pro erzeug-tem Elektron-Loch-Paar bei etwa 3 eV liegt, ist dieEnergieauflosung um mehr als eine Großenordnungbesser als bei Szintillationszahlern. Dicke von i-Schichtund Bedeckung sowie verwendetes Halbleitermateri-al hangen von der Anwendung ab. Die Dicke der i-Schicht sollte der Reichweite der Teilchen entspre-chen, die Dicke der Deckschicht deutlich kleiner sein.Fur den Nachweis von Alpha- und Beta-Teilchen,teilweise auch fur Rontgenstrahlung werden groß-flachige Silizium-Dioden verwendet, bei denen die i-Schicht nur wenige Mikrometer unter der Oberflacheliegt (Oberflachensperrschichtzahler). Fur Gamma-Detektoren ist man dagegen auf Germanium angewie-sen, das wegen seiner großeren Elektronendichte ei-ne entsprechend großere Absorptionskonstante fur dienotwendigen Primarprozesse (Compton- und Photo-Effekt) aufweist. Bei diesen Detektoren liegt die Dickeder i-Schicht in der Großenordnung von Zentime-tern. Der große Nachteil von Germanium ist seinegroße Leitfahigkeit bei Raumtemperatur, die Detekto-ren werden deshalb im Betrieb mit flussigem Stickstoff(77 K) gekuhlt.

Abbildung 20: p-i-n-Detektor,Energiebandstrukturen:EL, EV: Leitungs- und Valenz-bandenergien.(a) Lage der Fermi-EnergienEF in p-, i- und n-Halbleitern.(b) Spannungslose p-i-n-Diode.(c) p-i-n-Diode mit angelegterSperrspannung; die in deri-Schicht generierten Elektron-Loch-Paare werden durch dasstarke Feld getrennt.

mdv :mdvsensor.tex 14. Oktober 2006

1 Detektoren und Sensoren 22

1.4.3 Sekundarelektronenvervielfacher

Zum hochempfindlichen Nachweis langsamer geladener Teilchen (Elektronen bei der Pho-toelektronenspektroskopie, Ionen in Massenspektrometern) werden offene Sekundarelek-tronenvervielfacher im Ultrahochvakuum eingesetzt. Sie entsprechen in Technik und Auf-bau in etwa den in Photomultipliern verwendeten (vgl. 1.3.2); da jedoch keine Photoka-thode vorhanden ist, entfallt die Problematik der thermisch generierten Hintergrunder-eignisse, ein praktisch untergrundfreier Nachweis von Einzelereignissen ist moglich. Auchin diesen Anwendungsbereichen sind Mikrokanalplatten eine interessante Alternative zurherkommlichen Technik, insbesondere dann, wenn deren Ortsauflosung zusatzliche physi-kalische Informationen liefern kann (Elektronenbeugung an Oberflachen).

mdv :mdvsensor.tex 14. Oktober 2006

2 Aktoren 23

2 Aktoren

Interessant an Messgroßen im physikalischen Experiment ist fast immer nicht nur ihr punk-tueller Wert, sondern auch ihre Abhangigkeit von variablen Messparametern. Solche ge-messenen funktionalen Abhangigkeiten konnen dann auf Modellvorstellungen ubertragenwerden, die dadurch initialisiert, uberpruft und weiterentwickelt werden. So werden imBereich der Festkorperphysik aus der wellenlangenabhangig gemessenen Absorption oderLumineszenz von Kristallen Aussagen uber Energiezustande von Storstellen gemacht, ausder winkelabhangig gemessenen Einkopplung von Licht in Wellenleiter die optische Mo-den und der Brechungsindexverlauf berechnet, aus der temperaturabhangig gemessenenDielektrizitatskonstanten oder der temperaturabhangig gemessenen optischen Frequenz-verdopplung Informationen uber strukturelle Phasenubergange gewonnen, aus der winkel-und frequenzabhangig gemessenen Elektronenspinresonanz die Art und Symmetrie vonStorstellen und deren Umgebung bestimmt.

Wunschenswert ist es immer, die Parameteranderungen weitgehend automatisiert – d. h.vom Rechner gesteuert – ablaufen zu lassen, um einerseits den Experimentator von ermu-dender und fehleranfalliger ‘Handarbeit’ zu entlasten, andererseits den Verlauf des Expe-riments reproduzierbar, aber gleichzeitig einfach anderbar vorzugeben.

Durch Rechnersteuerung soll vorrangig die Reproduzierbarkeitund damit die Qualitat des Experiments verbessert werden.

2.1 Externe Gerate

Meist werden fur die Einstellung von Parametern kommerzielle externe Gerate verwen-det – Temperaturregler, optische Spektrometer, Netzgerate fur Magnetspulen, Hochspan-nungsversorgungen und viele andere. Ublicherweise sind diese Gerate mit Standardschnitt-stellen (RS 232, HPIB, USB) ausgestattet, uber die – mehr oder weniger aufwendig –eine Steuerung moglich ist. Der Befehlsumfang ist fast immer sehr individuell auf dasGerat zugeschnitten, zur Erstellung eines Steuerungsablaufs ist ein genaues Studium derGeratebeschreibung unerlasslich. In den ersten Generationen intelligenter Gerate wurdenaus Performance-Grunden oft kryptische Binarkommandos verwendet, modernere Geratedagegen ‘horen’ in der Regel auf Textkommandos, die ohne umstandliche Kodierung er-stellt werden konnen und weitgehend selbstdokumentierend sind.

Manche Aktoren lassen sich unter Umstanden besser und schneller, immer jedoch billiger,relativ direkt vom Rechner ansteuern, nachstehend einige Beispiele.

mdv :mdvactor.tex 14. Oktober 2006

2 Aktoren 24

2.2 Leistungsschalter

Um die Netzspannung von Elektrogeraten mittlerer und hohererLeistung potentialgetrennt zu schalten, werden Relais verwendet.Klassische elektromechanische Relais haben jedoch fur die direkteAnsteuerung durch Rechner verschiedene Nachteile: relativ hohenStromverbrauch, induktive Belastung, elektrische Storungen beimSchalten. Besser zu verwenden sind Halbleiterrelais, Bausteine mitdem in Abbildung 21 skizzierten Funktionsschema: mit einem gerin-gen Steuerstrom (ca. 10 mA) werden zwei Leuchtdioden betrieben,die zwei entgegengesetzt gepolte Fototransistoren schalten6. Die rea-le Schaltung ist naturlich komplizierter: um Storungen zu verringern,wird ublicherweise dafur gesorgt, dass nur im Nulldurchgang derWechselspannung ein- und ausgeschaltet wird, von der Nulldurch-gangslogik werden als Lastschalter Thyristoren angesteuert.

Abbildung 21:Halbleiterrelais,Funktionsschema.

Aufgrund des geringen Ansteuerstroms und eines weiten Bereichs (3. . . 30 V) der Ansteu-erspannung konnen Halbleiterrelais problemlos an Standardschnittstellen des Rechners be-trieben werden (Quittungsleitung der seriellen Schnittstelle, Einzelbit der Druckerschnitt-stelle). Mit geringem Aufwand konnen so auch Verbraucher im Kilowattbereich (Heizwi-derstande in Kristallzuchtofen o. a.) vom Rechner geschaltet werden (Zweipunktregelun-gen, Puls-Pausen-Steuerungen).

2.3 Schrittmotoren

Mechanische Stellelemente im physikalischen Experiment (Verschiebetische, Hubtische,Drehtische), die im Mikro- bis Zentimeterbereich arbeiten, lassen sich relativ einfach mitdafur passenden Minimotoren ausrusten und somit ferngesteuert bedienen. Zwei Systemesind gebrauchlich: mit Inkrementalgebern gekoppelte Gleichstrommotoren und Schrittmo-toren. Fur beide gibt es komfortable komplette kommerzielle Steuergerate, gerade aberbei Schrittmotoren ist es naheliegend, die Steuerung direkt dem Rechner zu ubertragen.

Beim Schrittmotor wird ein magnetisierter Anker von einem durch geeignete Spulenstromeerzeugten Drehfeld weitergedreht. Im Gegensatz zum Synchronmotor dreht sich das Ma-gnetfeld in diskreten Schritten und mit beliebiger, auch wechselnder, Geschwindigkeit(bis zu einer durch die Bauart bedingten Hochstgeschwindigkeit). Die Winkelauflosungist primar durch die Polzahl festgelegt, Werte zwischen 10 und 1000 sind gebrauchlich, beiVollschrittbetrieb bedeutet das eine entsprechende Anzahl von Schritten pro ganzer Um-drehung. Die typischen Betriebsarten von Schrittmotoren sind in den Abbildungen 22, 23und 24 skizziert. Zur einfacheren Darstellung des Prinzips ist die Polzahl auf 4 reduziert.

6Wichtiger Sicherheitsaspekt: Wie die Prinzipschaltung zeigt, schalten Halbleiterrelais nur einpoligab, außerdem ohne wirkliche mechanische Trennung. Auch im abgeschalteten Zustand fließt noch einkleiner Versorgungsstrom fur die Schaltung. Wenn an einem so abgeschalteten Gerat gearbeitet wird,muss eine weitergehende Abtrennung der Stromversorgung erfolgen, beispielsweise durch einen zusatzlichenmechanischen Schalter.

mdv :mdvactor.tex 14. Oktober 2006

2 Aktoren 25

Abbildung 22: Vollschrittbetrieb: Der Anker dreht sich bei einem Schritt zum nachstenPol, im skizzierten Fall eines 4-Pol-Motors entspricht dies einer Rotation um 90 ◦. Imrechten Teilbild der Verlauf der beiden Spulenstrome fur eine volle Umdrehung (4 Schritte),die Spulen 1 und 1’ bzw. 2 und 2’ sind jeweils geeignet in Serie geschaltet (⇒ Zwei-Phasen-Motor, bipolare Betriebsart).

Abbildung 23: Halbschrittbetrieb: Der Anker dreht sich bei einem Halbschritt um einenhalben Polabstand weiter (hier 45 ◦). Rechts der Stromverlauf (8 Halbschritte pro vollerUmdrehung).

Abbildung 24: Mikroschrittbetrieb: Der Anker dreht sich bei jedem Mikroschritt umeinen Bruchteil des Polabstands weiter (hier 1/9 = 10 ◦). Die Stromverlaufe nahern sichSinus- bzw. Cosinusfunktionen an. Mikroschrittbetrieb setzt voraus, dass der Schrittmotorvon seiner Bauform her dafur geeignet ist.

In den Abbildungen 22, 23 und 24 wird angenommen, dass der Schrittmotor jeweils bipolarbetrieben wird. Der Spulenstrom nimmt positives und negatives Vorzeichen an. Dadurchkommt man mit 2 Phasen aus, benotigt aber etwas aufwandigere Treiberendstufen als beiunipolarer Betriebsart. Diese ist in Abbildung 25 schematisiert (dort fur Vollschrittbe-trieb, Halbschrittbetrieb ist in ahnlicher Weise wie bei der bipolaren Betriebsart moglich,grundsatzlich auch Mikroschrittbetrieb). Bei bipolarer Betriebsart werden (mindestens)3 Zustande der Treiberstufen benotigt (positiv, null, negativ), bei unipolarer Betriebsartnur 2 (Strom, stromlos). Abbildung 26 zeigt die schematisierte Schaltung der jeweiligenTreiberendstufen.

mdv :mdvactor.tex 14. Oktober 2006

2 Aktoren 26

Abbildung 25: Unipolare Betriebsart: Bei dieser Betriebsart fuhren die vier dargestell-ten Spulen jeweils einzeln Strom. Rechts der zeitliche Verlauf der 4 Spulenstrome.

S1

S2

S4S3

V+

1 1' 2'2

S1 S2 S3 S4

V+

1 2 3 4

Abbildung 26: Treiberendstufen (schematisiert) fur bipolaren (links) und unipolaren Be-trieb (rechts) von Schrittmotoren. S1. . . S4 sind die Steuereingange.

Rechnersteuerung: Fur die Ansteuerung von Schrittmotoren durch den Rechner bietensich vier Varianten an:Intelligente Steuergerate erhalten vom Rechner eine Zielvorgabe (n Schritte vorwarts)

und erledigen das dazu notwendige selbstandig.Einfache Steuergerate erwarten vom Rechner Takt- und Richtungs-Impulse (meist TTL-

kompatibel) und generieren nur die zugehorige Spulenstromabfolge. Jeder einzelneMotorschritt muss vom Rechner veranlasst werden.

Treiberstufen mit Darlington-Transistoren (als ICs mit 8fach Treibern erhaltlich) lassensich uber eine Parallel-Ein/Ausgabe-Karte oder uber den Druckerausgang des Rech-ners ansteuern. In diesem Fall muss das Steuerprogramm die Abfolge der Strome furdie einzelnen Spulen (Abbildung 25) als Binarwerte erzeugen und sich den jeweiligenStatus merken.

D/A-Wandler mit Stromverstarkern konnen verwendet werden, um einen rechnergesteu-erten Mikroschrittbetrieb zu realisieren.

Geschwindigkeit: Wichtig ist es, die spezifizierte Start-Stop-Geschwindigkeit (bauartab-hangig zwischen etwa 100 und 1000 Hz) nicht zu uberschreiten, da nur dann eine schritt-genaue Positionierung gewahrleistet ist. Wenn großere Wege zuruckzulegen sind, kann –falls notig – die Geschwindigkeit in einer definierten Beschleunigungsphase (mit einer dazukorrespondierenden Bremsphase) bei fast allen Motoren auf das funf- bis zehnfache erhohtwerden.

Stromabsenkung: Bei Voll- und Halbschrittbetrieb ist es sinnvoll, im Ruhezustand denSpulenstrom auf einen niedrigeren Haltestrom abzusenken, die meisten Steuerungen se-

mdv :mdvactor.tex 14. Oktober 2006

2 Aktoren 27

hen einen solchen Betrieb vor (zusatzliche Steuerleitung). Dies fuhrt zu einer deutlichgeringeren thermischen Belastung des Motors und vor allem auch der Umgebung.

2.4 Servos

Vor allem fur Anwendungen in der Fernsteuerung (Modellbau, mechanisches Spielzeug, Ro-botik) wurden kompakte Stellmotoren entwickelt, die mit einigermaßen standardisiertenSignalen angesteuert werden konnen. Diese sogenannten Servos konnen auch in Experi-menten uberall dort eingesetzt werden, wo einfache Verstellaufgaben automatisiert werdensollen (Blenden, Shutter, Klappspiegel). Servos bestehen aus kleinen leistungsfahigen Mo-toren mit einem Untersetzungsgetriebe, uber das eine Welle oder Scheibe am Ausganggedreht wird. Deren Winkelstellung wird mit einem Drehwiderstand gemessen und demAnsteuersignal entsprechend eingestellt (geregelt). Als Winkelverstellbereich ist etwa einehalbe Umdrehung ublich. Das Ansteuersignal besteht aus Impulsen mit einer festen Fol-gefrequenz (oft 50 Hz) und variabler Lange (z. B. 1. . . 2 ms). Die Pulslange legt die Win-kelposition innerhalb des Verstellbereichs fest (Abbildung 27). Das Steuersignal brauchtnur kurzzeitig angelegt zu werden, der Servo behalt danach die vorgewahlte Position bei.

1 ms

1.5 ms

2 ms

−60°

+60°

20 ms

Abbildung 27: Links ein typischer Servo aus dem Fernsteuerungsbereich. Rechts die An-steuersignale (TTL-kompatibel zwischen ≈0 V und > 3 V wechselnd) fur die angegebenenWinkelpositionen.

2.5 Altgerate-Recycling

Alte Matrixdrucker oder Flachbettplotter, die in vielen Labors noch vorhanden sind,konnen im Rahmen ihrer Moglichkeiten sehr gut als ein- bzw. zweidimensionale mecha-nische Stellelemente eingesetzt werden. Die Ansteuerung ist einfach, sie konnen uber dieDrucker- oder die serielle Schnittstelle des Rechners betrieben werden, Drucker mit na-hezu standardisierten Escape-Sequenzen, Plotter mit HP-GL (H ewlett Packard GraphicsLanguage). Ein Drucker kann so zum Beispiel noch dazu verwendet werden, Filter in

mdv :mdvactor.tex 14. Oktober 2006

2 Aktoren 28

optischen Strahlengangen zu wechseln, aus einem Plotter kann mit Hilfe von zwei Um-lenkspiegeln ein optischer Scanner werden.

2.6 Piezostellelemente

Mechanische Bewegungen im Mikro- bis Nanometerbereich lassen sich mit Piezoaktorenausfuhren. Ihre Funktion beruht auf dem piezoelektrischen Effekt (genauer dessen Um-kehrung): Polare Festkorper reagieren auf ein elektrisches Feld mit Langenanderung oderScherverformung. Typische Bauformen von dreidimensionalen Piezoverstellern, wie sie bei-spielsweise bei der Rastersondenmikroskopie eingesetzt werden, zeigt Abbildung 28.

Abbildung 28: Bauformen von dreidimensionalen Piezoverstellern: Dreibein (links) undBiegerohrchen (rechts, ganz rechts Schnitt durch die Elektrodenanordnung). Beim Bie-gerohrchen bewirken symmetrische Spannungsanderungen an den X- oder Y-Elektrodeneine Verbiegung, eine Spannungsanderung an der Z-Elektrode eine Langenanderung.

Mit einfachen keramischen Piezostellelementen konnen Bewegungen im Mikrometerbereichmit Auflosungen im Nanometerbereich erreicht werden. Die notwendigen Betriebsspan-nungen liegen bei einigen hundert Volt; eine direkte Ansteuerung vom Rechner ist ubereine Kombination von D/A-Wandler und Spannungsverstarker moglich. Bei sehr genauenAnwendungen sollte die thermische Ausdehnung von Piezokeramik und Halterung durcheine geeignete Lageregelung kompensiert werden (Regelung auf konstanten Tunnelstrombei der Rastertunnelmikroskopie, auf maximales Signal bei piezobetriebenen Fabry-Perot-Interferometern).

2.7 Entstorung

Beim Schalten großerer elektrischer Leistungen, aber auch beim Betrieb von Schrittmoto-ren7 konnen elektromagnetische Storfelder auftreten, die sinnvolle Messungen im Experi-ment erschweren, manchmal verhindern. Solche Storungen sollten schon an der Storquellesoweit wie moglich reduziert werden. Die dazu notigen Maßnahmen hangen von der Artder Storung ab, diese sollte zunachst analysiert werden. Eine unvollstandige Auflistungmoglicher Entstormaßnahmen:

7Einfache Schrittmotorsteuergerate stellen den Motorstrom durch eine Puls-Pausen-Taktung der Be-triebsspannung ein. Da diese mit deutlich hoherer Frequenz als der maximalen Schrittfrequenz erfolgenmuss, sind relativ steile Schaltflanken die Folge.

mdv :mdvactor.tex 14. Oktober 2006

2 Aktoren 29

Kurze elektrische Verbindungsleitungen: Trivial, aber immer wieder vergessen, je weniger(Sende- oder Empfangs-) Antenne, umso besser.

Erdung: Wichtig, kann aber auch storen, wenn Erdschleifen auftreten; oft hilft dann, alleErdleitungen sternformig zusammenzufuhren.

Abschirmung: Abgeschirmte Kabel und Metallgehause gegen elektrische, weichmagneti-sche Materialien hoher Permeabilitat (sehr aufwendig) gegen magnetische Felder.

Symmetrisierung: Ferritringe um Steuerkabel sorgen fur eine Hochfrequenzsymmetrisie-rung und erniedrigen deutlich die HF-Abstrahlung (� Standard bei hochwertigenMonitor- oder SCSI-Kabeln).

Potentialtrennung: Eine einfache Trennung durch Optokoppler vermeidet Probleme mitErdschleifen und mit Potentialunterschieden zwischen Geraten.

Optische Verbindungen: Eine Signalubertragung via Lichtleiter ist zwar etwas aufwendig,aber an Storsicherheit kaum zu uberbieten.

mdv :mdvactor.tex 14. Oktober 2006

3 Signalverarbeitung 30

3 Signalverarbeitung

Detektoren und Sensoren wandeln physikalische Messgroßen in korrespondierende elektri-sche Großen wie Strom, Spannung, Ladung oder Widerstand um. Die Signalverarbeitungs-elektronik muss in ihrer Eingangsschaltung gezielt fur diese spezifische elektrische Großeausgelegt sein.

Bei der Signalverarbeitung ist zunachst zu uberlegen, in welcherSignaleigenschaft sich die gesuchte physikalische Messgroße etabliert.

Analoge elektrische Großen wandelt man zunachst in eine dazu proportionale Spannung,Ereignisgroßen in geeignete einheitliche Zahlimpulse. Einige der dazu verwendeten Schal-tungsprinzipien werden nachfolgend anhand von vereinfachten Operationsverstarkerschal-tungen kurz skizziert (eine vertiefte Einfuhrung in die Halbleiterschaltungstechnik mitdetaillierter Diskussion der Eigenschaften typischer Operationsverstarker und ihrer Schal-tungsdimensionierung findet sich z. B. in [14] oder [15]).

3.1 Strom

Viele Detektoren und Sensoren liefern ein Stromsignal, das der physikalischen Messgroßeproportional ist (Anodenstrom bei Photomultiplieren, Sperrstrom bei Photodioden). Die-ser Strom wird mit einem als Strom-Spannungs-Wandler beschalteten Operationsverstar-ker8 (Abbildung 29) in ein Spannungssignal U = −R · I umgesetzt.

Abbildung 29: Strom-Spannungs-Wandler: Links die Grundschaltung, in der Mitte miteiner Photodiode im Kurzschlussbetrieb, rechts im Sperrbetrieb.

Bei Photodioden sind die beiden skizzierten Schaltungen gebrauchlich, welche man imEinzelfall wahlt, hangt von den experimentellen Anforderungen ab:

Im Kurzschlussbetrieb fließt kein Dunkelstrom, interessant fur den rauscharmen Nachweissehr geringer Lichtintensitaten.

Im Sperrbetrieb ist die Diodenkapazitat geringer, das Feld in der Raumladungszone großerals im Kurzschlussbetrieb, ideal fur hohere Signalbandbreiten; allerdings fließt auch ohneBeleuchtung ein – wenn auch geringer – Dunkelstrom.

8Verschiedene Hersteller bieten Bausteine an, bei denen Photodiode und Operationsverstarker im glei-chen Gehause integriert sind.

mdv :mdvsignal.tex 14. Oktober 2006

3 Signalverarbeitung 31

3.2 Spannung

Zur Spannungsverstarkung wird der Operationsverstarker nichtinver-tierend betrieben (Abbildung 30). Diese Betriebsart hat den Vorteileines sehr hohen Eingangswiderstands, belastet somit die Signalquellenur minimal. Bei sehr hochohmigen Quellen und/oder kleinen Signal-pegeln sollte man Operationsverstarker mit FET-Eingang verwenden,der Eingangswiderstand ist deutlich großer, das Eingangsrauschendeutlich kleiner als bei konventionellen mit bipolarem Eingang.

Abbildung 30:Spannungsver-starker.

Die Verstarkung V wird wie ublich aus den idealen Eigenschaften des Operationsverstar-kers (Eingangsspannungdifferenz und Eingangsstrom gleich null) berechnet:

V =UA

UE= 1 +

R1

R2(3.1)

Ist nur eine Impedanzwandlung, keine Signalverstarkung notwendig, erreicht man diesdurch R1 = 0 (Spannungsfolger).

3.3 Widerstand

Die Widerstandsmessung wird mit Hilfe einer Konstantstromquelle auf eine Spannungs-messung zuruckgefuhrt9. Um die Messung wenig zu storen, insbesondere auch um we-nig Warme zu produzieren, sollte der Betriebsstrom moglichst niedrig eingestellt werden.Trotzdem kann bei Widerstandsdetektoren eine langsame zeitliche Veranderung (Drift)im Widerstandswert zu Messungenauigkeiten fuhren. Eine Verbesserung erreicht man insolch einem Fall meist durch eine modulierte Messung: Ein Messparameter wird periodischverandert (bei optischen Messungen zum Beispiel die Intensitat des Anregungslichts), daszugehorige Wechselspannungssignal wird gemessen, die (langsame) Gleichspannungsdriftwird durch einen Hochpass – im einfachsten Fall ein Koppelkondensator – unterdruckt.Noch besser geht’s mit dem im folgenden Abschnitt beschriebenen Lock-In-Verfahren,einer Korrelationsmesstechnik.

3.4 Lock-In-Verfahren

Die Lock-In-Technik ist eines der wichtigsten Korrelationsmessverfahren: Das zu messendeSignal wird geeignet moduliert, die Korrelationsfunktion mit der Modulation wird ausge-wertet. Im Prinzip wird eine sehr schmalbandige Messung bei der Modulationsfrequenzausgefuhrt, dadurch werden insbesondere niederfrequente Anteile im Rauschen (Drift) ef-fizient unterdruckt. Daruber hinaus kann fur die Modulation ein Frequenzbereich gewahltwerden, in dem das Rauschen minimal ist. Eine Signalmodulation kann auf unterschied-lichste Art realisiert werden, bei optischen Experimenten (Absorptions- oder Lumines-zenzmessungen) wird das Anregungslicht moduliert, bei Spinresonanzexperimenten das

9Auch moglich, aber nicht ublich ist die Messung des reziproken Widerstands uber den Strom (Kon-stantspannungsquelle).

mdv :mdvsignal.tex 14. Oktober 2006

3 Signalverarbeitung 32

Magnetfelds (allerdings nur geringfugig). Das so modulierte, meist stark verrauschte Si-gnal wird phasenrichtig gleichgerichtet – wie in Abbildung 31 schematisch dargestelltdurch abwechselnde Multiplikation mit +1 oder -1. Diese phasenrichtige Multiplikationwird durch eine mit der Modulation korrelierte Referenzspannung gesteuert. Der Integra-tor am Ausgang sorgt fur die gewunschte Bandbreitenbegrenzung.

Abbildung 31: Lock-In-Verstarker, Funktionsprinzip.

Eine Simulation der Wirkungsweise (durchgefuhrt mit MATLAB�) ist in Abbildung 32dargestellt. Das linke Teilbild zeigt das (ideale) Signal und die beiden bei der Simulationverwendeten Rauschspannungen, im mittleren Teilbild die Messergebnisse bei Anwendungeines einfachen Tiefpassfilters auf die verrauschten Signale, rechts die Messergebnisse beizusatzlicher Anwendung des Lock-In-Verfahrens.

Abbildung 32: Lock-In-Verstarker, Simulation. Links: Ausgangssignale. Mitte: Tiefpassfil-terung. Rechts: Lock-In-Verfahren.

3.5 Ladung

Bei Teilchendetektoren ist die elektrische Ladung pro nach-gewiesenem Teilchen die primar interessierende Große, zu-mindest dann, wenn der Detektor zur Energiespektroskopieeingesetzt wird (Szintillationszahler und Halbleiterdetekto-ren in der Alpha- oder Gamma-Spektroskopie). Die Ladungist das Integral uber einen Stromimpuls, eine ladungspro-portionale Spannung erzielt man mit einem als Integratorbeschalteten Operationsverstarker (Abbildung 33).

Abbildung 33: Integratorals Ladungs-Spannungs-Wandler.

mdv :mdvsignal.tex 14. Oktober 2006

3 Signalverarbeitung 33

Fur die Ausgangsspannung des Integrators gilt die Differentialgleichung

RC · dU

dt+ U + R I = 0 (3.2)

mit der allgemeinen Losung

U = −R I + K exp(− t

RC

). (3.3)

Im idealisierten Fall eines Rechteckimpulses der Lange τ , d. h. I = 0 fur t < 0, I = I0 fur0 < t < τ und I = 0 fur t > τ ergibt sich fur die Spannung am Ende des Impulses

Upeak = −R I0 + R I0 exp(− τ

RC

)(3.4)

und mit der Reihenentwicklung der Exponentialfunktion

Upeak = −I0τ

C

(1 − τ

RC+ . . . − . . .

). (3.5)

Gute Ladungsproportionalitat (Ladung = I0τ) ist folglich dann gewahrleistet, wenn dieSchaltung so ausgelegt wird, dass fur typische Signalimpulse RC � τ gilt. Allerdings solltedie Integrationszeitkonstante RC auch nicht großer gewahlt werden als fur die erforderlicheGenauigkeit notig, da ansonsten pile-up-Probleme bei hoheren Impulsraten auftreten.

3.6 Ereignis

Sollen Einzelereignisse nur gezahlt werden (photon countingu. a.), ohne dass weitere Signalinformationen auszuwertensind, werden – gegebenenfalls nach Verstarkung in einemschnellen Verstarker – die Signalimpulse in einem als Schwell-wertdiskriminator fungierenden Komparator zu einheitlichenZahlimpulsen geformt (Abbildung 34).

Abbildung 34: Kompara-tor als Diskriminator.

Der Komparator hat neben der Impulsformung die Funktion, Rauschimpulse – insbeson-dere vom Verstarkerrauschen herruhrend – zu unterdrucken (Impulse, die kleiner als UV

sind, werden zuruckgehalten).

3.7 Zeit

Bei vielen Messgroßen ist die zeitliche Entwicklung – z. B. nach einer gepulsten Anregung– interessant, da dadurch die Dynamik von Prozessen untersucht werden kann. Geht esdabei um langere Zeitraume (Zerfallszeiten von Hologrammen), kann die Zeitmessunguber ein Rechnerprogramm realisiert werden, bei kurzen Zeiten dagegen sind in der Regelspezialisierte Messgerate erforderlich.

mdv :mdvsignal.tex 14. Oktober 2006

3 Signalverarbeitung 34

3.7.1 Transientenspeicher

Die Entwicklung schneller Analog-Digital-Wandler und entsprechend schneller Speicherermoglicht die direkte Erfassung von zeitabhangigen Analogsignalen in Digitalspeicheros-zilloskopen oder Transientenrecordern. Es konnen sowohl einmalige Vorgange gespeichertwie auch – zur Rauschunterdruckung – sich wiederholende Messsignale aufsummiert wer-den. Die moglichen Zeitauflosungen erreichen den Subnanosekundenbereich.

Ohne Analog-Digital-Wandler, dafur mit extrem schneller Add-One-Arithmetik, gibt esdie gleiche Technik zur zeitaufgelosten Ereigniszahlung (Multi-Channel Scaler).

3.7.2 Boxcar-Technik

Eine relativ alte Messtechnik, die bei sich wiederholenden Signalen angewendet werdenkann, ist die Boxcar-Technik. Das zeitabhangige Signal wird in einem kurzen Zeitfensterabgetastet, das langsam uber das Signal verschoben wird (Abbildung 35). Ein Tiefpassfilter(Integrator) am Ausgang glattet das zunachst kammformige Abtastsignal zu einer langsamveranderlichen zeitabhangigen Ausgangsspannung (Y). Ein zweiter Ausgang liefert eineSpannung, die der Zeitverschiebung der Abtastung proportional ist (X).

Abbildung 35: Boxcar-Verfahren, links Funktionsschema, rechts Simulation.

Die Simulation des Verfahrens (wieder durchgefuhrt mit MATLAB�) zeigt die Wirkung– rechtes Teilbild der Abbildung 35: Oben unverrauschtes und verrauschtes Idealsignal,darunter das verrauschte Signal nach Boxcar-Abtastung und -Integration. Ganz untenzum Vergleich dasselbe Signal mit einem summierenden Transientendigitalisierer integriert(bei gleicher Messzeit und hier in der Simulation sehr viel besserer Zeitauflosung ist dasRauschen deutlich geringer als bei der Boxcar-Technik).

Abgesehen von der Zeitmessung kann das Boxcar-Verfahren – dann mit festem Abtast-zeitpunkt – als Korrelationsmesstechnik bei gepulst angeregten Experimenten (nichtli-neare Optik mit Pulslasern) eingesetzt werden. Gemessen wird nur wahrend der Puls-anregung, das Rauschen dazwischen wird unterdruckt. Digital, d. h. in Verbindung mitEreigniszahlung (photon counting), ist dies derzeit eines der empfindlichsten Messverfah-ren.

mdv :mdvsignal.tex 14. Oktober 2006

3 Signalverarbeitung 35

3.7.3 Zeit-Impulshohen-Wandlung

Die zeitliche Verzogerung seltener Zahlereignisse gegenuber einem Anregungsimpuls kanndurch Zeit-Impulshohen-Wandlung mit relativ guter Zeitauflosung bestimmt werden. Beidieser Technik wird eine analoge Große, die Zeitdifferenz zwischen zwei Impulsen, in einedazu proportionale andere, einen Spannungswert, gewandelt, indem wahrend der zu mes-senden Zeit eine Kapazitat mit konstantem Strom aufgeladen wird. Der dabei erreichteSpannungswert ist ein Maß fur die Zeitdifferenz. Eine Auftragung der Haufigkeitsverteilungder gemessenen Zeiten (� A/D-gewandelte Spannungswerte) ergibt den Zeitverlauf desdurch die Zahlereignisse reprasentierten Signals. Da nach einem Anregungsimpuls das je-weils erste Stop-Ereignis zum Tragen kommt, eignet sich die Methode nur fur selteneEreignisse, da ansonsten kurze Zeiten uberbewertet werden.

mdv :mdvsignal.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 36

4 D/A- und A/D-Wandler

Experimentelle Steuergroßen (Heizstrom, elektrisches Feld, . . .), die vom Rechner vorge-geben werden sollen, mussen dazu meist zuerst in Analogwerte umgesetzt werden. DieseDigital/Analog-Wandlung erfolgt in digital ansteuerbaren Peripheriegeraten oder auf PC-Karten durch spezielle Bausteine – D/A-Wandler. Experimentelle Messwerte andererseits(Spannung, Widerstand, Temperatur, Lichtintensitat, Druck, . . .) liegen am Experimentim allgemeinen analog vor und mussen – gegebenenfalls nach Umwandlung in elektrischeGroßen – zur Bearbeitung durch den Rechner in Digitalwerte umgeformt werden. Auchdiese Analog/Digital-Wandlung erfolgt – in externen Messgeraten wie Digitalvoltmeternoder auf PC-Karten – durch spezielle Bausteine, A/D-Wandler.

Die Grenze zwischen Digital und Analog ist auch eine Grenzezwischen scheinbarer Exaktheit und realer Ungenauigkeit.

Im folgenden sollen die Verfahren, nach denen die Wandlerbausteine arbeiten, etwas naherbetrachtet werden.

4.1 Digital/Analog-Wandler

Das praktisch ausschließlich verwendete technische Konzept fur Digital/Analog(D/A)-Wandler ist das der Stromsummation: Am Eingang eines Operationsverstarkers werdenStrome aufsummiert, deren Große der Wertigkeit der einzelnen Bits in dem umzuwandeln-den Digitalwert entspricht. Die schematische Schaltung zeigt Abbildung 36.

UR

UAR1

R

-

+Rn-1Rn-2R0

Abbildung 36: Prinzipschaltung eines D/A-Wandlers: Stromsummation.

Beim idealen Operationsverstarker sind Differenzeingangsspannung und Eingangsstromegleich null, daraus ergibt sich fur die Ausgangsspannung UA:

UA = −UR · R ·n−1∑i=0

Si/Ri (4.1)

Si = 1, wenn der entsprechende Schalter geschlossen, Si = 0, wenn der entsprechen-de Schalter geoffnet ist. Die Schalter (meist als Feldeffekttransistoren realisiert) werden

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 37

durch die einzelnen Bits des umzusetzenden Digitalwerts angesteuert, die Widerstande Ri

haben die Widerstandswerte Ri = R0 ·2−i. Damit erhalt man eine Ausgangsspannung, dieproportional zum Digitalwert ist.

Die Schaltung Abb. 36 hat den großen Nachteil, dass man sehr unterschiedliche Wider-standswerte benotigt. In der Praxis verwendet man daher eine modifizierte Schaltung, dasR/2R-Netzwerk. Das Funktionsprinzip wird aus Abb. 37 deutlich, wenn man sich klar-macht, dass an den Punkten i = 0, 1, . . . , n − 1 jeweils die Spannung UR · 2−i anliegt.

0 1 2 n-1

UAUR

-

+

R

2R

2R

2R

2R

RR 2RR

Abbildung 37: Digital/Analog-Wandler mit R/2R-Netzwerk

Die Gute eines D/A-Wandlers und damit seine Verwendungsmoglichkeit fur eine bestimm-te Steuerungsaufgabe lasst sich durch einige Kenngroßen charakterisieren:

• Die Auflosung gibt die Bitbreite des gewandelten Digitalwertes an. Sie liegt im all-gemeinen zwischen 8 und 16 Bit, durch die neueren Entwicklungen im Audiobereich(CD-Player) sind zur Zeit auch D/A-Wandler mit hoher Auflosung (14 Bit, 16 Bit)relativ preisgunstig. Die Auflosung bestimmt die minimale Schrittweite, mit der eineSteuergroße vom Rechner vorgegeben werden kann.

• Genauigkeit und Linearitat sowie deren Temperaturabhangigkeit geben an, wiegut die vorhandene (digitale) Auflosung in die Realitat der analogen Welt umgesetztwird. Diese Großen sind von den Toleranzen und dem Temperatur- und Alterungs-verhalten des internen Widerstandsnetzwerks abhangig. Hohe Anforderungen hierbedingen hohen Herstellungsaufwand.

• Die Geschwindigkeit, oft angegeben als Anstiegszeit (10%–90%) fur einen Aus-gangsspannungssprung von der minimalen zur maximalen Ausgangsspannung, kannals Kriterium im allgemeinen außer acht gelassen werden, da die Datenausgabe vomPC fast immer langsamer ist und da die typischen Zeitkonstanten der zu steuerndenGerate (Heizung etc.) meist sehr viel großer sind.

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 38

Die Ansteuerung von D/A-Wandlern durch den Rechner hangt davon ab, wie der Digi-talteil des Wandlers ausgefuhrt ist. Im einfachsten Fall sind die ‘Schalter’ durch TTL-kompatible Logiksignale direkt zuganglich, dann muss ein Baustein vorgeschaltet werden,der den Digitalwert zwischenspeichert und auch nach dem Ausgabebefehl statisch amD/A-Wandler anliegen lasst (z. B. ein paralleler E/A-Baustein 8255).

Ist ein internes Speicherregister im D/A-Wandler vorhanden, wird der Digitalwert ent-weder parallel oder getaktet seriell ubergeben. Parallele D/A-Wandler sind ahnlich wieparallele E/A-Bausteine zu sehen: Der Digitalwert wird – in Bytes aufgeteilt – durchAusgabebefehle ubergeben, ein Trigger-Befehl veranlasst die interne Ubernahme des kom-pletten Werts.

Bei seriellen D/A-Wandlern wird der Digitalwert durch einen Daten- und einen Taktein-gang seriell (bitweise) in ein Schieberegister eingetaktet, die interne Ubernahme wird durcheinen weiteren Eingang getriggert. Drei Leitungen reichen also zum Anschluss – z. B. anein Parallelport im PC – aus. Ein Ansteuerprogramm fur diese Art von D/A-Wandlernmuss den umzuwandelnden Digitalwert in eine Bitfolge umsetzen und diese zusammenmit richtig gesetztem Taktbit und Ubernahmebit z. B. uber 3 Leitungen einer parallelenSchnittstelle seriell ausgeben.

4.2 Analog/Digital-Wandler

Im Gegensatz zu den D/A-Wandlern werden unterschiedliche technische Konzepte ver-wendet, die sich in Auflosung, Geschwindigkeit und Aufwand zum Teil betrachtlich unter-scheiden.

4.2.1 Parallel-A/D-Wandler

auch als Flash-A/D-Wandler bezeichnet, vergleichen die anliegende Analogspannung ineiner Reihe von 2n Komparatoren10 mit 2n Vergleichsspannungen (Abbildung 38), n istdie Bitbreite des Digitalwertes.

Das Prinzip ist sehr aufwendig (fur einen 8-Bit-Wandler benotigt man 256 Komparato-ren), allerdings auch sehr schnell. Die schnellsten Flash-Wandler erreichen Wandlungsra-ten im Gigahertzbereich. Eingesetzt werden solche Wandler in Digitalisierern, mit denensehr schnelle Vorgange aufgezeichnet werden sollen (Transientenrecorder, Digitalspeicher-oszilloskope). Diese Digitalisierer speichern die Daten zunachst intern in einem entspre-chend schnellen Speicher, aus dem sie dann langsamer abgerufen werden konnen. Im PCsind Flash-Wandler zum Beispiel zur Digitalisierung von Videosignalen sinnvoll einsetzbar(Frame-Grabber-Karten), die Geschwindigkeit des direkten Speicherzugriffs (DMA) uber

10Ein Komparator kann als speziell beschalteter Operationsverstarker angesehen werden, der die beidenEingangsspannungen vergleicht und das Vergleichsresultat in ein Logiksignal umsetzt. U+ > U− ⇒ 1,U+ < U− ⇒ 0.

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 39

����

������ -+

����

������ -+

����

������ -+

2n Komparatoren

Dekodier-Logik · · ·

n Bit

�UE

-

+

Abbildung 38: Parallel-Analog/Digital-Wandler

den PCI-Bus ist schnell genug, um Videosequenzen ohne Zwischenspeicherung direkt inden Rechnerspeicher zu transferieren.

4.2.2 Kaskaden-Wandler

Um mit der Geschwindigkeit von Parallel-Wandlern eine hohere Auflosung zu erreichen,ohne gleichzeitig den massiven Aufwand von 2n parallel arbeitenden Komparatoren trei-ben zu mussen, wurden Kaskadierungskonzepte fur Parallel-Wandler entwickelt. Die Ein-gangsspannung wird bei diesen Wandlertypen in einer ersten Stufe grob digitalisiert, z. B.mit einer Genauigkeit von 6 Bit. In einem schnellen D/A-Wandler wird aus diesem gro-ben Digitalwert eine Kompensationsspannung generiert, die von der Eingangsspannungsubtrahiert wird. Die Differenz wird definiert verstarkt und in einem zweiten Digitalisie-rungsschritt einem weiteren D/A-Wandler zugefuhrt. Das Gesamtergebnis wird aus denbeiden Teilergebnissen zusammengesetzt.

4.2.3 Integrations- und Zahlverfahren

Bei diesem Verfahren wird durch die Messspannung der Strom einer Kondensatoraufladunggesteuert (Operationsverstarker als Integrator geschaltet). Die Zeit, die benotigt wird, umeine bestimmte Aufladespannung zu erreichen, ist umgekehrt proportional zum Ladestromund damit zur Messgroße. Durch Abzahlen der Taktimpulse eines hochgenauen Taktgene-rators (quarzstabilisiert) kann diese Zeit und damit die Messgroße sehr genau bestimmtwerden.

Eine Verbesserung dieses ‘Single-Slope’-Verfahrens ist das ‘Dual-Slope’-Verfahren, dessenFunktionsweise in Abb. 39 dargestellt ist. Die Integration uber die Messspannung erfolgthier fur eine fest vorgegebene Zeit t1 − t0, die durch Abzahlen von Z0 Taktimpulsen ge-messen wird. Die nach dieser Zeit erreichte Ladespannung ist proportional zur Messgroße.

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 40

�����������

��

���

��

��

��

��

���

��

��

��

��

��

��

� � � �

� �

Z0

Z

Z′Uc

tt0 t1 t2 t3 t′3

Abbildung 39: Dual-Slope-Verfahren: Zeitlicher Spannungsverlauf an der Integratorkapa-zitat fur zwei verschiedene Messspannungen.

Zum Zeitpunkt t1 wird die Messspannung abgeschaltet, zum Zeitpunkt t2 stattdessen einehochgenaue Referenzspannung umgekehrten Vorzeichens am Integrator angelegt. Die Zeitbis zur Entladung des Kondensators (t3− t2) ist nun – da die steuernde Referenzspannungkonstant ist und damit die Steigung der Entladegeraden fest – proportional zur Ladespan-nung bei t2. Auch diese Zeit wird durch Zahlen von Taktimpulsen gemessen (Z, Z ′). DieMessspannung kann dann auf sehr einfache Weise berechnet werden:

Umess = −Uref · Z/Z0 (4.2)

Zweckmaßigerweise werden −Uref und Z0 so gewahlt, dass ihr Quotient der gefordertenAuflosung entsprechen (z. B. −Uref/Z0 = 1 μV ), dann ist Z ohne weitere Umrechnungder Zahlenwert der Messspannung.

Der große Vorteil des Dual-Slope-Verfahrens besteht darin, dass Ungenauigkeiten des Takt-gebers und des Integrators nur eine geringe Rolle spielen, da sie in Auflade- und Entla-devorgang in gleicher Weise eingehen und damit das Messergebnis in erster Naherungnicht verfalschen. Zur Unterdruckung von Storspannungen kann die Aufladezeit t1 − t0 sofestgesetzt werden, dass sie einem ganzzahligen Vielfachen der Periode der Storspannungentspricht. Ublich sind Vielfache von 20 millisec, um 50 Hz-Storungen auszuschalten.

Integrierende A/D-Wandler sind die weitaus genauesten, das Verfahren wird insbesonderebei Digitalmultimetern eingesetzt. Ein kleiner Nachteil sind die relativ langen Integrati-onszeiten, die keine allzu schnelle Messfolge zulassen.

Eine etwas modifiziertes Verfahren wird bei der Impulshohenanalyse in Vielkanalanalysa-toren benutzt. Eine Kapazitat wird auf eine Spannung aufgeladen, die dem Spitzenwertdes zu analysierenden Impulses entspricht, die Entladung erfolgt dann mit konstantemStrom. Die Entladezeit wird wie beim Dual-Slope-Verfahren gemessen, der Zahlenwert istproportional zur Impulshohe und dient zur Adressierung des Vielkanalanalysatorspeichers.Hierbei sind Taktfrequenzen von einigen 100 MHz Stand der Technik, die Entladezeit unddamit der notwendige Zeitabstand zum nachsten Impuls betragt etwa 10 μsec.

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 41

4.2.4 Wageverfahren

Beim Wage- oder Kompensationsverfahren wird die Messspannung in einem Komparatormit einer Vergleichsspannung verglichen, die durch einen Digital/Analog-Wandler erzeugtwird. Die vereinfachte Schaltung zeigt Abb. 40.

�����

�����-

+

�Analog-Eingang

Komparator

Logik�����������

Digital-Ausgang

D/A-Wandler

����

����

Abbildung 40: Grundschaltung von Analog/Digital-Wandlern, die nach dem Vergleichs-prinzip arbeiten.

Im Logikteil wird der Digitalwert der Vergleichsspannung generiert und der Ausgang desKomparators beobachtet. Dieser Teil kann durch Hardware auf dem Baustein oder durchRechnersoftware realisiert sein. Die Vergleichsspannung kann durch unterschiedliche Stra-tegien variiert werden:

• Bei der einfachen Abzahlstrategie wird der Digitalwert, bei 0 beginnend, solangehochgezahlt, bis der Komparatorausgang von logisch 0 auf 1 wechselt. Diese Strategieist die langsamste.

• Beim Nachlaufverfahren wird – abhangig vom Komparatorausgang – vorwarts oderruckwarts gezahlt, bis der richtige Wert erreicht ist. Dies Verfahren ist sehr gutgeeignet bei langsam veranderlicher Messgroße, in diesem Fall liegt praktisch immerder richtige Digitalwert am Ausgang an.

• Beim Intervallschachtelungsverfahren (sukzessive Approximation) werden, beginnendbeim hochstwertigen Bit, alle Bits nacheinander abgetestet und je nach Komparator-reaktion im Digitalwert auf 0 oder 1 gesetzt. Der Messwert wird durch die fortgesetzteHalbierung des Intervalls sehr schnell erreicht. Voraussetzung ist, dass die Messspan-nung wahrend der Intervallschachtelung einigermaßen konstant bleibt. Dies wird imallgemeinen durch eine vorgesetzte ‘Sample-and-Hold’-Schaltung erreicht, die auf einStartsignal hin den Messwert abtastet (sample) und dann festhalt (hold).

Die meisten der auf PC-Karten verwendeten Analog/Digital-Wandler arbeiten nach die-sem letztgenannten Verfahren. Ein Programm fur solche Wandler muss zunachst eine A/D-Wandlung starten, sodann eine festgelegte Mindestzeit (Wandlungszeit) oder ein ‘Ready’-Signal abwarten, dann den Digitalwert einlesen. Die Wandlungszeit liegt, abhangig vom

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 42

A/D-Wandler, zwischen 1 und 100 μsec. Haufig ist dem A/D-Wandler ein Analogmulti-plexer vorgesetzt, der zwischen mehreren Messstellen umschalten kann, dann muss dasProgramm zuallererst den richtigen Kanal anwahlen.

Die folgenden Beispielfunktionen sollen die drei beschriebenen Strategien noch etwas nahererlautern. Die Funktionen arbeiten mit einem A/D-Wandler zusammen, bei dem der Lo-gikteil durch Rechnersoftware realisiert wird.

Vorab die Definition einer Klasse CInOut , in der die Compilerspezifika anonymisiert wer-den (hardwarenahe Befehle wie die hier fur Ein- und Ausgabe benotigten sind nicht stan-dardisiert):

typedef unsigned short USHORT;#ifdef _MSC_VER // compiler specificclass CInOut {public:

void OUTP (USHORT port, int value){ _outp (port, value); };

int INP (USHORT port){ return _inp (port); };

};#else // different compiler (for M$ eaters)#endif

Die Klassendefinition fur CAdc enthalt die Deklarationen der benotigten Variablen undderen Initialisierung sowie die D/A-Wandler-Prozedur – der 12-Bit-D/A-Wandler wird mit2 aufeinanderfolgenden Adressen (LowByte⇒daAdr, HighByte⇒daAdr+1) angesprochen:

class CAdc : public CInOut {private:

USHORT base, adMux, adComp, gtMask, maxAD, ADBits;void DA (USHORT daValue){ DA (0, daValue); };

bool IsGreater(){ return ((INP(adComp) & gtMask) != 0); };

public:CAdc (USHORT baseAdr = 0x390) {base = baseAdr;adMux = base + 8;adComp = base + 9;gtMask = 1;ADBits = 12;maxAD = (1<<ADBits) - 1;

};void DA (USHORT daChannel, USHORT daValue) {

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 43

USHORT daAdr = base + 2*daChannel;OUTP (daAdr, daValue);OUTP (daAdr+1, (daValue >> 8));

};USHORT AD (int adChannel);

};

Die erste Beispielfunktion AD veranschaulicht das Abzahlprinzip; der Digitalwert wird in-krementiert, bis der Komparator Erfolg meldet oder das Ende des A/D-Bit-Bereichs er-reicht ist:

USHORT CAdc::AD (int adChannel){

USHORT adValue = 0;OUTP (adMux, adChannel);while ((adValue<maxAD) && !IsGreater())DA (++adValue);

return adValue;}

Die zweite Variante verwendet das Nachlaufverfahren, es wird – abhangig vom Kompa-ratorausgang – dekrementiert und/oder inkrementiert. Der gemessene Digitalwert mussbeim nachsten Aufruf wieder zur Verfugung stehen, daher als statische Variable deklariertwerden.

USHORT CAdc::AD (int adChannel){

static USHORT adValue;OUTP (adMux, adChannel);while ((adValue>0) && IsGreater())DA (--adValue);

while ((adValue<maxAD) && !IsGreater())DA (++adValue);

return adValue;}

Beim Verfahren der sukzessiven Approximation werden in einer for-Schleife nacheinan-der die einzelnen Bits abgetestet. Man beginnt beim hochstwertigen, sie werden einzelnzunachst versuchsweise und abhangig vom Komparatorergebnis dann endgultig gesetzt.Nach der Ausgabe des Analogwerts ist eine Wartezeit einzuhalten, die von der Einstellge-schwindigkeit des D/A-Wandlers abhangt.

USHORT CAdc::AD (int adChannel)

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 44

{USHORT adValue = 0, TestBit;OUTP (adMux, adChannel);for (int i=ADBits-1; i>=0; i--) {TestBit = 1<<i;DA (adValue | TestBit);// ***** wait for settling *****if (!IsGreater())

adValue |= TestBit;}

return adValue;}

In den obigen Formulierungen liefern die beiden ersten Funktionen einen Digitalwert, derden Analogwert von oben her nahert, die dritte Funktion dagegen die Naherung von untenher. Wo notig, lasst sich dies leicht andern.

4.2.5 Spannungs-Frequenz-Wandlung

Bei diesem Verfahren wird die Messspannung in eine Wechselspannung oder eine Impuls-folge umgesetzt, deren Frequenz zur Messgroße proportional ist. Dies leisten spezielle ICs,Spannungs/Frequenz-Wandler. Die Spannungsmessung ist damit in eine Frequenzmessungtransformiert. Die Frequenz wird mit einem Zahler gemessen, der auf eine feste Zahlzeiteingestellt wird, fortlaufend misst und die jeweiligen Messwerte zum Auslesen in einem‘Latch’ zwischenspeichert (Ratemeter).

Der Vorteil des Verfahrens liegt u. a. darin, dass es integrierend ist, damit sehr rau-schunempfindlich und wenig storanfallig. Allerdings zahlt es zu den langsameren A/D-Wandlungsprinzipien, Zahlzeiten von 0.01 – 1 sec sind gebrauchlich. Ein weiterer Vorteil– oft wesentlich – ist die einfach durchzufuhrende Potentialtrennung zwischen Messstelleund Rechner (nachster Abschnitt).

4.3 Potentialtrennung

Das Arbeiten mit analogen Großen erfordert ein stabiles und vor allem einheitliches Refe-renzpotential im gesamten Messsystem (‘Messerde’). Die Problematik wird deutlich, wennman sich klarmacht, dass bei 12 Bit Auflosung und einem Spannungsbereich 0. . .5 Vdie einem Bit entsprechende Spannung etwa 1 mV betragt. Storspannungen in dieserGroßenordnung lassen sich in einem großeren System oft nicht verhindern. Ein Ausweg,der Storungen meist abhilft, ist die elektrische Trennung von Mess- bzw. Steuerungssy-stem und Datenverarbeitung. Einheitliche Bezugspotentiale brauchen dann nur noch inden Teilsystemen vorhanden zu sein.

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 45

Informationen zwischen den Teilsystemen werden am einfachsten auf optischem Wegeubertragen. Dies kann durch Optokoppler11 oder – bei hoheren Anforderungen, z. B. ineiner Hochspannungsumgebung – mit Lichtleiterverbindungen realisiert werden. Fur dieoptische Ankopplung sind insbesondere Bausteine und Gerate geeignet, die uber wenigeLeitungen angebunden werden konnen, da ansonsten der Aufwand hoch wird. Man verwen-det daher fur die analoge Ankopplung in einem gestorten Bereich Spannungs/Frequenz-Wandler, die sehr nahe an der Messstelle angeordnet sind und ihre Messfrequenz optischan einen Zahler im Rechner weitergeben bzw. seriell ansteuerbare D/A-Wandler, die vomRechner aus optisch angesteuert werden.

4.4 Digitale Regelung

Ein wichtiges Anwendungsgebiet fur A/D- und D/A-Wandler ist der Bereich der Rege-lungstechnik. Das grundlegende Prinzip, nach dem alle Regler – analoge wie digitale –arbeiten, ist das des geschlossenen Regelkreises (Abbildung 41).

ReglerAR

RegelstreckeAS��

��+

����

+

� �

Storgroße Z

Stellgroße Y

Y + Z

W − X Fuhrungsgroße W

Regelgroße X

-

Abbildung 41: Regelkreis

Die Regelstrecke ist das Gerat, das geregelt werden soll, z. B. ein Ofen oder Kryo-stat. Sie wird beschrieben durch ihre Ubertragungsfunktion AS, die im Idealfall eineKonstante ist (lineare Regelstrecke).

Die Regelgroße ist der physikalische Parameter, der geregelt werden soll, z. B. dieaktuelle Temperatur (Ist-Temperatur, Ist-Wert).

Die Fuhrungsgroße ist der Vorgabewert fur die Regelgroße (Soll-Temperatur, Soll-Wert).

Der Regler ist ein Verstarker im ganz allgemeinen Sinne mit bestimmten Eigenschaften,die durch die Ubertragungsfunktion AR beschrieben werden. Beim Zwei-Punkt-

11Optokoppler sind Schaltkreise, die eine Lumineszenzdiode und eine Photodiode – elektrisch getrennt,optisch gekoppelt – enthalten. Die Isolationsspannungen liegen im Bereich von einigen hundert bis etwa2000 Volt.

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 46

Regler ist die Ubertragungsfunktion eine Stufenfunktion mit Hysterese (Bimetall-thermostat o. a.), beim Proportionalregler eine Konstante, die Verstarkung desReglers.

Die Stellgroße ist die physikalische Große, mit der die Strecke betrieben wird (Heizlei-stung, -strom, -spannung).

In der Storgroße sind die von außen einwirkenden Storungen zusammengefasst (Schwan-kungen der Umgebungstemperatur, zusatzliche Warmezufuhr durch Lichteinstrah-lung o. a.).

Idealisiert gilt bei linearer Regelstrecke fur einen Proportionalregler

fur die StellgroßeY = AR · (W − X), (4.3)

fur die RegelgroßeX = AS · (Y + Z) (4.4)

und damit fur die Abhangigkeit der Regelgroße von Fuhrungsgroße und Storung

X =ARAS

1 + ARAS· W +

AS

1 + ARAS· Z. (4.5)

Um den Einfluss der Storung Z gering zu halten, muss man AR sehr groß machen. Dieshat dann Nachteile, wenn Regelstrecke und Regler sich nicht so ideal verhalten wie an-genommen. Beispielsweise fuhren die immer vorhandenen Verzogerungszeiten in Reglerund Regelstrecke dazu, dass die Regelung beim Uberschreiten einer bestimmten Gesamt-verstarkung schwingt. Ein Ausweg ist, die reine Proportionalregelung dadurch zu erwei-tern, dass man die Vorgeschichte und den Trend mit berucksichtigt. Zum ProportionalteilAR · (W − X) wird ein Integralteil

AI · 1τI

·∫ t0

−∞(W (t) − X(t)) · exp

t − t0τI

· dt (4.6)

und ein DifferentialteilAD · τD · d(W − X)

dt(4.7)

hinzugenommen (PID-Regler).

PID-Regler sind im analogen Bereich heute Stand der Technik. Ein Analogregler kannals (linearer) Verstarker angesehen werden, bei dem die Verstarkung, sowie Integral- undDifferentialanteil variiert werden konnen.

Beim digitalen Regler wird die gemessene Regelgroße in einen Digitalwert umgesetzt (A/D-Wandler), die Fuhrungsgroße liegt digital als Konstante, Funktion oder Tabelle vor undder eigentliche Regelalgorithmus ist durch ein Programm realisiert. Die Stellgroße wirddurch einen D/A-Wandler wieder analog gemacht und – nach entsprechender Verstarkung

mdv :mdvdaad.tex 14. Oktober 2006

4 D/A- und A/D-Wandler 47

– der Regelstrecke zugefuhrt. Wichtig ist eine sinnvolle Diskretisierung, der Zeittakt dafurkann intern (Timer) oder extern (Messtakt eines Digitalmultimeters) vorgegeben werden.

Der Vorteil des Analogreglers ist sicher im geringeren Aufwand und damit auch geringerenPreis zu sehen; wo dies keine allzu große Rolle spielt, sprechen einige wesentliche Punkte furdie Verwendung von digitalen Reglern (Aufzahlung ohne Anspruch auf Vollstandigkeit):

• Die Fuhrungsgroße kann eine beliebige zeitliche Funktion sein. So lassen sich inSchmelzofen (Kristallzuchtung) sehr komplexe Temperaturprogramme realisieren.

• Storgroßen (Umgebungstemperatur etc.) konnen separat gemessen und in der rich-tigen Weise berucksichtigt werden, bevor ihr Einfluss – zeitlich verzogert – in derRegelgroße zu sehen ist.

• Die Ubertragungsfunktion darf auch sehr kompliziert sein, den Rechner stort dasnicht. Insbesondere lassen sich Nichtlinearitaten der Regelstrecke berucksichtigenund Grenzbedingungen fur die Stellgroße oder deren Anderung festlegen.

• Driftprobleme spielen nur noch in den Wandlern eine Rolle, nicht mehr im Reglerteil.

• Die Ubertragungsfunktion kann wahrend der Regelung geandert werden, es lassensich Regelalgorithmen konstruieren, die sich wahrend der Regelung an die Eigen-schaften der Regelstrecke anpassen (adaptive Regler).

• Man kann mit unscharf formulierten Regelalgorithmen arbeiten – Fuzzy-Regler.

• Mehrere Stellgroßen und mehrere Regelgroßen lassen sich kombinieren.

mdv :mdvdaad.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 48

5 MATLAB I : Messdatenerfassung

Wenn man einigermaßen komfortable Programme zur Datenerfassung und Steuerung anExperimenten zu erstellen hat, kann das zu einer sehr langwierigen und aufwendigen Auf-gabe werden, insbesondere dann, wenn neben der reinen Datenerfassung auch noch weitergehende Funktionen wie Datenanalyse, Graphikerstellung, Anpassungsrechnungen inte-griert sein sollen. Allerdings sind die Teilprobleme in vielen Bereichen gleichartig und las-sen sich sehr gut modularisieren. Bestimmte Peripheriegerate sind zu bedienen, Messdatenmussen gepeichert werden, Transformationen oder Fits sind notig. Das legt es nahe, furdie Teilaufgaben fertige Module bereitzustellen, die dann nur noch geeignet kombiniertwerden mussen. Verschiedene Hersteller bieten dafur spezialisierte graphische Entwick-lungsumgebungen an, mit denen man Mess- und Steuerprogramme relativ einfach bau-steinartig zusammensetzen kann. Fuhrend auf diesem Markt sind derzeit die UmgebungenLabView� von National Instruments [16] und VEE� von Agilent [17]. Verwendet mansolche Werkzeuge, ist es allenfalls noch notwendig, kurze Treiberroutinen fur exotischeHardware im klassischen Sinne selbst zu programmieren. Fast alle kommerziellen Hard-warehersteller liefern zu ihrer Hardware fertige Module fur eine oder beide der genanntenEntwicklungswerkzeuge mit. Im industriellen Umfeld hat sich diese Art der graphischenMessprogrammerstellung inzwischen weitgehend durchgesetzt, da man damit die Entwick-lungszeiten betrachtlich verkurzen kann und da die Kosten der Werkzeuge meist keine allzugroße Rolle spielen.

Effizient zu progammieren heißt auch,effizient von fertigen Produkten Gebrauch zu machen.

Ein anderes, in Bereichen wie Physik oder Informatik naher liegendes Konzept zur Arbeits-erleichterung ist die Kombination von Numerikprogrammen mit kurzen selbstgeschriebe-nen Routinen. Die selbstgeschriebenen Teile ubernehmen die Kopplung an die Messperi-pherie, das Numerikprogramme alle weiter gehenden Aufgaben. Dabei ist es sinnvoll, einNumerikprogramm zu verwenden, das auch auf anderen Gebieten (Theorie, Simulation)gut einsetzbar ist. Die umfangreichsten und modernsten Moglichkeiten bietet hier seit ge-raumer Zeit MATLAB�, ein Produkt der Firma MathWorks [18]. Ebenfalls recht vielseitig,aber nicht ganz so professionell und benutzerfreundlich ist Scilab [19], ein Programm ausdem Public-Domain-Bereich.

Zur Informationsubertragung zwischen den Progammteilen – Daten und Steuerungsanwei-sungen mussen ausgetauscht werden – konnen unterschiedliche Mechanismen implemen-tiert sein, betriebssystemspezifische (Pipes, DDE12, OLE13, ActiveX, COM14, DCOM15,CORBA16 usw.), aber auch weitgehend betriebssystemunabhange (Dateien – binar oder

12Dynamic Data Exchange.13Object Linking and Embedding.14Component Object M odel.15D istributed COM.16Common Object Request Broker Architecture.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 49

Text – oder direkte Parameterubergabe zwischen den beteiligten Funktionen beipielsweisemit TCP/IP-Mechanismen).

Am Beispiel MATLAB sollen verschiedene Konzepte zur Steuerung und Datenerfassunggenauer betrachtet werden. Auf einige der Standardschnittstellen (insbesondere die seriel-len Schnittstellen) des Rechners ist ein Zugriff mit MATLAB-eigenen Objekten moglich,ansonsten werden externe Programme oder Funktionen benotigt. Mit der Windows-Versionvon MATLAB konnen unter anderem die windowstypischen KommunikationsstandardsDDE und ActiveX verwendet werden, wenn ein geeignetes Partnerprogramm vorhandenist. So ist beispielsweise ein Datenaustausch mit Programmen wie Excel per DDE moglich,mit dem ActiveX-Mechanismus kann Hardware dann angesprochen werden, wenn geeig-nete Treiber verfugbar sind (Naheres zu beiden Konzepten im MATLAB-Hilfesystem).Wir werden hier die MATLAB-eigenen Standards der MEX-Unterprogramme (MATLABEX tension) und der ‘MATLAB Engine’ unter Windows naher betrachten, die zwar nichtganz betriebssystemunabhangig sind, aber in ahnlicher Form auch unter anderen Betriebs-systemen (UNIX, Linux) implementiert sind. Das MATLAB-API17-Handbuch [20] meintdazu:

Although MATLAB is a complete, self-contained environment for programmingand manipulating data, it is often useful to interact with data and programsexternal to the MATLAB environment. MATLAB provides an Application Pro-gram Interface (API) to support these external interfaces. The functions suppor-ted by the API include:

� Calling C or Fortran programs from MATLAB.

� Importing and exporting data to and from the MATLAB environment.

� Establishing client/server relationships between MATLAB and other softwareprograms.

MATLAB ist ursprunglich als reines Text-Frontend fur Numerik-Pakete entwickelt wor-den, daher ist eine Bedienung uber Texteingaben oder Skripte nahe liegend. Es wurdenaber auch schon fruh Moglichkeiten integriert, graphische Benutzeroberflachen zu erstel-len. Dies ist besonders fur Anwendungen in der Messdatenerfassung interessant, bei de-nen sich gleichartige Ablaufe (Messungen) haufig wiederholen konnen. Auch einige dieserMoglichkeiten sollen an Beispielen diskutiert werden.

5.1 Hardware-Zugriff mit MATLAB-Funktionen

Ein Teil der PC-Hardware kann von MATLAB aus direkt angesprochen werden, so dieseriellen und die Druckerschnittstellen.

Die Funktion serial erstellt ein MATLAB-Objekt fur die serielle Schnittstelle, mit derAnweisung

17Application Program Interface.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 50

S1 = serial(’COM1’, ’BaudRate’, 9600);

beispielsweise wird die erste serielle Schnittstelle auf eine Geschwindigkeit von 9600 Baudeingestellt und in S1 bereitgestellt. Weiter verwendet wird S1 dann ahnlich wieein Datei-Objekt. Nach fopen(S1) konnen Daten mit fprintf(S1,...) ausgege-ben, mit x=fscanf(S1) gelesen werden. Weitere Schnittstelleneigenschaften werden mitset(S1,...) eingestellt, fclose(S1)) schließlich beendet die Verbindung.

Ebenfalls wie Datei-Objekte werden die Druckerschnittstellen gehandhabt. Man hat dieWahl zwischen C-artigen und Java-artigen Funktionen18:

Init = sprintf (’%cU1%c8%cs%c’, 27, 27, 27, 1);Pos = sprintf (’%cl%c.%c\r\n’, 27, Position, 7);printer = fopen (’lpt1:’, ’w’);fprintf (printer, Init);fprintf (printer, Pos);fclose (printer);

oder

ESC = 27; BELL = 7; CR = 13; LF = 10;Init = [ESC ’U1’ ESC ’8’ ESC ’s’ 1];Pos = [ESC ’l’ Position ’.’ BELL CR LF];printer = java.io.FileWriter(’lpt1:’);printer.write(Init);printer.write(Pos);printer.close; .

Beide Fragmente positionieren ein Epson-kompatiblen Drucker auf ’Position’.

Daruber hinaus ist es mit Java-Objekten auch moglich, die Ethernet-Schnittstelle desRechners von MATLAB aus anzusprechen. Fur Netzwerk-Verbindungen ist das Packagejava.net zustandig, das explizit importiert werden muss.

Ein MATLAB-Skript fur einen Ethernet-Client, der an den Server ipc1 zum TCPIP-Port1234 eine Zeichenfolge sendStr schickt und die Zeile recvStr empfangt, konnte somitetwa diese Anweisungen enthalten:

import java.net.*socket = java.net.Socket(’ipc1.physik.uni-osnabrueck.de’, 1234);str = java.lang.String(sendStr);out = socket.getOutputStream;out.write(str.getBytes);in = socket.getInputStream;

18Die neueren Versionen von MATLAB (in Release 11 inoffiziell und rudimentar, ab Release 12 of-fiziell) stellen ein Software-Interface zur Java Virtual Machine des Rechners bereit, uber das einerseitskomplette Java-Programme in MATLAB eingebunden werden konnen, andererseits aber auch einzelneJava-Anweisungen an die VM geschickt werden konnen.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 51

isr = java.io.InputStreamReader(in);ibr = java.io.BufferedReader(isr);recvStr = ibr.readLine;socket.close; .

Die Verbindung wird mit dem Socket-Objekt etabliert, mit der write-Methode deszugehorigen OutputStream wird die Anfrage abgeschickt. Die Antwort wird mit demInputStream gelesen, dem ein BufferedReader angehangt wurde, um bequem mitreadLine lesen zu konnen.

5.2 Externe Programme

Sollen – von MATLAB aus gesehen – nur einfache Aktionen angestoßen werden, ohnedass Informationen zuruckgeliefert werden, kann man das uber ein externes Programmerledigen, dem die benotigten Parameter in der Kommandozeile ubergeben werden. EinC++-Programm epson, das etwa folgende main-Funktion enthalt

int main(int argc, char* argv[]) {pos = atoi(argv[1]);CEpson fx;fx.Position(pos);... ,

konnte aus MATLAB mit

Position = 40;eval([’!epson ’ num2str(Position)]);

aufgerufen werden (eval ermoglicht variable Parameter beim Aufruf eines externen Pro-gramms mit ‘!’).

5.3 MEX-Funktionen

Von MATLAB aufrufbare C/C++- oder Fortran-Subroutinen (MEX-Dateien) werden un-ter Windows als DLLs (Dynamic Link Libraries) erstellt und beim Aufruf aus MATLABvom Betriebssystem automatisch geladen und ausgefuhrt:

You can call your own C or Fortran subroutines from MATLAB as if they werebuilt-in functions. MATLAB callable C and Fortran programs are referred toas MEX-files. MEX-files are dynamically linked subroutines that the MATLABinterpreter can automatically load and execute. MEX-files have several applica-tions:

� Large pre-existing C and Fortran programs can be called from MATLAB withouthaving to be rewritten as M-files.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 52

� Bottleneck computations (usually for-loops) that do not run fast enough in MAT-LAB can be recoded in C or Fortran for efficiency.

Der dem MATLAB-Handbuch [20] entnommenen Auflistung ware noch der Bereich derKopplung ans Experiment hinzuzufugen.

Zur Realisierung von MEX-Dateien ist im MATLAB-System das Kommando mex vorge-sehen; nach richtiger Konfiguration mit mex -setup ist es in der Lage, aus C- oder C++-Dateien die DLLs zur Verwendung unter MATLAB zu erstellen. Die Quelldatei wird dazuim jeweils aktuellen Verzeichnis – z. B. mit dem MATLAB-Texteditor – angelegt. Voraus-setzung ist, dass auf dem Rechner einer der von MATLAB unterstutzten C/C++-Compilervorhanden ist. Ein einfacher frei verfugbarer C-Compiler (LCC) wird bei MATLAB mit-geliefert, damit konnen in jedem Fall MEX-Programme compiliert werden (allerdings nurin C).

MATLAB kommuniziert mit einer MEX-Datei uber die Interface-Funktion mexFunction(),die mithin in jeder MEX-Datei vorhanden sein muss. Diese Funktion hat die Signatur

void mexFunction ( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ),

die 4 Parameter beschreiben die Eingabe- und Ausgabeobjekte der MEX-Funktion (lefthand side, r ight hand side). Die Felder prhs und plhs enthalten Zeiger auf die Objekte,nrhs und nlhs sind deren Anzahl. Bei einer MEX-Funktion func.dll, die aus MATLABmit

[u, v] = func (a);

aufgerufen wird, ist nlhs = 2, plhs[0] zeigt auf u, plhs[1] auf v, nrhs = 1, prhs[0]zeigt auf a.

Der C++-Quellcode einer MEX-DLL, die als einziges Objekt ein zweidimensionales Messda-tenfeld zuruckgibt, enthalt etwa die folgenden Zeilen:

#include "mex.h"...void mexFunction( int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[] ){

plhs[0] = mxCreateDoubleMatrix(YSIZE, XSIZE, mxREAL);double * z = mxGetPr(plhs[0]);...// put data into array z

} .

Das Matrix-Objekt wird mit mxCreateDoubleMatrix() angelegt, plhs[0] zeigt darauf.Mit mxGetPr(plhs[0]) beschafft man sich im Programm einen Zeiger auf den Anfang deseigentlichen Datenfelds.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 53

5.4 MEX-Funktionen und ‘Microsoft Foundation Classes’

Fur kurze MEX-Programme oder solche, die Numerik-Aufgaben erledigen, reicht die be-schriebene Vorgehensweise aus. Will man jedoch innerhalb der MEX-Funktion mit einerBenutzeroberflache arbeiten (Dialog o. a.), ist es wunschenswert, die DLL innerhalb dergewohnten Umgebung und mit deren Hilfsmitteln zu entwickeln. Dazu ist im Falle derMicrosoft-Entwicklungsumgebung fur Visual C++ wie folgt vorzugehen:

• Als Projekttyp im Startfenster wird MFC AppWizard (dll) angewahlt, im Folge-fenster Regular DLL using shared MFC DLL markiert. Die Entwicklungsumgebungerstellt daraufhin ein Gerust fur eine DLL.

• In der .def-Datei des Projekt wird unter EXPORTS der Name der zu exportierendenFunktion mexFunction vermerkt.

• Mit#include "mex.h"

und dem ‘Additional Include Directory:’

<MATLABPATH>\extern\include

werden dem Programm die notigen Definitionen zuganglich gemacht.

• Die Bibliotheken libmx.lib, libmex.lib, libmatlbmx.lib und libmat.lib wer-den als zusatzliche Input-Dateien bei den Linker-Optionen angegeben, als zusatzlicherLinker-Suchpfad

<MATLABPATH>\extern\lib\win32\microsoft\msvc60

(fur andere von MATLAB unterstutzte Compiler gegebenenfalls anzupassen).

Damit sind die Vorarbeiten erledigt, die MEX-Funktion kann implementiert werden:

void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )

{AFX_MANAGE_STATE(AfxGetStaticModuleState());plhs[0] = mxCreateDoubleMatrix(CData::YSIZE, CData::XSIZE, mxREAL);double * z = mxGetPr(plhs[0]);CData DataDlg;DataDlg.DoModal();for ( int k=0; k<CData::YSIZE; k++ )for ( int i=0; i<CData::XSIZE; i++ )

* (z + i*CData::YSIZE + k) = DataDlg.Z[k][i];}

Wichtig ist das Makro AFX_MANAGE_STATE... in der ersten Funktionszeile (Hinweis da-zu in der .CPP-Hauptdatei des Projekts). Die mexFunction() ruft hier einen modalen

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 54

Dialog auf, der die Datenerfassung, gegebenenfalls auch vom Benutzer vorzunehmendeEinstellungen des Experiments, realisiert. Am Ende der Funktion werden die Daten insRuckgabeobjekt umkopiert.

5.5 MEX-Funktionen mit GCC oder G++

Will man MEX-Funktionen mit Gnu-Werkzeugen erstellen, dann gibt es dafur mehrereMoglichkeiten, allerdings (noch) keine direkte Unterstutzung von The Mathworks. Fur dieGnu-Werkzeuge gibt es zurzeit mindestens drei interessante Windows-Implementierungen:

Cygwin bildet eine komplette UNIX-Umgebung unter Windows nach [21].

UWIN von AT&T verwendet Microsoft-Compiler als Standard, kann aber auch Gnu-Compiler einbinden [22].

MinGW kombiniert die Windows-Bibliotheken mit den Gnu-Werkzeugen [23]. Eine Ent-wicklungsumgebung dafur ist Dev-C++ [24].

Fur die Kombination von Cygwin mit MATLAB gibt es eine ausfuhrliche Beschreibungsowie die notwendigen zusatzlichen Dateien im Netz [25]. Die Implementierung ist analogzum ublichen mex-Kommando in MATLAB, MEX-DLLs werden innerhalb der MATLAB-Umgebung erstellt. Voraussetzung ist allerdings die Installation des relativ aufwendigenCygwin-Systems.

Will man mit dem erheblich schlankeren MinGW und Dev-C++ als Entwicklungsumge-bung arbeiten, kann man etwa wie folgt vorgehen:

• Zunachst muss eine Bibliotheksdatei (.LIB) erstellt werden, die alle in MEX-Dateiennotwendigen Funktionen enthalt. Das erledigt der Aufruf

dlltool --def <MATLABPATH>/extern/include/matlab.def \--output-lib libmex.lib

(in einer Zeile, die Fortsetzung mit ‘\’ funktioniert unter Windows nicht), dlltoolist im Gnu-Paket enthalten.

• In Dev-C++ wird mit einem leeren Projekt begonnen, als Projekt-Optionen wirddie Erstellung einer DLL gewahlt, libmex.lib wird als zusatzliche Objekt-Dateiangegeben, als zusatzliches Include-Verzeichnis wird

<MATLABPATH>/extern/include

eingetragen.

• Das ware schon alles — wenn Dev-C++ fehlerfrei ware. Leider wird die Lib-Dateinicht berucksichtigt, wenn man aus der Entwicklungsumgebung compiliert und linkt.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 55

Richtig gemacht wird aber der Makefile19. Folglich verwendet man die Entwicklungs-umgebung nur als Editor, lasst sich einen Makefile generieren und ubersetzt die DLLmit make aus einem DOS-Fenster oder mit !make vom MATLAB-Befehlsprompt.

Um alles, insbesondere auch die Parameterubergabe, zu testen, sollte man mit einer ein-fachen DLL anfangen, etwa:

#include "mex.h"void mexFunction( int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[] ){

if (nrhs==0)return;

double * y = mxGetPr(prhs[0]);int M = mxGetM(prhs[0]);int N = mxGetN(prhs[0]);plhs[0] = mxCreateDoubleMatrix(M, N, mxREAL);double * z = mxGetPr(plhs[0]);for (int i=0; i<M; i++)for (int k=0; k<N; k++)

*(z+N*i+k) = *(y+N*i+k)**(y+N*i+k);}

Das Beispiel quadriert eine Matrix feldweise, entspricht mithin der MATLAB-AnweisungM.*M.

5.6 MATLAB als ‘Engine’

MEX-Funktionen sind Erweiterungen des MATLAB-Befehlsumfangs und werden aus MAT-LAB aufgerufen. Umgekehrt kann man auch den Befehlsumfang des eigenen Programmsdurch MATLAB erweitern, MATLAB-Funktionen z. B. aus einem Messprogramm aufru-fen:

MATLAB provides a set of routines that allows you to call MATLAB from yourown programs, thereby employing MATLAB as a computation engine. MATLABengine programs are C or Fortran programs that communicate with a separateMATLAB process via pipes (in UNIX) and through ActiveX on Windows. Thereis a library of functions provided with MATLAB that allows you to start and endthe MATLAB process, send data to and from MATLAB, and send commandsto be processed in MATLAB. Some of the things you can do with the MATLABengine are:

19Bei großeren Projekten sollte man den Makefile nachbessern, da derzeit darin – wie auch in der Ent-wicklungsumgebung – jeweils alle Dateien des Projekts frisch ubersetzt werden.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 56

� Call a math routine to invert an array or to compute an FFT from your ownprogram. When employed in this manner, MATLAB is a powerful and program-mable mathematical subroutine library.

� Build an entire system for a specific task, for example, radar signature analysisor gas chromatography, where the front end (GUI) is programmed in C and theback end (analysis) is programmed in MATLAB, thereby shortening developmenttime.

Die Nutzung von MATLAB als ‘Engine’ veranschaulicht die Funktion OnFilter(), dieMATLAB aufruft, um ein zweidimensionales Datenfeld (quadratisches Bild b der GroßeBSIZE*BSIZE) zu filtern:

#include "engine.h"...void CMulDoc::OnFilter(){

int i, k;Engine * ep = engOpen ("");engEvalString (ep, "f=ones(5);");mxArray * z = mxCreateDoubleMatrix (BSIZE, BSIZE, mxREAL);mxSetName (z, "z");double * ptrz = mxGetPr (z);for ( i=0; i<BSIZE; i++ )for ( k=0; k<BSIZE; k++ )

* (ptrz + i*BSIZE + k) = b[k][i];engPutArray (ep, z);engEvalString (ep, "z=filter2(f,z);");engEvalString (ep, "z=z-min(min(z));");engEvalString (ep, "z=z*255/max(max(z));");mxArray * res = engGetArray (ep, "z");ptrz = mxGetPr (res);for ( i=0; i<BSIZE; i++ )for ( k=0; k<BSIZE; k++ )

b[k][i] = (BYTE) (* (ptrz + i*BSIZE + k));mxDestroyArray (res);mxDestroyArray (z);engClose (ep);UpdateAllViews (NULL);

} .

MATLAB wird mit engOpen() gestartet, mit f=ones(5) wird in MATLAB ein einfacheszweidimensionales Rechteckfilter definiert. Das Datenfeld wird an MATLAB ubergeben,mit der zweidimensionalen Filterfunktion filter2() gefiltert, wieder auf 8-Bit-Dynamiknormiert und zuruckkopiert. Lasst man die engClose-Anweisung am Ende weg, kann mannach dem Motto ‘MATLAB, ubernehmen Sie!’ mit den ubergebenen Daten in MATLAB

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 57

weiterarbeiten.

Auch bei Engine-Anwendungen sind gewisse Vorarbeiten notig: ahnlich wie bei den MEX-Anwendungen mussen zusatzliche Bibliotheken eingebunden werden, diesmal libmx.lib,libmat.lib, libeng.lib (Vorgehensweise fur unterstutzte Compiler wie Visual C++ ana-log zu 5.4, fur nicht unterstutzte Compiler wie G++ mussen die Lib-Dateien zunachsterstellt werden).

Einen ausfuhrlichen und vollstandigen Uberblick uber die von MATLAB bereitgestell-ten Schnittstellenfunktionen geben die zustandigen Handbucher (Benutzerhandbuch ge-druckt [20] und als PDF-Datei [26]; Referenzhandbuch in HTML [27] und PDF [28]) oderdas MATLAB-Hilfesystem. Ein weiteres Engine-Beispiel ist im Skriptum zur Vorlesung‘Graphik-Workshop’ [29] beschrieben. Dort geht es um den Tranfer von Bilddaten, die auseiner Twain-Quelle stammen, an MATLAB.

5.7 ActiveX

In der Windows-Version kann Matlab ActiveX-Komponenten20 verwenden, sowohl sogenannte Controls wie auch Server. Damit wird es sehr einfach, mit Rechnerperipherie zuarbeiten, fur die ActiveX-Controls vom Hersteller mitgeliefert werden. Dies ist inzwischenbei sehr vielen kommerziellen Steckkarten und auch bei externen Geraten zur Datener-fassung und Steuerung der Fall. Auch bei selbst programmierten Software-Komponentensollte man die Moglichkeit in Betracht ziehen, den ActiveX-Standard zu benutzen. Dieszumindest dann, wenn man mit einem Software-Entwicklungssystem arbeitet, das dieseinigermaßen einfach ermoglicht.

Matlab-Objekte fur ActiveX-Controls werden mit

h = actxcontrol(’Programm-ID’,...);

erstellt. Programm-ID ist der Name, unter dem die ActiveX-Komponente in der Regi-stry eingetragen ist. Als weitere Parameter konnen beim Aufruf angegeben werden (s.Matlab-Hilfe): Position und Große des Controls, Handle zum Parent-Objekt und eineoder mehrere Callback -Funktionen fur Ereignisse (Events) des Controls. Die moglichenEreignisse konnen mit events(h) erfragt werden.

Eigenschaften konnen, wie bei allen Matlab-Objekten ublich, mit set und get fest-gelegt und abgefragt werden, interaktiv geht das einfacher mit dem Property Editor, dermit inspect(h) aufgerufen wird.

Methoden – Funktionen – des Objekts ruft man entweder mit

a = invoke(h, ’Function’, Parameter1, Parameter2, ...);

20ActiveX ist eine der innerhalb des Microsoft Component Object Model (COM) definierten Software-Schnittstellen. Software-Komponenten – in der Regel DLLs – unterschiedlicher Herkunft konnen uber dieseInterface-Definition relativ problemlos zu variablen großeren Systemen zusammengefasst werden.

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 58

oder mit

a = Function(h, Parameter1, Parameter2, ...);

auf. Ein leeres invoke(h) liefert eine Liste der mit dem Objekt verbundenen Methoden.

5.8 Dateiformate

MATLAB kann eine ganze Anzahl von Dateiformaten direkt erstellen und lesen, danebensind verschiedene Funktionen implementiert, mit denen die Ein- und Ausgabe sehr flexibelgesteuert werden kann. Reicht dies alles nicht aus, so bleibt noch die Moglichkeit, eigeneFunktionen in C/C++, Fortran oder Java zu implementieren.

SAVE und LOAD Die Standardfunktionen zum Schreiben und Lesen von Daten sindsave und load. Ohne Argumente speichert save alle Variablen der aktuellen MATLAB-Sitzung binar in der Datei matlab.mat, mit load wird diese Datei wieder gelesen, dieVariablen werden wiederhergestellt. Durch Argumente kann man bei save den Namender Datei, die zu speichernden Variablen, die Formatierung und die Datengenauigkeit vor-geben. So werden mit

save <fname> X Y Z

die Variablen (Matrizen) X, Y und Z in der Datei <fname> im MATLAB-eigenen Daten-format gespeichert, mit

save <fname> Z -ASCII -DOUBLE

wird MATLAB angewiesen, Z in Textformat mit hoher Genauigkeit (16 Nachkommastel-len) zu speichern. Bei Textdateien (Option -ASCII) ist es meist nicht sinnvoll, mehrereDatenfelder anzugeben, da die Matrizen nacheinander geschrieben werden, ohne dass dieGroße und der Variablenname vermerkt werden. Dies kann beim Wiedereinlesen Proble-me machen, insbesondere dann, wenn die Spaltenanzahl der Matrizen unterschiedlich ist.Will man – wie bei Messdaten ublich – als Spaltenvektoren vorliegende Messwerte tabel-lenartig schreiben, muss man sie in MATLAB vorher zu einer Matrix zusammensetzen(Z = [X,Y]).

In ahnliche Weise lassen sich auch bei load nahere Spezifikationen angeben.

load <fname>

liest die Datei <fname>. Ohne Dateinamenerweiterung oder mit .MAT als Erweite-rung geht MATLAB von binarem MATLAB-Format aus, ansonsten von Textformat. BeiBinardateien werden die Daten unter ihren ursprunglichen Namen wiederhergestellt, durchAngabe von einzelnen Variablennamen als Parameter kann man load darauf beschranken.Handelt es sich um eine Textdatei, wird der Inhalt in der Matrix <fname> abgelegt. DurchVerwendung der funktionalen Form kann man das verandern. So konnen durch Leerzei-chen getrennte Zahlen aus einer Textdatei test.dat mit

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 59

Z = load(’test.dat’)

in die Matrix Z gelesen werden. Deren Spalten- und Zeilenzahl entspricht der Anordnungder Daten in der Textdatei.

Weitere Formate Ein Uberblick uber weitere Dateiformate, die in MATLAB zum Aus-tausch von Messdaten mit anderen Programmen verwendet werden konnen, ist im Skrip-tum zur Vorlesung ‘Graphik-Workshop’ [29] enthalten. Informationen dazu findet manauch in der MATLAB-Hilfe mit help fileformats und help iofun.

5.9 Graphische Benutzeroberflachen

Die Bedienung von (Mess-)Programmen wird dadurch betrachtlich erleichtert, dass manfur bestimmte Aktionen Eingabehilfen wie Drucktasten oder Menus zur Verfugung hat.MATLAB bietet zur Erstellung solcher graphischer Oberflachen umfangreiche Hilfsmittel.Basis ist immer ein figure-Objekt, das uber die Funktion uimenu mit zusatzlichenMenupunkten und uber die Funktion uicontrol mit Tasten, Eingabefenstern, Auswahl-listen und ahnlichem ausgestattet werden kann.

Abbildung 42 zeigt ein einfaches Beispiel, in dem mathematische Funktionen mit den Ein-fachkommandos ezplot, ezsurf oder ezmesh gezeichnet werden konnen. Die gewunschteFunktion wird im Textfeld eingegeben, nach Drucken der jeweiligen Taste geplottet.

−5

0

5

−5

0

5

−1

−0.5

0

0.5

1

x

sin(x/2) cos(y)

y

Abbildung 42: Graphische Be-nutzeroberflache zum Test vonFunktionsplots.

Das zugehorige MATLAB-Skript erstellt zunachst ein figure-Objekt als Rahmen, darinmit axes eine Zeichenflache.

figure( ...’Name’,’User Interface in MATLAB’, ...’NumberTitle’,’off’);

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 60

axes( ...’Units’,’normalized’, ...’Position’,[0.10 0.12 0.6 0.78], ...’FontUnits’,’normalized’,’FontSize’,0.055);

Pos = [0.75 0.8 0.2 0.05];dPos = [0 -0.1 0 0];hText = uicontrol( ...

’Style’,’edit’, ...’Units’,’normalized’, ...’Position’,Pos, ...’BackgroundColor’,[1 1 1], ...’String’,’sin(x/2)*cos(y)’);

uicontrol( ...’Style’,’pushbutton’, ...’Units’,’normalized’, ...’Position’,Pos+dPos, ...’String’,’EZPLOT’, ...’Callback’,’ezplot(get(hText,’’String’’))’);

...

Das Textfeld wird vorbesetzt, beim Drucken der Taste (hier EZPLOT) wird das Textfeldgelesen und die gewunschte Funktion (ezplot) damit aufgerufen.

Die Funktion uicontrol erstellt Graphik-Objekte, die durch Eigenschafts-Werte-Paarenaher definiert werden. So gibt der Wert fur Style an, was fur ein Typ uicontrolerstellt werden soll, Pos die Lage und Große, String die Beschriftung. Aktionsele-mente brauchen eine Callback-Eigenschaft, die die auszufuhrende Aktion festlegt. DerRuckgabewert von uicontrol ist ein Objekt-Pointer (Handle), mit dem Eigenschaftendes Objekts spater erfragt (get) oder verandert (set) werden konnen.

Das zweite Beispiel implementiert eine einfache Messumgebung (Abbildung 43). Fur Mess-parameter sind Eingabefelder vorgesehen, verschiedene Aktionen konnen per Tastendruckgestartet werden.

Die Aktionen sind jeweils durch die Callback-Eigenschaft festgelegt:

uicontrol( ’Style’, ’pushbutton’, ...’String’, ’MEASURE’, ...’Callback’, measurecb);

uicontrol( ’Style’, ’pushbutton’, ...’String’, ’CALCULATE’, ...’Callback’, ’errordlg(’’Not implemented’’,’’Error’’)’);

uicontrol( ’Style’, ’pushbutton’, ...’String’, ’SAVE’, ...’Callback’, savecb);

Beim Drucken der CALCULATE-Taste wird mit errordlg ein Dialogfenster mit Fehlermel-

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 61

−10 −8 −6 −4 −2 0 2−20

−15

−10

−5

0

5

10

15

20

Voltage [V]

Cur

rent

[mA

] Abbildung 43: GraphischeBenutzeroberflache zur Mess-datenerfassung und -dar-stellung (gemessen wurdegerade die Kennlinie einer9-V-Zenerdiode).

dung aufgemacht, die beiden weiteren Aktionen sind an anderer Stelle im MATLAB-Skriptimplementiert, measurecb als

measuring = 0;measurecb = [...

’if measuring==0,’ ...’measuring = 1;’ ...’x0 = str2num(get(hStart,’’String’’));’ ...’x1 = str2num(get(hStop,’’String’’));’ ...’dx = str2num(get(hStep,’’String’’));’ ...’[x,y] = domeas(x0,x1,dx);’ ...’measuring = 0;’ ...’end;’]; .

Die Zahlenwerte (str2num) der Texteingaben (hStart, hStop, hStep sind die Handles derTextfelder) werden als Parameter an die eigentliche Messfunktion domeas ubergeben,zuruckgeliefert werden die Messwerte. Die Semaphore (Ampel) measuring sorgt dafur,dass ein zweiter Tastendruck wahrend einer Messung ohne Folgen bleibt. Falls die Messunglanger dauert, sollten innerhalb der Messfunktion regelmaßig aktuelle Messdaten gezeich-net werden, um uber den Messablauf zu informieren. Dazu wird die Graphik zunachstkonfektioniert (Datenbereich, Achsenbeschriftungen usw.) und mit hold on eingefroren.In der Messschleife innerhalb der Messfunktion domeas wird dann laufend nur noch deraktuelle Datenpunkt geplottet:

for n = 1:nmax,... % Slow Measurementplot(x(n), y(n), ’ko’);if mod(n,10)==0, drawnow; end;

end; .

Der Aufruf von drawnow sorgt dafur, dass konkret gezeichnet wird, im obigen Fall nach

mdv :mdvmatlabe.tex 14. Oktober 2006

5 MATLAB I : Messdatenerfassung 62

jedem zehnten Punkt. MATLAB schiebt ansonsten alle Zeichenaktionen auf, bis nichtsanderes mehr anliegt, wurde also ohne diese Zeile erst am Ende der Messung zeichnen.

Die Aktion savecb macht zunachst mit uiputfile ein Standarddialogfenster zurAuswahl eines Dateinamens auf, Ruckgabewerte sind Dateiname und vollstandiger Pfad:

savecb = ...[’[fn,fp]=uiputfile(’’*.*’’);’, ...’if fn~=0,’, ...’ chdir(fp);’, ...’ pairs=[x’’,y’’];’ ...’ save(fn,’’pairs’’,’’-ascii’’);’ ...’end;’]; .

Vor dem Abspeichern mit save werden die im Messprogramm als Zeilenvektoren vorlie-genden Messwerte in die gewunschte Tabellenform gebracht (zweispaltige Matrix pairs).

GUIDE Als Hilfsmittel zur graphischen Erstellung von GUIs enthalt Matlab einen gra-phischen Editor (GUI Design Environment – GUIDE), der mit guide aufgerufen wird.Der Editor erstellt eine Matlab-Graphik-Datei (.fig) und eine dazu korrespondierendeSkript-Datei (.m). Seit Release 13 (Juni 2002) ist es auch moglich, alles in eine einzigeSkript-Datei zu exportieren. Damit sind nachtragliche Anderungen und Anpassungen so-wohl mit dem graphischen Editor wie auch mit einem Text-Editor moglich. Die Dateiensind allerdings etwas umfangreicher und unubersichtlicher als Skript-Dateien, in denen einGUI direkt programmiert wird.

mdv :mdvmatlabe.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 63

6 MATLAB II : Messdatenverarbeitung

MATLAB ist die Abkurzung fur MAT rix LABoratory, Vektoren und Matrizen sind die Va-riablentypen, mit denen MATLAB am besten umgehen kann. Das sind aber auch genau dieDatentypen, in denen Messdaten ublicherweise vorliegen. Meist eindimensional, eine phy-sikalische Große wird in ihrer Abhangigkeit von einer anderen, unabhangig veranderlichengemessen. So wird beim Freien Fall der zuruckgelegte Weg in Abhangigkeit von der Zeitbestimmt, die Kennlinie einer Diode ist der Strom als Funktion der anliegender Span-nung, die optische Absorption eines Materials wird meist wellenlangenabhangig gemessen,in der Kernspektroskopie interessiert man sich fur die Energieverteilung der bei Zerfalls-oder Wechselwirkungsprozessen involvierten Teilchen. Zwei- oder mehrdimensional da-gegen liegen Daten beispielsweise uberall dort vor, wo physikalische Großen ortsabhangiggemessen werden. Alle bildgebenden Messverfahren – wie die Rastermikroskopie oder auchviele der Untersuchungsmethoden aus dem medizinischen Bereich – liefern solche Daten.Da in MATLAB Rechenverfahren fur Matrizen sehr effizient implementiert sind, ist esgerade auch fur die Weiterverarbeitung von ein- und mehrdimensionalen Messdaten her-vorragend geeignet21.

Die in Messdaten enthaltene physikalische Informationwird oft erst nach geschickter Bearbeitung sichtbar.

6.1 Filterung

Filterverfahren werden verwendet, um Datenfelder zu glatten, aber auch, um spezielle In-formationen hervorzuheben. MATLAB stellt dafur verschiedene Funktionen zur Verfugung,die wichtigsten sind filter zur Filterung eines eindimensionalen Felds und filter2fur zweidimensionale Felder. Die Verfahren berechnen die Faltung aus zwei Vektoren oderMatrizen, dem Datenfeld D und der Filterfunktion F .

So berechnet Df = filter(F,norm,D) an jedem Punkt des Ergebnis-Feldes Df die mitF gewichtete und mit norm normierte Summe der Werte des Ausgangsfeldes D, die inder Umgebung dieses Punktes liegen

Df(n) =D(n)F (1) + D(n − 1)F (2) + . . . + D(n − m + 1)F (m)

norm(6.1)

=m∑

k=1

D(n − k + 1)F (k)norm

. (6.2)

Den Mittelwert aus jeweils 5 benachbarten Datenpunkten wurde man demnach durch dieAnwendung der Filterfunktion F = ones(1,5) und norm = 5 bzw. norm = sum(F)erhalten.

21Fur bestimmte Anwendungsbereiche bietet The MathWorks spezialisierte Toolboxes zu MATLAB an,so die ‘Image Processing Toolbox’ mit vielen Funktionen fur die digitale Bildbearbeitung.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 64

6.1.1 Gewichteter Mittelwert

Die oben beschriebene einfache Mittelwertbildung entspricht einer rechteckigen Filterfunk-tion. Oft ist es zweckmaßig, einen geeignet gewichteten Mittelwert zu berechnen, um naheliegende Punkte starker zu bewerten als entfernte. Die Form und Breite der konkretenFilterfunktion muss jeweils an die gewunschte Anwendung angepasst werden. In den mei-sten Fallen ist es sinnvoll, symmetrische Funktionen zu verwenden, die an ihren Randerneinigermaßen stetig verlaufen (Trapez, Dreieck, Cosinus o. a.).

Das folgende Fragment wendet eine parabelformige Filterfunktion weight auf ein ver-rauschtes Signal an:

HalfWidth = 20;linear = [-HalfWidth:HalfWidth]/HalfWidth;weight = 1 - linear.*linear;Filtered = filter(weight, sum(weight), Signal); .

Im zweiten Parameter von filter kann ein zusatzlicher Wertevektor angegeben werden,mit der vorhergehende Werte des Ergebnisvektors berucksichtigt werden konnen (Naheresdazu in der Online-Hilfe). Im obigen Fall wird nur eine Konstante zur Normierung einge-setzt.

Die Wirkung zweier unterschiedlich breiter Filterfunktionen zeigt Abbildung 44. Die ver-wendeten Filterfunktionen sind mit eingezeichnet; deutlich ist die Abhangigkeit der Glat-tungswirkung, aber auch des Informationsverlusts von der Filterbreite.

Abbildung 44: Filterung von verrausch-ten Messdaten mit Filterfunktionen un-terschiedlicher Breite. Obere Kurve:idealer Verlauf, zweite Kurve: realesMesssignal, dritte und vierte Kurve: ge-filterte Daten (Halbwertsbreite der Fil-terfunktionen: 6 bzw. 20 Punkte bei ins-gesamt 500 Datenpunkten).

Eine zweidimensionale Filterung mit filter2 ist insbesondere bei zweidimensional orts-abhangigen Messwerten interessant. Die Glattung eines Rastertunnelmikroskopbildes ver-anschaulicht Abbildung 45. Links die Originalmessung, atomare Auflosung an einer Gra-phitprobe (HOPG22) mit dem bei Einfachgeraten ublichen Rauschen. Daneben das ge-filterte Bild, als Filterfunktion wurde ein Rotationsparaboloid verwendet, dessen Basis-durchmesser in etwa dem atomaren Abstand entsprach.

22H ighly Ordered Pyrolytic Graphite

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 65

Abbildung 45: Rastertunnelmikroskopbild einer HOPG-Probe (atomare Ausflosung).Links die Originaldaten, daneben das gefilterte Bild, rechts Ausschnitte in dreidimen-sionaler Darstellung.

Besonders deutlich erkennt man die Wirkung des relativ drastischen Filters in den dreidi-mensional dargestellten Bildausschnitten rechts.

Die Konstruktion der Filterfunktion ff und ihre Anwendung auf die Bildmatrix z zeigtdas folgende Fragment:

r0 = 10;[xf,yf] = meshgrid(-r0:r0);ff = r0*r0-xf.*xf-yf.*yf;ff = ff.*(ff>0);ff = ff/sum(sum(ff));z = filter2(ff,z); .

Die Filtermatrix ff ist quadratisch, die Multiplikation mit (ff>0) in der vierten Zeilesetzt die bei der Paraboloiddefinition r2

0 − r2 entstandenen negativen Matrixelemente aufnull.

6.1.2 Gradientenfilter

Will man Daten nicht glatten, sondern bestimmte Detailinformationen verstarken, kannman dies mit speziell darauf zugeschnittenen Filtern erreichen. Mit einem einfachen Gra-dientenfilter beispielsweise lassen sich Flachen in einem Bild auf ihre Begrenzungslinienreduzieren. Das folgende Beispiel filtert ein Bild b mit einem Gradientenfilter fur vertikale(Zeilenvektor [-1,1]) und einem fur horizontale Gradienten (Spaltenvektor [-1;1]) undfasst die Ergebnisse durch eine Oder-Verknupfung zusammen:

fver = [-1,1];fhor = [-1;1];bver = abs(filter2(fver, b));bhor = abs(filter2(fhor, b));bcontour = bver | bhor; .

Abbildung 46 zeigt die Wirkung, links das Originalbild mit seinen flachenhaften Objekten,rechts das gefilterte, auf dem nur noch die Umrisse sichtbar sind.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 66

Abbildung 46: Gradientenfilter, links Original-, rechts gefiltertes Bild.

Filter dieser Art kann man dann verwenden, wenn geometrische Strukturen wie z. B.Begrenzungslinien zwischen Kristallbereichen (Domanen) automatisiert erkannt werdensollen. Man transformiert dann nach der Filterung in den Parameterraum des gesuchtengeometrischen Objekts (Hough-Transformation [30]), das Maximum dort liefert die Para-meter des gefundenen Objekts. Falls das Ausgangsbild nicht kontrastreich genug fur dasVerfahren ist, kann man sich ein Bild mit extremem Kontrast dadurch generieren, dassman alle Helligkeitswerte oberhalb eines bestimmten Grenzwerts auf 1, die darunter auf 0setzt. MATLAB erledigt das mit

HighContrast = LowContrast > Threshold; .

Darin ist LowContrast die Bildmatrix mit geringem Kontrast, Threshold der verwen-dete Grenzwert und HighContrast das resultierende Binarbild.

6.1.3 Savitzky-Golay-Filter

In Abschnitt 6.1.1 wurde beschrieben, wie man einen geeignet gewichteten Mittelwert zurGlattung von Messdaten verwenden kann. Dabei wurde auch ein gravierender Nachteildeutlich, scharfe Strukturen in Messdaten werden verbreitert. Besser einstellen lasst sichdas, wenn man statt des Mittelwerts ein Polynom geeigneter Ordnung23 verwendet, umDaten zu glatten. Das Prinzip ist in Abbildung 47 dargestellt.

Abbildung 47: Gleitender Polynomfit: Fur die Da-tenwerte in der Umgebung eines Punktes wirddas Regressions-Polynom berechnet, der Datenpunkt(großer Kreis) wird durch den Polynomwert (Raute) er-setzt.

23Der einfache Mittelwert ist ein Fit-Polynom nullter Ordnung.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 67

Das Verfahren scheint sehr aufwendig zu sein, fur jeden Datenpunkt muss ein Regressions-Polynom berechnet werden. Man kann jedoch zeigen, dass dies nicht notig ist und dassstattdessen eine geeignete Filterfunktion verwendet werden kann. Diese Art der Filterungwird nach den Autoren der ersten umfassenden Arbeit zu diesem Thema [31] – AbrahamSavitzky und Marcel J. E. Golay – benannt.

Das Regressions-Polynom fur die Umgebung des Datenpunktes i sei definiert durch

pi(x) =M∑

k=0

Bk (x − xi)k . (6.3)

Die Polynomkoeffizienten Bk ergeben sich aus der Minimalisierung der Summe der Ab-standsquadrate (least squares fit)

Di =i+nR∑

j=i−nL

(pi(xj) − yj)2!= Min. (6.4)

Dabei wurde angenommen, dass das Polynom fur nL linksseitige und nR rechtsseitigezusatzliche Punkte berechnet wird. Das Minimum wird dadurch bestimmt, dass man diepartiellen Ableitungen nach allen Bm berechnet und zu Null setzt

∂Di

∂Bm= 0 , m = 0 . . . M . (6.5)

Bei Messdaten kann man als Vereinfachung fast immer annehmen, dass die Datenpunkteaquidistant sind

xj − xi = (j − i)Δx , j − i = n , n = −nL . . . 0 . . . nR . (6.6)

Damit wird dann aus Gleichung 6.3

pi(xj) =M∑

k=0

BknkΔxk =

M∑k=0

bknk , n = j − i . (6.7)

Die partiellen Ableitungen (Gl. 6.5) liefern M + 1 Gleichungen ahnlicher Struktur

nR∑n=−nL

nm

(M∑

k=0

bknk − yi+n

)= 0 , m = 0 . . . M , (6.8)

nR∑n=−nL

nmM∑

k=0

bknk =

nR∑n=−nL

nmyi+n . (6.9)

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 68

Das lineare Gleichungssystem 6.9 fur die bk konnte nun mit den ublichen Methoden gelostwerden. Das musste fur jeden Datenpunkt i gemacht werden.

Zur weiteren formalen Betrachtung schreibt man das lineare Gleichungssystem 6.9 in Ma-trixschreibweise:

⎛⎜⎜⎜⎝

(−nL)M · · · nMR

.... . .

...−nL · · · nR

1 · · · 1

⎞⎟⎟⎟⎠⎛⎜⎝

(−nL)M · · · −nL 1...

. . ....

...nM

R · · · nR 1

⎞⎟⎠⎛⎜⎝

bM...b0

⎞⎟⎠ =

=

⎛⎜⎜⎜⎝

(−nL)M · · · nMR

.... . .

...−nL · · · nR

1 · · · 1

⎞⎟⎟⎟⎠⎛⎜⎝

yi−nL

...yi+nR

⎞⎟⎠ .

(6.10)

Man sieht, dass die ersten beiden Matrizen zueinander transponiert sind, mit

A =

⎛⎜⎝

(−nL)M · · · −nL 1...

. . ....

...nM

R · · · nR 1

⎞⎟⎠ , AT =

⎛⎜⎜⎜⎝

(−nL)M · · · nMR

.... . .

...−nL · · · nR

1 · · · 1

⎞⎟⎟⎟⎠ (6.11)

und b =

⎛⎜⎝

bM...b0

⎞⎟⎠ sowie y =

⎛⎜⎝

yi−nL

...yi+nR

⎞⎟⎠ (6.12)

vereinfacht sich die Schreibweise deutlich:

AT A b = AT y . (6.13)

A ist eine Rechteckmatrix mit M +1 Spalten und nL +nR +1 Zeilen. Jede Rechteckmatrixlasst sich in eine Orthogonalmatrix Q und eine rechte Dreiecksmatrix R aufspalten (QR-Zerlegung):

A = Q R und AT = (Q R)T = RT QT , (6.14)

und mitAT A = RT QT Q R = RT I R = RT R (6.15)

erhalt man schließlichR b = QT y . (6.16)

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 69

Der Polynomwert am Punkt xj = xi(n = 0) ist b0, er ergibt sich durch Multiplikation

b0 =QT (M + 1, :)

R(M + 1, M + 1)y . (6.17)

Die Matrix A ist unabhangig von den Datenwerten yj , damit sind dies auch die MatrizenQ und R. Die Polynomwerte ergeben sich durch eine gleitende Multiplikation (Filterung)mir einer festen Filterfunktion F0, die Filterkoeffizienten mussen nur einmal berechnetwerden

F0 =QT (M + 1, :)

R(M + 1, M + 1)=

Q(:, M + 1)R(M + 1, M + 1)

. (6.18)

Entsprechend kann man Ableitungen berechnen, so ist die erste Ableitung am Punktxj = xi durch den Polynomkoeffizienten b1 gegeben, die Filterkoeffizienten dafur sind

F1 =Q(:, M) − F0R(M, M + 1)

R(M, M). (6.19)

Die konkrete Berechnung der Koeffizienten war zur Zeit der Originalarbeit von Savitzkyund Golay noch etwas aufwandig, der großte Teil der Veroffentlichung besteht daher ausden tabellierten Filterkoeffizienten fur verschiedene Polynomordnungen und unterschied-liche Anzahl von Stutzpunkten. Abbildung 48 zeigt ein Beispiel einer solchen Tabelle.

Das Arbeiten mit solchen Tabellenwerten ist relativ fehleranfallig (schon in der anscheinendcomputergenerierten obigen Tabelle ist mindestens ein Zahlenwert falsch). Besser ist es,die Filterkoeffizienten dann zu berechnen, wenn sie gebraucht werden. Matlab kennt dieQR-Zerlegung, dafur ist die Funktion qr zustandig, man muss mithin nur die Matrix Adefinieren [32].

Die folgende Matlab-Funktion berechnet die benotigten Filterkoeffizienten fur die Datenund die erste Ableitung, Polynomordnung M und Zahl der links- und rechtsseitigen PunktenL und nR werden vorgegeben:

function [F0,F1,F2] = savgol(nl,nr,M)% coefficients for Savitzky-Golay fits% F0: smooth curve, F1/F2: derivatives% nl/nr: number of left/right points% M: polynomial order

A = ones(nl+nr+1,M+1);for j = M:-1:1,

A(:,j) = [-nl:nr]’.*A(:,j+1);end;[Q,R] = qr(A);F0 = Q(:,M+1)/R(M+1,M+1);

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 70

Abbildung 48: Tabelle der Filterkoeffizienten fur einen gleitenden Polynomfit zweiter Ord-nung und unterschiedliche Anzahl von Stutzpunkten (aus der Originalarbeit [31]).

F1 = (Q(:,M)-F0*R(M,M+1))/R(M,M);F2 = (Q(:,M-1)-F0*R(M-1,M+1)-F1*R(M-1,M))/R(M-1,M-1);

Das folgende Skript zeigt die Anwendung auf ein Datenfeld y:

nl = 15;nr = 15;M = 6;F0 = savgol(nl,nr,M);sgy = filter(F0(nl+nr+1:-1:1),1,y);sgy(1:nl) = y(1:nl);sgy(1+nl:end-nr) = sgy(1+nl+nr:end);sgy(end-nr+1:end) = y(end-nr+1:end);

Die Funktion filter arbeitet ruckwarts gewandt, daher ist das Filter-Array F0 ge-spiegelt zu verwenden. Außerdem mussen die Daten um die rechtsseitige Breite des Fil-ters verschoben werden, um wieder zu den ursprunglichen Abszissenwerten zu passen. Zuuberlegen ist auch, wie man die Randbereiche behandelt, im obigen Fragment wurden dortdie Ausgangsdaten y eingesetzt.

Abbildung 49 zeigt die Anwendung von Savitzky-Golay-Filtern unterschiedlicher Ordnungauf ein verrauschtes Datenfeld im Vergleich zur einfachen Mittelung.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 71

Abbildung 49: Einfache Mittelwertbildung (links) und Savitzky-Golay-Filterung zweiter(Mitte) und sechster Ordnung (rechts) bei Daten mit unterschiedlich breiten Strukturen.Grau: ursprungliche Daten, schwarz: gefilterte Daten, Filterbreite jeweils gleich (nL =nR = 15).

6.2 Interpolation

Interpolationsverfahren werden dann verwendet, wenn man Zwischenwerte zwischen be-nachbarten Datenwerten benotigt. Dies ist unter anderem dann erforderlich, wenn in ver-wendeten Eichtabellen der erforderliche Wert nicht exakt reprasentiert ist. So enthaltenTabellen uber Thermospannungen von Thermoelementen, die man zur Temperaturmes-sung verwendet, deren Werte nicht beliebig dicht, sondern mit irgendeiner praktikablenSchrittweite, z. B. in 10-K-Abstanden, Werte dazwischen muss man geeignet interpolieren.Oft sind auch Messdaten nicht in der gewunschten Fulle gemessen worden; um dem Be-trachter dennoch einen ‘vollstandigen’ Eindruck zu vermitteln, zeichnet man interpolierteKurven.

Zur Realisierung der Interpolation stellt MATLAB ein Reihe von Funktionen mit jeweilsahnlicher Signatur zur Verfugung.Die Anweisung

VI = interpN(X1,..,XN,V,XI1,..,XIN)

mit N = 1,2,3,n interpoliert die Ausgabewerte VI N-dimensional zwischen den Tabel-lenwerten V. V ist an den Koordinaten X1..XN vorgegeben, VI wird an den KoordinatenXI1..XIN berechnet.

Als weiterer Parameter kann (und sollte) die Interpolationsstrategie angegeben werden,moglich sind die folgenden Verfahren:

’nearest’: Zielwert wird auf den Wert des nachstliegenden Tabellenwerts gesetzt. Funk-tionswerte sind unstetig.

’linear’: Lineare Interpolation zwischen benachbarten Werten, die Funktionswerte sindstetig.

’cubic’: Kubische Interpolation, Funktionswerte und erste Ableitung stetig.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 72

’spline’: Spline-Interpolation, Stetigkeit der Funktionswerte sowie der ersten und zwei-ten Ableitung.

Die Ergebnisse der verschiedenen Interpolationsverfahren hangen von der Art der zu in-terpolierenden Funktion bzw. der zu interpolierenden Messdaten ab. Die Abbildungen 50und 51 veranschaulichen dies an zwei relativ extremen Beispielen: In Abbildung 50 wirdeine in den Funktionswerten und Ableitungen stetige Sinusfunktion interpoliert, in Abbil-dung 51 eine Rechteckfunktion mit ausgepragten Unstetigkeiten. Die Messwerte (X,V) wer-den durch die Punkte, die interpolierten Werte (XI,VI) durch die Kurven reprasentiert.Dieinterpolierte Funktionswerte wurden mit

VI = interp1(X,V,XI,’Strategy’);

berechnet, fur Strategy wurden die angegebenen Verfahren eingesetzt.

nearest linear cubic spline

Abbildung 50: Wirkung verschiedener Interpolationsstrategien bei einer stetigen Funktion(Sinus).

nearest linear cubic spline

Abbildung 51: Wirkung verschiedener Interpolationsstrategien bei einer Funktion mit Un-stetigkeitsstellen (Rechteck).

Der Vergleich zeigt, dass bei einer in den Werten und in den Ableitungen stetigen Funktion(Sinus) die Interpolation mit Splines sehr gut ist. Die kubische Interpolation ist ein guterKompromiss, wenn Unklarheit uber die Stetigkeit herrscht. Die nearest-Strategie ist dannanzuwenden, wenn Zwischenwerte nicht sinnvoll, nicht moglich oder nicht erwunscht sind.Dass sich auch die Rechenzeiten fur die unterschiedlichen Verfahren betrachtlich voneinan-der unterscheiden, ist offensichtlich; dies kann insbesondere bei sehr großen Datenfeldernein zusatzliches Kriterium sein.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 73

6.3 Fouriertransformation

Messdaten, insbesondere elektrische Signale, werden meist in Abhangigkeit von der Zeit ge-messen. Periodizitaten darin zeigen charakteristische Frequenzen an. Einem zeitabhangigstreng periodischen Verlauf entspricht eine einzelne Frequenz, ein Punkt im Frequenzspek-trum. Umgekehrt entspricht einem zeitlich einmaligen Ereignis ein Frequenzkontinuum.Die beiden Koordinaten – Zeit und Frequenz – sind zueinander komplementar.24 Zwischensolchen komplementaren Darstellungen vermittelt die Fouriertransformation. Naturgemaßspielt bei Messdaten nur die endliche diskrete Fouriertransformation eine Rolle. Zwischenden beiden komplementaren Bereichen kann man Daten beliebig hin und her transformie-ren, jeweils die fur einen bestimmten Zweck sinnvollere oder nutzlichere Darstellungsformwahlen.

Zur Berechnung der diskreten Fouriertransformation enthalt MATLAB die Funktionenfft, fft2 und fftn, sowie deren inverse ifft, ifft2 und ifftn zur Rucktransfor-mation. Die eindimensionalen Formen berechnen die Transformation in einer Dimension,auch wenn die Variable eine Matrix ist (spaltenweise bzw. in der ersten nicht singularenDimension). Die zwei- und die mehrdimensionalen Formen rechnen entsprechend in zweioder allen Dimensionen.

Zu den Anwendungsbereichen der Fouriertransformation gehort die Frequenzanalyse unddie Datenfilterung, dazu je ein Beispiel.

6.3.1 Frequenzanalyse

Die Fouriertransformierten von streng periodischen Funktionen sind Deltafunktionen imdazu jeweils reziproken Raum. Einer zeitlich periodische Funktion entspricht mithin einPunkt im (komplexen) Frequenzraum. Es liegt daher nahe, periodische Messdaten zu trans-formieren und in ihrer Frequenzdarstellung zu analysieren. Abbildung 52 zeigt als Beispieldie zu zwei verschiedenen Wahltasten – 1 und 5 – gehorenden Tone eines Telefons25. Inder zeitlichen Auftragung ist der Unterschied nur schwer zu erkennen (linkes Bild), nachder Fouriertransformation wird die Analyse einfach (rechtes Bild).

Wie zu erwarten sind keine idealen Deltafunktionen entstanden. Die Breite der Spektralli-nien entspricht der reziproken Messzeit, die hier auf 50 ms begrenzte Messzeit verursachteine Breite von 20 Hz in der Frequenzauftragung. Ideale Deltafunktionen waren nur durchunendlich lange Messzeiten zu erreichen.

Ein zweiter bei der Fouriertransormation auftretender Effekt ist in Abbildung 52 eben-falls erkennbar: unterschiedliche Linienformen, Restintensitat neben den Linien. Hier zwarnicht sonderlich storend, da die Intensitaten der Messsignale deutlich großer sind, kann

24Ein ahnlich komplementares Paar in der Physik ist beispielsweise Ort und Raumfrequenz.25Bei der Tastenmatrix am Telefon sind Reihen und Spalten mit festen Frequenzen kodiert, die Reihen

mit 697, 770, 852 und 941 Hz, die Spalten mit 1209, 1336 und 1477 Hz. Beim Tastendruck werden diebeiden zugehorigen Frequenzen als Ton ubertragen.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 74

0 10 20 30 40Zeit [ms]

0 500 1000 1500Frequenz [Hz]

Abbildung 52: Wahltone 1 und 5 am Telefon: Links die zeitliche Auftragung der Ampli-tuden (Oszilloskop), unten 1 , oben 5 , rechts die Absolutwerte der Fouriertransformier-ten, durchgehende Linie: 1 , gestrichelt: 5 .

diese Untergrundintensitat dann Probleme machen, wenn Signale analysiert werden sol-len, die verschiedene Frequenzanteile mit sehr unterschiedlichen Intensitaten enthalten.Der Untergrund wird von dem stufenartigen Verlauf der Messdaten am Beginn und Endeder Messung hervorgerufen, die zusatzliche Frequenzen im Spektrum verursachen. Manvermeidet den Effekt bei der Fourieranalyse dadurch, dass man das zu analysierende Si-gnal zuvor mit einer geeigneten Fensterfunktion multipliziert, die an den Endpunkten ganzoder nahezu verschwindet. Zur Realisierung verwendet man u. a. Dreiecks-, Trapez-, Cosi-nus-, Parabel- oder Gaußfunktionen. Das Verfahren hat als Nebeneffekt immer eine leichteVerbreiterung der Strukturen im Spektrum zur Folge, da durch die geringere Gewichtungder Randpunkte die effektive Messzeit verringert wird.

Die Anwendung auf das vorliegende Beispiel zeigt Abbildung 53. Es wird eine cosinusformigeFensterfunktion verwendet, im linken Bild als graue Kurve dargestellt. Die Wirkung istdeutlich, im Spektrum ist keine Untergrundintensitat mehr enthalten, die Form der Spek-trallinien ist nahezu identisch geworden.

Macht man die Fensterfunktion schmaler, verkurzt damit die effektive Messzeit, so verliertman Information, die spektralen Strukturen werden breiter (Abbildung 54).

6.3.2 Datenfilterung

Außer zur Analyse von Messdaten kann man die Fouriertransformation auch dazu verwen-den, Messdaten gezielt zu verandern. Ein Anwendungsbereich ist die Filterung von Daten,sofern es darum geht, Signale bestimmter Frequenzen oder ganzer Frequenzbereiche inMessdaten zu manipulieren. Man transformiert dazu den gesamten Datensatz, macht imFourierspektrum die gewunschten Veranderungen und transformiert anschließend mit der

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 75

0 10 20 30 40Zeit [ms]

0 500 1000 1500Frequenz [Hz]

Abbildung 53: Wirkung einer Fensterfunktion bei der Fouriertransformation: Links diemit der cosinusformigen Funktion multiplizierten Messdaten, rechts die untergrundfreienSpektren.

0 10 20 30 40Zeit [ms]

0 500 1000 1500Frequenz [Hz]

Abbildung 54: Verkurzung der effektiven Messzeit durch eine schmalere Fensterfunktion,die Spektrallinien verbreitern sich.

inversen Fouriertransformation wieder zuruck.

Die Abbildung 55 zeigt als idealisiertes Anwendungsbeispiel Messdaten, denen eine inten-sive periodische Storung uberlagert ist26. Eine herkommliche Filterung (vgl. 6.1) wirkterst dann zufriedenstellend, wenn eine relativ breite Filterfunktion verwendet wird. Dannsind aber auch die Strukturen in den Messdaten deutlich verbreitert.

Abbildung 56 zeigt die Wirkung einer Fourierfilterung. Vor der Fouriertransformation26Storungen dieser Art konnen beispielsweise durch die Netzwechselspannung (50 oder 100 Hz) verur-

sacht werden. Die Frequenz muss dabei nicht unbedingt der Storfrequenz entsprechen, sondern kann durchSchwebungseffekte zwischen Messtakt und Storfrequenz auch in vollig andere Bereiche verschoben sein.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 76

Abbildung 55: Messdaten mit eineruberlagerten periodischen Storung: obendie ungestorten Daten, darunter mitStorung. Die beiden unteren Kurven zei-gen das Ergebnis der in Kapitel 6.1beschriebenen herkommlichen Filterungder Daten mit unterschiedlich brei-ten Filterfunktionen (vgl. auch Abbil-dung 44).

werden die Messdaten mit einer Fensterfunktion multipliziert, im linken Bild als graueKurve dargestellt. In diesem Fall wird eine Trapezfunktion verwendet, die so gewahlt wird,dass sie im interessierenden Bereich der Messdaten konstant ist. Dadurch ist gewahrleistet,dass die Intensitatsverhaltnisse dort die Transformationen ungeandert uberstehen.

Das rechte Bild (obere Kurve) zeigt das Ergebnis der Fouriertransformation (fft), dieStorfrequenz wird durch die beiden intensiven Linien reprasentiert. Zur Unterdruckungder Storung wird im Fourierraum mit einer Funktion multipliziert, die zwischen 0 (imBereich der Linien) und 1 (außerhalb davon) variiert (graue Kurve im rechten Bild). Auchhier wird eine trapezartige Funktion gewahlt, damit keine abrupten Ubergange entstehen.Diese wurden bei der Rucktransformation zu storenden Artefakten fuhren. Die untereKurve im rechten Bild zeigt das Ergebnis der Multiplikation. Die Rucktransformation(inverse Funktion ifft) ergibt dann ein fast storungsfreies Ergebnis (untere Kurve im

Abbildung 56: Fourierfilterung von Messdaten mit periodischer Storung. Links oben dieDaten ohne und mit Storung, darunter die verwendete Fensterfunktion und die damitmultiplizierten Daten. Rechts die Fouriertransformierte und die Filterfunktion, die dieStorfrequenz unterdruckt. Rechts unten die damit multiplizierte Fouriertransformierte,links unten das Ergebnis der Rucktransformation.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 77

linken Bild). Die Strukturen in den Messdaten sind etwas breiter geworden; das lasst sichnicht verhindern, da durch die Manipulation im Fourierraum auch die Bandbreite desNutzsignals verringert wird.

6.4 Fits, Anpassung an Funktionen

Vermutet man, dass sich Messdaten durch einen mathematischen Zusammenhang beschrei-ben lassen, dann interessieren die Parameter, die die bekannte oder vermutete funktionaleAbhangigkeit bestimmen. In diesen Parametern steckt meist die physikalische Eigenschaft,die man messen will. So kann man beispielsweise die Federkonstante einer Feder dadurchbestimmen, dass man den linearen Zusammenhang zwischen Kraft und Auslenkung misst.

Man berechnet diese Parameter dadurch, dass man die Abweichung zwischen Daten undFunktionszusammenhang moglichst klein macht (man minimalisiert die Summe der Qua-drate der Differenzen – least squares fit). Besonders einfach ist das, wenn die vermuteteFunktion ein Polynom ist oder wenn die Anpassparameter in der Funktion nur linear auf-treten. Dann lasst sich das Fit-Problem exakt losen, das Minimum ergibt sich als Losungeines linearen Gleichungssystems. Ansonsten muss man mit geeigneten Iterationsverfahrenarbeiten.

6.4.1 Polynome

Fur Polynomanpassungen ist in Matlab die Funktion polyfit zustandig. Der Aufruf

P = polyfit(x, y, N);

liefert im Vektor P die Koeffizienten des Regressionspolynoms N-ter Ordnung fur denDatensatz x,y.

[P, S] = polyfit(x, y, N);

definiert eine zusatzliche Struktur S mit weiteren Informationen, die beispielsweise furdie Fehlerabschatzung nutzlich sind.

Yp = polyval(P, Xp);

berechnet die Polynomwerte an den Punkten Xp,

[Yp, dYp] = polyval(P, Xp, S);

zusatzlich Fehlergrenzen, innerhalb derer bei Daten mit einigermaßen zufalligem Fehlermindestens 50 % der Datenwerte liegen. Abbildung 57 zeigt als Beispiel fur einen Polynom-fit den einfachsten Fall, die Anpassung an eine lineare Abhangigkeit (polyfit(x,y,1)).

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 78

Abbildung 57: Regressionsgerade an zufallsverteilte Messdaten. Die Berechnung erfolgtemit polyfit. Im linken Bild zeigt die schwarze Gerade die Ausgangsfunktion, die dann mitrandn gestort wurde (Punkte), grau die Fitgerade (die leichte Abweichung deutet daraufhin, dass die Zufallszahlen nicht ganz ideal sind). Im rechten Bild ist der FehlerbereichYp-dYp. . . Yp+dYp grau hinterlegt, es wird deutlich, dass mehr als 50 % der Datenpunktein diesem Bereich liegen.

6.4.2 Parameterlineare Fits

Mit Matlab lassen sich die Anpassparameter auch immer dann besonders einfach be-stimmen, wenn sie nur linear in der funktionalen Abhangigkeit enthalten sind, mit der dieDaten gefittet werden sollen. Wenn also etwa der uber x gemessene Datensatz y mit derFunktion f(x) gefittet werden soll, die Anpassparameter ai nur in linearer Form enthalt:

y ≈ f(x) = a1f1(x) + a2f2(x) + · · · + anfn(x) . (6.20)

Die Teilfunktionen fi(x) konnen darin beliebig aufwandig sein.27

Die Messdaten x und y sind 2 Vektoren, die je m Elemente enthalten. Da beide bekannt(gemessen) sind, kann man Gleichung 6.20 als ein lineares Gleichungssystem fur die ai

auffassen. Fur m > n, den Regelfall bei der Anpassung von Messdaten, ist das Glei-chungssystem allerdings uberbestimmt.

Zur Losung linearer Gleichungssysteme hat MATLAB die Funktion mldivide, ‘left matrixdivision’, die verkurzt auch mit ‘\’ (Backslash) geschrieben werden kann. Die gleiche for-male Schreibweise kann auch verwendet werden, wenn das Gleichungssystem uberbestimmtist. MATLAB errechnet dann eine Naherungslosung, in der die quadratischen Abweichun-gen minimiert sind (least squares fit). Das ist genau das, was man benotigt.

Die Parameter ai in Gleichung 6.20 werden berechnet durch:

F = [f1(x), f2(x), . . . fn(x)]; (6.21)27Polynome sind ein einfacher Spezialfall mit f1(x) = x0, f2(x) = x1 usw.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 79

a = F\y; . (6.22)

Das Ergebnis a ist ein Vektor mit den Parametern ai.

Abbildung 58 zeigt ein Beispiel aus dem Bereich der nichtlinearen Optik, eine neue Sub-stanz wurde mit Laserimpulsen unterschiedlicher Leistung beleuchtet, das erzeugte fre-quenzverdoppelte Licht wurde gemessen. Man erwartet einen quadratischen Zusammen-hang zwischen den beiden Intensitaten I2ω und Iω:

I2ω = d2effGI2

ω . (6.23)

Neben einem Geometriefaktor G enthalt der Ausdruck die wirksame Nichtlinearitat deff ,die interessierende physikalische Große. Die Berechnung der Fitparameter erledigt dasMATLAB-Skript

data = load(’p15_2.int’);x = data(:,1);y = data(:,2);F = [ones(size(x)), x.*x];a = F\y; .

Zunachst werden die Messdaten gelesen, die als Tabelle in der Datei p15_2.int abgelegtsind, daraus werden die x- und y-Werte extrahiert. Die Funktion F besteht aus demquadratischen Anteil und einer zusatzlichen Konstanten, die eine eventuell vorhandenekonstante Untergrundintensitat berucksichtigt. Dazu ist der mit Einsen besetzte Vektorgleicher Große notig. In Abbildung 58 sind Messwerte und Anpassungskurve zusammengeplottet.

Eingangsleistung

Aus

gang

slei

stun

g

Abbildung 58: Zusammenhang zwischenLaserleistung und frequenzverdoppelterIntensitat an einer nichtlinearen Probe,Messwerte (◦) und quadratische Anpas-sung (grau).

6.4.3 Anpassung an beliebige Funktionen

Soll eine Funktion angepasst werden, die die Fitparameter in allgemeiner Form enthalt,kann das durch eine Minimalwertsuche mit der MATLAB-Funktion fminsearch erledigtwerden. Diese Funktion wendet den Simplex-Algorithmus an, um ein Minimum zu finden.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 80

Sie wird aufgerufen mit

a = fminsearch(f, a0, options, p1, p2, ...) .

Darin ist a das Ergebnis, die berechneten Parameter, f die zu minimierende Funktion,a0 Startwerte28 fur a, options einstellbare Optionen wie Genauigkeit oder Maximalzahlder Iterationen, pn weitere Variable, die an f ubergeben werden. Die Funktion f hatdie Form

d = f(a, p1, p2, ...) .

Bei der Bestimmung von Fitkurven berechnet man in f zum Beispiel die Summe derquadrierten Differenzen zwischen Messwerten und zugehorigen Funktionswerten der Fit-funktion.

Zur Veranschaulichung wieder ein einfaches Beispiel aus der Optik. Die Abhangigkeit desBrechungsindex von der Wellenlange kann mit guter Genauigkeit durch eine Summe vonResonanztermen ausgedruckt werden:

n(λ)2 = 1 +∑

i

Ai

λ−2i − λ−2 . (6.24)

Fur diese Terme sind jeweils Absorptionsubergange (Elektronen, Phononen etc.) bei denWellenlangen λi verantwortlich. Im sichtbaren Spektralbereich genugt es oft, nur einenderartigen – im Ultravioletten liegenden – Term zu berucksichtigen.

Im vorliegenden Beispiel wurden die Brechungsindizes von Benzophenon, einem optischanisotropen Material, fur die 3 Hauptpolarisationsrichtungen bei verschiedenen Wellenlan-gen gemessen. Die Wellenlangen waren durch die verwendeten Spektrallampen vorgegeben.Brechungsindizes in den Bereichen dazwischen konnte man durch geeignete Interpolationerhalten, sehr viel besser ist es jedoch, den durch physikalische Modellvorstellungen be-grundeten Funktionsverlauf anzupassen, der durch ganz wenige Parameter (in diesem Falljeweils ein Resonanzterm mit zwei Parametern fur jede der drei Polarisationsrichtungen)beschrieben werden kann.

Das MATLAB-Skript fur die Anpassungsrechnung:

function para = coeff(fname)start = [ 1e14, 2e-7 ];options = optimset(’TolX’, 1e-10, ’TolFun’, 1e-10, ...

’MaxIter’, 1e4, ’MaxFunEvals’, 1e4);data = load(fname);para = fminsearch(’devsum’, start, options, data(:,1), data(:,2)); .

Der Minimalisierungsalgorithmus wird mit Startwerten und Optionen aufgerufen, die Op-tionen werden zuvor mit optimset festgelegt (Toleranzen und Maximalzahl der Itera-tionen). An die zu minimierende Funktion devsum werden die Messdaten aus der Dateifname weitergereicht, Wellenlangen und zugehorige Brechungsindizes.

28Beim verwendeten Simplex-Verfahren ist es sehr wichtig, sinnvolle Startwerte vorzugeben, da der Al-gorithmus auch nach Auffinden eines lokalen Minimums abbricht.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 81

Die Funktion devsum berechnet die Summe der quadrierten Abstande der Messwerte vonder jeweils aktuellen Fitkurve:

function f = devsum(para, lambda, nexp)f = sum((nexp - nfit(para, lambda)).^2); .

Die Fitkurve selbst wird in einer weiteren Funktion berechnet, um sie auch fur andereZwecke (Graphik) verwenden zu konnen:

function n = nfit(para, lambda)n = sqrt(1+para(1)./((para(2))^(-2)-lambda.^(-2))); .

Die errechneten Fitkurven sind zusammen mit den Messwerten in Abbildung 59 darge-stellt. Deutlich wird hierin auch ein weiterer Vorteil von (wenigparametrigen) Fitkurvengegenuber einer Interpolation: Kleine statistische Messfehler werden weitgehend ausgemit-telt.

400 600 800 1000 1200

1.50

1.60

1.70

1.80

1.90

Wavelength [nm]

Ref

ract

ive

Inde

x

Abbildung 59: Brechungsindizes vonBenzophenon, oben na, in der Mit-te nb, unten nc. Die Punkte re-prasentieren die Messwerte, Liniendie Fitkurven.

6.5 Graphische Darstellung

Obwohl MATLAB in erster Linie fur Anwendungen in der Numerik konzipiert ist, bie-tet es auch eine Fulle von Visualisierungsfunktionen, die zur Erstellung von Graphikeneingesetzt werden konnen. Darunter sind 2D-Funktionen wie plot fur lineare 2D-Plots,loglog fur doppelt logarithmische oder semilogx und semilogy fur halblogarithmischeDarstellung und 3D-Funktionen wie plot3 fur dreidimensionale Linienplots oder surffur Flachendarstellungen.

Alle Graphik-Objekte sind in MATLAB in einer hierarchischen Objekt-Struktur angeord-net, die einzelnen Objekte sind uber ihre Handles29 zuganglich. Alle Objekteigenschaftenkonnen wahrend der Erstellung oder nachtraglich mit Hilfe der Handles fast beliebig ein-gestellt werden. So wurde beispielsweise die Kurve und die Punkte fur na in Abbildung 59konfiguriert mit:

29‘Handle Graphics’ ist ein eingetragenes Warenzeichen von The MathWorks Inc.

mdv :mdvmatlabv.tex 14. Oktober 2006

6 MATLAB II : Messdatenverarbeitung 82

hfita = plot(L, na, ’k-’);set(hfita, ’LineWidth’, 1.5);hold on;data = load(’n_a.dat’);hna = plot(1e9*data(:,1), data(:,2), ’ko’);set(hna, ’LineWidth’, 1.5);set(hna, ’MarkerSize’, 7)

Darin sind die ersten beiden Parameter in den plot-Anweisungen jeweils die Daten, ’k-’ordnet eine durchgezogene schwarze (black) Linie an, ’ko’ schwarze kreisformige Marker.Mit set werden anschließend weitere Eigenschaften festgelegt.

Eine Einfuhrung in die Graphik-Moglichkeiten von MATLAB gibt das Skriptum zu Vor-lesung ‘Graphik-Workshop’ [29], eine Fulle von Informationen findet man außerdem imMATLAB-Hilfesystem und in der Online-Hilfe unter den Einstiegspunkten help graphics,help graph2d und help graph3d.

mdv :mdvmatlabv.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 83

7 Schnittstellen und Programmierung

Die Kopplung zwischen Experiment und Steuerungs- bzw. Auswerterechner wird im allge-meinen durch Schnittstellen (Interfaces) vermittelt – Standardschnittstellen, die an prak-tisch jedem Rechner gleichartig vorhanden sind, oder aber speziellen Schnittstellenkarten,die fur bestimmte Aufgaben gebaut sind. Eigenschaften und Progammierung der Rech-nerschnittstellen sind Gegenstand dieses Kapitels, das Schwergewicht liegt dabei auf denStandardschnittstellen. Die Programmbeispiele werden in MATLAB, C/C++ oder Javaerstellt.

Programmiersprachen sind keine Weltanschauungen sondern Werkzeuge;es gibt geeignete und ungeeignete und man darf sie ungestraft wechseln.

7.1 Die serielle Schnittstelle

Serielle Verbindungen sind die vom Leitungsaufwand her einfachsten genormten 2-Punkt-Verbindungen in der DV-Technik. Ursprunglich sind sie fur langsame, zeichenorientierteDatenubertragung zwischen Fernschreibern oder zwischen Rechner und Terminal konzi-piert. Am PC ist meist zumindest eine serielle Schnittstelle vorhanden, an die Peripherie-gerate wie Maus, Modem, Plotter, (serielle) Drucker, Datenerfassungsgerate oder auch einanderer Rechner angeschlossen werden konnen.

7.1.1 Grundlagen und Schnittstellennorm

Damit Gerate verschiedener Hersteller ohne weitere Anpassungsarbeit miteinander kom-munizieren konnen, mussen alle relevanten Parameter herstellerubergreifend festgelegtsein. Fur serielle Verbindungen sind mehrere Normen definiert, die sich in der Hardware-auslegung unterscheiden. Je nach Norm sind unterschiedliche Maximalentfernungen undMaximalubertragungsgeschwindigkeiten moglich. In der zur Zeit gebrauchlichsten Norm(USA: RS 232 C, D: DIN 66020, 66022, Europa: CCITT V24)30, die auch bei der PC-Schnittstelle verwendet wird, sind unter anderem die folgenden Parameter vereinbart:

• Der High-Pegel einer Leitung liegt zwischen +3 und +15 Volt, der Low-Pegel zwi-schen -3 und -15 Volt.

• Daten werden in negativer Logik (1 = Low-Pegel), Steuersignale in positiver Logik(True, aktiv = High-Pegel) ubertragen.

• Der Ruhezustand der Datenleitung ist logisch 1. Bei der asynchronen Ubertragungwerden Zeichen einzeln ubertragen, die einzelnen Bits eines Zeichens in Folge. Jedes

30Die Nummern der Normblatter werden haufig auch zur Bezeichnung der Schnittstelle verwendet: RS-232-Interface, V24-Schnittstelle.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 84

Bit hat die gleiche zeitliche Lange. Die Ubertragung wird durch ein auf logisch0 gesetztes Bit, das Startbit, eingeleitet, dann folgen die Datenbits in steigenderWertigkeit, danach eventuell ein Paritatsbit P, am Ende mindestens 1–2 Bits logisch1 (Stopbits, = Ruhezustand der Leitung).

0

1Start 0 1 n-1 P Stop Start

Die Zeichenlange (Wortlange) n liegt zwischen 5 (Fernschreiber) und 8 Bit (8 BitASCII31).

• Die Ubertragungsgeschwindigkeit, das ist die Zahl der ubertragenen Bits pro Se-kunde32, muss zwischen Sender und Empfanger vereinbart werden, damit sich derEmpfanger nach dem Startbit auf die ankommende Bitfolge synchronisieren kann.Ublich sind 75 · 2N bit/sec mit N = 0 · · · 9, d. h. 75, 150, 300, . . . 9600, 19200, 38400bit/sec, in Sonderfallen werden aber auch andere Ubertragungsgeschwindigkeiteneingestellt33.

• Neben den beiden Datenleitungen fur Senden (TxD) und Empfangen (RxD) sindeinige Steuerleitungen definiert, die anzeigen, ob das betreffende Gerat eingeschaltetist (DSR, DTR), empfangsbereit ist (CTS, RTS), die Leitung in Ordnung ist (DCD)oder ein Anruf angekommen ist (RI). Ein Teil dieser Leitungen ist fur den Modem-Betrieb und damit die Datenfernubertragung gedacht, im lokalen Betrieb konnen siezur Datenflusssteuerung (Quittungsbetrieb) benutzt werden.

• Als Steckverbindungen wurden bis vor einigen Jahren 25-polige D-Stecker und -Buchsen benutzt, bei neueren PCs fast ausschließlich 9-polige, auf Spezialkartenteilweise auch kleinere. Die Steckerbelegung ist davon abhangig, ob es sich um einDatenendgerat (DTE, Data Terminal Equipment) oder um ein Modem-artiges Gerat(DCE, Date Communication Equipment) handelt. PCs fungieren immer als DTE-Gerate, die Steckerbelegung dafur ist in Tabelle 3 angegeben. Bei DCE-Geraten istdie Signalrichtung (Ein/Aus) komplementar.

Verbindungskabel zwischen einem DTE- und einem DCE-Gerat verbinden jeweilsgleiche Pin-Nummern, bei Kabeln zwischen 2 DTE-Geraten (z. B. zwischen PCund Plotter) mussen die sich entsprechenden Pins (RxD↔TxD, CTS↔RTS) jeweils‘gekreuzt’ verbunden werden(Abbildung 60). Oft genugen zum Anschluss die Daten-leitungen und Masse, teilweise werden die Steuerleitungen zur Datenflusskontrollebenutzt.

31ASCII = American Standard Code for Information Interchange32Fur bit/sec ist die Einheit Baud gebrauchlich, die Ubertragungsgeschwindigkeit wird oft als Baud-Rate

bezeichnet.33Moderne Bausteine konnen mit Ubertragungsraten bis zu 1 MBaud betrieben werden.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 85

Pin Pin Ein/ Signal9-pol. 25-p. Aus

1 8 E DCD, Data Carrier Detected, Leitung in Ordnung

2 3 E RxD, Receive Data, Dateneingang

3 2 A TxD, Transmit Data, Datenausgang

4 20 A DTR, Data Terminal Ready, Terminal betriebsbereit

5 7 GND, Signal Ground, Masseanschluss

6 6 E DSR, Data Set Ready, externes Gerat betriebsbereit

7 4 A RTS, Request To Send, Sendeanforderung zum externen Gerat

8 5 E CTS, Clear To Send, Sendeanforderung vom externen Gerat

9 22 E RI, Ring Indicator, Wahlsignal vom MODEM

Tabelle 3: Steckerbelegung der seriellen Schnittstelle im PC

Abbildung 60: Die wichtigsten Kabeltypen fur serielle Verbindungen vom PC zu einemPeripheriegerat, Pinbelegungen fur 9-polige Stecker bzw. Buchsen. Von links: Volle DTE-DCE-Verbindung (Rechner�Modem), DTE-DCE ohne Steuerleitungen, volle DTE-DTE-Verbindung (Nullmodemkabel zwischen zwei PCs), DTE-DTE ohne Steuerleitungen.

7.1.2 Quittungsbetrieb

Werden die Daten uber eine serielle Leitung potentiell schneller ubertragen, als sie voneinem der Teilnehmer verarbeitet werden konnen (Drucker, Plotter), muss eine Moglichkeitvorgesehen werden, den Datenfluss zu steuern (Quittungsbetrieb, Handshake). Zwei Artender Datenflusssteuerung werden uberwiegend verwendet:

• Beim ‘Hardware-Handshake’ wird durch den Status der Steuerleitungen mitgeteilt,ob ein Gerat empfangsbereit ist. Die meisten Gerate benutzen zu diesem Zweckdie CTS- bzw. RTS-Leitung (CTS-RTS-Handshake). Das Sendergerat muss vor derAusgabe jedes einzelnen Zeichens den Steuerleitungsstatus uberprufen und gegebe-nenfalls den ‘Aktiv’-Zustand der Handshake-Steuerleitung abwarten.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 86

• Beim ‘Software-Handshake’ (auch XON-XOFF-Handshake) sind zwei Zeichen verein-bart, die vom Empfangergerat zum Stop und zur Wiederaufnahme der Ubertragungans Sendergerat geschickt werden. Gestoppt wird mit ‘XOFF’ (meist CTRL-S), wie-dergestartet mit ‘XON’ (meist CTRL-Q). Das Sendergerat sollte insbesondere aufXOFF prompt reagieren, d. h. die Datenausgabe sofort anhalten.

Bei der Ubertragung von großeren Datenmengen zwischen Rechnern ist es oft sinnvoll,im Blockbetrieb zu arbeiten. Dabei bildet das Sendergerat nach einem vereinbarten Algo-rithmus einen Block aus einer bestimmten Anzahl von Zeichen, der zusammen mit einerPrufsumme verschickt wird. Der Empfanger pruft den Block anhand der Prufsumme aufRichtigkeit und quittiert positiv oder negativ. Bei negativer Quittung wird der Block noch-mals geschickt. Auf diese Weise lasst sich eine hohe Datensicherheit erreichen. Die mei-sten klassischen Datenubertragungsprogramme arbeiten mit solchen ‘Protokollen’ (Ker-mit, Crosstalk, X-Modem, . . . ).

7.1.3 Andere Ubertragungsnormen

Die RS 232 C-Schnittstellen-Norm ist relativ alt und ursprunglich fur niedrige Ubertra-gungsraten konzipiert. Laut Spezifikation ist sie fur Leitungslangen bis zu 15 m und furUbertragungsraten bis zu 20 kbit/s ausgelegt. Inzwischen sind deutlich hohere Ubertra-gungsraten moglich und gebrauchlich (MODEMs, Rechner-Rechner-Kopplung). Neben derRS 232 C existieren zwei wesentlich leistungsfahigere Normen, die allerdings im PC-Bereichwenig verwendet werden.

Die Norm RS 423 A definiert eine unsymmetrische Schnittstelle, bei der die Datenuber-tragung uber ein (mit dem Wellenwiderstand) abgeschlossenes Koaxialkabel erfolgt. Diemaximale Ubertragungsrate ist 300 kbit/s, die maximale Leitungslange 600 m.

Die Norm RS 422 A benutzt symmetrische Leitungstreiber und -empfanger und abge-schlossene, verdrillte Zweidrahtleitungen. Die maximale Leitungslange ist 1200 m, die ma-ximale Ubertragungsrate 2 Mbit/s (bei dann allerdings verringerter Leitungslange vonmax. 60 m).

Noch hohere Ubertragungsraten sind durch Lichtleiterverbindungen, großere Ubertra-gungsstrecken durch Modulationsverfahren (Telefon-Modem) oder uber die einschlagigendigitalen Postdienste (Datex-P, ISDN, DSL) realisierbar.

Fur alle Normen sind Treiberbausteine verfugbar, die eine Umsetzung des vom Schnitt-stellenbaustein generierten TTL-Signals auf die Norm-Signale vornehmen.

7.1.4 Programmierung unter Windows

Bis vor einigen Jahren konnte die serielle Schnittstelle des PC mit akzeptabler Geschwin-digkeit nur durch direkte Programmierung der Schnittstellenbausteine betrieben werden.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 87

Zum einen lag das an der beschrankten Funktionalitat der Bausteine, zum andern an denwenig leistungsfahigen Betriebssystemfunktionen. Beides hat sich deutlich geandert: in derEntwicklung von den ‘klassischen’ ICs 8250 und 16450 zum 16550 bzw. Multifunktions-bausteinen mit integriertem 16550 wurde der Zeichenpuffer im Baustein vergroßert, undmoderne Betriebssysteme wie Windows 32 bieten alle zum Betrieb notwendigen Funktio-nen. Direkte Portprogrammierung [33] ist daher nicht mehr sinnvoll.

Vom Betriebssystem wird die serielle Schnittstelle logisch wie eine Datei gehandhabt, diegelesen und geschrieben werden kann. Folglich muss zunachst ein Datei-Objekt angelegtwerden, um die Eigenschaften der Schnittstelle einstellen zu konnen. Unter Win32 gibt esdafur die Funktion CreateFile:

HANDLE hCOM = CreateFile("COM1:", 0, 0, NULL, OPEN_EXISTING, 0, NULL); .

Danach konnen mit den Methoden ReadFile und WriteFile Datenblocke von derSchnittstelle gelesen bzw. zur Schnittstelle geschickt werden, mit CloseHandle wird dieSchnittstelle wieder freigegeben.

Die Schnittstellenparameter sind in einem im Betriebssystem vorgehaltenen umfangreichenBit-Feld, dem Device Control Block, definiert:

typedef struct _DCB { // dcbDWORD DCBlength; // sizeof(DCB)DWORD BaudRate; // current baud rateDWORD fBinary: 1; // binary mode, no EOF checkDWORD fParity: 1; // enable parity checkingDWORD fOutxCtsFlow:1; // CTS output flow controlDWORD fOutxDsrFlow:1; // DSR output flow controlDWORD fDtrControl:2; // DTR flow control typeDWORD fDsrSensitivity:1; // DSR sensitivityDWORD fTXContinueOnXoff:1; // XOFF continues TxDWORD fOutX: 1; // XON/XOFF out flow controlDWORD fInX: 1; // XON/XOFF in flow controlDWORD fErrorChar: 1; // enable error replacementDWORD fNull: 1; // enable null strippingDWORD fRtsControl:2; // RTS flow controlDWORD fAbortOnError:1; // abort reads/writes on errorDWORD fDummy2:17; // reservedWORD wReserved; // not currently usedWORD XonLim; // transmit XON thresholdWORD XoffLim; // transmit XOFF thresholdBYTE ByteSize; // number of bits/byte, 4-8BYTE Parity; // 0-4=no,odd,even,mark,spaceBYTE StopBits; // 0,1,2 = 1, 1.5, 2char XonChar; // Tx and Rx XON characterchar XoffChar; // Tx and Rx XOFF character

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 88

char ErrorChar; // error replacement characterchar EofChar; // end of input characterchar EvtChar; // received event characterWORD wReserved1; // reserved; do not use

} DCB;

Die Bedeutung der einzelnen Komponenten sowie vordefinierte Konstanten fur die Zuwei-sung von Werten sind z. B. in der Online-Hilfe zu Visual C++ ausfuhrlich beschrieben(suchen unter ‘DCB’).

Um Einstellungen zu andern, wird der Device Control Block kopiert, geandert und an-schließend wieder zuruckkopiert, etwa so:

DCB dcb;GetCommState ( hCOM, &dcb );dcb.BaudRate = CBR_38400; // set to 38400 Baud...SetCommState ( hCOM, &dcb );

Durch eine entsprechende Kontrollstruktur wird das Verhalten der Schnittstelle bei Zeit-uberschreitung (Timeout) definiert (Online-Hilfe unter ‘COMMTIMEOUTS’):

typedef struct _COMMTIMEOUTS { // ctmoDWORD ReadIntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutConstant;DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutConstant;

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

Anderungen ahnlich wie oben durch:

COMMTIMEOUTS ctmo;GetCommTimeouts ( hCOM, &ctmo );ctmo.ReadIntervalTimeout = 100; // allow 100 msec between... // arriving charactersSetCommTimeouts ( hCOM, &ctmo );

Zusatzlich zu dieser umfassenden Art der Schnittstellenprogrammierung gibt es verein-fachte Funktionen, um die Ausgangsleitungen der Schnittstelle statisch zu setzen:

BOOL SetCommBreak ( HANDLE hFile ); // handle of comm. deviceBOOL ClearCommBreak ( HANDLE hFile ); // handle of comm. device

setzen die Datenleitung auf logisch 0 bzw. logisch 1.

BOOL EscapeCommFunction ( HANDLE hFile, // handle of comm. deviceDWORD dwFunc ); // function to perform

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 89

mit dwFunc = SETRTS, CLRRTS, SETDTR, CLRDTR, ... setzt die Quittungsleitungen indefinierte Zustande.

Mit diesen Funktionen konnen die Ausgangsleitungen der Schnittstelle relativ einfach zurSteuerung von primitiven Geraten genutzt werden, beispielsweise wie in folgendem Pro-grammfragment zum Schalten eines Halbleiterrelais:

void CAnyDlg::SwitchOn(){ EscapeCommFunction ( hCOM, SETRTS ); };

void CAnyDlg::SwitchOff(){ EscapeCommFunction ( hCOM, CLRRTS ); };

Neben den bisher beschriebenen Funktionen gibt es eine Anzahl weiterer, die dazu dienen,die serielle Schnittstelle ereignisgesteuert zu verwenden (SetCommMask, WaitCommEvent,. . . ). Da sie im Umfeld der Messdatenerfassung relativ selten benotigt werden, sollen siehier nicht naher diskutiert werden (sie sind in der Online-Hilfe ausfuhrlich dokumentiert).

7.1.5 C++ und Microsoft Foundation Classes

Objektorientiert in C++ kann man die Schnittstelle – z. B. unter Visual-C++ – program-mieren, wenn man die Klassenbibliothek der Microsoft Foundation Classes verwendet.Man konstruiert ein CFile-Objekt, etwa

CFile SerialLine ( "COM1:", CFile::modeReadWrite ); ,

dessen Methoden Read und Write dann zur Ein- und Ausgabe von Datenblockenaufgerufen werden.

Die zum Zugriff auf den Device Control Block und die Timeout-Struktur benotigte Handleist in der Klasse CFile als Variable definiert:

HANDLE hCOM = SerialLine.m_hFile .

7.1.6 C-Programmierung mit Stream-IO-Funktionen

Die Windows-Funktionen ReadFile und WriteFile sind fur binare Datenblocke ge-dacht, ebenso die entsprechenden Methoden der Klasse CFile. Die Formatierung erfolgtgetrennt davon, etwa mit sprintf bzw. sscanf. Statt der Windows-Funktionen kannman aber auch die von C gewohnten Stream-IO-Funktionen verwenden, die die Formatie-rung mit erledigen (fprintf, . . . ). Die Schnittstelle wird dabei wie eine Datei gehandhabt.Im folgenden Fragment werden Textanweisungen formatiert ausgegeben und Daten binargelesen (Tektronix-Oszilloskop):

FILE * com = fopen("COM1:", "r+");setvbuf(com, NULL, _IONBF, 0);fprintf(com, "DAT:SOU CH%d\r\n", channel);

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 90

...fprintf(com, "CURV?\r\n");fflush(com);fread(buffer, sizeof(char), 10, com);...fclose(com); .

Die Funktion setvbuf weist den Compiler an, keinen Datenpuffer bereitzustellen, dieDaten also direkt zur Schnittstelle weiterzuleiten. Da dies nicht von allen Compilern striktbefolgt wird, ist zusatzlich ein fflush zwischen Schreiben und Lesen zu empfehlen, umden eventuell doch vorhandenen Puffer zu leeren.

Sollen Schnittstellenparameter uber den Device Control Block eingestellt werden, mussdazu eine kurze Programmsequenz

HANDLE hCOM = CreateFile ( "COM1:", ... );DCB dcb;GetCommState ( hCOM, &dcb );...CloseHandle ( hCOM );

– wie in 7.1.4 beschrieben – vorgeschaltet werden.

7.1.7 Linux-Spezifisches

Unter Linux kann die serielle Schnittstelle ebenfalls mit Stream-IO-Funktionen betrie-ben werden, statt "COM1:", . . . sind als Geratenamen die entsprechenden Linux-Devices"/dev/ttyS0", . . . einzusetzen.

Desweiteren andert sich die Programmierung der Schnittstellenparameter, dem DeviceControl Block entspricht unter Linux die etwas andere Struktur termios; hier ein An-wendungsbeispiel:

FILE * com = fopen("/dev/ttyS0", "r+");int fn = fileno(com);struct termios options;tcgetattr(fn, &options); // get current optionscfsetispeed(&options, B9600); // inputratecfsetospeed(&options, B9600); // outputratecfmakeraw(&options); // raw inputoptions.c_cflag |= (CLOCAL | CREAD); // local usage, receiveoptions.c_cflag |= CRTSCTS; // enable HardwareFlowControloptions.c_cc[VTIME] = 10; // timeout (*0.1s)options.c_cc[VMIN] = 0; // minimum received charstcsetattr(fn, TCSANOW, &options); // activate the changes now.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 91

7.1.8 Programmierung in MATLAB

Seit dem Release 12 (September 2000) enthalt Matlab eine Funktionsbibliothek fur dieseriellen Schnittstellen. Mit der Funktion serial wird zunachst ein Objekt erstellt, dessenParameter Matlab-ublich mit set und get eingestellt oder erfragt werden konnen34.Daneben ist auch ein objektartiger Zugriff in Punktschreibweise moglich.

Inzwischen (ab Release 13 – Juni 2002) ist in Matlab auch ein Property Inspector inte-griert, mit dem Objekt-Eigenschaften interaktiv inspiziert und verandert werden konnen.Zumindest in der Testphase ist das ein Hilfsmittel, das einem viel Arbeit ersparen kann.Der Property Inspector wird mit

inspect(ser);

aufgerufen, nachdem das serielle Objekt beispielsweise durch

ser = serial(’COM1’);

erstellt wurde.

Auf das Schnittstellenobjekt werden dann transparent die C-ahnlichen Matlab-I/O-Funktionen angewendet. Das folgende Beispiel – eine Funktion osc, die Daten aus einenDigitalspeicheroszilloskop (Tektronix 210) in Matlab einliest – verdeutlicht die Verwen-dung:

function y = osc(channel)ser = serial(’COM1’);ser.FlowControl = ’hardware’;ser.InputBufferSize = 3000;ser.Terminator = ’CR/LF’;fopen(ser);fprintf(ser, ’SEL:CH%d ON\n’, channel);fprintf(ser, ’DAT:SOU CH%d\n’, channel);fprintf(ser, ’DAT:ENC RPB\n’);fprintf(ser, ’CURV?\n’);a = 0;while char(a)~=’#’,

a = fread(ser, 1, ’uchar’);end;b = fread(ser, 1, ’uchar’);n = fread(ser, str2num(char(b)), ’uchar’);y = fread(ser, str2num(char(n’)), ’uint8’);fclose(ser);delete(ser);clear ser;

34Die komplette Liste der moglichen Parameter erhalt man mit set(handle), die Liste der aktuellenWerte mit get(handle), handle ist die von serial zuruckgelieferte Object Handle.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 92

Das Schnittstellenobjekt wird mit serial erstellt, anschließend werden einige Parame-ter festgelegt – Datenflusskontrolle, Puffergroße, Zeilenendezeichen. Dann werden nachfopen mit fprintf einige Anweisungen an das Oszilloskop gegeben (Kanalauswahl,Datenformat), die letzte (CURV?) fordert die aktuellen Daten an. Gelesen wird solange,bis ein #-Zeichen kommt, danach werden die Daten relevant. Zunachst eine Ziffer (b), dieangibt, aus wieviel Ziffern die folgende Zahl – n – besteht35. Diese wiederum informiertuber die Große des Datenblocks y. Die Folge von fread-Funktionen entspricht dieserDatenstruktur. Die letzten 3 Zeilen raumen auf.

7.2 Direkte Port-Ein/Ausgabe unter Windows 32

Wahrend die serielle Schnittstelle komfortabel mit Betriebssystemfunktionen zu bedienenist, mussen andere Schnittstellen meist relativ maschinennah programmiert werden. Dazuist es sehr hilfreich, wenn man aus einem Datenerfassungsprogramm mit C-Funktionen36

direkt auf die zugehorigen Ein/Ausgabe-Ports zugreifen kann. In einem Multi-Tasking-Betriebssystem, das außerdem ein gewisses Sicherheitsniveau verspricht, ist dies nicht mehrselbstverstandlich. Dazu zunachst ein Zitat aus einem neueren Werk uber Visual C++ [34]:

Zugriff auf den physikalischen Speicher und die E/A-Schnittstellen

Programmierer der 16-Bit-Version von Windows waren damit vertraut, direktauf den physikalischen Speicher oder die Eingabe-/Ausgabe-Schnittstellen zuzu-greifen. . . .

Fur 32-Bit-Betriebssysteme ist diese Vorgehensweise nicht mehr moglich. Win32ist ein plattformunabhangiges Betriebssystem. Alle plattformabhangigen Ele-mente sind vollstandig inkompatibel mit dem Betriebssystem. Dazu zahlen alleArten des Zugriffs auf die physikalische Hardware, wie z. B. Schnittstellen, phy-sikalische Speicheradressen usw.

Wie aber schreiben Sie Anwendungen, die direkt mit der Hardware kommunizie-ren konnen? Dazu benotigen Sie eines der verschiedenen DDKs (Device DriverKits). Uber ein DDK kann eine Treiber-Bibliothek erzeugt werden, die den ge-samten Low-Level-Zugriff auf das Gerat enthalt und Ihre High-Level-Applikationvon allen Plattformabhangigkeiten befreit.

Ende des Zitats.

Der Autor hat insofern recht, als Geratetreiber die einzig sichere Art sind, auf Schnittstel-len zuzugreifen, da man nur auf diese Weise Zugriffskonflikte verhindern kann. Andererseitslasst Windows 98 (und wohl auch ME) den Low-Level-Zugriff auf die Schnittstellen zu,und Visual C++ bietet nach wie vor die notwendigen Funktionen zur Programmierung.

35Mit fread wird n als Spaltenvektor gelesen, daher das transponierte n’ bei der Umwandlung in eineZahl in der folgenden Zeile.

36In Microsoft C/C++ sind das die Funktionen inp, inpw, inpd fur die Eingabe und outp, outpw,

outpd fur die Ausgabe eines Bytes, Worts oder Doppelworts.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 93

Verwenden sollte man diese Moglichkeit jedoch nur, wenn man Zugriffskonflikte auf andereWeise unterbindet. So sollte man darauf achten, dass Messprogramme, die solche Zugriffeverwenden, nicht mehrfach auf einem Rechner gestartet werden.

7.2.1 Portzugriff unter Windows 2000

Schwieriger wird die Sache unter Windows 2000: ein Programm mit Low-Level-Zugriffen,das unter 98 oder ME problemlos arbeitet, wird von 2000 gestoppt, weil es gegen dieSystemsicherheit verstoßt. Ohne Geratetreiber ist unter 2000 kein Zugriff auf die Schnitt-stellen moglich. Frei verfugbare generische Geratetreiber, die den Zugriff auf Ports (undauch auf den Speicher) pauschal ermoglichen, konnen einem jedoch die Arbeit abnehmen,eigene Treiber zu schreiben.

Ein Beispiel fur einen solchen Geratetreiber ist UNIIO, der von der Firma BBD SOFT alsfreie Software zur Verfugung gestellt wird [35]. BBD SOFT ist dabei, ‘Unified IO - C++interface for industrial IO cards’ zu entwickeln. Ziel ist es, plattformunabhangige C++-Klassen fur industrielle Peripheriekarten zu entwickeln. Plattform- und Compiler-abhangigmussen dabei nur noch kurze Routinen fur den direkten Hardwarezugriff implementiertwerden.

Das umfangreiche Softwarepaket ist derzeit mit Treibern fur Windows 2000 und Linuxsowie darauf aufsetzenden Klassen fur verschiedene Peripheriekarten frei verfugbar [35].Als Compiler unter Windows wird vom Hersteller allerdings bisher nur Visual C++ un-terstutzt.

Fur eigene Anwendungen reicht es aus, einen kleinen Teil des Gesamtpakets zu verwenden.Im Wesentlichen ist das die Klasse IOPort (Dateien ioport.hpp und ioport.cpp),die die direkten Port-Ein/Ausgabe-Funktionen anonymisiert. Dazu wird noch die KlasseOSInterface (Dateien osiface.hpp und osiface.cpp) benotigt, dort wird in derWindows-Implementierung der Geratetreiber uniio.sys aktiviert, der den Zugriff aufPorts und Speicher freigibt. Der Treiber muss dafur zuvor vom Administrator im Systeminstalliert sein, das kann das im Paket enthaltene Installationsprogramm loaddrv.exeerledigen.

Unter Visual C++ sind die Klassen dann direkt verwendbar, fur Dev-C++ sind Anpas-sungen notig. Dev-C++ halt sich strikt an den ANSI-Standard, enthalt mithin keine Port-Ein/Ausgabe-Funktionen. Die Erweiterung lasst sich am einfachsten durch eine Anleihebei Linux bewerkstelligen. Die Datei asm_io.h enthalt alles Notige. Leider heißen dieFunktionen anders als bei Microsoft – und die Parameterreihenfolge ist unterschiedlich37.Dem

_outpw ( PortNumber, Value );

37Dies hangt damit zusammen, dass die ersten Assembler von Intel und Motorola eine unterschiedlicheReihenfolge von Quell- und Zieloperand verwendeten. Microsoft ist in der Tradition von Intel, Gnu in dervon Motorola.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 94

bei Microsoft entspricht ein

outw ( Value, PortNumber );

bei Gnu. Man muss also zusatzlich die Funktionen in der Klasse IOPort anpassen. Wei-terhin ist als Compiler-Option -D_ANONYMOUS_STRUCT einzufugen, da ein verwendeterSpeicheradresstyp eine anonyme Struktur enthalt.

7.2.2 Test: PC-Lautsprecher

Ohne zusatzliche Hardware lassen sich die Port-Ein/Ausgabe-Funktionen am einfachstenmit dem in jedem PC eingebauten Lautsprecher testen. Fur dessen Ansteuerung ist derTimer2 des im PC – zumindest als Funktion – eingebauten Timer-Bausteins 8254 mit derBasisadresse 0x40 zustandig (Genaueres dazu in [33] Seite 18 ff.).

Die Frequenz des Rechtecksignals fur den Lautsprecher wird mit

void SetFreq (int freq){

unsigned short Divisor = 1193180 / freq;IOPort ModePort (0x43);ModePort.writeChar (0xb6);IOPort FreqPort (0x42);FreqPort.writeChar (Divisor);FreqPort.writeChar (Divisor >> 8);

}

eingestellt. Der Timer2 wird damit auf Rechteckmodus programmiert, die Taktfrequenzdes Timers von 1193180 Hz wird durch den eingestellten Divisor auf die gewunschte Fre-quenz geteilt.

Basierend auf dem Ton A mit 440 Hz werden die Frequenzen fur weitere Tone in temperier-ter Stimmung berechnet – darin ist das Frequenzverhaltnis zweier aufeinanderfolgenderTone 12

√2 (Halbtonschritt):

void PlayNote (int note, int duration){

SetFreq ((int)(440 * pow(2, note / 12.0)));IOPort EnPort (0x61);EnPort.writeChar (EnPort.readChar() | 0x03); // start speakerSleep (duration);EnPort.writeChar (EnPort.readChar() & ~0x03); // stop speaker

}

Die beiden niederwertigsten Bits von Port 0x61 aktivieren den Lautsprecher.

Das Hauptprogramm ubernimmt Tonnummer und Tondauer (in ms) aus der Kommando-zeile, ohne Parameter wird eine Sekunde ein C gespielt.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 95

int main (int argc, char * argv[]){

int note = 3, duration = 1000;if (argc>2) {note = atoi(argv[1]);duration = atoi(argv[2]);}

PlayNote(note, duration);return 0;

}

Notwendiger Programmvorspann:

#include <cmath>#include <stdlib.h>#include "osiface.hpp"#include "ioport.hpp"using namespace Uniio;

Benotigt man statt eines eigenstandigen Programms eine MEX-Funktion, so ist nur obigemain-Funktion zu ersetzen durch

void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )

{if (nrhs==0) return;double * y = mxGetPr(prhs[0]);int M = mxGetM(prhs[0]);for (int i=0; i<M; i++)PlayNote((int)*(y+i), (int)*(y+M+i));

}

Ein Musikstuck kann dann als Matrix mit 2 Spalten (Tonnummer und -dauer) und MZeilen vorgegeben werden.

7.2.3 Bit-Operationen

Beim Zugriff auf Ein/Ausgabe-Ports ist es oft notwendig, einzelne Bits der Ein- oderAusgabedaten auf einen bestimmten Wert zu setzen oder zu uberprufen. C stellt dafureinige Bit-Operationen zur Verfugung, unter C++ kann man stattdessen die Klasse bitsetverwenden.

C-Stil. Die Vorgehensweise ist in [36] beschrieben (Kapitel 6.9: Bit-Felder):Dies geschieht ublicherweise, indem man

”Bit-Masken“ definiert, die den rele-

vanten Bit-Positionen entsprechen, also

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 96

#define KEYWORD 01#define EXTERNAL 02#define STATIC 04

oder

enum { KEYWORD = 01, EXTERNAL = 02, STATIC = 04 };

Die Zahlen mussen dabei Potenzen von 2 sein. Zugriff auf die Bits wird dann einProblem, das mit den Operatoren fur Bit-Manipulation gelost werden muss, diein Kapitel 2 beschrieben wurden.

Bestimmte Redewendungen sind sehr haufig. Die Zuweisung

flags |= EXTERNAL | STATIC;

setzt die EXTERNAL- und STATIC-Bits in flags auf Eins,

flags &= ~(EXTERNAL | STATIC);

loscht genau diese Bits, und die Bedingung

if ((flags & (EXTERNAL | STATIC)) == 0) ...

ist genau dann erfullt, wenn beide Bits geloscht sind.

Dem ist allenfalls hinzuzufugen, dass man sich zur einfacheren Handhabung der Zweier-potenzen ein Makro etwa der Art

#define BIT(b) (1<<b)

definieren kann, das Fehler vermeidet und gleichzeitig dokumentiert:enum { KEYWORD = BIT(0), EXTERNAL = BIT(1), STATIC = BIT(2) }; .

C++: bitset. Im ANSI38-Standard fur C++ vom Dezember 1996 [37] ist die generischeKlasse (template class) bitset definiert (Kapitel 23.3.5), die alle notwendigen Methodenzur Bit-Manipulation enthalt (vgl. auch Online-Hilfe zu Visual C++). Ein 16-Bit-Objektwurde deklariert mit

std::bitset<16> flags; ,ein einzelnes Bit (Bit b, 0≤b≤15) mit

flags.set(b); oder flags.reset(b); bzw. flags.flip(b);

auf Eins oder Null gesetzt bzw. negiert. Neben anderen Operatoren ist insbesondere auchder Zugriffsoperator [] definiert, der mit

flags[b] = 1; oder flags[b] = 0; bzw. flags[b] = !flags[b];

die gleiche Wirkung erzielt. Das Testen eines Bits kann ebenfalls auf (mindestens) zweiWeisen erfolgen;

if (flags.at(b) == 0) ... oder if (flags[b] == 0) ...

Zum Arbeiten mit Bitsets sollte man sich passende anonymisierte Ein/Ausgabe-Funktio-nen bereitstellen, etwa fur Visual C++:

void OUTB (USHORT Port, std::bitset<16> Data)

38American National Standards Institute.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 97

{ _outp (Port, (int) Data.to_ulong()); };

oder fur Gnu C++:

void OUTB (USHORT Port, std::bitset<16> Data){ outb ((int) Data.to_ulong(), Port); }; .

Bei Verwendung der UNIIO-Bibliothek wurde man zusatzlich die Klasse IOPort passenderweitern:

IOPort & IOPort::writeChar ( const std::bitset<16> Data ){ OUTB (thePortNumber, Data); } .

7.3 Zeit und Windows

Windows ist kein ‘Echtzeit’-Betriebssystem, daher zur exakten zeitlichen Steuerung einesAblaufs im Prinzip nicht geeignet. Wenn man aber kleinere Ungenauigkeiten in Kaufnehmen kann, sind die Windows-Funktionen zur Zeitmessung und Zeittaktsteuerung rechtvielseitig verwendbar.

7.3.1 Systemzeit

Die Rechneruhr wird unter Windows im Abstand von 10 ms inkrementiert, mit dieserAuflosung und Genauigkeit arbeiten auch alle Zeitfunktionen, die darauf zugreifen (auchwenn die Zeitangaben in Millisekunden sind). Unter anderem sind dies:

Sleep – setzt die Programmausfuhrung fur die als Parameter (in Millisekunden) angege-bene Zeit aus.

clock – berechnet die seit dem Programmstart vergangenen Zeittakte. Die formale Auflo-sung ist durch die Konstante CLOCKS_PER_SEC gegeben, die reale Auflosung ist dieder Rechneruhr. Die Zeit in Sekunden ergibt sich durch Division von clock durchCLOCKS_PER_SEC.

GetTickCount – liefert die seit dem Start von Windows vergangene Zeit (in Millisekunden)als 32-Bit-Wert (DWORD)39.

7.3.2 Zeitmessung in MATLAB

Dazu aquivalente Funktionen sind auch in MATLAB verfugbar, ebenfalls mit einer Auf-losung von 10 ms:

39Bei Rechnersystemen, die langer in Betrieb sind, muss gegebenenfalls berucksichtigt werden, dass derMillisekunden-Zahler etwa alle 50 Tage uberlauft und wieder bei Null anfangt.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 98

pause – wartet fur die (diesmal in Sekunden anzugebende) Zeit.

clock – liefert Datum und Zeit als Vektor mit 6 Elementen [Jahr Monat Tag StundenMinuten Sekunden].

etime – berechnet die Differenz aus zwei clock-Werten.

tic, toc – starten und stoppen eine Zeitmessung, toc liefert die Zeitdifferenz.

cputime – liefert die Zeit (in Sekunden) seit dem Start von MATLAB.

7.3.3 Performance-Counter

Zur genaueren Zeitmessung kann unter Windows ein spezieller Zahler verwendet werden,der ein hochfrequentes Taktsignal zahlt. Dieser Zahler wird mit der Funktion

QueryPerformanceCounter(LARGE_INTEGER * N)

ausgelesen, die Frequenz des zugehorigen Taktsignals kann man mit

QueryPerformanceFrequency(LARGE_INTEGER * F)

erfragen. Ist kein entsprechender Zahler in der Rechner-Hardware vorgesehen, wird alsFrequenz 0 gemeldet. Typischerweise liegen die verwendeten Frequenzen zwischen 1 MHzund der Prozessortaktfrequenz. Mithin sind Zeitmessungen mit Mikrosekundengenauigkeitoder besser moglich.

Die Messung einer Zeitdifferenz delta mit dem Performance Counter veranschaulichtdas nachstehende Programmfragment:

LARGE_INTEGER f, n1, n2;QueryPerformanceFrequency(&f);QueryPerformanceCounter(&n1);...QueryPerformanceCounter(&n2);double delta = (double) (n2.QuadPart-n1.QuadPart)/f.QuadPart; .

Will man nicht die Differenz der Ablesezeitpunkte messen, sondern nur die dazwischenliegende Zeit, beispielsweise um die Ausfuhrungszeit von Programmcode zu bestimmen,dann sollte man noch mit einer Leermessung korrigieren. Eine Beispielanwendung fur denPerformance-Counter ist in Abschnitt 7.4.3 beschrieben.

7.3.4 Timer

Prozesse unter Windows konnen sich Taktgeber (Timer) einrichten, die in festem zeitli-chen Abstand entweder eine dafur bereitgestellte Funktion aufrufen oder an das zugehorigeFenster die WM_TIMER-Nachricht verschicken. Sie sind immer an ein Fenster-Objekt (Win-dow) gebunden, konnen daher nicht in reinen Konsolprogrammen eingerichtet werden.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 99

Timer werden mit SetTimer() eingerichtet, mit KillTimer() wieder entfernt. DieZeitauflosung und damit auch die minimal einstellbare Taktrate betragt derzeit 10 msec.Nachstehendes Programmfragment verdeutlicht die Verwendung:

static UINT MyTimer = 1;const UINT Elapse = 100; // timeout 100 msec...void CALLBACK TiProc (HWND hWnd, UINT msg, UINT timer, DWORD systime){ Do what you want to do every 100 msec }...MyTimer = SetTimer (hWnd, MyTimer, Elapse, TiProc); // install timer...KillTimer (hWnd, MyTimer); // deinstall timer

7.3.5 Timer in MATLAB

Seit der Version 6.5 (Release 13) stehen auch in Matlab Timer-Objekte zur Verfugung,die mit dem Aufruf

t = timer(’TimerFcn’, @mycallback, ’Period’, 10.0);

eingerichtet werden. Eigenschaften des Timer-Objekts werden direkt bei der Einrichtungfestgelegt oder spater – Matlab-ublich – entweder mit

set(t,’Eigenschaft1’,Wert1,’Eigenschaft2’,Wert2,...);

oder mit

t.Eigenschaft = Wert; .

get(t) und set(t) zeigen die aktuellen und die moglichen Werte fur die Objekteigen-schaften an.

Die Zeitauflosung entspricht der des umgebenden Betriebssystems, bei Windows derzeit0.01 s.

Die Verwendung von Callback -Funktionen ist sehr flexibel, neben der ublichen TimerFcnkonnen Funktionen zugewiesen werden, die beim Starten (StartFcn), Stoppen (StopFcn)oder Fehlern (ErrorFcn) des Timers aufgerufen werden. Nachdem ein Timer-Objekt mitallen Eigenschaften eingerichtet ist, wird es mit start(t) gestartet, mit stop(t) wiederangehalten. Weitere Informationen dazu in der Matlab-Hilfe.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 100

7.3.6 Multimedia-Timer

Fur Anwendungen, bei denen die Zeitauflosung der ‘normalen’ System-Timer nicht aus-reicht, stellt Windows einen weiteren Timer-Typ bereit, den Multimedia-Timer mit einerAuflosung von 1 ms. Neben der hoheren Auflosung hat dieser Timertyp den Vorteil, nichtan Fenster-Objekte gebunden zu sein, er kann somit auch in Konsolprogrammen, fenster-losen DLLs (MEX) u. a. verwendet werden. Gestartet wird mit

MMRESULT timeSetEvent( UINT uDelay, UINT uResolution,LPTIMECALLBACK lpTimeProc,DWORD dwUser, UINT fuEvent );

uDelay ist die Verzogerung (Taktrate) in Millisekunden, uResolution die Auflosung (Ge-nauigkeit), lpTimeProc die Callback-Funktion, die vom Timer aufgerufen werden soll,dwUser Daten, die an die aufgerufene Funktion ubergeben werden, fuEvent legt fest, obder Timer einmalig (TIME_ONESHOT) oder periodisch arbeiten soll (TIME_PERIODIC).

Der Ruckgabewert identifiziert den Timer und wird zum Stoppen des Timers mit

MMRESULT timeKillEvent( UINT uTimerID );

benotigt (uTimerID).

Die Callback-Funktion, die vom Multimedia-Timer aufgerufen wird, muss dem folgendenPrototyp entsprechend implementiert werden

void CALLBACK TimeProc( UINT uID, UINT uMsg,DWORD dwUser, DWORD dw1, DWORD dw2 );

darin identifiziert uID den Timer und dwUser enthalt die beim Timer-Start ubergebenenDaten, die ubrigen Parameter sind reserviert oder undefiniert.

Mit

MMRESULT timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc );

konnen die Fahigkeiten (minimale und maximale Zeit) der Multimedia-Timers erfragtwerden.

Ein Beispielprogramm, in dem Funktionen des Multimedia-Timers verwendet werden, istin Abschnitt 7.4.2 beschrieben.

7.4 Parallele Schnittstellen

werden benutzt, um Peripheriegerate uber mehrere Leitungen gleichzeitig anzusprechenund um Daten schnell byte- oder wortweise einzulesen oder auszugeben. Ein Standard-gerat, das im allgemeinen auf diese Weise angeschlossen ist, ist der Drucker. Die Drucker-schnittstelle arbeitet mit 8 Datenleitungen (ein Byte wird jeweils komplett zum Druckerubertragen), einer Leitung, die anzeigt, dass die Daten gultig sind und einer Leitung, die

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 101

meldet, ob der Drucker beschaftigt ist. Weitere Leitungen sind fur zusatzliche Statusmel-dungen zustandig. In den letzten Jahren wurde die Funktionalitat der Druckerschnittstellebetrachtlich erweitert, so dass bei modernen Rechnern eine sehr schnelle bidirektiona-le Datenubertragung zu Peripheriegeraten wie externen Disk-Laufwerken, Scannern o. a.moglich ist.

Bei einfachen konfigurierbaren Parallel-Schnittstellen-Karten (die also nicht ausschließ-lich fur einen Verwendungszweck vorgesehen sind wie die Druckerschnittstelle) wurdeuberwiegend der Baustein 8255 verwendet, fur festgelegte Spezialanwendungen sind oftSonderanfertigungen notwendig (schnelle Kopplung von externen Geraten an den PC).

7.4.1 Die Druckerschnittstelle alter Art

wird, da ursprunglich nur fur einen speziellen Zweck – die Ansteuerung des Druckers– vorgesehen, uber festverdrahtete, nicht weiter konfigurierbare Ausgabe- und Eingabe-Register betrieben. Einen schematischen Uberblick uber die Schaltung und die Zuordnungder Register-Bits zur 25-poligen Buchse am PC gibt Abbildung 61.

25-pol. D-Buchse

� �

11

10

12

13

15

17

16

14

1

9

....

2

Busy

AcknPaper Out

Online

Error

Select

Init

AutoLF

Strobe

Data7

....

Data0

Output-Register

4

3

2

1

0

7

....

0

Basis-Adresse

Basis-Adr + 2

....

Input-Register

7

6

5

4

3

4

3

2

1

0

7

....

0

Basis-Adresse

Basis-Adr + 2

Basis-Adr + 1

....

�����

�����

IRQ 7

PC

BUS

PC

BUS

Abbildung 61: Schaltung des Druckeranschlusses im PC, Pins 18–25 der 25-poligen D-Buchse sind mit Masse verbunden. • : Invertierung des Signals.

Uber die Basisadresse der Druckerschnittstelle40 werden die 8 Datenleitungen zum Drucker40Ublicherweise ist dies 0x378 fur die erste Druckerschnittstelle; bei modernen Boards konnen uber

das ROM-BIOS auch andere Standardadressen eingestellt werden. Die Adressen der am PC vorhandenenDruckerschnittstellen werden beim Systemstart im RAM ab 0x408 vermerkt.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 102

angesprochen, ihr Zustand kann uber diese Adresse festgelegt und gelesen werden. DasAusgaberegister mit Basisadresse+2 bedient mit den Bits 0–3 die zum Drucker gehen-den Kommandoleitungen. Bit 4 dieses Registers legt fest, ob die vom Drucker kommendeAcknowledge-Leitung auf die IRQ7-Leitung des PC zugreifen und damit einen Interruptauslosen kann. Auch der Zustand dieser Leitungen kann — uber Basisadresse+2 — einge-lesen werden. Die vom Drucker kommenden Statusleitungen sind mit den Bits 3–7 einesEingaberegister verbunden, das unter Basisadresse+1 gelesen werden kann.

Durch die Druckerschnittstelle sind somit in jedem PC 12 Ausgabe- und 5 Eingabelei-tungen vorhanden, eine Eingabeleitung kann als Interruptleitung benutzt werden. DieSignale sind TTL-kompatibel, d. h. logisch 1 ist nominell +5 V, logisch 0 nominell 0 V.Zumindest die Datenleitungen und die Strobeleitung lassen relativ niederohmigen Betriebzu (> 150 Ω). Verwendet man paarweise verdrillte Kabel oder Flachbandkabel zum An-schluss, so ist durch die Anordnung der Masseleitungen ein sehr storsicherer Betrieb bis zuFrequenzen von mehr als 100 kHz moglich. Mithin ist die Druckerschnittstelle auch gut furSteuerungszwecke – beispielsweise zur Ansteuerung von Schrittmotoren – zu gebrauchen.

7.4.2 Druckerport und Multimedia-Timer zur Schrittmotoransteuerung

Im folgenden Beispiel wird die Ansteuerung eines Schrittmotors uber das Druckerportimplementiert. Es werden zwei Bits des Ports benutzt, um Schrittmotortakt (Bit 0) undLaufrichtung (Bit 1) vorzugeben. Einfache Schrittmotornetzgerate erzeugen daraus die furden Motorbetrieb notwendige Abfolge von Stromimpulsen.

Zum Betrieb des Druckerports wird die Klasse lptPort definiert:

class lptPort {private:

unsigned short BaseAddress;enum {DATA = 0, STATUS = 1, CONTROL = 2};int Bit(int n) { return 1<<n; };

public:lptPort(const char * name = "lpt1");void writeData(const int data);int readData();void setBit(const int n);void resetBit(const int n);int readStatus();void writeControl(const int data);

}; .

Der Konstruktor initialisiert die Basisadresse des verwendeten Druckerports (prn, lpt1,. . . ), sie ist im Speicherbereich 0x408 ff. vermerkt. Dazu werden die Speicherzugriffsfunk-tionen aus dem UNIIO-Paket verwendet (Dateien physmem.hpp und physmem.cpp):

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 103

using namespace Uniio;lptPort::lptPort(const char * name) : BaseAddress(0){

PhysicalMemory aMemory (0x00400, 0x10, false);if ((stricmp(name, "lpt")==0) || (stricmp(name, "prn")==0)

|| (stricmp(name, "lpt1")==0))BaseAddress = aMemory.readShort (0x08);

else if ((stricmp(name, "lpt2")==0))BaseAddress = aMemory.readShort (0x0a);

else if ((stricmp(name, "lpt3")==0))BaseAddress = aMemory.readShort (0x0c);

else if ((stricmp(name, "lpt4")==0))BaseAddress = aMemory.readShort (0x0e);

} .

Die Funktionen zum Lesen und Schreiben der Datenleitungen verwenden die Klasse IOPortdes UNIIO-Pakets:

void lptPort::writeData(const int data){

if (BaseAddress==0)return;

IOPort P(BaseAddress+DATA);P.writeChar(data);

}int lptPort::readData(){

if (BaseAddress==0)return -1;

IOPort P(BaseAddress+DATA);return (unsigned char) P.readChar();

} .

Aus writeData und readData werden die Funktionen zur Bitmanipulation zusammen-gesetzt:

void lptPort::setBit(int n){ writeData(readData() | Bit(n)); }

void lptPort::resetBit(int n){ writeData(readData() & ~Bit(n)); } .

Die Verwendung der Klasse lptPort zusammen mit den Multimedia-Timer-Funktionen(vgl. 7.3.6) in einem kurzen Programm, dem die Anzahl der Schrittmotorschritte in derKommandozeile ubergeben wird, konnte dann so aussehen:

#include "mmsystem.h"#include "lpt.h"

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 104

...const int Delay = 1;static UINT uTimer = 0;static int running = 1;lptPort pp("LPT1");

void CALLBACK Steps ( UINT ID, UINT, DWORD steps, DWORD, DWORD ){

static unsigned short n = 0;if ((n%2)==0)pp.setBit(0);

elsepp.resetBit(0);

if (++n >= 2*steps)running = 0;

}

int main(int argc, char *argv[]){

int steps = 10;if (argc>1)steps = atoi(argv[1]);

if (steps==0)return -1;

pp.resetBit(0);if (steps<0) {pp.setBit(1);steps = -steps;

}elsepp.resetBit(1);

timeBeginPeriod(1);uTimer = timeSetEvent ( Delay, 1, Steps, steps, TIME_PERIODIC );while (running);

timeKillEvent ( uTimer );timeEndPeriod(1);Sleep (100);return 0;

}

timeBeginPeriod und timeEndPeriod klammern die Verwendung der Multimedia-Timer-Ressource ein, der Parameter ist die gewunschte Zeitauflosung. Mit Delay = 1 wirdein Schritt-Takt von 500 Hz erreicht, passend fur den Betrieb der meisten Schrittmotoren.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 105

7.4.3 Servo-Ansteuerung: Multimedia-Timer und Performance-Counter

Ahnlich wie Schrittmotoren konnen auch Servos uber das Druckerport betrieben werden.Wie in Abschnitt 2.4 beschrieben wurde, werden zur Ansteuerung gut definierte Impulsse-quenzen benotigt, bei denen die Folgefrequenz fest ist und die Impulslange genau eingestelltwerden kann. Die feste Folgefrequenz kann durch den Multimedia-Timer realisiert werden,die Pulslange mit dem Performance-Counter gemessen werden.

Ein einzelner Impuls mit genau einstellbarer Lange wird bei jedem Aufruf der Callback-Funktion Pulse erzeugt:

short ACTUAL = 30;

void CALLBACK Pulse ( UINT ID, UINT, DWORD, DWORD, DWORD ){

LARGE_INTEGER f, t1, t2;QueryPerformanceFrequency(&f);unsigned short Inc = f.QuadPart/20000*ACTUAL;QueryPerformanceCounter(&t1);t1.QuadPart += Inc;pp.setBit(0);do {QueryPerformanceCounter(&t2);} while (t2.QuadPart<t1.QuadPart);

pp.resetBit(0);}

Die Voreinstellung fur die Pulslange ist 1.5 ms (vgl. Abschnitt 2.4).

Im Hauptprogramm wird der Multimedia-Timer gestartet, hier mit einer Zeitkonstantevon 20 ms. In einer Schleife wird durch Tastatureingaben die Pulslange, damit die Win-kelstellung des Servos, verandert.

const short MIN = 18, MAX = 42;timeBeginPeriod (20);uTimer = timeSetEvent ( 20, 20, Pulse, 0, TIME_PERIODIC );while ((c=_getch())!=’e’)

switch (c) {case ’a’: ACTUAL = MIN;

break;case ’s’: ACTUAL = (ACTUAL<=MIN) ? MIN : (ACTUAL-1);

break;case ’d’: ACTUAL = (ACTUAL>=MAX) ? MAX : (ACTUAL+1);

break;case ’f’: ACTUAL = MAX;

break;

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 106

default:;

}timeKillEvent ( uTimer );timeEndPeriod (20);

Anders als in diesem Testprogramm wird man in einem arbeitsfahigen Steuerprogrammdie Pulslangen jeweils problemangepasst einstellen und nur eine begrenzte Anzahl vonSteuerimpulsen ausgeben (vgl. Abschnitt 7.4.2).

7.4.4 Enhanced Parallel Port (EPP) und Extended Capability Port (ECP)

Durch verschiedene Verbesserungen wurde in den vergangenen Jahren die Leistungsfahig-keit der Druckerschnittstelle deutlich erhoht. Die von unterschiedlichen Herstellern ein-gefuhrten Veranderungen wurden 1994 vom IEEE41 vereinheitlicht und in einer neuenNorm fur die Druckerschnittstelle – IEEE 1284 – verabschiedet. Praktisch alle Herstellerhalten sich inzwischen an diesen Standard. Die Norm enthalt die Druckerschnittstelle al-ter Art als Basisbetriebsart, ist also voll ruckwartskompatibel, daneben sind verschiedenebidirektionale Betriebsarten (u. a. EPP und ECP) definiert, die einen schnellen Datenaus-tausch (bis zu 2 MByte/sec) mit Peripheriegeraten wie Scannern oder externen Laufwer-ken ermoglichen. Neben den unterschiedlichen Betriebsarten sind im Standard IEEE 1284auch die elektrischen Daten der Schnittstelle wie Steckerbelegung, Kabelart, maximaleKabellange (10 m) usw. genauestens spezifiziert.

Eine gute und ausfuhrliche Beschreibung der Norm bietet die Webseite von Warp Ni-ne Engineering [39], eines Herstellers von Peripherie-Bausteinen fur die IEEE 1284 (ei-ne partielle Kopie davon liegt auf dem lokalen Server [40]). Hardware-Beschreibungensind in den Datenblattern fur die entsprechenden Schnittstellen-ICs enthalten (z. B. furdie ICs TL16PIR552 – einem Baustein mit zwei seriellen und einem parallen Port oderSN74LVC161284 – einem IEEE-1284-kompatiblen Treiberbaustein).

7.4.5 Der programmierbare Parallel-E/A-Baustein 8255

Auf vielen Steckkarten, die parallele Ein/Ausgabeleitungen zur Verfugung stellen und/oderuber solche statischen Leitungen andere Bausteine betreiben (D/A-, A/D-Wandler, Zahler,Relais), wird (besser: wurde) zu diesem Zweck der Intel-Schaltkreis 8255 A eingesetzt. Erbesitzt 24 programmierbare E/A-Leitungen, die in drei Gruppen zu je 8 unterteilt sind(Ports A, B, C). Port C lasst sich weiter in 2 Gruppen zu je 4 aufteilen (CH, CL). Furjede der Gruppen kann (muss) die Betriebsart (Eingabe oder Ausgabe) definiert werden,so dass je nach Programmierung 0, 4, 8 · · · 24 Eingabe- und entsprechend 24, 20, 16 · · ·0 Ausgabeleitungen vorhanden sind. Der Baustein belegt 4 aufeinanderfolgende Adressenim E/A-Adressraum, die Basisadresse ist Port A zugeteilt, Basis+1 Port B, Basis+2 Port

41Institute of Electrical and Electronics Engineers [38].

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 107

C, auf Basisadresse+3 wird das Steuerbyte geschrieben, das entweder Betriebsart undBetriebsmodus festlegt oder ein Einzelbitkommando enthalt. Die genaue Beschaltung derE/A-Leitungen (Steckerart und -belegung etc.) variiert von Karte zu Karte und muss imEinzelfall der Beschreibung entnommen werden.

Aufbau des Steuerbytes fur den Parallelbaustein 8255 A (Betriebsart und -modus):

1 M2 M1 A CH M0 B CL

BIT 7 6 5 4 3 2 1 0

BIT 7 = 1 legt fest, dass mit diesem Kommandobyte Betriebsart und Betriebsmodusfestgelegt werden sollen.

M2, M1 definieren den Betriebsmodus fur Port A und CH,

M0 den fur Port B und CL, diese 3 Bits sollten auf 0 gesetzt werden, dies bedeutetnormale Ein- oder Ausgabe. Die anderen moglichen Betriebsmodi (automatischerQuittungs- oder Interruptbetrieb) sind hardwaremaßig meist nicht vorgesehen.

A, CH, B, CL definieren die Betriebsart fur die einzelnen Gruppen, ein auf 0 gesetztesBit bedeutet Ausgabe, ein auf 1 gesetztes Eingabe.

Das Steuerbyte 83H wurde mithin die Gruppen A und CH als Ausgabe-, die Gruppen Bund CL als Eingabeleitungen festlegen.

Wie beim Druckerport kann auch beim 8255 der aktuelle Status der Ausgabeleitungendurch einen Input-Befehl gelesen werden. Dies ist wichtig, wenn es darauf ankommt, nureinzelne Leitungen (Bits) anzusprechen, ohne die ubrigen eines Ports oder einer Gruppezu verandern.

Fur Port C gibt es beim 8255 eine zusatzliche Moglichkeit, einzelne Bits gezielt anzu-sprechen, das Einzelbitkommando, bei dem das Steuerbyte (Basisadresse+3) wie folgtaufgebaut sein muss:

0 N2 N1 N0 W

BIT 7 6 5 4 3 2 1 0

BIT 7 = 0 ist das Zeichen fur ein Einzelbitkommando.

N2, N1, N0 adressieren das Bit in Port C, das auf den Wert von

W gesetzt wird.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 108

0x01 wurde Bit 0 auf 1 setzen, 0x06 Bit 3 auf 0, 0x0f Bit 7 auf 1.

Die Programmierung des Bausteins 8255 soll am Beispiel einer Klasse fur den Betrieb einesexternen 14-Bit Puls-A/D-Wandlers an einer alteren Parallel-E/A-Karte naher erlautertwerden.

In der Header-Datei ist als Kommentar ein schematisches Blockdiagramm vorangestellt,das auch die Bit-Zuordnungen der 8-Bit-Ports der beiden 8255 auf der Karte zu denAnschlussleitungen der Analog-Digital-Wandler definiert (mit den beiden 8255-Bausteinenauf der Karte ist der gleichzeitige Betrieb von zwei externen A/D-Wandlern moglich).

/*------------------------------------------------------------PC BUS (ADDRESS, DATA, CONTROL)

-----+ +---------------+ +---------------+ +-----+---------------+ +---------------+ +---------------+| PIO 1 | | | | PIO 2 || 8255 | | TIMER 8253 | | 8255 || 24 BIT | | | | 24 BIT |+---------------+ +---------------+ +---------------+

|A| |B| |C| |A| |B| |C|

+---------------+ +---------------+| ADC 1 | | ADC 2 |+---------------+ +---------------+

| |

A0..B5 : DATA ... from ADC ... low active (1)B6 : OVERFLOW ... from ADC ... low activeB7 : READY ... from ADC ... low activeC0 : CLEAR ... to ADC ... low activeC1 : ADC RUN ... to ADC ... low active */

Die Datenbits des Analog-Digital-Wandler-Ausgangs sind in logischer Abfolge ihrer Wer-tigkeit entsprechend mit den 8 Bits von Port A und 6 Bits von Port B verbunden, dieStatusausgange des ADC mit den restlichen 2 Bits von Port B , 2 Bitausgange von PortC steuern den ADC (realisiert wird dies durch ein speziell fur den Anwendungszweckgefertigtes Verbindungskabel).

In der Klassendefinition werden nach der Vereinbarung von Variablen und Hilfsfunktionendie Portadressen und Konfigurationskommandos fur die 8255er sowie die Bitmasken furdie Ports festgelegt. Gut dokumentieren und kapseln lasst sich dies mit Aufzahlungstypen,in denen das Makro BIT() zum Setzen einzelner Bits verwendet wird.

#define BIT(b) (1<<b)

class PIO8255 : CInOut {

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 109

private:unsigned short BaseAddress;unsigned short ADDR (unsigned short offset = 0) {

return (BaseAddress+offset);};enum PortOffsets { LOPORT, HIPORT, CMDPORT, CONFPORT };enum PortConfiguration {

ALLOUTPUT = BIT(7),AINPUT = BIT(7) | BIT(4),BINPUT = BIT(7) | BIT(1),CLINPUT = BIT(7) | BIT(0),CHINPUT = BIT(7) | BIT(3),ADCREAD = AINPUT | BINPUT

};enum ADCStatus {

NOTOVER = BIT(6),NOTREADY = BIT(7),

};enum ADCCommand {

CLEARCMD = 0,RUNCMD = BIT(0),STOPCMD = BIT(0) | BIT(1)

};void Acknowledge () {

IOPort CMD ( ADDR(CMDPORT) );CMD.writeChar ( CLEARCMD );CMD.writeChar ( RUNCMD );

};

Mit der Funktion Acknowledge() wird ein aus dem A/D-Wandler gelesener Digitalwertquittiert.

Offentlich, d. h. fur den Benutzer der Klasse verwendbar sind schließlich nur die beiden Me-thoden DataAvailable() und GetData(). Fur den Normalbetrieb der Analog-Digital-Wandler ist dies ausreichend.

public:PIO8255 (unsigned short basead = 0x1b0) {

BaseAddress = basead;IOPort CONF ( ADDR(CONFPORT) );IOPort CMD ( ADDR(CMDPORT) );CONF.writeChar ( ADCREAD );CMD.writeChar ( STOPCMD );Acknowledge();

};

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 110

bool DataAvailable () {IOPort HI ( ADDR(HIPORT) );return ( ( HI.readChar() & NOTREADY ) == 0 );

};unsigned short GetData () {

unsigned short data;IOPort HI ( ADDR(HIPORT) );IOPort LO ( ADDR(LOPORT) );data = ( (HI.readChar() | NOTREADY)<<8 ) + LO.readChar();Acknowledge();return ~data;

};};

7.5 Der IEC-Bus

Die in der vorhergehenden Kapiteln beschriebenen Schnittstellen (parallel, seriell) werdenim wesentlichen fur 2-Punkt-Verbindungen benutzt (PC↔Plotter, PC↔Drucker). DieseVerbindungstechnik wird sehr aufwendig, wenn eine großere Anzahl von Messgeraten ein-gebunden werden soll, da der PC fur jedes Messgerat eine individuelle Schnittstelle zurVerfugung stellen muss.

Im Gegensatz zu den 2-Punkt-Verbindungen zeichnen sich Bussysteme dadurch aus, dasseine Vielzahl von Geraten an eine Schnittstelle angeschlossen werden kann, und uber denBus eine Kommunikation mit dem PC wie auch zwischen den angeschlossenen Geratenmoglich ist.

7.5.1 Grundlagen

Das Bussystem, das sich auf dem Messgeratesektor seit einigen Jahren weitgehend durch-gesetzt hat, ist der IEC-Bus. Dieser sehr gut genormte Schnittstellenbus42 besteht aus8 Daten-, 3 Handshake- und 5 allgemeinen Steuerleitungen (Abb. 62).

Der Bus wird in negativer Logik mit TTL-Spannungen betrieben, der aktive Leitungs-zustand bzw. logisch 1 entspricht somit ca. 0 V, inaktiv oder logisch 0 dagegen ca. 5 V.Die Signalausgange sind als ‘offene Kollektor’ Ausgange realisiert, durch diese ‘Wired-Or’-Verknupfung wird sichergestellt, dass auch dann keine Buskonflikte auftreten, wennmehrere Gerate gleichzeitig auf eine bestimmte Busleitung zugreifen. Andererseits kannein einzelnes Gerat den Aktiv-Status einer Leitung erzwingen.

Gegenuber einem Rechnerbus weist der IEC-Bus einige Unterschiede auf:42Die international gultigen Schnittstellen-Normen sind IEEE 488 (USA) und IEC 66.22 (Europa). Fur

den IEC-Bus sind auch die Bezeichnungen IEEE-Bus (sprich: ai-triple-i), HPIB (Hewlett Packard InterfaceBus) und GPIB (General Purpose Interface Bus) gebrauchlich.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 111

Steuergerat Gerat 1 Weitere Gerate

���

���

� � � � �� � �

EOISRQIFCRENATN

NRFDNDACDAV

DIO1. . . DIO8�� 8 �� 8

}AllgemeineSteuerleitungen

}Handshake

Daten

Abbildung 62: Die 16 Signalleitungen des IEC-Bus.

Die Datenubertragung erfolgt asynchron, d. h. sie wird nicht — wie beim PC-Bus —durch ein zentrales Taktsignal synchronisiert, sondern durch ein Quittungsverfahren mitden 3 Handshakeleitungen. Das Signal fur gultige Daten (DAV: Data Valid) wird vomjeweiligen Sprechergerat nur dann aktiviert, wenn alle Horergerate am Bus ihre Bereit-schaft durch das deaktivierte NRFD-Signal (Not Ready For Data) anzeigen. Die Datenbleiben danach so lange gultig, bis alle Horergerate das NDAC-Signal (Not Data Ac-cepted) deaktiviert und damit gemeldet haben, dass die Daten empfangen wurden. DieDatenubertragungsgeschwindigkeit richtet sich also dynamisch nach dem jeweils langsam-sten aktiven Gerat am Bus. Dennoch sind — bei hinreichend schnellen Teilnehmern —maximale Ubertragungsraten von ca. 1 MByte/sec moglich.

Die 8 Datenleitungen (DIO1. . . DIO8) werden sowohl fur Daten als auch fur Komman-dos benutzt, die Unterscheidung erfolgt durch die Steuerleitung Attention (ATN). Nur einGerat am Bus — als Steuergerat (Controller) konfiguriert — darf die Attention-Leitung be-dienen und somit Kommandos erteilen. Ein Teil der Kommandos dient dazu, andere Gerateam Bus als Sprecher- (Talker) oder Horer-Gerate (Listener) zu adressieren. Durch dieseAdressierkommandos wird eine Datenubertragung zwischen einem Sprecher und einemoder mehreren Horern eingeleitet. Insgesamt sind 31 Horer- und 31 Sprecheradressen ineinem IEC-Bus-System moglich, die ubrigen Kommandobytes sind fur weitere Befehle re-serviert. Unter anderem ist eine weitergehende Adressunterteilung uber Sekundaradressenmoglich.

Die Funktion der weiteren Steuerleitungen:

REN (Remote Enable) schaltet die lokale Bedienungsmoglichkeit der angeschlossenenGerate ab.

IFC (Interface Clear) bringt das Schnittstellensystem in einen definierten Anfangszu-stand.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 112

SRQ (Service Request) wird von einem angeschlossenen Gerat aktiviert, wenn es eineBedienung wunscht (z. B. am Ende einer Messung zum Datentransfer). Die dazunotige Unterbrechung wird vom Steuergerat veranlasst, erfolgt daher nicht unbedingtprompt. Die Reaktion des Steuergerats muss mit einer Umfrage (Serial Poll, ParallelPoll) beginnen, um festzustellen, welches Gerat die SRQ-Leitung aktiviert hat.

EOI (End Or Identify) hat zwei Funktionen: Zum einen zeigt der gerade aktive Sprecherdamit das Ende des Datentransfers an. Zum anderen wird EOI zusammen mit ATNvom Controller benutzt, um eine Parallelabfrage (Parallel Poll) anzuordnen.

Fur weitere technische Details sei an dieser Stelle auf die weiterfuhrende Literatur zumIEC-Bus verwiesen [41, 42].

7.5.2 Datenformat

Die Datenubertragung auf dem IEC-Bus erfolgt ‘bit-parallel’ und ‘byte-seriell’. Hinsicht-lich der Lange des Datenstroms und der Codierung der einzelnen Bytes bestehen keineEinschrankungen. Daher muss die Art der Datencodierung jeweils zwischen Talker- undListener-Gerat vereinbart werden. Da aber bei praktisch allen Peripheriegeraten das Da-tenformat fur den IEC-Bus nicht veranderbar ist, bedeutet ‘vereinbaren’, dass sich derPC als flexibelstes Gerat am Bus auf das jeweilige Datenformat einstellen muss. ZweiCodierungsarten werden uberwiegend verwendet:

• Binare Codierung dort, wo große Datenmengen moglichst schnell ubertragen werdensollen. Einige Digitalspeicheroszilloskope ubertragen ihre Daten auf diese Weise —bei einer Auflosung von 8 Bit wird fur einen Datenpunkt nur 1 Byte benotigt.

• ASCII-Codierung dort, wo es eher auf Sicherheit und Verstandlichkeit ankommtund die Geschwindigkeit nicht im Vordergrund steht. Die Daten werden als Textubertragen, somit ist eine sofortige Kontrolle moglich. Fast alle Digitalmultime-ter benutzen diese Codierungsart sowohl fur ihre Programmierung als auch fur dieMessdaten. Da jeweils nur ein Messwert ubertragen wird, werden keine hohen Ge-schwindigkeiten benotigt.

7.5.3 Programmierung

PC-Karten fur den IEC-Bus enthalten im allgemeinen einen intelligenten Schnittstellen-baustein, der einen großen Teil des Busmanagements (insbesondere den Quittungsablauf)selbstandig erledigt. Meist konnen die Karten sowohl als Controller (uberwiegende Be-triebsart im PC) wie auch als Talker/Listener konfiguriert werden.

Fast alle Kartenhersteller (jedenfalls die teureren) liefern Softwarebibliotheken zum Be-trieb der Karte mit, ublich ist zumindest eine C-Bibliothek. Der Datenaustausch mit einem

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 113

externen Gerat erfolgt dann hochsprachlich analog zum Dateizugriff nach dem Schema:

1. Logische Verbindung zum externen Gerat herstellen (open),2. Daten lesen (read) oder schreiben (write),3. Verbindung zum externen Gerat schließen (close).

Beispiel: Hewlett-Packard, neben National Instruments und Keithley einer der wichtige-ren Hersteller fur IEC-Bus-Karten, liefert zum Betrieb der Karten die HP Standard Instru-ment Control Library mit, eine Bibliothek mit Schnittstellen fur Basic und C. Die Softwa-re43 muß zunachst auf dem PC installiert werden, anschließend wird die Schnittstellenkar-te logisch eingebunden, d. h. unter einem symbolischen Namen werden die physikalischenDaten der Karte (E/A-Adresse usw.) vermerkt (zustandiges Programm: iocfg32.exe).Der bei der Konfiguration festgelegte Name wird – zusammen mit der Adresse des exter-nen Gerats – beim Verbindungsaufbau benotigt. Die Bibliotheksfunktionen werden in Cbzw. C++ durch die Header-Datei sicl.h bekanntgemacht und aus sicl32.lib mit demLinker ins Programm eingebunden. Aus den Routinen in sicl32.lib erfolgen Zugriffeauf die zentrale System-DLL sicl32.dll, die das eigentliche Ein/Ausgabe-Managementabwickelt. Durch diese Softwarestruktur ist gewahrleistet, daß alle Zugriffe auf die IEC-Bus-Karte(n) im System uber eine zentrale Stelle laufen; die verantwortliche DLL ist‘Multi-Thread’-fahig, somit konnen mehrere Programme gleichzeitig mit dem Bus arbei-ten.

Unter anderem stellt SICL die folgenden Definitionen und Funktionen fur den Betrieb vonGeraten bereit (aus sicl.h):

typedef int INST;INST iopen (char *addr);int iclose (INST id); .

Auf ein Gerate wird uber eine ‘Instrument-Handle’ zugegriffen, die in Typ und Verwen-dungsart in etwa der ‘File-Handle’ in C entspricht. iopen() eroffnet die Verbindung zumGerat, addr enthalt Kartenname und Gerateadresse, also z. B. “hpib,7”.

Die Funktionen fur formatiertes Schreiben und Lesen entsprechen den C-Bibliotheksfunk-tionen fprintf() und fscanf():

int iprintf (INST id, const char *fmt, ...);int iscanf (INST id, const char *fmt, ...); .

Der Ruckgabewert enthalt die Anzahl der tatsachlich konvertierten Argumente.

Zum unformatierten Schreiben und Lesen aus einem oder in ein Bytefeld buf der Langedatalen bzw. bufsize sind

int iwrite (INST id, char *buf, unsigned long datalen,int endi, unsigned long *actual);

int iread (INST id, char *buf, unsigned long bufsize,

43Vorsicht bei Windows NT: Fehlerfrei unter NT 4.0 arbeiten nur neuere Versionen (etwa ab Rev. F.01.021997).

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 114

int *reason, unsigned long *actual);

zustandig, endi legt die Art des Ubertragungsendes fest (= 0: ohne EOI, = 0: mit EOI),actual gibt die Zahl der tatsachlich ubertragenen Bytes an und reason den Grund furErfolg oder Mißerfolg. Die Ruckgabewerte sind C-ublich Null bei Erfolg, ungleich Null beiMißerfolg.

Ein Programm, das ein Digitalvoltmeter auf einen bestimmten Betriebszustand setzt unddann einen Meßwert liest, konnte die folgenden Zeilen enthalten:

#include "c:/hp/siclnt/c/sicl.h"...INST DVM = iopen("hpib,7");iprintf (DVM, "L0VAT0\n");iscanf (DVM, "%lg", &Voltage);iclose(DVM); .

Die Details der Funktionen sowie die Vielzahl weiterer SICL-Funktionen sind in den bei denHP-Karten mitgelieferten umfangreichen Handbuchern [43, 44] ausfuhrlich beschrieben.

7.6 Universal Serial Bus (USB)

Von einem Herstellerkonsortium bestehend aus Compaq, Digital Equipment Corporation,IBM PC Company, Intel, Microsoft, NEC und Northern Telecom wurde nach mehrjahrigerVorarbeit im Januar 1996 eine neue Schnittstellennorm fur den PC vorgeschlagen [45], derUniversal Serial Bus (USB). Alle neueren PCs enthalten inzwischen diese Schnittstelle(gekennzeichnet durch das nebenstehende Logo), die Zahl der damit ausgestatteten Pe-ripheriegerate wachst laufend [46]. Seit einiger Zeit gibt es auch Messgeratehersteller, diediesen Bus verwenden. In allen neueren PC-Betriebssystemen ist die Unterstutzung furden USB integriert, spezialisierte Treiber werden von den Gerateherstellern in praktischallen Fallen mitgeliefert, Eigenprogrammierung ist daher nicht erforderlich.

Von den genannten Herstellern ist der USB so universell konzipiert, dass er langfristigalle bisherigen Standardschnittstellen uberflussig machen kann. Im Normvorschlag sindverschiedene Geschwindigkeitsbereiche vorgesehen, so dass auf dem Bussystem langsameund schnelle Peripheriegerate koexistieren konnen, ohne dass uberall ein hoher Aufwandfur schnellen Schnittstellenbetrieb notig ist. Einen Uberblick uber die Geschwindigkeitsbe-reiche des USB gibt die Zusammenstellung in Abbildung 63. Vor kurzem wurde die Normfur den Hochgeschwindigkeitsbereich verabschiedet (USB 2.0), neuere Betriebssysteme un-terstutzen inzwischen auch diesen Bereich.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 115

Abbildung 63: Geschwindigkeitsbereiche fur den USB, Anwendungen und typische Eigen-schaften (Stand USB 2.0, 2002).

Das Konzept des USB sieht einehierarchisch vernetzte Peripherie-struktur vor, in der die einzelnenGerate durch logische Adressen an-gesprochen werden.

Ahnlich wie beim Twisted-Pair-Ethernet ist die logische Busstruk-tur physikalisch durch Zweipunkt-verbindungen realisiert, die uberVerteiler (Hubs) verbunden sind. Aneinem Root-Hub (in der Regel imPC) konnen bis zu 127 Gerate an-geschlossen werden. Das Prinzip istin Abbildung 64 skizziert.

Host (Root Tier)

Tier 1

Tier 2

Tier 3

Tier 4

Hub 1

Hub 2 Node

HostRootHub

Node

Hub 3 Hub 4 Node Node

NodeNodeNode

Abbildung 64: Vernetzungsstruktur eines USB-Systems.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 116

Keyboard Monitor PC

Pen Mouse Speaker Mic Phone Hub

Host/HubHub/FunctionHub/Function

Function Function Function Function Function Hub

Abbildung 65: PC-System, das uber USB-Verbindungen betrieben wird.

In den Endgeraten kann die Hub-Funktionalitat mit integriert sein, somit kann ein einfa-ches USB-System auch ohne abgesetzte Hubs aufgebaut werden. Eine mogliche Realisie-rung fur ein PC-System zeigt Abbildung 65: Die Hauptperipheriegerate wie Monitor undKeyboard fungieren gleichzeitig als USB-Hub, an den jeweils weitere Gerate angeschlossensind.

Als serielles Bussystem benotigt der USB nur relativ einfache Kabelverbindungen; furden Datentransfer wird eine verdrillte Zweidrahtleitung verwendet, daneben wird nochdie Versorgungsspannung von 5 V uber die Buskabel gefuhrt (Abbildung 66). Dadurchkonnen Gerate mit geringem Stromverbrauch auch ohne eigenes Netzteil am USB betriebenwerden.

...

...

5 meters max

VBus

GND

D+D-

VBus

GND

D+D-

Abbildung 66: USB-Kabel: Verdrillte Datenleitun-gen und zwei Leitungen fur die Versorgungsspan-nung reichen aus.

In der Spezifikation weiterhin vorgesehen ist eine Hot-Plug-Fahigkeit: Peripheriegeratekonnen wahrend des normalen Rechnerbetriebs hinzugefugt oder entfernt werden, derlastige und zeitraubende Neustart des Systems entfallt. Die Gerate werden automatischerkannt, der zugehorige Treiber wird geladen bzw. aktiviert oder nach dem Entfernen einesGerats wieder deaktiviert.

Fur den Bereich der Datenerfassung und Experimentsteuerung weist der USB einige in-teressante Vorteile auf:

• Als breit akzeptierter Standard ist die Schnittstelle uberall verfugbar (Notebooks).Der Einbau von speziellen Schnittstellenkarten entfallt.

• Die notwendigen Komponenten sind billig herzustellen (einfache standardisierte Ka-bel, intelligente Standardperipheriebaussteine).

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 117

• Einfache Systeme lassen sich aus wenigen ICs zusammenbauen, oft reicht ein intel-ligenter Peripheriebaustein aus, die Stromversorgung wird vom Bus geliefert.

• Da bis zu 127 Gerate am Bus betrieben werden konnen, muss man nicht mehrmoglichst viele Teilfunktionen zusammenfassen, um Platz zu sparen (Multi-IO-Kar-ten), sondern kann die Funktionen getrennt und damit flexibler realisieren.

Fur die Programmierung werden jedoch immer USB-konforme, ins Betriebssystem einge-bundene Geratetreiber notig sein, wegen der komplexen Fahigkeiten des USB verbietetsich ein direkter Zugriff auf Gerate.

Client SW

USB HostController

USB LogicalDevice

Function

Host Physical DeviceInterconnect

USB BusInterface

USB System SW

Actual communications flow

Logical communications flow

Implementation Focus Area

Function Layer

USB DeviceLayer

USB BusInterface Layer

Abbildung 67: Logischer und physikalischer Datenfluss in einem USB-System.

Der Datenfluss in einem USB-System ist in Abbildung 67 dargestellt. Im intelligentenPeripheriegerat wird man in der Regel nur die oberste Ebene (Function Layer) implemen-tieren mussen, die beiden unteren Ebenen konnen aus vorgefertigten Moduln entnommenwerden. Ahnlich ist es im Rechnersystem, auch dort wird die Software auf fertigen Moduln(DLLs und Geratetreiber) aufsetzen. Konkret bedeutet das, dass bei kommerziellen Pe-ripheriegeraten im Anwenderprogramm die Funktionen der mitgelieferten DLLs benutztwerden, mithin nur der logische Datenfluss der obersten Ebene programmiert wird, beiEigenbaugeraten wird man allerdings DLL, Geratetreiber und (zumindest) die obersteSoftwareebene im Peripheriegerat selbst realisieren.

Die gesamten technischen Spezifikationen des Universal Serial Bus sind sehr detailliertin [47] zusammengestellt, alle Abbildungen des Kapitels sind dieser Dokumentation ent-nommen.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 118

7.7 TCP/IP-Programmierung

Neben der standig wachsenden Zahl der rein windowsorientierten Kommunikationsmog-lichkeiten (DDE, NetDDE, OLE1, OLE2, COM, DCOM, ActiveX, . . . ), steht – wennTCP/IP als Protokoll installiert ist – unter den Windows-Systemen auch die weitgehendsystemunabhangige Socket-Schnittstelle zum Informationsaustausch zwischen Prozessenauf einem oder auf verschiedenen vernetzten Rechnern (Internet) zur Verfugung. Uberdiese Schnittstelle ist auch eine Verbindung mit Rechnern unter anderen Betriebssyste-men einfach realisierbar. Daruber hinaus sind seit einiger Zeit verschiedene Microcontrol-ler auf dem Markt, die eine Ethernet-Schnittstelle und die zugehorige TCP/IP-Softwareenthalten und damit den Bau einfacher und billiger Messsysteme mit Internet-Anschlussermoglichen.

7.7.1 Sockets und Ports

Ein Socket ist der Endpunkt einer Netzwerkverbindung unter dem TCP/IP-Protokoll;diese Schnittstelle kann uberall dort benutzt werden, wo TCP/IP als Netzwerkprotokollinstalliert ist. Die Kommunikation uber Sockets kann sowohl zwischen Programmen in-nerhalb eines Rechners wie auch – das ist der ublichere Fall – zwischen unterschiedlichenRechnern ablaufen.

Der Verbindungsaufbau erfolgt (bei TCP-Verbindungen, auf die wir uns hier beschrankenwollen) nach einem Client-Server-Prinzip: ein Server-Socket wartet am Netzwerk (Listen),ein Client-Socket betreibt den Verbindungsaufbau (Connect), der Server-Socket nimmtdie Verbindung an (Accept). Uber die Verbindung werden Daten mit Send und Receiveausgetauscht, die Verbindung wird schließlich von einem der Partner mit Close beendet.

Die Art der Verwendung bzw. das Subprotokoll der Verbindung wird durch die Port-Nummer des Server-Sockets spezifiziert. Dadurch konnen unterschiedliche Verbindungsty-pen (TELNET, FTP, WWW, . . . ) quasigleichzeitig auf eine physikalische Netzschnittstel-le zugreifen – soweit dafur ein Server-Programm vorgehalten wird. So hat beispielsweiseein TELNET-Server die Port-Nummer 23, ein SMTP-Server 25, ein WWW-Server 80.Der Client gibt beim Connect-Versuch die gewunschte Port-Nummer an, um mit demzustandigen Server verbunden zu werden. Die ublichen Client-Programme machen diesohne Zutun richtig – ein TELNET-Programm versucht einen Verbindungsaufbau mit Port23 des Host-Rechners. Zu Testzwecken kann die Verbindung auch zu einer anderen Port-Nummer hergestellt werden (z. B. TELNET-Client ↪→ SMTP-Server, um das Protokoll zustudieren).

Generell ist vorgesehen, dass von einem Server mehrere Verbindungen vom gleichen Typgemanagt werden konnen, dazu wird der Listener-Socket bei der Verbindungsannahmejeweils dupliziert und die Datenubertragung wird auf dem Duplikat abgewickelt.

Die Liste der festgelegten Port-Nummern (‘well-known ports’) ist in RFC1700 [48] ver-offentlicht (‘Request for Comments is a series of documents published by the Internet

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 119

Engineering Task Force [49] and cover a broad range of topics. The core topics are the In-ternet and the TCP/IP protocol suite.’). Die vom Rechnerbetriebssystem belegten Portsbzw. Dienste finden sich in der Datei services (bei UNIX-Systemen im Verzeichnis /etc,bei Windows-NT- oder -2000-Systemen im Verzeichnis ...\System32\drivers\etc, beiWindows-95/98/ME-Systemen im Windows-Hauptverzeichnis). Bei der Programmierungvon Socket-Verbindungen mussen Kollisionen von Port-Nummern mit ‘well-knowns’ ver-mieden werden (> 1024 im allgemeinen problemlos).

7.7.2 Socket-Server in C/C++

In C/C++ unter Linux oder Windows ist eine Socket-Verbindung meist mit relativ ein-fachen Anweisungen realisierbar, die zustandigen Funktionen ahneln den ublichen Datei-Ein/Ausgabe-Funktionen.

Bei einem Server-Socket wird die Verbindung mit socket und bind bereitgestellt,listen wartet dann auf ankommende Verbindungen, die mit accept angenommen wer-den. Dabei wird ein Duplikat des Sockets erstellt, mit dem die Datenubertragung durchdie Funktionen recv und send abgewickelt wird. Der ursprungliche Socket bleibt emp-fangsbereit, kann weitere Verbindungen abweisen, in eine Warteschlange stellen oder uberweitere Duplikate sofort annehmen. Nach dem Ende der Verbindung wird das Socket-duplikat mit closesocket geschlossen, der Server-Socket geht wieder in den normalenListen-Zustand zuruck.

Im folgenden Beispiel ist ein einfacher Echo-Server programmiert, ein Programm, das aneinem bestimmten Port auf eine Verbindungsanforderung wartet und die ankommendenDaten reflektiert.

Port und Rechnername werden als Konstanten fest eingestellt:

const unsigned short PORT = 1234;const char HOSTNAME[] = "localhost"; .

Unter Windows ist es zuallererst notwendig, das Socket-System zu initialisieren, das machtdie Funktion WSAStartup:

WORD wVersionRequested = MAKEWORD( 1, 0 );WSADATA wsaData;WSAStartup( wVersionRequested, &wsaData ); .

Die Informationen uber die Verbindungsart, Portnummer und IP-Adresse werden in einerStruktur von Typ sockaddr_in abgelegt, die Funktion gethostbyname ubersetzt denRechnernamen in eine IP-Adresse (lokal oder durch Anfrage bei einem Nameserver):

struct sockaddr_in ad, adcli;int adlen = sizeof(sockaddr_in);ad.sin_family = PF_INET;ad.sin_port = htons(PORT);

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 120

struct hostent *he = gethostbyname(HOSTNAME);if (he==0) {

printf("Error: gethostbyname.\n");return -1;}memcpy(&ad.sin_addr, he->h_addr, 4); .

Diese Struktur wird bei der Erstellung des Sockets in der Funktion bind als Parameterbenotigt:

SOCKET S = socket(AF_INET, SOCK_STREAM, 0);WSASetLastError(0);if (bind(S, (sockaddr *) &ad, sizeof(ad))!=0) {

printf("Bind Error: %d\n", WSAGetLastError());return -1;} .

In der folgenden Endlosschleife wird auf die Verbindungsanforderung durch einen Client-Socket gewartet, listen stoppt das Programm solange. accept nimmt die Verbindungauf dem Duplikat T an, in der Struktur adcli werden die Client-Daten abgelegt, mankann feststellen, mit wem man verbunden ist. Die zweite Schleife empfangt Daten, gibtsie auf dem Bildschirm aus und schickt sie wieder zuruck, bis der Client die Verbindungbeendet (recv liefert ein Ergebnis <= 0):

for (;;) {listen(S, 5);SOCKET T = accept(S, (sockaddr *) &adcli, &adlen);for (;;) {const int BUFSIZE = 1024;char buffer[BUFSIZE+1];int n = recv(T, buffer, BUFSIZE, 0);if (n<=0)

break;buffer[n] = ’\0’;printf(buffer);send(T, buffer, strlen(buffer), 0);

}closesocket(T);

}return closesocket(S); // never reached .

Nach der zweiten Schleife wird das Socket-Duplikat T mit closesocket geschlossen. Dieaußere Endlosschleife kann nie verlassen werden, die letzte Zeile ist mithin nur ein Tributan guten Programmierstil.

In einem Messsystem wurde man statt der printf-Zeile eine geeignete Aktion implemen-tieren, d. h. die Nachricht im buffer interpretieren, darauf reagieren, die Antwort imbuffer ablegen.

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 121

Nach minimalen Anderungen ist das Programm auch unter Linux lauffahig:

• Alle Funktionen, die mit WSA beginnen, sind Windows-spezifisch, fallen unter Linuxweg.

• Die Casts von sockaddr_in nach sockaddr sind unter Linux unnotig.

• Statt closesocket genugt unter Linux ein close.

7.7.3 Socket-Client in C/C++

Ein zu dem Socket-Server-Programm komplementares Client-Programm, das Konsol-Ein-gaben an den Server schickt und die Antworten ausgibt, lasst sich durch kleine Anderungenrealisieren.

Nach dem ungeanderten ersten Teil wird die Verbindung vom Client mit connect auf-gebaut:

SOCKET S = socket(AF_INET, SOCK_STREAM, 0);WSASetLastError(0);if (connect(S, (sockaddr *) &ad, sizeof(ad))!=0) {

printf("Connect Error: %d\n", WSAGetLastError());return -1;} .

Dann die Endlosschleife mit Tastatureingabe, Verschicken, Empfangen, Ausgabe:

for (;;) {const int BUFSIZE = 1024;char buffer[BUFSIZE+1];fgets(buffer, BUFSIZE, stdin);if ((buffer[0]==’e’)||(buffer[0]==’E’))break;

send(S, buffer, strlen(buffer), 0);int n = recv(S, buffer, BUFSIZE, 0);buffer[n] = ’\0’;printf(buffer);

}return closesocket(S); .

7.7.4 Socket-Client in MATLAB/Java

Durch die Java-Integration ist es sehr einfach geworden, die TCP/IP-Kommunikationdirekt in MATLAB zu formulieren. Das zustandige Package java.net wird importiertund es wird ein Socket-Objekt mit den benotigten Eigenschaften (Zielrechner, Port)formuliert:

mdv :mdvperi.tex 14. Oktober 2006

7 Schnittstellen und Programmierung 122

import java.net.*so = java.net.Socket(’131.173.11.215’, 1234);...V(i) = measure(so, C(i));...so.close; .

Die Messroutine measure ubermittelt einen Vorgabewert C(i) an das Messsystem undliest einen Messwert V(i):

function volt = measure(so, curr)sData = sprintf(’da4 %d’, curr);SocketIO(so, sData);rData = SocketIO(so, ’ad4’);volt = str2double(rData); .

Die eigentliche Kommunikation wird von der Funktion SocketIO erledigt:

function recvStr = SocketIO(socket, sendStr)str = java.lang.String(sendStr);out = socket.getOutputStream;out.write(str.getBytes);in = socket.getInputStream;isr = java.io.InputStreamReader(in);ibr = java.io.BufferedReader(isr);recvStr = ibr.readLine; .

Der MATLAB-String wird in einen Java-String gewandelt, der OutputStream des Socketswird etabliert, der Java-String wird verschickt. Auf den InputStream des Sockets wirdein BufferedReader aufgesetzt, mit dem eine ankommende Zeile gelesen wird.

mdv :mdvperi.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 123

8 Windows-Programmierung mit Visual C++

Einfache Messprogramme, Praktikumsanwendungen, Prototypprogramme, leicht veran-derbare Programme oder solche mit nur kurzer Lebensdauer werden zweckmaßigerweisemit einer graphischen Messumgebung wie LabView bzw. VEE oder – wie in Kapitel 5beschrieben – mit einem Numerikprogramm wie MATLAB programmiert. Fur Aufgaben,die deutlich daruber hinaus gehen, beispielsweise die Erstellung von professionellen Mess-programmen fur feste apparative Aufbauten, kann es sinnvoll sein, Windows-Programmekomplett in einer einfachen Programmiersprache wie C, C++ oder Pascal (Delphi) zuerstellen.

Wegen des großen, praktisch unuberschaubaren Funktionenwildwuchses des Betriebssy-stems Windows – die Header-Datei Windows.h umfasst typischerweise 5000 bis 10000 Zei-len – ist es sehr aufwendig und fehleranfallig, umfangreiche Windows-Programme direkt ineiner Sprache wie C zu schreiben. Sinnvoller ist es, sich geeigneter vorgefertigter Objekteund der zugehorigen objektorientierten Programmiersprache sowie einer darauf zugeschnit-tenen leistungsfahigen Programmierumgebung mit gutem Online-Hilfesystem zu bedienen.Am Beispiel von Visual C++44 und der Klassenbibliothek der Microsoft Foundation Clas-ses sollen hier einige der Moglichkeiten zur Erstellung von Windows-Messprogrammendiskutiert werden. Zur Realisierung werden die Hilfsmittel der Microsoft-Entwicklungs-umgebung Visual Studio benutzt, die – zusammen mit den MFCs – in vielen neuerenBuchern zur Windows-Programmierung (z. B. [50]) relativ gut dokumentiert sind.

Man mag uber die Firma denken wie man will;es gibt niemanden, der Windows besser kennt.

8.1 C, C++ und MFC, Visual C++

Zunachst soll die Entwicklung in der Technik der Windows-Programmierung mit einfachenBeispielen in C bzw. C++ illustriert werden. Ahnliche Entwicklungen uber die Objektori-entierung zur visuellen Umgebung lassen sich auch in anderen Sprachfamilien nachvollzie-hen.

8.1.1 Windows-Programmierung in C

Die klassische Programmiersprache fur Windows-Programme ist C, ein damit erstelltesMinimal-HelloWorld lasst sich – wie das entsprechende C-Einstiegsprogramm unter DOS,UNIX, Linux – auf wenige Zeilen kondensieren:

5 #include <windows.h>

44Die in diesem Skriptum verwendeten Soft- und Hardwarebezeichnungen sind in den meisten Fallenauch eingetragene Warenzeichen und unterliegen als solche den gesetzlichen Bestimmungen.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 124

6 int WINAPI WinMain(HINSTANCE I, HINSTANCE PrevI, LPSTR CL, int CmdShow )7 {8 MessageBox(NULL, "Hello Windows!", "Quite Simple", MB_OK);9 return 0;

10 }

Das Hauptprogramm ist immer WinMain(), das als WINAPI oder PASCAL klassifiziert wer-den muss (Art der Parameterubergabe). Die ubergebenen Parameter betreffen Mehrfach-aufrufe des Programms (I und PrevI), Befehlszeile (CL) und Sichtbarkeit (CmdShow).

Das Ergebnis ist dann auch nicht aufregender als beim Standard-HelloWorld unter anderen Systemen, zeigt aber schon, dass manauf relativ einfache Weise vorgefertigte Objekte mit gewisser Basis-funktionalitat verwenden kann – so man denn weiß, wie die heißen.Nutzlich ist das Minimalprogramm als Test fur die richtige Funktionvon Compiler, Linker etc.

Soll das Windows-Programm mehr tun, als eine schlichte Meldung von sich zu geben45,muss man einen großeren Aufwand treiben. WinMain() wird deutlich umfangreicher, da ei-nige Eigenschaften des Programms und des zugehorigen Fensters definiert werden mussen.

9 int WINAPI WinMain(HANDLE I, HANDLE IPrev, LPSTR CL, int cmdShow)10 {11 MSG msg;12 WNDCLASS wc;13 HWND hwnd;14 if (IPrev == NULL) {15 memset(&wc, 0, sizeof(wc));16 wc.lpszClassName = "Hello";17 wc.hInstance = I;18 wc.hCursor = LoadCursor(NULL, IDC_ARROW);19 wc.hIcon = LoadIcon(I, "UNIICON");20 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);21 wc.style = 0;22 wc.lpfnWndProc = MyWndProc;23 if(!RegisterClass(&wc)) return FALSE;24 }25 hwnd = CreateWindow("HELLO", "HELLO", WS_OVERLAPPEDWINDOW,26 CW_USEDEFAULT, 0, CW_USEDEFAULT, CW_USEDEFAULT,27 NULL, NULL, I, NULL);28 ShowWindow(hwnd, cmdShow);29 UpdateWindow(hwnd);30 while (GetMessage(&msg, NULL, 0, 0))31 DispatchMessage(&msg);32 return msg.wParam;33 }

45Einfache Dialogfenstern dieser Art lassen sich wahrend der Programmentwicklung vorteilhaft alsDebug-Hilfe einsetzen.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 125

Nur einige der hier festgelegten Eigenschaften (Komponenten der WNDCLASS-Struktur undFenstereigenschaften) sind von der jeweiligen Anwendung abhangig, die meisten der obigenProgrammzeilen sind in praktisch allen C-Windows-Programmen identisch, insbesonderebeispielsweise die letzten Zeilen, die die Fensterdarstellung veranlassen und die eintreffen-den Meldungen abarbeiten.

Windows ist ein ereignis- bzw. meldungsorientiertes Betriebssystem, Meldungen (messa-ges) losen Aktionen aus. Daher muss als zentraler ‘Briefkasten’ fur die an das Windows-Programm gerichteten Meldungen eine CALLBACK-Funktion bereitgestellt werden, die dieeintreffenden Meldungen analysiert und die notwendigen Aktionen veranlasst.

46 LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)47 {48 switch(msg) {49 case WM_PAINT:50 Paint(hwnd);51 return(0);52 case WM_DESTROY:53 PostQuitMessage(0);54 return(0);55 default:56 return(DefWindowProc(hwnd, msg, wP, lP));57 }58 }

Im vorliegenden Beispiel sind nur die Meldungen WM_PAINT und WM_DESTROY berucksich-tigt, alle anderen werden an die Standardfunktion DefWindowProc() weitergeleitet.

Schließlich muss die von WM_PAINT veranlasste Aktion Paint() noch definiert werden,Einfachst-Grafik und Schrift:

35 void Paint(HWND hwnd)36 {37 PAINTSTRUCT paintStruct;38 HDC hDC = BeginPaint(hwnd, &paintStruct);39 if (hDC != NULL) {40 LineTo (hDC, 200, 100);41 TextOut (hDC, 200, 100, "Hello UNIOS!", 12);42 EndPaint(hwnd, &paintStruct);43 }44 }

Damit ist das Programm komplett mit seinen we-sentlichen Teilen: der Hauptfunktion WinMain(), derCALLBACK-Funktion mit der Meldungsauswahl und derFunktion Paint(), die die gewunschte Arbeit verrichtet.Das Ergebnis ist das nebenstehende Fenster, das nach derZeichenaktion keine weiteren Ereignisse vorsieht.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 126

8.1.2 Objektorientiert mit C++ und MFC

Uber die Bibliothek der Microsoft Foundation Classes (MFC) werden einige der immergleichartigen Grundeigenschaften vordefiniert in einigen Basisklassen bereitgestellt.

Beim Einfachstprogramm kann dies gegenuber C – sieht man einmal von den kurzerenParameterlisten ab – noch keine wesentliche Verbesserung bringen:2 #include "afxwin.h"3 class CApp : public CWinApp {4 virtual BOOL InitInstance() {5 AfxMessageBox("Hello Win !");6 return FALSE;7 };8 } theApp;

Das zweite Beispiel dagegen stellt sich im Vergleich zu C deutlich ubersichtlicher dar.Zuerst die Deklaration der benotigten Basisobjekte Anwendung (theApp) und zugehorigesFenster (FW):

2 #include "afxwin.h"3

4 class CApp : public CWinApp {5 virtual BOOL InitInstance();6 } theApp;7

8 class CFWin : public CFrameWnd {9 LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );

10 void Paint();11 } FW;

Die Initialisierungsfunktion verbindet die Anwendung mit dem Fenster und startet an-schließend die Fensterdarstellung mit den gewunschten Eigenschaften.

13 BOOL CApp::InitInstance()14 {15 m_pMainWnd = &FW;16 FW.Create(NULL, "MFC Example");17 FW.ShowWindow(m_nCmdShow);18 FW.UpdateWindow();19 return TRUE;20 }

Zur Abarbeitung der Meldungen wird die in der Basisklasse CFrameWnd schon vorhandeneFunktion WindowProc() uberladen:

22 LRESULT CFWin::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )23 {

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 127

24 switch (message) {25 case WM_PAINT:26 Paint();27 return 0;28 case WM_DESTROY:29 PostQuitMessage(0);30 return 0;31 default:32 return DefWindowProc(message, wParam, lParam);33 }34 }

Zum Schluss wieder die ‘Arbeits’-Funktion Paint(). Die Ahnlichkeit mit der korrespon-dierenden C-Funktion (Seite 125) resultiert in einem entsprechenden Gesamtergebnis.

36 void CFWin::Paint()37 {38 PAINTSTRUCT p;39 CDC * dc = BeginPaint(&p);40 dc->LineTo(200,100);41 dc->TextOut(200,100,"Hello WORD");42 EndPaint(&p);43 }

8.1.3 Programmunterstutzt in Visual C++

In den bisherigen Programmbeispielen in C und C++ wurde deutlich, dass ein uber ei-ne einfache MessageBox hinausgehendes Windows-Programm einen fast immer gleichenRoutineaufwand erfordert, bis ein lauffahiges Programmgerust erstellt ist. Dieser Anfangs-aufwand kann dadurch vereinfacht werden, dass man das Grundgerust kopiert46; das Er-stellen der switch-Struktur fur die Meldungsabarbeitung und vor allem die Deklarationund Definition der benotigten Funktionen bleibt aber eine aufwendige und vor allem sehrfehleranfallige Arbeit. Da ein Großteil des Arbeitsaufwands formal beschrieben werdenkann, liegt es nahe, diesen Teil dem Rechner, d. h. einer darauf spezialisierten Program-mierumgebung zu uberlassen.

Visual C++ ist eine solche Programmierumgebung, wird sie richtig eingesetzt, konnenselbst umfangreichere Windows-Programme mit minimalem Programmieraufwand reali-siert werden. Wichtig ist dafur allerdings, die vielfaltigen Moglichkeiten der Entwicklungs-umgebung zu kennen und sie auch zu nutzen, aber auch, sich in erster Naherung mit denVorgaben der bereitgestellten vorgefertigten Klassen (MFC) zufrieden zu geben.

46In klassischen Programmieranleitungen wurde meist ein Basisprogramm (generic.c oder ahnlich)bereitgestellt – und meist auch seitenfullend abgedruckt, das der Anwender als Kopiervorlage benutzenkonnte.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 128

Fur nebenstehende Anwendung mussten nur die Zeilen61 und 62 an der richtigen Stelle eingefugt werden.

57 void CVc1View::OnDraw(CDC* pDC)58 {59 CVc1Doc* pDoc = GetDocument();60 ASSERT_VALID(pDoc);61 pDC->LineTo(200,100);62 pDC->TextOut(200,100,"Halloween?");63 }

Ausgenutzt wurde, dass Visual C++ ein komplettes Ausgangsgerust fur ein Windows-Programm bereitstellt. Die vielseitigen weiteren leistungsfahigen Programmierhilfsmittelder Entwicklungsumgebung sind in der inzwischen sehr umfangreichen Literatur47 zu Vi-sual C++ ausfuhrlich beschrieben (z. B. in [50]).

8.2 Dialogorientierte Programme

Der MFC-Anwendungsassistent (MFC AppWizard) kann fertige Grundgeruste fur drei Ty-pen von Programmen erstellen: Einzeldokument-, Mehrfachdokument- und Dialog-basierte.Sie unterscheiden sich in den verwendeten Basisfensterklassen. Fur Testzwecke, aber auchfur einfachere Anwendungen sind dialogorientierte Programme sehr gut geeignet, da siefur die jeweils gewunschte Funktionalitat relativ rasch weitgehend visuell erstellt werdenkonnen. An einem einfachen Beispiel (Eingabe, Berechnung, Ausgabe) soll dies erlautertwerden.

Nach dem Start der Entwicklungsumgebung mit der Auswahl (File→New) eines neuenProjekts des Typs MFC AppWizard (exe), Namensvergabe und Festlegung des Arbeitsver-zeichnisses wird im AppWizard -Fenster der Punkt ‘Dialog based’ markiert (Abbildung 68)und der Erstellungsdialog zu Ende gefuhrt.

Abbildung 68: Startfenster bei Auswahl eines neuen Projekts des Typs MFC AppWizard(exe), fur Dialog-Programme wird ‘Dialog based’ gewahlt.

47Bei der Auswahl eines Buches sollte man darauf achten, ob der Autor sich auf C++ und MFC kon-zentriert oder aber – was leider auch teilweise vorkommt – zunachst umfanglich C-Programme alten Stilsaus Vorgangerbuchern wiederverwertet.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 129

8.2.1 Visuelle Dialogerstellung mit dem Ressourceneditor

Der benotigte Dialog wird visuell mit dem Ressourceneditor erstellt, die Vorgehensweiseist in den folgenden Abbildungen dargestellt:

Abbildung 69: Aus der Ressourcenubersicht (links) wird der vorgefertigte Hauptdialog imRessourceneditor geoffnet und interaktiv erweitert; die wichtigsten Objekte konnen ausder Werkzeugleiste (rechts) ausgewahlt werden.

Abbildung 70: Zunachst wird ein veranderbares Textfeld (Edit) eingefugt, und es wer-den dessen Eigenschaften festgelegt (das obige Eigenschaftsfeld zeigt die Voreinstellungen,beispielsweise kann statt des vom Wizard eingestellte Namens IDC EDIT1 ein sinnvollerergewahlt werden).

Abbildung 71: Die zweite Eigenschaftsseite: bei Zahlen macht es Sinn, die Textausrichtungvon Left auf Center oder Right zu andern.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 130

Abbildung 72: Einfugen einer Drucktaste mit der Beschriftung ‘Square’ und dem NamenIDC ACTION. Durch ‘&’ wird ein Tastaturkurzel definiert (Alt-S).

8.2.2 Funktionen und Variablen

Nach der Konstruktion der Benutzeroberflache werden Funktionen und Variablen an dieneuen Objekte gebunden. Dazu wird der Klassen-Assistent (Class Wizard) aufgerufen. Inseinem Submenu Member Variables wird dem erstellten Textfeld mit Add Variable dieIntegervariable m_Count zugewiesen (Abbildung 73).

Abbildung 73: Verbinden einer Variablen mit dem Textfeld des Dialogs.

Im Submenu Message Maps wird an den Tastendruck auf die Square-Taste (IDC_ACTION,BN_CLICKED) eine Funktion gebunden (Add Function). Das Wizard -Programm schlagtdafur einen vom Tastennamen IDC_ACTION abgeleiteten Funktionsnamen – OnAction()

Abbildung 74: Submenu Message Maps des Klassenassistenten: Mit Add Function wirdeine Funktion an ein Ereignis gebunden, mit Edit Code der Funktionscode erstellt.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 131

– vor, mitEdit Code kommt man dann im Texteditor zum vorgefertigten Funktionsrumpfund kann den Funktionscode implementieren. Im vorliegenden Beispiel sind das die dreiZeilen 175–177 innerhalb der Funktion OnAction() (Abbildung 75).

173 void CTDlg::OnAction()174 {175 UpdateData(true);176 m_Count *= m_Count;177 UpdateData(false);178 }

Abbildung 75: Funktionscode und fertige Benutzeroberflache fur das Programmbeispiel.

Wie schon durch die Bezeichnung nahegelegt, wird durch Drucken der Square-Taste derFensterinhalt quadriert. Die Funktion UpdateData() synchronisiert die Variablen zwi-schen Fenster und Programm, die Richtung wird durch true (Dialogfenster→Programm,Voreinstellung) bzw. false (Programm→Dialogfenster) festgelegt.

8.3 MFC-Zeitfunktionen

Neben den in Abschnitt 7.3 beschriebenen Windows-Funktionen zur Zeitsteuerung ste-hen in den Microsoft Foundation Classes einige vereinfachte Klassen und Methoden zurVerfugung, mit denen zeitliche Ablaufe gesteuert werden konnen.

8.3.1 Systemzeit

Korrespondierend zu den Zeit-Management-Funktionen in C (time.h) definieren die Mi-crosoft Foundation Classes die beiden Klassen CTime und CTimeSpan fur den objektori-entierten Umgang mit absoluten und relativen Zeiten (ausfuhrliche Beschreibung in derOnline-Hilfe). Die Funktion

void CAnyWnd::OnTimer() {CTime now = CTime::GetCurrentTime();CString s;s.Format ( "%02d:%02d:%02d", now.GetHour(),

now.GetMinute(), now.GetSecond() );SetWindowText ( s );

}

etwa wurde in der Titelleiste von AnyWnd die aktuelle Zeit darstellen. Die fur eine re-gelmaßige Aktualisierung notwendige periodische WM_TIMER-Nachricht kann man durch

SetTimer ( 1, 1000, NULL );

veranlassen (s. nachsten Abschnitt).

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 132

8.3.2 Timer

Taktgeber (Timer) konnen mit etwas vereinfachten Methoden eingerichtet werden, daSetTimer() und KillTimer() Klassenmethoden der Basisklasse CWnd sind. DieZeitauflosung und damit auch die minimal einstellbare Taktrate betragt derzeit 10 msec.Nachstehendes Programmfragment verdeutlicht die etwas einfachere Verwendung:

static UINT MyTimer = 1;const UINT Elapse = 100; // timeout 100 msec...void CALLBACK TiProc (HWND h, UINT msg, UINT timer, DWORD systime){ Do what you want to do every 100 msec }...MyTimer = SetTimer (MyTimer, Elapse, TiProc); // install timer...KillTimer (MyTimer); // deinstall timer

8.4 Dokumentorientierte Programme

Fur einfache Ablaufe sind dialogorientierte Programme sehr gut geeignet, vor allem auchrasch zu programmieren. Falls man jedoch innerhalb des Programms Daten graphischdarstellen, Dateien lesen oder schreiben, die Zwischenablage benutzen oder ausdruckenmochte, wird es zweckmaßig, einen anderen vom MFC AppWizard bereitgestellten Pro-grammprototypen zu verwenden, dokumentorientierte Programme. Meist reicht es aus,mit einem einzelnen Dokumentfenster zu arbeiten, dazu wahlt man im Startfenster desWizards den Punkt ‘Single document’ an (Abbildung 76) und fuhrt den Erstellungsdialogmit den vorgeschlagenen Einstellungen zu Ende.

Abbildung 76: Startfenster bei Auswahl eines neuen Projekts des Typs MFC AppWi-zard (exe), fur dokumentorientierte Programme mit einem Dokumentfenster wird ‘SingleDokument’ gewahlt.

Wie auch bei dialogorientierten Programmen wird eine komplette Programmstruktur er-stellt, die schon alle Basiselemente einer typischen Windows-Anwendung im richtigen

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 133

Abbildung 77: Vom AppWizard zusammengestellte Basiselemente einer ‘Single-Docu-ment’-Anwendung.

‘Look and Feel’ enthalt (Abbildung 77). So gibt es unter anderem eine vorgefertigte Menu-leiste mit den wichtigsten Menupunkten, eine Werkzeugleiste mit einigen Drucktastenund eine unten im Fenster eingeblendete Statuszeile. Weiterhin ist dafur gesorgt, dass derName des aktuellen Dokuments zusammen mit dem Programmnamen im Fenstertitel er-scheint. Erganzungen in der Benutzeroberflache und Erweiterungen in den vorgefertigtenPrototypfunktionen machen aus der Grundstruktur eine Anwendung mit der gewunschtenFunktionalitat.

Die Programmfunktionen sind bei dokumentorientierten Programmen auf mehrere Ba-sisobjekte verteilt: Die Anwendung (Basisklasse CWinApp), das Hauptfenster (BasisklasseCFrameWnd), das eigentliche Dokument (Basisklasse CDocument) und die Dokumentdarstel-lung (Basisklasse CView). Erganzungen werden zweckmaßigerweise dort implementiert, wosie logisch hingehoren. Insbesondere sollte man gut zwischen Dokument und Darstellungabgrenzen (Datei-Management in der Dokument-Klasse, Drucken wie auch Bildschirmdar-stellung in der View-Klasse).

8.4.1 Dateizugriff

Alles, was man dazu braucht, ist vorgefertigt vorhanden, wenn man das Standard-Datei-menu verwendet. Dokumente werden durch die Methode Serialize() in einem Archiv(Typ CArchive) abgelegt oder daraus geladen, das seinerseits mit einem Dateiobjekt (TypCFile) verbunden ist. Dateiname und -verzeichnis werden uber den gewohnten Standard-dialog festgelegt.

Serialize() ist innerhalb der Dokumentklasse als leeres Gerust vorgefertigt:

void CAnyDoc::Serialize(CArchive& ar){

if (ar.IsStoring()) {// TODO: add storing code here

}

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 134

else {// TODO: add loading code here

}} .

Eine Implementierung, die nPoints Integer-Datenwerte Y[i] aus dem Objekt Osc zeilen-weise in Textform speichert oder liest, konnte so aussehen:

void CAnyDoc::Serialize(CArchive& ar){

CString s;if (ar.IsStoring()) {for (int i=0; i<Osc.nPoints; i++) {

s.Format("%3d\r\n", Osc.Y[i]);ar.WriteString (s);

}}else {for (int i=0; ar.ReadString(s) && (i<Osc.MaxPoints()); i++)

Osc.Y[i] = atoi(s);Osc.nPoints = i;

}} .

Neben den Methoden WriteString() und ReadString() bietet CArchive noch Write()und Read() fur binaren Zugriff sowie die Streamoperatoren << und >> fur die gangigstenVariablentypen.

8.4.2 Graphik

Die graphische Darstellung der gemessenen Daten ist ein essentieller Teil bei jedem physi-kalischen Experiment. Die fur Veroffentlichungen, Diplom- oder Doktorarbeiten benotigtenPrasentationsgraphiken konnen sehr gut mit darauf spezialisierten Programmen aus demPublic-Domain-Bereich wie GnuPlot oder kommerziellen Programmen wie Excel, Origin,EasyPlot, MATLAB erstellt werden. Daneben sind jedoch – um eine physikalische Mes-sung zu uberwachen und zu dokumentieren – einfache Bildschirmgraphiken notwendig,die das Messprogramm zeitgleich mit der Messung direkt aus den Rohdaten liefern sollte.Solche Einfachgraphiken lassen sich ohne großen Aufwand mit den Windows-Hilfsmittelnrealisieren.

Graphische Darstellungen in einer Anwendung sollten sich ‘windowskonform’ verhalten,d. h. beispielsweise nach einer Anderung der Fenstergroße sofort in der veranderten Großeneu gezeichnet oder nach einer Fensteruberdeckung umgehend regeneriert werden. SolcheAktualisierungen werden im betroffenen Fenster jeweils durch eine WM PAINT-Nachrichtausgelost, die vom System an das Fenster geschickt wird. In der CView-Klasse wird dadurch

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 135

letztlich die Methode OnDraw() angestoßen, die dafur zustandig ist, den Fensterinhaltzu zeichnen. Fur die Programmierung heißt das andererseits, dass alle Graphikaktionenmit permanentem Ergebnis ausschließlich uber OnDraw() ausgefuhrt werden sollten. EineMethode, die fur die Datenerfassung zustandig ist, muss sich daher darauf beschranken,die Daten zu sammeln und bereitzustellen sowie von Zeit zu Zeit die Aktualisierung dergraphischen Darstellung zu veranlassen, beispielsweise durch Aufruf der FensterfunktionInvalidate().

Geratekontext: Fast alle Informationen und viele Werkzeuge, die zur graphischen Dar-stellung notwendig sind, werden von der Geratekontextklasse CDC oder davon abgeleitetenKlassen bereitgestellt. Der jeweils aktuelle Geratekontext wird beim Aufruf von OnDraw()als Parameter ubergeben und kann dann innerhalb der Zeichenroutine benutzt werden.

Koordinaten: Gezeichnet wird auf den Bildschirm, genauer in das Client-Fenster. Dessenrelative Pixel-Koordinaten liefert die Fenster-Funktion GetClientRect(), die sie in einerStruktur des Typs CRect ablegt. Man kann direkt in diesem Koordinatensystem arbeiten,indem man die zu zeichnenden Daten in diese Koordinaten umrechnet. Einfacher ist es,die Umrechnung Windows zu uberlassen und die Koordinatentransformation indirekt zuspezifizieren. Dazu stellt die CDC-Klasse verschiedene Funktionen bereit, die die Abbil-dung von Benutzer-Koordinaten (Window) auf Geratekoordinaten (Viewport) regeln. DieProgrammierung kann meist entsprechend dem folgenden Beispiel ablaufen:

1 void CAnyView::OnDraw(CDC* pDC) {2 CRect R;3 GetClientRect(R);4 R.DeflateRect(10, 10);5 pDC->SetMapMode(MM_ANISOTROPIC);6 pDC->SetWindowExt(Osc.Xmax()-Osc.Xmin(), Osc.Ymin()-Osc.Ymax());7 pDC->SetWindowOrg(Osc.Xmin(), Osc.Ymax());8 pDC->SetViewportExt(R.Size());9 pDC->OffsetViewportOrg(R.left, R.top);

10 ...

Zunachst werden die Koordinaten des Client-Fensters festgestellt, Zeile 4 verkleinert dieZeichenflache um einen 10 Pixel breiten Rand. In Zeile 5 wird die richtige Abbildungsarteingestellt, Zeilen 6 und 7 definieren die Benutzerkoordinaten, 8 und 9 die Geratekoordi-naten. In SetWindowOrg() ist berucksichtigt, dass der Ursprung der Geratekoordinatenoben links ist.

Zeichenfunktionen: Fur das Zeichnen von Linien sind die beiden Methoden MoveTo()und LineTo() zustandig, ein rechteckiger Rahmen konnte mit

9 ...10 pDC->MoveTo(Osc.Xmin(), Osc.Ymin());11 pDC->LineTo(Osc.Xmax(), Osc.Ymin());12 pDC->LineTo(Osc.Xmax(), Osc.Ymax());13 pDC->LineTo(Osc.Xmin(), Osc.Ymax());

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 136

14 pDC->LineTo(Osc.Xmin(), Osc.Ymin());

die Daten schließlich mit

15 pDC->MoveTo(Osc.X[0], Osc.Y[0]);16 for (int i=1; i<Osc.nPoints; i++)17 pDC->LineTo(Osc.X[i], Osc.Y[i]);

gezeichnet werden.

Zeichenwerkzeuge: Fur farbige Linien braucht man einen farbigen Zeichenstift (Pen),er wird als CPen-Objekt kreiert und vor Zeichenbeginn selektiert:

CPen * RedPen = new CPen ( PS_SOLID, 0, RGB (255, 0, 0) );pDC->SelectObject ( RedPen );

in diesem Fall ein durchgezogener Linientyp der Strichstarke 1 Pixel in Rot.

8.4.3 Drucken

Das Ausdrucken einer Graphik erfolgt ebenfalls uber die OnDraw()-Methode, allerdings ineinem anderen Geratekontext und vor allem auf ein Gerat mit anderen Koordinaten. Ob ge-druckt wird, kann mit der Funktion IsPrinting() aus der CDC-Klasse nachgefragt werden.Abhangig von der Antwort konnen Teile der Graphik je nach Gerat unterschiedlich behan-delt werden, z. B. konnte eine auf dem Bildschirm farbige Linie auf den Drucker schwarzund strichpunktiert ausgegeben werden. Wichtiger ist es, die Koordinatentransformationgeeignet zu andern, um die Graphik sinnvoll im Ausdruck zu plazieren. Dazu muss man sichdie Druckereigenschaften beschaffen, am einfachsten aus dem in OnPreparePrinting()ubergebenen Druckerinformationsblock, dessen Adresse man sich kopiert:

static CPrintInfo * PrintInfo;...BOOL CAnyView::OnPreparePrinting(CPrintInfo* pInfo) {PrintInfo = pInfo;...

} ,

um daraus innerhalb der OnDraw()-Methode die Druckerkoordinaten zu extrahieren:

if (pDC->IsPrinting()) {R = PrintInfo->m_rectDraw;R.DeflateRect(R.Width()/8, R.Height()/8, R.Width()/8, R.Height()/2);

} .

Mit DeflateRect() wird hier ein linker, oberer und rechter Rand von etwa 25 mm einge-stellt, ein unterer Rand von halber Seitenlange.

Was sonst noch zum Drucken notig ist, kann man dem Druckprozessor von Windowsuberlassen.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 137

8.4.4 Zwischenablage

Ahnlich einfach ist der Transport einer Graphik in die Zwischenablage, um sie in einemanderen Windows-Programm zu verwenden (WinWord, Datenbank etc.).

Zunachst wird der Menu-Unterpunkt ‘Edit→Copy’ (‘Bearbeiten→Kopieren’) mit einerFunktion versehen, das erledigt der Class Wizard (Abbildung 78).

Abbildung 78: Zuweisung einer Funktion zu ID EDIT COPY im Class Wizard.

Dann ist noch etwas Funktionscode notig:

void CAnyView::OnEditCopy() {CMetaFileDC p;if ( !p.CreateEnhanced( NULL, NULL, NULL, NULL ) )return;

OnDraw (&p);HENHMETAFILE hMF = p.CloseEnhanced();OpenClipboard();EmptyClipboard();SetClipboardData(CF_ENHMETAFILE, hMF);CloseClipboard();

} .

Es wird ein Metafile-Geratekontext kreiert und in diesem die Graphik – wie ublich mitOnDraw() – erstellt. Der darauf verweisende Zeiger (Handle) hMF wird schließlich an dieZwischenablage ubergeben.

8.4.5 Dialogfenster

Um die Parameter fur ein Messprogramm einzustellen oder um einzelne Daten darzustel-len, ist es auch in einem primar dokumentorientierten Programm sinnvoll, mit Dialogfen-stern zu arbeiten, da diese sehr flexibel erstellt werden konnen.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 138

Man muss zwei Typen von Dialogfenstern unterscheiden: Modale Dialoge beanspruchen fursich die volle Aufmerksamkeit, eine Ruckkehr zum Hauptprogramm ist erst am Ende desDialogs moglich. Man sollte sie dort einsetzen, wo eine Benutzereingabe auf jeden Fall zuEnde gefuhrt werden muss, bevor der normale Programmablauf fortgesetzt werden kann.Nichtmodale Dialoge dagegen konnen wie zusatzliche parallel arbeitende Programmfensterverwendet werden.

Erstellt werden beide Dialogtypen zunachst graphisch im Ressourceneditor. Mit dem ClassWizard wird dann eine zugehorige Klasse (hier: CParam, Parameterdialog) eingerichtet,die im allgemeinen Fall von CDialog abgeleitet wird, in Spezialfallen aber auch auf an-deren Dialog-Klassen basieren kann. Die Klasseneigenschaften werden uber die Headerda-tei importiert, ein Menupunkt zum Aufrufen des Dialogs und eine zugehorige Funktion(OnParam()) werden eingerichtet.

Bei modalen Dialogen ist die Verwendung sehr einfach, ein Dialog-Objekt wird innerhalbder Menufunktion angelegt und modal aufgerufen:

void CAnyView::OnParam() {CParam P;P.DoModal();

} .

Die Methode DoModal() sorgt dafur, dass das Dialogfenster erstellt und dargestellt wirdund dass die Parameter (Member Variables) bei ‘OK’ aktualisiert, bei ‘Abbrechen’ dagegenverworfen werden.

Die Farbe eines Zeichenstiftes konnte in einem modal gefuhrten Dialog der abgeleitetenKlasse CColorDialog etwa durch die Zeilen

static COLORREF COLOR;...void CAnyView::OnParam() {

CColorDialog C;if ( C.DoModal()==IDOK )COLOR = C.GetColor();

}...static CPen * ColorPen = new CPen ( PS_SOLID, 0, COLOR );

eingestellt werden.

Bei nichtmodalen Dialogen ist dagegen etwas mehr Aufwand notig. Im einfachsten Fallwird eine zusatzliche Create()-Methode implementiert:

BOOL CParam::Create(CWnd* pParentWnd) {return CDialog::Create(IDD, pParentWnd);

} ,

mit der das global im Programm angelegte Dialog-Objekt an einer zentralen Stelle kreiertwird, beispielsweise im Konstruktor des View-Objekts:

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 139

static CParam P;CAnyView::CAnyView() {

P.Create (this);} .

Mit der folgenden Implementierung von OnParam() kann dann die Sichtbarkeit des Dia-logfensters geswitcht werden:

void CAnyView::OnParam() {if (!P.ShowWindow(SW_HIDE))P.ShowWindow(SW_SHOWNORMAL);

} .

Da das Dialog-Objekt dauerhaft vorhanden ist – sichtbar oder unsichtbar – muss derDatenabgleich (P.UpdateData()) zur richtigen Zeit vom Programm explizit veranlasstwerden. Eine geeignete Stelle dafur ist z. B. der Zeitpunkt, an dem ein Messablauf gestartetwird.

Kleine nichtmodale Dialogfenster kann man als ‘System modal’ (Properties→More Styles)einrichten, dann werden sie nicht durch andere ‘normale’ Fenster uberdeckt.

8.4.6 Benutzeroberflache

Die Hauptelemente der Benutzeroberflache eines dokumentorientierten Programms sind inihrer Grundstruktur vorhanden – Menu, Werkzeugleiste und Statuszeile – und brauchennur noch geeignet erweitert zu werden. Primares Bedienelement ist die Menuleiste, alleErweiterungen sollten zunachst dort als neue Menupunkte im Haupt- oder einem Submenuimplementiert werden. Die Menufunktionen werden mit dem Class Wizard hinzugefugt.Die Werkzeugleiste wird ebenfalls graphisch um neue Tasten erweitert, die ublicherweisemit schon vorhandenen IDs belegt werden und dann Menupunkte duplizieren, aber auchneue Funktionen realisieren konnen. Die Eintrage in der Prompt-Zeile des ‘Property’-Dialogs definieren den Inhalt der Statuszeile zum jeweiligen Menupunkt (erste Zeile, vor\n), bei Drucktasten der Werkzeugleiste zusatzlich den Erlauterungstext (zweite Zeile,nach \n).

8.4.7 Mehrere Dokumentfenster

Meist reicht fur Datenerfassungsprogramme der beschriebene Programmtyp ‘Single do-cument’ aus. Sobald man aber z. B. mehrere Messdatensatze gleichzeitig darstellen undgetrennt voneinander abspeichern will, wird es zweckmaßig, den etwas komplexeren Pro-totyp ‘Multiple document’ einzusetzen. Das wird mit einer geanderten Anfangsauswahl imStartfenster des AppWizard veranlasst.

Neben den schon bekannten Basisobjekten Anwendung (Basisklasse CWinApp), Hauptfen-ster (Basisklasse CMDIFrameWnd), Dokument (Basisklasse CDocument) und Dokumentdar-stellung (Basisklasse CView) wird dann ein Subfenster-Objekt (Basisklasse CMDIChildWnd)

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 140

deklariert, das nun Dokument und View enthalt und logisch zwischen Hauptfenster undDokument bzw. View eingeschoben ist . Wahrend beim Einzeldokumentprogramm alleObjekte nur einfach vorhanden sind, wird beim Mehrfachdokumentprogramm jeweils einneuer Objektsatz Subfenster, Dokument und View erstellt, wenn ein neues Dokument(z. B. mit ‘Datei→Neu’) angelegt wird.

Das muss bei der Implementierung der Erweiterungen berucksichtigt werden: Sehr vielstrenger als beim Einzeldokumentprogramm ist zwischen den verschiedenen Objekten zuunterscheiden, insbesondere zwischen solchen, die einfach, und solchen, die mehrfach vor-handen sind. Objekte zur Bedienung des Experiments durfen nur einfach angelegt werden,sie sollten also z. B. im Hauptfenster implementiert werden. Gemessene Datensatze undzugehorige Parameter dagegen liegen meist mehrfach vor, werden daher im Rahmen desDokumentobjekts realisiert.

Zur Verbindung zwischen den gerade aktuellen Objekten enthalten die einzelnen Klassenverschiedene Methoden, die meist einen Zeiger auf das betreffende Objekt zuruckgeben:

CMDIFrameWnd::GetActiveFrame() zeigt auf das augenblicklich aktive Subfenster,

CMDIChildWnd::GetActiveDocument() auf das im Subfenster aktuelle Dokument und

CMDIChildWnd::GetActiveView() auf das dort gerade aktive View-Objekt.

CView::GetDocument() vermittelt die Verbindung des View-Objekts zum dargestelltenDokument.

CDocument::GetFirstViewPosition() und CDocument::GetNextView() liefern die ver-schiedenen Darstellungen des Dokuments (ein Dokument kann mit mehreren Viewsverbunden sein).

CDocument::UpdateAllViews(NULL) aktualisiert alle mit dem Dokument verbundenenViews und sollte nach Anderungen im Dokument bzw. in den Daten aufgerufenwerden.

Die ersten drei sind Methoden der Basisklasse CFrameWnd, mithin konnen alle obigenFunktionen auch in Einzeldokumentprogrammen verwendet werden.

8.4.8 Bitmap-Graphiken

Einfache funktionale Zusammenhange (wenige Messgroßen in Abhangigkeit von einemeindimensionalen experimentellen Parameter), wie sie in Experimenten meist vorliegen,lassen sich mit den in Kapitel 8.4.2 dargelegten Moglichkeiten der Linien-Graphiken zu-friedenstellend skizzieren. Bei mehrdimensionalen Abhangigkeiten, z. B. Messungen mitArray-Detektoren, sind dagegen flachenhafte Darstellungen sehr viel anschaulicher. Kom-plexe Prasentationsgraphiken sollte man auch hier kompetenten Programmen wie MAT-LAB, AVS-Express, Iris-Explorer uberlassen, insbesondere wenn hoherdimensionale Zu-

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 141

sammenhange durch geeignete Hyperflachen veranschaulicht werden sollen. Einfache Bit-map-Graphiken konnen aber mit vertretbarem Aufwand in Messprogrammen realisiertwerden, wenn dies zur Verfolgung der Messung oder zur Vorauswahl von Messergebnissennotig ist.

Device Independent Bitmap (DIB): Obwohl die Microsoft Foundation Classes derTyp CBitmap zur Verfugung stellen, ist es einfacher, mit gerateunabhangigen Bitmaps(DIBs) zu arbeiten. Windows stellt dafur einige Strukturen und Funktionen bereit. DIBssind insofern gerateunabhangig, als sie alle wichtigen Informationen zur Darstellung ent-halten, z. B. auch die Farbtabelle und implizit die gewunschte reale Bildgroße. DIBs werdendurch eine Struktur vom Typ BITMAPINFOHEADER, eine Farbtabelle und das Datenfeld deseigentlichen Bildinhalts beschrieben. Relativ komplex ist der BITMAPINFOHEADER aufge-baut:

typedef struct tagBITMAPINFOHEADER{ // bmihDWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;

} BITMAPINFOHEADER; .

biSize enthalt die Große der Struktur (sizeof(BITMAPINFOHEADER)), biWidth die Breiteund biHeight die Hohe der Bitmap (in Pixel), biPlanes die Anzahl der Farbebenen(=1), biBitCount die Zahl der Bits pro Punkt (8 bei 256 Farben), biCompression denKompressionsmodus (BI RGB fur unkomprimiert), die nachsten drei kann man auf nullsetzen, biClrUsed und biClrImportant geben an, wieviele Farben benutzt und wievieledavon wichtig sind.Die Farbtabelle ist ein Feld aus RGBQUAD s

typedef struct tagRGBQUAD { // rgbqBYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;

} RGBQUAD; ,

das mit dem BITMAPINFOHEADER zur BITMAPINFO zusammengefasst ist:

typedef struct tagBITMAPINFO { // bmiBITMAPINFOHEADER bmiHeader;

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 142

RGBQUAD bmiColors[1];} BITMAPINFO; .

Der Bildinhalt wird durch ein zweidimensionales Datenfeld beschrieben, fur eine quadra-tische 256-Farben-Bitmap mit der Seitenlange BSIZE z. B. durch BYTE b[BSIZE][BSIZE].Dargestellt auf einem Ausgabegerat wird die DIB dann mit der Funktion StretchDIBits(),die die Bitmap auch gleich auf die gewunschte Große bringt:

int StretchDIBits (HDC hdc, // handle of device contextint XDest, // x-coordinate of upper-left corner of dest. rect.int YDest, // y-coordinate of upper-left corner of dest. rect.int nDestWidth, // width of destination rectangleint nDestHeight, // height of destination rectangleint XSrc, // x-coordinate of upper-left corner of source rect.int YSrc, // y-coordinate of upper-left corner of source rect.int nSrcWidth, // width of source rectangleint nSrcHeight, // height of source rectangleCONST VOID *lpBits, // address of bitmap bitsCONST BITMAPINFO *lpBitsInfo, // address of bitmap dataUINT iUsage, // usageDWORD dwRop // raster operation code

); .

Farbtabelle: Eine geeignete Farbtabelle lasst sich mit einer for-Schleife erstellen. EineGraustufentabelle wird mit

for (int n=0; n<256; n++) {bmi.c[n].rgbBlue = n;bmi.c[n].rgbGreen = n;bmi.c[n].rgbRed = n;bmi.c[n].rgbReserved = 0;

}; ,

eine mit kupfergetontem Intensitatsverlauf durch

for (int n=0; n<256; n++) {bmi.c[n].rgbBlue = n/2;bmi.c[n].rgbGreen = n*2/3;bmi.c[n].rgbRed = n;bmi.c[n].rgbReserved = 0;

};

realisiert. Zur Erhohung des Farbkontrastes kann man Falschfarbendarstellungen verwen-den, so wird mit

for (int n=0; n<256; n++) {

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 143

bmi.c[n].rgbBlue = 255-n;bmi.c[n].rgbGreen = n;bmi.c[n].rgbRed = 255-n;bmi.c[n].rgbReserved = 0;

};

eine Farbtabelle erzeugt, die von Magenta nach Grun wechselt, mit

int dB = 8, dG = 0, dR = 0;int blue = 0, green = 0, red = 0;for ( int n=0; n<256; n++ ) {

switch ( n ) {case 32: dB = 0; dG = 8; break;case 64: dB = -8; dG = 0; break;case 96: dB = 0; dR = 8; break;case 128: dG = -4; dR = 0; break;case 192: dB = 8; dG = 0; break;case 224: dB = 0; dG = 8; break;}blue += dB; green += dG; red += dR;bmi.c[n].rgbBlue = (blue>255) ? 255 : (blue<0) ? 0 : blue;bmi.c[n].rgbGreen = (green>255) ? 255 : (green<0) ? 0 : green;bmi.c[n].rgbRed = (red>255) ? 255 : (red<0) ? 0 : red;

}

eine Tabelle, die sehr kontrastreich uber alle Farben lauft (vgl. dazu auch [51]).

Beispiel: In einem ‘Multiple-Document’-Programm soll ein quadratisches Intensitatsfelddargestellt werden. Dazu werden in der Dokument-Klasse die notigen Datenstrukturenangelegt:

public:BYTE b[BSIZE][BSIZE];struct {

BITMAPINFOHEADER bmih;RGBQUAD c[256];

} bmi;

ein Feld fur die Daten und eine Struktur fur die Bitmapinfo. Der BITMAPINFOHEADER wirdim Konstruktor des Dokuments besetzt:

CMulDoc::CMulDoc() {BITMAPINFOHEADER bmih =

{ 0, BSIZE, BSIZE, 1, 8, BI_RGB, 0, 0, 0, 256, 256 };memcpy(&bmi.bmih, &bmih, sizeof(BITMAPINFOHEADER));bmi.bmih.biSize = sizeof(BITMAPINFOHEADER);

} ,

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 144

die Farbtabelle durch eine der Schleifen des vorherigen Abschnitts. Die Bilderstellungerfolgt wie ublich innerhalb der OnDraw()-Methode der View-Klasse:

StretchDIBits(pDC->m_hDC, xoff, yoff,xsize, ysize, 0, 0, BSIZE, BSIZE, GetDocument()->b,(BITMAPINFO*) &GetDocument()->bmi, DIB_RGB_COLORS, SRCCOPY); .

xoff, yoff, xsize, ysize werden gerateabhangig festgelegt (pDC->IsPrinting()). DieDaten werden im Beispielprogramm synthetisch innerhalb des Dokument-Objekts gene-riert (eine Funktion des Typs z = sin(x) · sin(y)). Bei einem Messprogramm wurde mandie Datenerfassung im Hauptfenster starten und die Daten im Dokument-Objekt ablegen,die Aktualisierung der Datendarstellung (wahrend oder nach einer Messung) durch dieFunktion UpdateAllViews(NULL) aus der Klasse CDocument veranlassen. Abbildung 79zeigt das ideale ‘Messergebnis’ in drei Subfenstern mit unterschiedlichen Farbtabellen. Beiidealen Daten wird mit jedem der gewahlten Farbverlaufe ein guter Bildeindruck erzielt.

Abbildung 79: Darstellung eines ‘idealen’ Messergebnisses (Dynamik 8 Bit) in drei unter-schiedlichen Farbtabellen. Links: lineare Graustufentabelle, Mitte: FalschfarbenubergangMagenta – Grun, rechts: extremer Farbkontrast.

Anders bei nichtidealen Daten: Der Vorteil einer kontrastreichen Falschfarbendarstellungzeigt sich insbesondere dann, wenn die dargestellte Bitmap eine geringe lokale Dynamikaufweist, diesen Fall demonstriert Abbildung 80.

Abbildung 80: Dasselbe Messergebnis mit sehr geringer lokaler Dynamik, nur bei der Dar-stellung mit uberhohtem Kontrast (rechts) lassen sich Strukturen deutlich erkennen.

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 145

Dass aber eine kontrasterhohende Darstellung nicht immer das Mittel der Wahl ist, zeigtsich bei stark verrauschten Intensitatsfeldern (Abbildung 81).

Abbildung 81: Stark verrauschtes Messergebnis: die kontrasterhohende Darstellung lasstkeine Konturen mehr erkennen, vorzuziehen ist eine der beiden kontrastarmeren Darstel-lungsarten.

BMP-Dateien: Will man Bitmaps abspeichern, macht man das am einfachsten im win-dowsspezifischen BMP-Format, da dieses Dateiformat exakt dem DIB-Format entspricht.Nach einem kurzen Header, der die Kennung ‘BM’ und den Offset vom Dateianfang zuden Daten, oft auch die Dateilange enthalt, werden BITMAPINFOHEADER, Farbtabelle undDaten hintereinander abgelegt:

void CMulDoc::Serialize(CArchive& ar) {if (ar.IsStoring()) {

const char bmptag[] = "BM";struct { long filesize, unused, offset; } bmphead;bmphead.offset = strlen(bmptag) + sizeof(bmphead) + sizeof(bmi);bmphead.unused = 0;bmphead.filesize = bmphead.offset + sizeof(b);ar.Write(bmptag, strlen(bmptag));ar.Write(&bmphead, sizeof(bmphead));ar.Write(&bmi, sizeof(bmi));ar.Write(&b, sizeof(b));

}} .

8.4.9 Fenstereigenschaften

Die Eigenschaften der zu einem Programm gehorenden Fenster werden von der Entwick-lungsumgebung einigermaßen sinnvoll festgelegt. Falls man von diesen Voreinstellungenabweichen will, z. B. fur die Subfenster ein bestimmte, an die Daten angepasste Große ein-stellen will, kann man das am besten innerhalb der Funktion PreCreateWindow(CREATE-STRUCT& cs) tun. Diese Funktion steht im Hauptfenster und in der Subfensterklasse furBenutzeranpassungen zur Verfugung. Sie fuhrt dem Anwender die Struktur der Fensterei-

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 146

genschaften vor, bevor das Fenster real kreiert wird. Beispielsweise kann uber die Kom-ponenten cs.cx und cs.cy die Fenstergroße, uber cs.x und cs.y die Fensterpositioneingestellt werden.

8.5 Sockets mit MFC-Unterstutzung

Visual C++ hat in den Microsoft Foundation Classes fur den direkten Zugriff auf dieSocket-Schnittstelle die Basisklasse CAsyncSocket und die davon abgeleitete komfortablereKlasse CSocket implementiert. Datentransfers laufen in aller Regel uber synchrone TCP-Verbindungen ab, daher kann man sich auf die CSocket-Klasse beschranken, die geeigneteSynchronisations- bzw. Blockungsmechanismen impliziert.

Bei der AppWizard -gesteuerten Programmerstellung versichert man sich der Windows-Open-Services-Architecture-Unterstutzung uber Sockets durch die Auswahl des entspre-chenden Menupunkts (Abbildung 82.

Abbildung 82: Auswahlfenster des MFC AppWizard: Socket-Unterstutzung.

Damit wird eine Initialisierung des Socket-Systems ins Programm integriert und man kanndie beiden Socket-Klassen ohne weiteren Aufwand verwenden.

8.5.1 Server-Socket

Ein Server-Socket sollte standig empfangsbereit sein, wird daher zweckmaßigerweise alsstatisches Objekt im Programm angelegt. Einige Methoden von CSocket sind zu veran-dern, man implementiert folglich im Class Wizard eine neue Klasse z. B. CRcv, die vonCSocket abgeleitet wird. Ein CRcv-Objekt wird im Hauptprogramm statisch angelegt

CRcv theReceiver;

und im Initialisierungsteil empfangsbereit eingerichtet

theReceiver.Create(PORT);

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 147

theReceiver.Listen(); .

Die PORT-Nummer muss beim Server-Socket fest vorgegeben werden (> 1024), da sich derClient-Socket genau mit dieser Port-Nummer verbinden muss.

In der CRcv-Klasse ist dann zu definieren, was der Server-Socket leisten soll. Dazu werdenverschiedene in der Basisklasse schon vorhandene Methoden neu implementiert. Mit demClass Wizard (‘Add Function’) werden die Funktionsgeruste fur OnAccept(), OnReceive()und OnClose() erstellt. OnAccept() hat die Aufgabe, den Server-Socket zu duplizieren unddie vom Clienten ankommende Verbindungsanfrage mit dem Duplikat anzunehmen:

void CRcv::OnAccept(int nErrorCode) {if (nErrorCode)CSocket::OnAccept (nErrorCode);

CRcv * wsWork = new CRcv();if (!Accept(*wsWork))AfxMessageBox ("Accept: Fehler");

} .

Durch die Duplizierung bleibt der Original-Socket empfangsbereit fur weitere Anfragen.

Die zu verrichtende Aufgabe wird in OnReceive() festgelegt:

void CRcv::OnReceive(int nErrorCode) {if (nErrorCode)CSocket::OnReceive (nErrorCode);

const int buflen = 2000;char Q[buflen];Q[Receive(Q, buflen)] = ’\0’;...// action to be performed by the socket

} .

Hier kann die mit der Funktion Receive() empfangene Anfrage Q analysiert und beant-wortet werden oder mit

CString Peer;UINT Port;GetPeerName(Peer, Port);

festgestellt werden, woher die Anfrage kam, um nur bestimmte Clienten zuzulassen.

Das HTTP-konforme Versenden eine GIF-Datei an den Clienten (das konnte in diesemFall ein Web-Browser sein) ware beispielsweise mit

CFile F;BYTE * fbuffer;F.Open("Uniloggr.gif", CFile::modeRead);UINT length = F.GetLength();

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 148

fbuffer = new BYTE[length];F.Read(fbuffer, length);CString S = "HTTP/1.0 200 OK\nContent-Type: image/gif\n\n";Send (S, S.GetLength());Send (fbuffer, length);delete [] fbuffer;

zu bewerkstelligen.

Nach Verbindungsende sollte sich das Socket-Duplikat wieder verabschieden, z. B. mit

void CRcv::OnClose(int nErrorCode) {if (nErrorCode)CSocket::OnClose(nErrorCode);

delete this; // suicide} .

Dabei wird davon ausgegangen, dass der Client-Socket die Verbindung aufgibt. Beendet derServer-Socket die Verbindung nach dem Versenden der Daten – das ist beispielsweise beiWeb-Servern der Fall, wird OnClose() nicht implementiert; stattdessen wird das Socket-Duplikat am Ende der OnReceive()-Methode mit ‘delete this’ entfernt.

Zumindest in der Testphase eines derartigen Programms ist eine ausgiebige Fehlerbehand-lung zweckmaßig, das obige Fragment eines Web-Servers ware entsprechend zu erweitern:

CFile F;BYTE * fbuffer;try {

if (!F.Open("Uniloggr.gif", CFile::modeRead))throw ("CFile::Open: Fehler");

UINT length = F.GetLength();fbuffer = new BYTE[length];if (length != F.Read(fbuffer, length))throw ("CFile::Read: Fehler");

CString S = "HTTP/1.0 200 OK\nContent-Type: image/gif\n\n";if (Send (S, S.GetLength())==SOCKET_ERROR)throw ("Send: Fehler");

if (Send (fbuffer, length)==SOCKET_ERROR)throw ("Send: Fehler");

}catch (char * err) { AfxMessageBox (err); }delete [] fbuffer; .

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 149

8.5.2 Client-Socket

Ein Client-Socket ist sehr viel einfacher zu implementieren, da er genau dort eingerichtetwerden kann, wo er gebraucht wird und im allgemeinen mit den vorhandenen Methodender Klasse auskommt. Typisch konnte etwa die Anweisungsfolge

CSocket Client;char rbuffer[LENGTH];Client.Create ();Client.Connect (SERVER, PORT);Client.Send (Q, Q.GetLength());Client.Receive (rbuffer, LENGTH);...Client.Close();

sein, die eine Verbindung zu einem SERVER aufbaut und nach der Anfrage Q die Antwortin rbuffer erhalt.

8.5.3 Mail-Client

Nur etwas komplizierter, in erster Linie umfangreicher, gestaltet sich die Erstellung einesClient-Programms, das einem feststehenden Protokoll folgen soll. Dies sei an einer einfa-chen Mailer-Klasse erlautert, die man beispielsweise dazu verwenden kann, die Nachrichtvom erfolgreichen Ablauf eines Langzeitexperiments automatisch zu verschicken.

Zum Versenden von Mail im Internet steht auf den dafur eingerichteten Servern meistSMTP (S imple M ail T ransfer Protocol), ein einfach zu bedienendes, weitgehend un-geschutztes Protokoll, zur Verfugung.

Die Protokollabwicklung wird in einer Klasse CMailer gekapselt, die CSocket erweitert:

class CMailer : public CSocket {private:

UINT SMTP;CString SENDER;CString SERVER;

public:CMailer() {SMTP = 25;SENDER = "Your.Name";SERVER = "smtp.uni-osnabrueck.de";

}private:

int Status();void Data(CString data, int result);

public:

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 150

void Mail(CString to, CString subject, CString data);};

Parameter, die in der Regel konstant bleiben (SMTP-Port, Absender, SMTP-Server), sindim Konstruktor fest eingestellt (uber eine zusatzliche Konstruktorvariante lasst sich dasauch flexibel halten). Das Versenden wird von der Funktion Mail() erledigt, die dazu diebeiden privaten Hilfsfunktionen Status() und Data() benutzt.

Status() empfangt mit Receive() die Serverantworten und gibt der Statuscode des Ser-vers zuruck:

int CMailer::Status() {const int buflen = 500;char buf[buflen];buf[Receive(buf, buflen)] = ’\0’;return atoi(buf);

} .

Data() verschickt Text mit Hilfe der CSocket-Methode Send() und uberpruft den richti-gen Antwortstatus:

void CMailer::Data(CString data, int result) {if (Send(data, data.GetLength())==SOCKET_ERROR)throw (CString("SEND DATA: Socket-Fehler"));

if ( Status() != result ) {CString Error;Error.Format ("Status != %d: %s", result, data.Left(10));throw (Error);

} .

Mail kreiert den Socket, verbindet mit dem Server, erledigt den gesamten formalisiertenEroffnungsdialog mit dem SMTP-Server, versendet die Daten (Datenende durch ‘.’ amZeilenanfang) und beendet danach die Verbindung:

void CMailer::Mail(CString to, CString subject) {CString S;if (!Create())throw (CString("Create: Fehler"));

if (!Connect(SERVER, SMTP))throw (CString("Connect: Fehler"));

if (Status() != 220)throw (CString("Connect: Status != 220"));

Data("helo hi\n", 250);S.Format("mail from: %s\n", SENDER);Data(S, 250);S.Format("rcpt to: %s\n", to);Data(S, 250);

mdv :mdvmsvc.tex 14. Oktober 2006

8 Windows-Programmierung mit Visual C++ 151

Data("data\n", 354);S.Format("Subject: %s\n%s\n.\n", subject, data);Data(S, 250);Data("quit\n", 221);Close();

} .

Fehlerhafte Statusruckmeldungen fuhren zum Abbruch, die jeweiligen Fehlermeldungen(throw) sollten - zumindest wahrend der Testphase - im ubergeordneten Programm mittry und catch abgearbeitet werden.

Die Verwendung der CMailer-Klasse wird durch ein Fragment aus dem ubergeordnetenProgramm deutlich:

CMailer M;try {

M.Mail(Address1, Subject1, Data1);M.Mail(Address2, Subject2, Data2);}

catch (CString err) { AfxMessageBox(err); }

verschickt zwei Email-Nachrichten.

mdv :mdvmsvc.tex 14. Oktober 2006

Literatur 152

Literatur

Die Literaturhinweise sind – insbesondere die zitierten Lehrbucher betreffend – exempla-risch, willkurlich und zufallig, eine Vollstandigkeit ist weder moglich noch angestrebt.

[1] H. Ibach, H. Luth. Festkorperphysik. Springer, 1990.

[2] D. Geist. Halbleiterphysik I: Eigenschaften homogener Halbleiter. Vieweg, 1969.

[3] F. S. Goucher, G. L. Pearson, M. Spark, G. K. Teal, W. Shockley. Theory andExperiment for a Germanium p-n Junction. Phys. Rev. 81, 637 (1951).

[4] W. Heywang. Sensorik. Springer, 1986.

[5] Analog Devices. AD592. Datenblatt.

[6] G. Winstel, C.Weyrich. Optoelektronik II – Photodioden, Phototransistoren, Photo-leiter und Bildsensoren. Springer, 1986.

[7] Burle Electronics. Photomultiplier Handbook. Burle, 1987.

[8] Burle Electronics. Electro-Optics Handbook. Burle, 1987.

[9] D. Geist. Halbleiterphysik II: Sperrschichten und Randschichten – Bauelemente. Vie-weg, 1970.

[10] Hamamatsu Photonics. Opto-Semiconductors, Condensed Catalog. Datenblatt.

[11] Centronic Ltd. High Performance Silicon Photodetectors. Datenblatt.

[12] Ortel Vertriebs GmbH. InGaAsP / InP-IR-LED’s, InGaAs-Fotodioden (Telcom De-vices Corp.). Datenblatt.

[13] M. J. E. Golay. A pneumatic infrared detector. Rev. Sci. Instr. 18, 357 (1947).

[14] U. Tietze, C. Schenk. Halbleiterschaltungstechnik. Springer, 1991.

[15] Hermann Hinsch. Elektronik: Ein Werkzeug fur Naturwissenschaftler. Springer, 1996.

[16] http://www.ni.com.

[17] http://www.agilent.com.

[18] http://www.mathworks.com.

[19] http://www.inria.fr.

[20] The MathWorks. MATLAB Application Program Interface Guide. Handbuch, 1998.

[21] http://sources.redhat.com/cygwin/.

mdv :mdvmsvc.tex 14. Oktober 2006

Literatur 153

[22] http://www.research.att.com/sw/tools/uwin/.

[23] http://www.mingw.org.

[24] http://www.bloodshed.net.

[25] http://www.mrc-cbu.cam.ac.uk/Imaging/gnumex20.html.

[26] Bei einer Standard-Installation:<matlabroot>/help/pdf doc/matlab/api/apiguide.pdf.

[27] Bei einer MATLAB-Standard-Installation findet sich das Inhaltsverzeichnis der API-Referenz in <matlabroot>/help/techdoc/apiref/apireftoc.html.

[28] Bei einer Standard-Installation:<matlabroot>/help/pdf doc/matlab/api/apiref.pdf.

[29] http://www.physik.uni-osnabrueck.de/kbetzler/gw/gw.html.

[30] Bassmann, Besslich. Konturorientierte Verfahren in der digitalen Bildverarbeitung.Springer Verlag, 1989.

[31] A. Savitzky, M. J. E. Golay. Smoothing and Differentiation of Data by SimplifiedLeast Squares Procedures. Analytical Chemistry 36, 1627–1639 (1964).

[32] W. Gander, J. Hrebıcek. Solving Problems in Scientific Computing using Maple andMATLAB. Springer Verlag, 1995.

[33] Klaus Betzler. Experimentsteuerung. Vorlesungsskriptum, 1990.http://www.physik.uni-osnabrueck.de/kbetzler/win32/es.pdf.

[34] Viktor Toth. Visual C++ 5. Markt &Technik, 1997.

[35] http://www.bbdsoft.com/.

[36] Brian W. Kernighan, Dennis M. Ritchie. Programmieren in C. Hanser, 1990.

[37] http://www.physik.uni-osnabrueck.de/kbetzler/win32/ansi/cpp.htm.

[38] http://www.ieee.org/.

[39] http://www.fapo.com/ieee1284.htm.

[40] http://www.physik.uni-osnabrueck.de/kbetzler/win32/ieee1284/1284int.htm.

[41] Georg Walz. Grundlagen und Anwendung des IEC-Bus. Markt & Technik, 1982.

[42] Lothar Preuss, Harald Musa. Computerschnittstellen : Dokumentation der Hard- undSoftware mit Anwendungsbeispielen CENTRONICS, IEC-BUS, V.24. Hanser, 1989.

[43] Hewlett Packard. HP Standard Instrument Control Library: User’s Guide for Windows.Handbuch, 1996.

mdv :mdvmsvc.tex 14. Oktober 2006

Literatur 154

[44] Hewlett Packard. HP Standard Instrument Control Library: Reference Manual. Hand-buch, 1996.

[45] http://www.usb.org.

[46] http://www.usbstuff.com.

[47] http://www.physik.uni-osnabrueck.de/kbetzler/Win32/usb/usbspec.pdf.

[48] http://www.ietf.org/rfc/rfc1700.txt.

[49] http://www.ietf.org/.

[50] David J. Kruglinsky. Inside Visual C++ Version 5. Microsoft Press, 1997.

[51] http://www.physik.uni-osnabrueck.de/kbetzler/TexCo/colormap.pdf.

mdv :mdvmsvc.tex 14. Oktober 2006