kylemanna
5/29/2017 - 1:46 AM

keithley_2015_scpi_read_voltage.py

#!/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)