# python, bleh import time import datetime import serial import sys import struct def wait_for_GPIB_data_ready(): spoll = 0 while spoll == 0: ser.write('++spoll\r') s = '' while ser.inWaiting() == 0: time.sleep(0.001) while ser.inWaiting() > 0: s += ser.read(1) time.sleep(.001) spoll = int(s) #print "SPOLL: " + str(spoll) def write_GPIB(s): ser.write(s + '\r') time.sleep(0.01) # strips \n or \r from the last two chars def read_serial(): s = "" while ser.inWaiting() == 0: time.sleep(0.01) while ser.inWaiting() > 0: time.sleep(.001) s += ser.read(1) if s[-1] == "\n" or s[-1] == "\r": s = s[:-1] if s[-1] == "\n" or s[-1] == "\r": s = s[:-1] # print '=='+ s[:] +'==' + str(len(s)) return s def read_serial_bytes(i): while ser.inWaiting() < i: time.sleep(0.01) s = ser.read(i) return s # strips \n or \r from the last two chars def read_GPIB(): ser.write('++read eoi\n') s = '' while len(s) < 1 or s[-1] != chr(eot_char): s += ser.read(1) if s[-1] == "\n" or s[-1] == "\r": s = s[:-1] if s[-1] == "\n" or s[-1] == "\r": s = s[:-1] # print '=='+ s[:] +'==' + str(len(s)) return s # send query and receive a string response, strip terminating CR or LF def query_GPIB_string(s): ser.write(s + '\n') # send instrument command write_GPIB('++eot_enable 1') # Append user defined character when EOI detected ser.write('++read eoi\n') # read data until EOI char is received s = '' while len(s) == 0 or s[-1] != chr(eot_char): s += ser.read(1) s = s[:-1] # strip EOI termination char if s[-1] == "\n" or s[-1] == "\r": s = s[:-1] # strip CR at the end of string return s #--------------------------- MAIN ----------------------------------------- mv_per_div = 200 ps_per_div = 50 golden_ratio = 1.61803398875 chartheight = 400 chartwidth = int(golden_ratio * chartheight) chartXstart = 70 chartYstart = 10 imagewidth = 2 * chartXstart + chartwidth imageheight = chartYstart + chartheight traces = 10 trace_stroke_width = 2 graticule_stroke_width = 0.3 vrange = 32000.0 eot_char = 127 #if len(sys.argv) != 3: # print 'usage: python E4916A.py FREQUENCY_MHZ FILENAME' # exit() #F_nominal = float(sys.argv[1]) #filename = sys.argv[2] + '.csv' ser = serial.Serial(port='COM22', baudrate=9600, timeout=0.5, rtscts=1) ser.isOpen() write_GPIB('') write_GPIB('++mode 1') write_GPIB('++addr 1') write_GPIB('++auto 0') write_GPIB('++eoi 1') write_GPIB('++clr') write_GPIB('++eot_char ' + str(eot_char)) time.sleep(.01) write_GPIB('TEXT CLEAR') #write_GPIB('ACQuisition STOP') # drain touch buffer while query_GPIB_string('ABSTOUCH?').split(' ')[1] != '-1,-1': time.sleep(.01) #wait for screen tap touch = 0 while touch == 0: time.sleep(.01) write_GPIB("TEXT X:20,Y:1,STRING:'TAP HERE FOR NEXT PULSER'") if query_GPIB_string('ABSTOUCH?').split(' ')[1] != '-1,-1': touch = 1 write_GPIB('TEXT CLEAR') id = query_GPIB_string('ID?').split(' ')[1] head = query_GPIB_string('SAMid?').split(',')[1].split(':')[1].replace('"', '') head_sn = query_GPIB_string('UID?').split(',')[2].split(':')[1].replace('"', '') write_GPIB('ABBwfmpre ON') # reduced response to WFMPre? write_GPIB('CHM3 OFFSET:-5.0E-1,SENSITIVITY:'+str(mv_per_div * 0.001)+',SMOOTHING:ON') write_GPIB('CONDACQ TYPE:CONTINUOUS') write_GPIB('OUTPUT TRACE1') write_GPIB('TRIGGER MODE:NORMAL,STATUS:TRG,SOURCE:EXTERNAL,LEVEL:0,SLOPE:MINUS') #write_GPIB('TRIGGER MODE:NORMAL,STATUS:TRG,SOURCE:EXTERNAL,LEVEL:0,SLOPE:PLUS') write_GPIB('AUTOSET HORIZ:ON,VERT:OFF,TRIGGER:ON,MODE:EDGE,START') time.sleep(1) #write_GPIB('MAINPOS 44.65784E-9') write_GPIB('TBMAIN LENGTH:512,TIME:'+str(ps_per_div)+'E-12,XINCR:4.0E-13') write_GPIB('TBWIN LENGTH:512,TIME:1.0E-12,XINCR:2.0E-14') with open('image1.svg', "w") as text_file: # get graticule range parameters = query_GPIB_string('WFMPre?').split(',') for i in range(len(parameters)): param = parameters[i].split(':')[0] data = parameters[i].split(':')[1] if param == 'YZERO': yzero = float(data) if param == 'YMULT': ymult = float(data) print param, data text_file.write('\n') text_file.write('\n') text_file.write('\n') fontsize = 16 # graticule outside border stroke_width = 1 text_file.write('\n') text_file.write('\n') text_file.write('\n') text_file.write('\n') # Volts text_file.write(''+('%+.1fV'% (yzero+ymult*vrange))+'\n') text_file.write(''+('%+.1fV'% yzero)+'\n') text_file.write(''+('%+.1fV'% (yzero-ymult*vrange))+'\n') # mv/div text_file.write(''+('%dmV' % mv_per_div)+'\n') text_file.write('/dev\n') # ps/div text_file.write(''+('%dps/div' % ps_per_div)+'\n') # graticule lines for i in range(1,10): stroke_width = graticule_stroke_width if i == 5: stroke_width = graticule_stroke_width * 3 text_file.write('\n') text_file.write('\n') # repeat several traces for j in range(traces): # get trace data curve_txt = query_GPIB_string('CURVe?').split(',')[1:] # waveform.split(';')[1].split(',')[1:] text_file.write('\n') # get measurements risetime = query_GPIB_string('RISetime?').split(',')[0].split(' ')[1] overshoot = query_GPIB_string('OVErshoot?').split(',')[0].split(' ')[1] amplitude = query_GPIB_string('AMPlitude?').split(',')[0].split(' ')[1] text_file.write('') text_file.close() #write_GPIB('TRIGGER MODE:NORMAL,STATUS:TRG,SOURCE:EXTERNAL,LEVEL:0,SLOPE:MINUS') write_GPIB('TRIGGER MODE:NORMAL,STATUS:TRG,SOURCE:EXTERNAL,LEVEL:0,SLOPE:PLUS') write_GPIB('AUTOSET HORIZ:ON,VERT:OFF,TRIGGER:ON,MODE:EDGE,START') time.sleep(1) #write_GPIB('MAINPOS 44.65784E-9') write_GPIB('TBMAIN LENGTH:512,TIME:'+str(ps_per_div)+'E-12,XINCR:4.0E-13') write_GPIB('TBWIN LENGTH:512,TIME:1.0E-12,XINCR:2.0E-14') with open('image2.svg', "w") as text_file: # get graticule range parameters = query_GPIB_string('WFMPre?').split(',') for i in range(len(parameters)): param = parameters[i].split(':')[0] data = parameters[i].split(':')[1] if param == 'YZERO': yzero = float(data) if param == 'YMULT': ymult = float(data) print param, data text_file.write('\n') text_file.write('\n') text_file.write('\n') fontsize = 16 # graticule outside border stroke_width = 1 text_file.write('\n') text_file.write('\n') text_file.write('\n') text_file.write('\n') # Volts text_file.write(''+('%+.1fV'% (yzero+ymult*vrange))+'\n') text_file.write(''+('%+.1fV'% yzero)+'\n') text_file.write(''+('%+.1fV'% (yzero-ymult*vrange))+'\n') # mv/div text_file.write(''+('%dmV' % mv_per_div)+'\n') text_file.write('/dev\n') # ps/div text_file.write(''+('%dps/div' % ps_per_div)+'\n') # graticule lines for i in range(1,10): stroke_width = graticule_stroke_width if i == 5: stroke_width = graticule_stroke_width * 3 text_file.write('\n') text_file.write('\n') # repeat several traces for j in range(traces): # get trace data curve_txt = query_GPIB_string('CURVe?').split(',')[1:] # waveform.split(';')[1].split(',')[1:] text_file.write('\n') # get measurements falltime = query_GPIB_string('FALltime?').split(',')[0].split(' ')[1] undershoot = query_GPIB_string('UNDershoot?').split(',')[0].split(' ')[1] text_file.write('') text_file.close() filename = 'pulser.html' with open(filename, "w") as text_file: text_file.write('') text_file.write('Pulser') text_file.write('') fontsize = 16 #text_file.write('CSA803 COMMUNICATIONS SIGNAL ANALYZER, ' + id + '') text_file.write('CSA803 COMMUNICATIONS SIGNAL ANALYZER, Sampling head ' + head + ', S/N ' + head_sn + '') text_file.write('
') text_file.write(''+datetime.datetime.now().strftime("%A %d %b %Y %X")+'') text_file.write('
') text_file.write('
') text_file.write(''+ 'Risetime %.2fps' % (float(risetime) * 1E12) +'') text_file.write('
') text_file.write(''+ 'Falltime %.2fps' % (float(falltime) * 1E12) +'') text_file.write('
') text_file.write(''+ 'Overshoot %.1f' % (float(overshoot) * 1.0) +'%') text_file.write('
') text_file.write(''+ 'Undershoot %.1f' % (float(undershoot) * 1.0) +'%') text_file.write('
') text_file.write(''+ 'Amplitude %.3fV' % (float(amplitude) * 1.0) +'') text_file.write('

