Kapitel 31
Messdaten verarbeiten
904
#5: Die Datei wird geschlossen. Erst jetzt werden die Daten auf dem Datenträger dauerhaft
gespeichert.
31.4 Aufgabe
Entwickeln Sie auf der Basis der Funktion get_digits() eine Funktion read_dmm(), die
die Zahl auf dem Display des Multimeters ermittelt und als Gleitkommazahl (float) zurück-
gibt. Berücksichtigen Sie folgende Dinge:
Die Position des Punktes auf dem Display
Das Minus-Zeichen, das z.B. bei einer Spannungsmessung auftreten kann
Die Präfixe für Einheiten: M (Mega = 1000000), k (Kilo = 1000, m (Milli = 0.001),
(Mikro = 10
-6)
, n (Nano = 10
-9
)
Steht z.B. auf dem Display
-123.4 mV, so soll die Zahl -0.1234 geliefert werden. Bei einer
Anzeige von
106.5 liefert die Funktion den Wert 106.5.
31.5 Lösung
Das folgende Skript ist ein komplettes Modul. Neben der Funktion read_dmm() enthält es
auch zwei Hilfsfunktionen, um die Strukturierung zu verbessern.
Skript:
import serial
DIGIT = {'1111110':'0',
'0110000':'1',
'1101101':'2',
'1111001':'3',
'0110011':'4',
'1011011':'5',
'1011111':'6',
'1110000':'7',
'1111111':'8',
'1111011':'9'}
def read_dmm(port=2, baudrate=2400, databits=8,
stopbits=1, timeout=3): #1
""" Liefert eine Gleitkommzahl, die den Zahlenwert
angibt, der auf dem Display angezeigt wird"""
ser = serial.Serial(port, baudrate, databits,
'N', stopbits, timeout)
data = ser.read(28)
ser.close()
d1 = [format(i, '#010b')[2:] for i in data]
905
31.5
Lösung
Erläuterung:
#1: Die Parameterliste der Funktion enthält einige voreingestellte Werte. Dabei ist die Num-
mer des COM-Ports völlig willkürlich gesetzt. Aber so kann die Funktion auch ohne Argu-
ment aufgerufen werden.
i = 0
while not d1[i].startswith("0001"): i +=1
d = d1[i:i+14]
return get_number(d) #2
def get_digits(d):
""" Liefert eine ganze Zahl (int), die die
Ziffern des Displays repräsentiert."""
A = d[1][7] + d[2][7] + d[2][5] + d[2][4] + \
d[1][5] + d[1][6] + d[2][6]
B = d[3][7] + d[4][7] + d[4][5] + d[4][4] + \
d[3][5] + d[3][6] + d[4][6]
C = d[5][7] + d[6][7] + d[6][5] + d[6][4] + \
d[5][5] + d[5][6] + d[6][6]
D = d[7][7] + d[8][7] + d[8][5] + d[8][4] + \
d[7][5] + d[7][6] + d[8][6]
return int(DIGIT[A] + DIGIT[B] + DIGIT[C]+ DIGIT[D])
def get_number(d):
""" Zurückgegeben wird eine Gleitkommazahl(float),
die den dargestellten Zahlenwert repräsentiert."""
n = get_digits(d) #3
# Position des Punktes #4
if d[7][4] == "1": n/=10
elif d[5][4] == "1": n/=100
elif d[3][4] == "1": n/= 1000
# Präfix
if d[9][4] == "1": n /= 10**6 #Mikro
elif d[9][5] == "1": n /= 10**9 #Nano
elif d[9][6] == "1": n *= 1000 #Kilo
elif d[10][4] == "1": n /= 1000 #Milli
elif d[10][6] == "1": n *= 10**6 #Mega
# Minuszeichen
if d[1][4] == "1": n *= -1
return n
Kapitel 31
Messdaten verarbeiten
906
#2: Zurückgegeben wird eine Gleitkommazahl, die von der Funktion get_number() berech-
net wird.
#3: Zunächst wird aus den Ziffern auf dem Display eine ganze Zahl gewonnen. Die wird
dann im Folgenden nachbearbeitet.
#4: Die Position des Punktes wird ermittelt. Der Tabelle kann man entnehmen, welche Bits
der 14 Datenbytes vom Messgerät die Punkte nach den ersten drei Ziffern darstellen. Da es
nur einen Punkt gibt, kann nur eines dieser drei Bits gesetzt sein. Sobald der Punkt gefun-
den ist, wird die Zahl
n durch 10, 100 oder 1000 dividiert.
In ähnlicher Weise werden die Präfixe der Einheiten (, n, k, m, M) und das Minuszeichen
berücksichtigt.

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.