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()