NI-VISA这是一种美国的一家公司的协议,主要用来和仪器通信,当然这只是一种通信的格式,具体的操作我们还是要参照示波器的说明书。
我们直接采用Python里面自带的NI—VISA库文件。pip install pyvisa
通过VISA发送相应命令(示波器编程文档有命令集)即可完成对示波器的控制,并且通过VISA可以接收返回值,比如波形数据等。
这里是通过USB来与示波器通信
1 rm = visa.ResourceManager() 2 # res = rm.list_resources() 3 # print(rm) 4 # print(res) 5 self.inst = rm.open_resource(‘USB0::0x0699::0x0528::C019161::INSTR‘)
第一行是得到visa资源管理器,第二行的res会是返回当前与电脑连接的端口地址,采用print()将其打印出来即可看到你的示波器地址。然后就可以注释掉了,然后使用第五行的代码即可打开示波器通信通道。
源码如下:
1 import matplotlib.pyplot as plt 2 import visa 3 import time 4 5 class Tektronix_MSO64: 6 def __init__(self): 7 visa_dll = ‘c:/windows/system32/visa32.dll‘ 8 rm = visa.ResourceManager() 9 # res = rm.list_resources() 10 # print(rm) 11 # print(res) 12 self.inst = rm.open_resource(‘USB0::0x0699::0x0528::C019161::INSTR‘) 13 ############################################## 14 self.inst.write("*IDN?") 15 print(self.inst.read()) 16 self.inst.write(‘CLEAR‘) 17 self.inst.write(‘ACQuire:MODe?‘) 18 print(self.inst.read()) 19 self.inst.timeout = 25000 20 self.inst.write(‘ACQUIRE:STOPAFTER RUNSTOP‘) 21 self.inst.write(‘ACQuire:STATE RUN‘) 22 23 24 def set_HORIZONTAL(self,POSITION,SCALE):#scale us 25 set_POSITION=‘HORIZONTAL:POSITION %s‘%POSITION 26 set_SCALE=‘HORIZONTAL:SCALE %se-6‘%SCALE 27 self.inst.write(set_POSITION) 28 self.inst.write(set_SCALE) 29 30 def open_ch(self,ch): 31 op_ch=‘DISplay:GLObal:CH%s:STATE ON‘%ch 32 self.inst.write(op_ch) 33 34 def close_ch(self,ch): 35 cl_ch=‘DISplay:GLObal:CH%s:STATE OFF‘%ch 36 self.inst.write(cl_ch) 37 38 def vertical_ch(self,ch,scale,position): 39 ver_ch=‘CH%s:BANDWIDTH FULl‘%ch 40 ver_scale=‘CH%s:SCAle %sE-3‘%(ch,scale)#mv 41 ver_position=‘CH%s:POSition %s‘%(ch,position) 42 ver_dc=‘CH%s:COUPLING DC‘%ch 43 ver_ter=‘CH%s:TERMINATION 10.0E+5‘%ch 44 self.inst.write(ver_ch)#at its maximum bandwidth 45 self.inst.write(ver_scale) 46 self.inst.write(ver_position) 47 self.inst.write(ver_dc) 48 self.inst.write(ver_ter) 49 50 def trigger_set(self,ch,level): 51 trigger_ch=‘TRIGGER:A:EDGE:SOURCE CH%s‘%ch 52 trigger_level=‘TRIGGER:A:LEVEL:CH4 %s‘%level 53 self.inst.write(‘TRIGGER:A:EDGE:COUPLING DC‘) 54 self.inst.write(trigger_ch) 55 self.inst.write(‘TRIGGER:A:EDGE:SLOPE RISE‘) 56 self.inst.write(trigger_level) 57 58 def begin_trigger(self): 59 self.inst.write(‘ACQuire:STOPAfter SEQuence‘) 60 while 1: 61 time.sleep(1) 62 self.inst.write(‘TRIGGER:STATE?‘) 63 TRIGGER_STATE =self.inst.read() 64 if TRIGGER_STATE[0] == "S": 65 print(‘have triggered‘) 66 break 67 68 def data_caul(self,ch,div,position,divH,positionH): 69 caul_ch=‘DATA:SOURCE CH%s‘%ch 70 self.inst.write(caul_ch) 71 self.inst.write(‘DATa:ENCdg ASCIi‘) 72 self.inst.write(‘WFMOUTPRE:BYT_NR 4‘) 73 self.inst.write(‘DATA:START 1‘) 74 self.inst.write(‘DATA:STOP 250e6‘) 75 self.inst.write(‘WFMOUTPRE?‘) 76 preamble= self.inst.read() 77 ######################################################### 78 j=0 79 point_str=‘ ‘ 80 for i in range(0,len(preamble)): 81 if preamble[i]==‘,‘: 82 j+=1 83 if j==4: 84 point_str=point_str+preamble[i] 85 elif j==5: 86 point_len=len(point_str) 87 point_str=point_str[2:(point_len-6)] 88 break 89 point_int=int(point_str) 90 print(point_int) 91 ###################################################### 92 data = self.inst.query(‘CURVE?‘) 93 x = [] 94 dat = [‘ ‘] 95 dat1 = [] 96 j = 0 97 for i in range(0, len(data)): 98 if data[i] == ‘,‘: 99 dat1.append(float(dat[j])/32000*div*5-div*position) 100 x.append((int(j)/point_int*divH*10-divH*10*positionH/100)*0.000001) 101 j += 1 102 dat.append(‘ ‘) 103 else: 104 dat[j] = dat[j] + data[i] 105 # plt.plot(x, dat1, color=‘g‘, linestyle=‘-‘) 106 plt.plot(x, dat1) 107 108 109 110 111 if __name__ == "__main__": 112 my=Tektronix_MSO64() 113 my.set_HORIZONTAL(10,200) 114 fig = plt.figure() 115 # my.close_ch(1) 116 my.open_ch(4) 117 my.open_ch(3) 118 my.open_ch(2) 119 my.open_ch(1) 120 my.vertical_ch(4,2000,2) 121 my.vertical_ch(3, 2000,2) 122 my.vertical_ch(2, 2000,2) 123 my.vertical_ch(1, 2000,2) 124 my.trigger_set(4,2) 125 my.begin_trigger() 126 my.data_caul(4,2,2,200,10) 127 my.data_caul(3,2,2,200,10) 128 my.data_caul(2,2,2,200,10) 129 my.data_caul(1,2,2,200,10) 130 plt.show()
第7行代码感觉没有用到,因为调用的python自带的visa库。
根据示波器编程文档,通过visa发送相应命令,接收相应返回值即可完成对示波器的控制,获取数据等,具体命令可以参考相应的编程文档。
此代码具有以下功能:
设置水平轴相关设置;
设置通道相关设置;
打开,关闭相应通道;
设置触发;
开启一次触发;
获取波形数据,并处理数据,然后通过plot()显示出来;
原文:https://www.cnblogs.com/caiya/p/13154580.html