Eine RS232-Schnittstelle gehört mittlerweile
zur Standardausstattung jedes etwas besse-
ren Multimeters. Die mitgelieferte Software
kann aber in der Regel Werte einer Messreihe
nur auf dem PC-Monitor darstellen und als
Textdatei speichern. Soll jedoch die Mess-
reihe weiter bearbeitet und ausgewertet wer-
den, muss diese tabellarische Textdatei
umständlich in ein Statistikprogramm über-
führt werden oder in einen Textverarbeiter
eingebunden werden.
Dabei liefert Microsoft zusammen
mit dem Office-Paket den Interpreter
Visual Basic Applications, die eine
direkte Kommunikation von Word
oder Exel mit dem Messgerät ermög-
licht. Wir wollen dies an einem Bei-
spiel demonstrieren.
Die Dokumentvorlage in Bild 1 ent-
hält ein kleines Beispielprogramm,
um von Word aus ein an die serielle
Schnittstelle COM1 angeschlossenes
Digitalmultimeter auszulesen. Am
Digitalmultimeter ist ein temperatur-
abhängiger Widerstand (KTY10-6)
angeschlossen. Der Widerstands-
wert wird mit Hilfe einer Formel, die
der Hersteller des Temperaturfühlers
angibt, in eine Temperatur umge-
rechnet und in einem VBA-Formular
angezeigt. Ein Klick auf den Knopf
Messen zeigt die aktuelle Tempera-
tur an. Voraussetzung ist, dass sich
die RSMINI.DLL im Windows-Ver-
zeichnis befindet. Die Dokumentvor-
lage (KTY.DOT) und die verwendete
RSMINI.DLL sind frei kopierbar und
stehen als Download auf der Elektor-
Home-Page www.elektor.de bereit.
Außerdem ist die Software auf Dis-
kette EPS 000053-11 erhältlich.
Sensor und Messgerät
Der Halbleiter-Temperatur-Sensor
KTY-6-10 ist ein temperaturabhängi-
ger Widerstand. Leider ist seine
Charakteristik nicht linear, sondern
weist einen leicht diabolischen Ver-
SOFTWARE
38
Elektor
5/2000
Messen
in Word und Excel
Mit Visual Basic for Applications
Hans-Joachim Berndt
Microsofts Office ´97 enthält
eine vollständige Programmier-
sprache namens Visual Basic for
Applications (VBA). Mit diesem in
weiten Bereichen zu Visual Basic
kompatiblen Interpreter können
Messungen direkt in Word oder
Excel durchgeführt werden. Die
volle Power der Office-Anwen-
dungen steht dann der Mess-
wertanalyse zur Verfügung. Da in
VBA auch externe Routinen in
dynamischen Link-Bibliotheken
angesprochen werden können,
ist eine direkte Messwertauf-
nahme möglich.
“rsmini” (ByVal ms%)
Alle Parameter müssen hier als Wertparame-
ter (ByVal), nicht als Referenzparameter (Vor-
einstellung) übergeben werden. Die DLL
selbst sollte sich im Windows- oder im
Systemverzeichnis befinden. Ein weiterer Ort
für die DLL ist das Verzeichnis des Tabellen-
blattes beziehungsweise der Dokumentvor-
lage. Unterhalb der Deklarationen werden
nun die einzelnen Routinen zum Auslesen
des Multimeters hinzugefügt.
Function ComOpen() As Integer
ComOpen = OPENCOM(“COM1:1200,
N,7,2”): RTS 0: DTR 1
lauf auf (Bild 2). Der Kennlinienver-
lauf wird durch Formeln beschrie-
ben:
R
T
= R
25
⋅ (1+α⋅∆T
A
+
β⋅∆T
A
2
) =
f(T
A
)
mit
α = 7,88⋅10
-3
K
-1
β = 1,937⋅10
-5
K
-2
oder umgekehrt nach der Tempera-
tur aufgelöst:
T = 25 +
√(α
2
- 4
⋅β + 4⋅β⋅k
T
) -
α / 2⋅β
mit k
T
= R
T
/R
25
Der Widerstandswert des KTY-6-10
soll mit dem weit verbreiteten Digi-
talmultimeter METEX M-3650CR mit
RS232-Anschluss (oder einem kom-
patiblen DVM) ermittelt und als
Temperaturkurve direkt in Excel
respektive Word aufgenommen wer-
den.
Das DVM wird über ein Spezialkabel
an eine freie COM-Schnittstelle des
PC angeschlossen. Dabei kommen
im Messgerät Optokoppler zum Ein-
satz, um den PC galvanisch zu tren-
nen. Die Optokoppler beziehen ihre
Versorgungspannung von den
RS232-Leitungen. Darum müssen
nach dem Öffnen der Schnittstelle
die Leitungen RTS und DTR entspre-
chend eingestellt werden.
Mit den Übertragungsparametern
1200 Baud, keine Parität, 7 Datenbits
und 2 Stoppbits überträgt das Mul-
timeter die Anzeige als 14-Byte-
ASCII-Zeichenkette. Als letztes Zei-
chen wird das Byte 13 (CR) übertra-
gen. Um die Übertragung zu
initiieren, muss ein “D” vom PC in
Richtung Multimeter geschickt wer-
den. In der Praxis funktionieren aber
fast alle Zeichen.
Dynamische
Link-Bibliothek
Das an der COM-Schnittstelle des
PCs angeschlossene Multimeter
wird über eine kleine dynamische
Link-Bibliothek (DLL) direkt aus
Excel angesprochen und gelesen.
Wenige Programmzeilen filtern den
erfassten Widerstandswert. Über
eine geeignete Gleichung wird die
nicht-lineare Kennlinie über eine
Funktion in eine Temperatur umge-
rechnet und dargestellt.
Die speziell für diesen Beitrag ent-
wickelte RSMINI.DLL erlaubt (im
Gegensatz zu der in [1] verwendeten
RSAPI.DLL mit zahlreichen allge-
meinen und gerätespezifischen
Funktionen zur Verwendung der
seriellen Schnittstelle) einen grund-
legenden Zugriff und kann zusam-
men mit den verwendeten Pro-
grammbeispielen direkt von der
Elektor-Home-Page heruntergeladen
werden
Die kleine DLL stellt alle wesentli-
chen Funktionen zur Kommunikation
über die RS232-Schnittstelle unter
Win95/98 bereit. Um die Anzeige des
Multimeters auszulesen, werden fol-
gende DLL-Aufrufe benötigt:
OPENCOM
Öffnen der seri-
ellen Schnittstelle
CLOSECOM
Schließen der
Schnittstelle
SENDBYTE
Zeichen vom PC
senden
READBYTE
Zeichen im PC
empfangen
RTS
Schalten der
Leitung RTS
DTR
Schalten der
Leitung DTR
DELAY Verzögerung
in
Millisekunden
Ein neues Modul
Nach dem Start von Word97 oder
Excel97 gelangt man mit ALT+F11
in den VBA-Editor. Dort fügt man
über das Menü Einfügen/Modul ein
neues Modul ein. Als Erstes werden
nun die externen Funktionen der
DLL deklariert. Dabei ist wichtig,
das alle DLL-Funktionen großge-
schrieben werden.
Declare Function OPENCOM Lib
“rsmini” (ByVal A$) As
Integer
Declare Sub CLOSECOM Lib
“rsmini” ()
Declare Sub SENDBYTE Lib
“rsmini” (ByVal b%)
Declare Sub RTS Lib “rsmini”
(ByVal b%)
Declare Sub DTR Lib “rsmini”
(ByVal onoff%)
Declare Function READBYTE
Lib “rsmini” () As Inte-
ger
Declare Sub DELAY Lib
SOFTWARE
39
5/2000
Elektor
Bild 1. Word-Dokumentvorlage KTY.DOT als
Messprogramm.
R (
Ω)
KTY 10-6
6000
5000
4000
-50
0
50
100
150
000053 - 13
3000
2000
1000
0
T (
°C)
Bild 2. Charakteristik des Ttemperatursensors
KTY10-6.
End Function
Function GetString() As String
Dim A$
SENDBYTE 33
A$ = “”
Do
e = READBYTE
If e > 13 Then A$ = A$ + Chr$(e)
Loop Until e < 0
GetString = A$
End Function
Sub Test
If ComOpen>0 then MsgBox (GetString)
End Sub
Schnittstelle öffnen
OpenCom erwartet eine Zeichenkette, die die
Schnittstellenparameter enthält. Hier wird
Com1 mit 1200 Baud, 7 Datenbits, keine
Parität und 2 Stoppbits geöffnet. Kann die
Schnittstelle nicht geöffnet werden, so liefert
OpenCom eine Null zurück.
RTS 0 und DTR 1 schaltet die RS232-Leitun-
gen für die Optokoppler. Da das Multimeter
eher langsam ist, soll 300 ms auf ein Zeichen
gewartet werden. Dies wird von der DLL
bereits voreingestellt.
Zeichenkette einlesen
Die Messwertanforderung wird mit dem Zei-
chen “D” eingeleitet. Nun werden solange
Zeichen empfangen und in eine Zeichenkette
A$ gepackt, bis READBYTE den Wert -1 lie-
fert, die Wartezeit also überschritten ist.
Innerhalb dieser Zeitspanne sollten alle 14
Bytes eingetroffen sein.
Die beiden Funktionen können mit einer klei-
nen Testroutine überprüft werden:
Sub Test
If ComOpen>0 then MsgBox (GetString)
End Sub
Zeichenkette zerlegen
Der Widerstand des Sensors liegt zunächst
als Zeichenkette
“ 01.98 kOhm”
vor, wird aber nun in eine Fließpunktvariable
(Double) gewandelt. Der String wird ab Posi-
tion 4 mit fünf Zeichen extrahiert (“01.98”).
Vorher wird noch die Gültigkeit geprüft,
indem der Dezimalpunkt an Stelle 6 abgefragt
wird. Schließlich wird das Ergebnis in Ohm
umgerechnet und dem Funktionsnamen als
Ergebnis zugewiesen.
Function StringToOhm(ByVal A$) As
Double
StringToOhm = 0
If Mid$(A$, 6, 1) <> “.” Then
Exit Function
b$ = Mid$(A$, 4, 5)
StringToOhm = Val(b$) *
1000
End Function
Temperatur berechnen
Die oben angegebene Formel zur
Berechnung der Temperatur aus dem
Widerstandswert wird als VBA-
Funktion wie folgt formuliert:
Function Temp(ByVal r As
Double) As Double
Const Alpha = 0.00788, Beta
= 0.00001937, R25 = 2000
If r <= 0 Then r = R25
kt = r / R25
Temp = 25+(Sqr(Alpha ^ 2 - 4
* Beta + 4 * Beta * kt)-
Alpha) / (2 * Beta)
End Function
Die Funktion erhält den Widerstand
in Ohm und liefert als Ergebnis die
Temperatur in °C. Man kann die For-
mel nun auch im Tabellenblatt einfü-
gen und so ein entsprechendes Dia-
gramm erzeugen, wie das Titelbild
zeigt.
Messreihe
in Excel und Word
Mit Hilfe einer kleinen Schleife kön-
nen nun Messreihen aufgenommen
werden. Die Subroutine “Get10”
nimmt zehn Messwerte auf. Zwi-
schen den Messpunkten wird mit
DELAY 1000 ms Sekunden gewartet.
Die Zeit wird in Spalte A, die Tem-
peratur in Spalte B eingetragen.
Sub Get10()
Const Interval = 1000
If ComOpen > 0 Then
For i = 1 To 10
Cells(i, 1) = i - 1
Cells(i, 2) =
Temp(StringToOhm(Get-
String))
DELAY 1000
Next i
CLOSECOM
End If
End Sub
Steht kein Excel zur Verfügung, kön-
nen die Messungen auch unter Word
durchgeführt werden. Die VBA-
Makros sind fast ohne Änderung im
Textprogramm lauffähig. Die Routine
“Get10” muss natürlich angepasst
werden, da es in Word keine Zellen
(cells) gibt. Um Buchstaben und Text
in das aktuelle Dokument einzufü-
gen, benutzt man in Word97 Selec-
tion.TypeText Text:=”Hallo”.
Alle Deklarationen und Funktionen
werden wie oben übernommen. Die
neue “Get10”-Routine für Word fügt
die Messdaten in das aktuelle Doku-
ment ein:
Sub Get10()
If ComOpen > 0 Then
For i = 1 To 10
Selection.TypeText
Text:=Str$(i)
Selection.TypeText
Text:=vbTab
Selection.TypeText
Text:=Str$(Temp
(StringToOhm(Get-
String)))
Selection.TypeParagraph
DELAY 1000
Next i
CLOSECOM
End If
End Sub
Aus der Steuerelement-Toolbox kann
eine Befehlsschaltfläche auf das
Dokument gezogen werden. Ein
Doppelklick auf dem Schalter öffnet
den VBA-Editor und zeigt die Sub-
routine, die bei Betätigung dieser
Schaltfläche ausgeführt wird. Wird
hier “Get10” eingetragen, so erfolgt
eine Messung, wenn der Button
angeklickt wird.
Private Sub CommandBut-
ton1_Click()
Get10
End Sub
Vorher muss der Entwurfsmodus
beendet sein.
(000053)rg
Literatur:
– H.-J. Berndt / B. Kainka
Messen, Steuern und Regeln
mit Word und Excel
2..Auflage 1999
Franzis-Verlag, Poing
ISBN 3-7723-4093-8
– B. Kainka / H.-J. Berndt
PC-Schnittstellen unter Windows
1. Auflage 1999
Elektor-Verlag Aachen
ISBN 3-89576-086-2
SOFTWARE
40
Elektor
5/2000