I want to control my Keithley 6485 Picoammeter externally by connecting it via RS232toUSB to my Linux PC (CentOS 6.9) and writing a code in python (version 2.7.13) with pyvisa:
import sys import visa from visa import constants rm = visa.ResourceManager('/usr/local/vxipnp/linux/lib64/libvisa.so') #open serial connection and set baud to 9600, 8 data bits, CR termination, one stop bit, none parity, no flow control amm = rm.open_resource('ASRL2::INSTR', baud_rate = 9600, data_bits = 8, write_termination= '\r', read_termination = '\r') constants.VI_ASRL_STOP_ONE constants.VI_ASRL_PAR_NONE constants.VI_ASRL_FLOW_NONE amm.write("*RST") # Return 6485 to RST default amm.write("SYS:ERR:ALL?") # Return error message amm.write("TRIG:DEL 0") # Set trigger delay to zero seconds amm.write("TRIG:COUNT 2500") # Set trigger count to 2500 amm.write("SENS:CURR:RANG:AUTO OFF") # Turn auto range off amm.write("SENS:CURR:NPLC .01") # Set integration rate to NPLC 0.01 amm.write("SENS:CURR:RANG 2e-7") # Use 200 nA range amm.write("SYST:ZCH OFF") # Turn zero check off amm.write("SYST:AZER:STAT OFF") # Turn auto zero off amm.write("DISP:ENAB OFF") # Turn Display off amm.write("*CLS") # Clear status model amm.write("TRAC:POIN 2500") # Set buffer size to 2500 amm.write("TRAC:CLE") # Clear buffer amm.write("TRAC:FEED:CONT NEXT") # Set storage control to start on next reading amm.write("STAT:MEAS:ENAB 512") # Enable buffer full measurement event amm.write("*SRE 1") # Enable SRQ on buffer full measurement event amm.write("*OPC?") # operation complete query (synchronize completion of commands) amm.write("INIT") # start taking and storing readings wait for GPIB SRQ line to go true amm.write("DISP:ENAB ON") # Turn display on print(amm.query_ascii_values("TRAC:DATA?")) # Request data from buffer
The problem when I run this script I just get "1" as the print output, although it should be returned in ASCII like this: Reading, Timestamp, Status and the error message after amm.write("*RST"): -113 undefined header. So I think the messages and not transferred correctly.
I know over the RS-232 interface, only the ASCII format is allowed. But when I follow the example in the pyvisa instruction with write_ascii_values(text, values) and assigning it a list, I only get an error message from the device -100 Command error.
Can somebody please tell me how to set the variables in write_ascii_values correctly or what I am doing wrong? Are my settings for the serial device wrong? Sometimes when I execute 2 times I get the error "VI_ERROR_ASRL_FRAMING (-1073807253): A framing error occurred during transfer ." too. I just do not know what to do.
Try adding a "\n" to every command and query.
Also, how are you handling the queries? All I see are amm.write commands. Where are the amm.read commands following a write command with a "?" within the quotes? Once you send a command containing a "?" in the message, the instrument will then want to respond to that request. The "1" that you receive in your print function is probably from the earlier command
I do know that when you send the
command that it will respond with a "1" to signify that the instrument has completed processing all earlier commands.
thanks for your answer. The printed "1" comes indeed from the command
When I erase OPC? and SYS:ERR:ALL? from the code I get the error:
File "./AMDAQ.py", line 31, in <module> print(amm.query("TRAC:DATA?"))
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
The adding of "\n" did not help (still get the -113 error). I assign the read and write termination as "\r" here:
amm = rm.open_resource('ASRL2::INSTR', baud_rate = 9600, data_bits = 8, write_termination= '\r', read_termination = '\r'
Adding \n would lead to \n\r, so a LFCR termination for the device. However I tried every termination possibility with the device: CR, LF, CRLF, LFCR, but it does not change anything.
I am not that familiar with this instrument, but typically, the first thing to do after a reset is to configure the instrument for the type of measuring.
Also, did you try using "READ?" for your print function
The manual is confusing as it sometimes refers to the same command with or without the prefix of ":"
:SYST:CLE or SYST:CLE
Not sure if it matters?
BTW: Keep the *OPC? statement where it is, just change it to a query as it allows the system time to configure itself properly before responding.
Thanks again for your help. I amended my script according to your change advises. It does not change anything.
I also change from RS232 to GPIB, but I get the same VI_ERROR_TMO (-1073807339) error. Also when I change the language from SCPI to 488.1. So there is definitely something wrong with the translation when it wants to read the data out of it. But I am out of ideas...