Here is some Python sample code for scanning some channels with model 3706A:
import pyvisa
import time
import matplotlib.pyplot as plt
import pandas as pd
def check_error():
status = my3706A.read_stb()
if int(status) & 4 == 4 : #test if the EAV (error available) bit is set
error_response = my3706A.query("print(errorqueue.next())")
print(error_response)
else:
print("No Errors")
def get_scanState():
my3706A.write("scanState, scanCount, stepCount, lastReading = scan.state()")
return int(float(my3706A.query("print(tonumber(scanState))")))
DEBUG = 0
my3706A = pyvisa.ResourceManager().open_resource('TCPIP0::192.168.1.214::INSTR')
#my3706A = pyvisa.ResourceManager().open_resource('USB0::0x05E6::0x3706::04428124::INSTR') # Connect to the keithley and set it to a variable named multimeter.
my3706A.timeout = 10000 #number of msec to wait for VISA command completions
#my3706A.write("")
#put instrument into known state
my3706A.write('reset()')
my3706A.write('status.reset()')
my3706A.write('errorqueue.clear()')
#allocate a buffer for the measurements
my3706A.write('buf=dmm.makebuffer(1000)')
my3706A.write('buf.clear()')
my3706A.write('buf.appendmode=1')
my3706A.write('buf.collectchannels=1')
if DEBUG: check_error()
#configure the DMM settings
my3706A.write("dmm.func= dmm.DC_VOLTS") # TWO_WIRE_OHMS DC_VOLTS
my3706A.write("dmm.range=1")
my3706A.write("dmm.autorange=1")
my3706A.write("dmm.nplc= 1") #0.0005 to 15 for 60Hz power
my3706A.write("dmm.autozero= dmm.ON")
my3706A.write("dmm.autodelay= dmm.ON")
if DEBUG: check_error()
#associate these dmm settings with a configuration name
# do not use a factory preset name, e.g., 'dcvolts'
# custom settings = requires custom name
my3706A.write('dmm.configure.set("my_dcvolts")')
if DEBUG: check_error()
#associate the dmm config with channels
my3706A.write('dmm.setconfig("1001:1008", "my_dcvolts")')
#define a scan
my3706A.write('scan.measurecount=1') # one reading per scan
my3706A.write("scan.create('1001:1008')")
my3706A.write("scan.scancount = 10") # 10 scans
# now that scan is setup, run the scan
my3706A.write("buf.clear()") # just in case, clear the buffer of any content
#my3706A.write("scan.execute(buf)") # this one does not return until scan completes
my3706A.write("scan.background(buf)") # this one returns; Python needs to coordinate with done.
# setup a while loop to exit when scan state goes to 6 = scan.SUCCESS = done
script_running = True
DEBUG_LOOP = 0
while script_running:
present_state = get_scanState()
if DEBUG_LOOP: print("Scan State: " + str(present_state))
if present_state == 6:
script_running = False
time.sleep(0.5) #delay before asking again
#ask for the data
my3706A.write("printbuffer(1, buf.n, buf.relativetimestamps, buf.readings)")
raw_data = my3706A.read()
# raw data will be comman delimited string:
# time, ch1, time, ch2, time, ch3, time, ch4, time, ch5, time...
# parse the data
raw_data_array = raw_data.split(",")
timestamps = []
chan1001 = []
chan1002 = []
chan1003 = []
chan1008 = []
num_channels = 8
num_elements = num_channels * 2 #time, ch1, time, ch2, time, ch3, time, ch4, time, ch5, time....
for element in range(0, len(raw_data_array), num_elements):
timestamps.append(float(raw_data_array[element]))
chan1001.append(float(raw_data_array[element+1]))
chan1002.append(float(raw_data_array[element+3]))
chan1003.append(float(raw_data_array[element+5]))
chan1008.append(float(raw_data_array[element+15]))
#create dataframe
data = {'Timestamp': timestamps, 'Channel 1': chan1001, 'Channel 2': chan1002, 'Channel 3': chan1003, 'Channel 8': chan1008}
df = pd.DataFrame(data)
# Set 'Timestamp' as the index
df.set_index('Timestamp', inplace=True)
# Print the DataFrame
print(df)
# ******************** Simple Graph ******************
plt.figure()
plt.subplot(3, 1, 1) # nrows=3, ncols=1, index=1
plt.plot(timestamps, chan1001, 'o-b')
plt.subplot(312)
plt.plot(timestamps, chan1002, 'x-r')
plt.subplot(313)
plt.plot(timestamps, chan1003, '.-g')
plt.show()
my3706A.clear()
my3706A.close()