SCPI Kommandos: Agilent U1253B und ein Python Beispiel
Meine Liste aller SCPI Kommandos, die ich bisher für das Agilent U1253B herausgefunden und getestet habe und ein kurzes Beispielprogramm in Python.
Die SCPI Kommandos
Standard Commands for Programmable Instruments SCPI ist eine Sammlung von Klartext (ASCII) Kommandos zur Steuerung von Messgeräten, wie eben diesem Multimeter. Der Vorteil ist, dass die Kommandos gut lesbar und dem entsprechend auch gut „konstruierbar” sind. Das Agilent U1253B unterstützt ein paar SCPI Kommandos, mit denen sich schon einiges anfangen lässt, du solltest allerdings nicht in das Programming Guide für eines der Tischmultimeter schauen, da kann das U1253B nicht mithalten, umgekehrt gibt es für das U1253B ein paar Kommandos, die es bei den großen Multimetern so nicht gibt …
Messbereich Kommando Bemerkung Alle *IDN? Liefert die Geräte-Identifikation z.B.
Agilent Technologies,U1253B,MY51530075,V2.22 *RST Reset, liefert die Position des Drehschalters, beginnend bei *0 für ganz links bis *8 für ganz rechts. Ändern der Stellung des Drehschalters sendet automatisch die neue Position: *0 für ganz links bis *8 für ganz rechts. READ? Aktuellen Messwert auslesen
FETC? funktioniert auch CONF? Liefert die aktuelle Konfiguration, z.B.:
"CURR +5.00000000E-02,+1.00000000E-06" *0 (~V) CONF:VOLT:AC [Auto, 5, 50, 500, 1000]
Beispiel: CONF:VOLT:AC 5
In diesem Messbereich kann nur AC ausgewählt werden. DC führt zu einem Fehler "*E" CONF:FREQ Frequenzmessung *1 (~=V) CONF:VOLT:[AC,DC,ACDC] [Auto, 5, 50, 500, 1000] Beispiel: CONF:VOLT:DC 5
Mit CONF:VOLT:ACDC kann neben AC und DC Messung der Modus für beide Spannungen ausgewählt werden. CONF:FREQ Frequenzmessung *2 (~=mV) CONF:VOLT:[AC,DC,ACDC] [Auto, 0.05, 0.5, 1, 1000] Beispiel: CONF:VOLT:AC 5 CONF:FREQ Frequenzmessung *3 (?) CONF:[RES,CONT] [500, 5k, 50k, 5M, 50M, 500M] Beispiel: CONF:RES 5M
RES: Widerstand messen
CONT: Widerstand mit Durchgangsprüfer-Piepser CONF:COND Leitfähigkeit immer im Range 500 nS *4 (Diode) CONF:DIOD CONF:FREQ *5 (C, T) CONF:CAP [Auto, 10n, 100n, 1000n, 10u, 100u, 1000u, 10m, 100m] Beispiel: CONF:CAP 10m CONF:TEMP [J,K],CEL Beispiel: CONF:TEMP J,CEL
CEL misst die Temperaturen in Celsius
J = J-Type Fühler,
K = K-Type Fühler SYST:TCOM [0,1] Beispiel: SYST:TCOM 0
0 = Temperaturkompensation aus
1 = Temperaturkompensation ein
Temperaturkompensation führt zu einer Messung relativ zur internen Temperatur des Gerätes. *6 (µA) CONF:CURR:[AC, DC, ACDC] [Auto, 500u 5000u] Beispiel: CONF:CURR:AC 500u
Statt 5000u kann man auch 5m oder 0.005 schreiben, dass gilt auch für alle andern Kommandos *7 (mA, A) CONF:CURR:[AC, DC, ACDC] [Auto, 50m, 500m] Beispiel: CONF:CURR:AC 50m
die Messbereiche über 500m können nur ausgewählt werden, wenn ein Kabel in der entsprechenden Buchse steckt. CONF:CURR:[AC, DC, ACDC] [Auto, 5, 10] Beispiel: CONF:CURR:AC 10 SYST:CPER [4-20, 0-20]
CONF:CURR:PERC Beispiel:
SYST:CPER 4-20
CONF:CURR:PERC
Strommessung in % im Bereich von 4 - 20 mA oder 0 - 20 mA. Bei 4 - 20 mA entsprechen 25% 8 mA und im 0.20 mA Bereich logischer Weise 5 mA
Beispielprogramm in Python
Dieses kleine Beispielprogramm stellt eine serielle Bluetooth Verbindung zu einem 1253B mit entpsrechendem Adapter her und gibt auf stdout jeweils die Zeit in Sekunden und die Temperatur in °C aus. So kann das aussehen:
[code]
0.2858979702 23.3201
0.421705961227 23.3201
0.458187818527 23.3244
[/code]
Um die Ausgabe in eine Datei zu schreiben, kannst du einfach stdout umleiten. Den Abstand zwischen den Messungen könntest du noch mit time.sleep() etwas verlängern, in dieser Form liefert das Programm etwa 27 Messwerte pro Sekunde, das dürfte für die meisten Temperaturmessungen etwas zu schnell sein.
Den Port musst Du eventuell noch anpassen. Auf meinem Mac ist es immer dieser Port, ob das bei dir auch so ist? Keine Ahnung! Geh einfach nach /dev/ und schau nach.
Ach so: Klar, das Programm kann so nur auf unixoiden Systemen, wie Linux oder unter MacOS X funktionieren. Wie du den entsprechenden Port unter Windows-Python auf machst, lässt sich aber bestimmt schnell ergooglen.
[code language=“python“]
#!/usr/bin/env python
# coding: utf8
import time
import serial
import sys
ser = serial.Serial(
port=’/dev/tty.AgilentU1177A-271650-SPP‘,
baudrate=9600
)
time.sleep(0.5)
ser.write("CONF:TEMP K,CEL\n")
ser.write("SYST:TCOM:0\n")
t0 = time.time()
try:
while 1:
t=time.time()-t0
ser.write("READ?\n")
a=ser.readline()
f = 0.0
try:
f=float(a)
except ValueError:
f=0
print t,f
sys.stdout.flush()
except KeyboardInterrupt:
pass
ser.write("*RST\r\n")
time.sleep(0.2)
ser.close()
[/code]