Posted Wed, 21 Jun 2023 11:57:44 GMT by Antonescu, Bruno Thomas
Hello everyone, 

i'm a little bit stressed. I've been trying to get my keithley 3706a to work with a python script for days. 
Unfortunately without success. I get the connection, but I can't read out any valid voltage values. 
Could anyone help me, please?

I am attaching the source code
Posted Thu, 29 Jun 2023 11:28:16 GMT by C, Andrea
Looks like your Python code was written for different product than the model 3706A.
You are sending SCPI syntax commands.
The 3706A is TSP command set only.

:SENSE:FUNC "VOLT:DC"  becomes dmm.func = dmm.DC_VOLTS

See if the attached Getting Started document helps you.
Posted Mon, 03 Jul 2023 05:34:06 GMT by Antonescu, Bruno Thomas
Hi, 

thank you for your response. 

So i finished last week my Source-Code and now it works. 
I tried some TSP-Syntaxes and it works. 

 
Posted Tue, 30 Apr 2024 14:25:12 GMT by Souza, Jadson
Hi Bruno,
Could you share the source code?
Thanks!
Posted Tue, 24 Sep 2024 20:10:46 GMT by C, Andrea
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()

You must be signed in to post in this forum.