On 4 dec, 20:55, Terry Reedy <tjre...@udel.edu> wrote: > On 12/4/2012 7:14 AM, Jean Dubois wrote: > > > > > > > > > > > The following test program which tries to communicate with a Keithley > > 2200 programmable power supply using usbtmc in Python does not work as > > expected. I have connected a 10 ohm resistor to its terminals and I > > apply 0.025A, 0.050A, 0.075A en 0.1A, > > I then measure the current and the voltage en write them in a file > > De data produced looks like this: > > 0.00544643 0.254061; first current value is wrong, voltage value is > > correct > > 0.0250807 0.509289; second current value is wrong, but it corresponds > > to the first, second voltage is correct > > 0.0501099 0.763945; 3rd current value is wrong, but it corresponds to > > the second, 3rd voltage is right > > 0.075099 1.01792; 4th current value is wrong, it corresponds to the > > 3rd, 4th voltage is right > > 4th correct current value is missing > > > But is should be (numerical inaccuracy taking into account) (these data > > were produced by a similar octave-program): > > 0.0248947 0.254047 > > 0.0499105 0.509258 > > 0.0749044 0.764001 > > 0.0998926 1.01828 > > > Here is the python-program: > > #!/usr/bin/python > > import time > > import os > > import sys > > measurementcurr='' > > measurementvolt='' > > timesleepdefault=1 > > filename ='mydata.txt' > > usbkeith = open('/dev/usbtmc1','r+') > > usbkeith.flush() > > usbkeith.write("*IDN?\n") > > #strip blank line: > > identification=usbkeith.readline().strip() > > print 'Found device: ',identification > > usbkeith.write("SYST:REM" + "\n") > > usbkeith.write(":SENS:VOLT:PROT 1.5\n") > > keithdata = open(filename,'w') > > #start first measurement > > usbkeith.write(":SOUR:CURR 0.025\n") > > usbkeith.write(":OUTP:STAT ON\n") > > time.sleep(timesleepdefault) > > usbkeith.write(":MEAS:CURR?\n") > > time.sleep(timesleepdefault) > > measurementcurr=usbkeith.readline() > > print 'Measured current 1: ',measurementcurr > > usbkeith.write("MEAS:VOLT?\n") > > time.sleep(timesleepdefault) > > measurementvolt=usbkeith.readline() > > print 'Measured voltage 1: ',measurementvolt > > keithdata.write(measurementcurr.strip()+' '+measurementvolt) > > [3 near repetitions snipped] > > This sort of repetitious code without even line breaks is painful for me > to read. Python has looping statements for a reason. Replace all four > nearly identical blocks with the following. (If you are not familiar > with built-in enumerate, you should be. Read its entry in the library > manual.) > > for number, current_in in enumerate( > ('0.025', '0.050'. '0.075', '0.100'), 1) > usbkeith.write(":SOUR:CURR %s\n" % current_in) > ... > print 'Measured current %d: ' % number, measurementcurr > ... > print 'Measured voltage %d: ' % number, measurementvolt > > Now you can make changes in only one place and easily add more test values. > > > print "Goodbye, data logged in file:" > > print filename > > usbkeith.close() > > keithdata.close() > > > can anyone here what is going wrong and how to get it right? > > No, but if both the python and octave programs used loops, it would be > easier to see if both are doing the same things before, within, and > after the loop. > > -- > Terry Jan Reedy I followed your suggestion an now the code looks like this: #!/usr/bin/python import time import os import sys measurementcurr='' measurementvolt='' timesleepdefault=2 filename ='mydata.txt' usbkeith = open('/dev/usbtmc1','r+') usbkeith.flush() usbkeith.write("*IDN?\n") #strip blank line: identification=usbkeith.readline().strip() print 'Found device: ',identification usbkeith.write("SYST:REM" + "\n") usbkeith.write(":SENS:VOLT:PROT 1.5\n") keithdata = open(filename,'w') usbkeith.write(":OUTP:STAT ON\n") for number, current_in in enumerate(('0.025', '0.050', '0.075', '0.100'), 1): usbkeith.write(":SOUR:CURR %s\n" % current_in) time.sleep(timesleepdefault) usbkeith.write(":MEAS:CURR?\n") measurementcurr=usbkeith.readline() print 'Measured current %d: ' % number, measurementcurr usbkeith.write(":MEAS:VOLT?\n") measurementvolt=usbkeith.readline() print 'Measured voltage %d: ' % number, measurementvolt keithdata.write(measurementcurr.strip()+' '+measurementvolt) usbkeith.write(":OUTP:STAT OFF\n") print "Goodbye, data logged in file:" print filename usbkeith.close() keithdata.close()
Still there is a "buffer-problem" as you can see in the output below: 0.00639725 0.0104065; these values are completely wrong 0.0248976 0.262959; these should have been be the first values 0.0500431 0.516602: these should been the second values 0.0749168 0.772616; these are the 3rd values 4th values are missing any idea why this does what it does in Python? jean -- http://mail.python.org/mailman/listinfo/python-list