') text_file.write('') text_file.write('

') text_file.write('') text_file.write('') text_file.write('') text_file.close() # https://github.com/kendallb/PrintHtml import os os.system('cmd /c "PrintHtml.exe -p Default pulser.html"') exit() write_GPIB('ID?') write_GPIB('++read eoi') print read_serial() print query_GPIB_string('ID?') print query_GPIB_string('UID?') print query_GPIB_string('SAMid?') print query_GPIB_string('ABBwfmpre?') print query_GPIB_string('ABSTouch?') print query_GPIB_string('ACQNum?') print query_GPIB_string('ACQuisition?') print query_GPIB_string('ADJtrace1?') print query_GPIB_string('ALTinkjet?') print query_GPIB_string('AMPlitude?') print query_GPIB_string('AUTOSet?') print query_GPIB_string('AVG?') print query_GPIB_string('BCOrrection?') print query_GPIB_string('BITMap?') print query_GPIB_string('BYT.or?') print query_GPIB_string('CALibrate?') print query_GPIB_string('CH?') #print query_GPIB_string('CHIdent?') print query_GPIB_string('COLor?') print query_GPIB_string('COMpare?') print query_GPIB_string('CONDacq?') print query_GPIB_string('COPy?') print query_GPIB_string('CROss?') print query_GPIB_string('CURSor?') print query_GPIB_string('CURVe?') print query_GPIB_string('DATE?') print query_GPIB_string('DCOmp?') print query_GPIB_string('DEBug?') print query_GPIB_string('DEFine?') print query_GPIB_string('DIAg?') print query_GPIB_string('DISPlay?') print query_GPIB_string('DISPNum?') print query_GPIB_string('DIV2?') print query_GPIB_string('DOT1Abs?') print query_GPIB_string('DSYmenu?') print query_GPIB_string('DSYS?') print query_GPIB_string('ENCdg?') print query_GPIB_string('MPAram?') print query_GPIB_string('NVRam?') print query_GPIB_string('POWeron?') print query_GPIB_string('SET?') print query_GPIB_string('RISetime?') print query_GPIB_string('FALltime?') print query_GPIB_string('OVErshoot?') exit()