#!/usr/bin/env python3
"""
Simple Python Script to Read AC and DC voltage from a Keithley 2015 via SCPI
"""
import serial
import io
import time
class SCPI:
def __init__(self, device):
self.ser = serial.Serial(device, 19200, timeout=2)
def write(self, s, term = '\r'):
print('TX >> ', s)
self.ser.write(str.encode(s))
if term:
self.ser.write(b'\r')
self.ser.flush()
def read(self):
buf = []
while True:
c = self.ser.read(1)
if c == b'\r':
s = b''.join(buf).decode('ascii')
print("RX << ", repr(s))
return s.strip()
else:
buf.append(c)
def cmd(self, msg):
last_char = msg[-1:]
self.write(msg)
if (last_char == '?'):
resp = self.read()
if ',' in resp:
return resp.split(',')
else:
return resp
else:
return None
def source_out(dmm):
dmm.cmd(':outp:freq 1000')
dmm.cmd(':outp:imp hiz')
dmm.cmd(':outp:ampl 1.0')
dmm.cmd(':outp on')
def vac_stream(dmm):
source_out(dmm)
dmm.cmd(':SENSe:FUNCtion \'VOLTage:AC\'')
dmm.cmd(':SENSe:VOLTage:AC:RANGe 1')
dmm.cmd(':SENSe:VOLTage:AC:DETector:BANDwidth 300')
dmm.cmd(':SENSe:VOLTage:AC:NPLC 1')
dmm.cmd(':SAMPle:COUNt 1')
dmm.cmd(':DISPlay:ENABle 1')
dmm.cmd(':TRIGger:DELay MIN')
dmm.cmd(':INITiate:CONTinuous ON')
while True:
#time.sleep(1)
resp = dmm.cmd(':SENSe:DATA:FRESh?')
#resp = dmm.cmd(':DATA:FETCh?')
now = time.time()
print('{:0.6f},{}'.format(now, resp))
def vdc_stream(dmm):
source_out(dmm)
dmm.cmd(':SENSe:FUNCtion \'VOLTage:DC\'')
dmm.cmd(':SENSe:VOLTage:DC:RANGe 1')
dmm.cmd(':SENSe:VOLTage:DC:NPLC 10')
#dmm.cmd(':SAMPle:COUNt 1')
#dmm.cmd(':DISPlay:ENABle 1')
dmm.cmd(':TRIGger:SEQuence:SOURce TIMer')
dmm.cmd(':TRIGger:SEQuence:TIMer 1')
dmm.cmd(':TRIGger:COUNt INF')
#dmm.cmd(':INITiate:CONT 1')
dmm.cmd(':INITiate')
while True:
#time.sleep(1)
resp = dmm.cmd(':SENSe:DATA:FRESh?')
now = time.time()
print('{:0.6f},{}'.format(now, resp))
if __name__ == '__main__':
dmm = SCPI('/dev/serial/by-id/usb-067b_2303-if00-port0')
dmm.cmd('*RST')
dmm.cmd(':INITiate:CONTinuous OFF;:ABORt')
dmm.cmd('*OPC?')
resp = dmm.cmd('*IDN?')
print('version: {}'.format(repr(resp)))
vdc_stream(dmm)