Posted 2 years ago 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 2 years ago 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 2 years ago 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 12 months ago by Souza, Jadson
Hi Bruno,
Could you share the source code?
Thanks!
Posted 7 months ago by C, Andrea
Here is some Python sample code for scanning some channels with model 3706A:
  1. import pyvisa                                              
  2. import time                                                
  3. import matplotlib.pyplot as plt                
  4. import pandas as pd
  5.  
  6.  
  7. def check_error():
  8.     status = my3706A.read_stb()
  9.     if int(status) & 4 == 4 :    #test if the EAV (error available) bit is set
  10.         error_response = my3706A.query("print(errorqueue.next())")
  11.         print(error_response)
  12.     else:
  13.         print("No Errors")
  14.  
  15. def get_scanState():
  16.     my3706A.write("scanState, scanCount, stepCount, lastReading = scan.state()")
  17.     return int(float(my3706A.query("print(tonumber(scanState))")))
  18.    
  19.  
  20. DEBUG = 0
  21. my3706A = pyvisa.ResourceManager().open_resource('TCPIP0::192.168.1.214::INSTR')
  22. #my3706A = pyvisa.ResourceManager().open_resource('USB0::0x05E6::0x3706::04428124::INSTR') # Connect to the keithley and set it to a variable named multimeter.
  23. my3706A.timeout = 10000  #number of msec to wait for VISA command completions
  24. #my3706A.write("")
  25. #put instrument into known state
  26. my3706A.write('reset()')
  27. my3706A.write('status.reset()')
  28. my3706A.write('errorqueue.clear()')
  29. #allocate a buffer for the measurements
  30. my3706A.write('buf=dmm.makebuffer(1000)')
  31. my3706A.write('buf.clear()')
  32. my3706A.write('buf.appendmode=1')
  33. my3706A.write('buf.collectchannels=1')
  34.  
  35. if DEBUG: check_error()
  36. #configure the DMM settings
  37. my3706A.write("dmm.func= dmm.DC_VOLTS")  #   TWO_WIRE_OHMS   DC_VOLTS
  38. my3706A.write("dmm.range=1")
  39. my3706A.write("dmm.autorange=1")
  40. my3706A.write("dmm.nplc= 1")   #0.0005 to 15 for 60Hz power
  41. my3706A.write("dmm.autozero= dmm.ON")
  42. my3706A.write("dmm.autodelay= dmm.ON")
  43.  
  44. if DEBUG: check_error()
  45. #associate these dmm settings with a configuration name
  46. # do not use a factory preset name, e.g., 'dcvolts'
  47. # custom settings = requires custom name
  48. my3706A.write('dmm.configure.set("my_dcvolts")')
  49.  
  50. if DEBUG: check_error()
  51. #associate the dmm config with channels
  52. my3706A.write('dmm.setconfig("1001:1008", "my_dcvolts")')
  53.  
  54.  
  55. #define a scan
  56. my3706A.write('scan.measurecount=1')  # one reading per scan
  57. my3706A.write("scan.create('1001:1008')")
  58. my3706A.write("scan.scancount = 10")     # 10 scans
  59. # now that scan is setup, run the scan
  60. my3706A.write("buf.clear()")   # just in case, clear the buffer of any content
  61. #my3706A.write("scan.execute(buf)")  # this one does not return until scan completes
  62. my3706A.write("scan.background(buf)")  # this one returns;  Python needs to coordinate with done.
  63.  
  64. # setup a while loop to exit when scan state goes to 6 = scan.SUCCESS = done
  65. script_running = True
  66. DEBUG_LOOP = 0
  67. while script_running:
  68.     present_state = get_scanState()
  69.     if DEBUG_LOOP: print("Scan State: " + str(present_state))
  70.     if present_state == 6:
  71.         script_running = False
  72.     time.sleep(0.5) #delay before asking again
  73.  
  74. #ask for the data
  75. my3706A.write("printbuffer(1, buf.n, buf.relativetimestamps, buf.readings)")
  76. raw_data = my3706A.read()
  77. # raw data will be comman delimited string:
  78. # time, ch1, time, ch2, time, ch3, time, ch4, time, ch5, time...
  79. # parse the data
  80. raw_data_array = raw_data.split(",")
  81. timestamps = []
  82. chan1001 = []
  83. chan1002 = []
  84. chan1003 = []
  85. chan1008 = []
  86. num_channels = 8
  87. num_elements = num_channels * 2  #time, ch1, time, ch2, time, ch3, time, ch4, time, ch5, time....
  88. for element in range(0, len(raw_data_array), num_elements):
  89.     timestamps.append(float(raw_data_array[element]))
  90.     chan1001.append(float(raw_data_array[element+1]))
  91.     chan1002.append(float(raw_data_array[element+3]))
  92.     chan1003.append(float(raw_data_array[element+5]))
  93.     chan1008.append(float(raw_data_array[element+15]))
  94. #create dataframe
  95. data = {'Timestamp': timestamps, 'Channel 1': chan1001, 'Channel 2': chan1002, 'Channel 3': chan1003, 'Channel 8': chan1008}
  96. df = pd.DataFrame(data)
  97.  
  98. # Set 'Timestamp' as the index
  99. df.set_index('Timestamp', inplace=True)
  100. # Print the DataFrame
  101. print(df)
  102. # ********************  Simple Graph ******************
  103. plt.figure()
  104. plt.subplot(3, 1, 1) # nrows=3, ncols=1, index=1
  105. plt.plot(timestamps, chan1001, 'o-b')
  106. plt.subplot(312)
  107. plt.plot(timestamps, chan1002, 'x-r')
  108. plt.subplot(313)
  109. plt.plot(timestamps, chan1003, '.-g')
  110. plt.show()
  111.  
  112.  
  113. my3706A.clear()
  114. my3706A.close()

You must be signed in to post in this forum.