python 操作TK示波器(NI-VISA)

NI-VISA这是一种美国的一家公司的协议,主要用来和仪器通信,当然这只是一种通信的格式,具体的操作我们还是要参照示波器的说明书。

我们直接采用Python里面自带的NI—VISA库文件。pip install pyvisa,然后安装好NI-VISA的驱动,百度到官网即可下载安装。

通过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 plt2 import visa3 import time4 from datetime import datetime # std library5 6 class Tektronix_MSO64:7     def __init__(self):8         visa_dll = 'c:/windows/system32/visa32.dll'9         self.rm = visa.ResourceManager()10         # res = rm.list_resources()11         # print(rm)12         # print(res)13         self.inst = self.rm.open_resource('USB0::0x0699::0x0528::C019161::INSTR')14         ##############################################15         self.inst.write("*IDN?")16         print(self.inst.read())17         self.inst.write('CLEAR')18         self.inst.write('ACQuire:MODe?')19         print(self.inst.read())20         self.inst.timeout = 2500021         self.inst.write('ACQUIRE:STOPAFTER RUNSTOP')22         self.inst.write('ACQuire:STATE RUN')23 24 25     def set_HORIZONTAL(self,POSITION,SCALE):#HORIZONTAL position,HORIZONTAL scale /us26         self.inst.write('HORIZONTAL:POSITION %s'%POSITION)27         self.inst.write('HORIZONTAL:SCALE %se-6'%SCALE)28 29     def open_ch(self,ch):#关闭相应通道30         self.inst.write('DISplay:GLObal:CH%s:STATE ON'%ch)31 32     def close_ch(self,ch):#打开相应通道33         self.inst.write('DISplay:GLObal:CH%s:STATE OFF'%ch)34 35     def vertical_ch(self,ch,scale,position):#通道,ch scale/mv,ch POSition,36         self.inst.write('CH%s:BANDWIDTH FULl'%ch)#at its maximum bandwidth37         self.inst.write('CH%s:SCAle %sE-3'%(ch,scale))38         self.inst.write('CH%s:POSition %s'%(ch,position))39         self.inst.write('CH%s:COUPLING DC'%ch)#直流40         self.inst.write('CH%s:TERMINATION 10.0E+5'%ch)#1兆欧41 42     def trigger_set(self,ch,level):#通道,触发电压43         self.inst.write('TRIGGER:A:EDGE:COUPLING DC')#边沿触发44         self.inst.write('TRIGGER:A:EDGE:SOURCE CH%s'%ch)45         self.inst.write('TRIGGER:A:EDGE:SLOPE RISE')#上升沿触发46         self.inst.write('TRIGGER:A:LEVEL:CH4 %s'%level)47 48     def begin_trigger(self):#开启一次触发49         self.inst.write('ACQuire:STOPAfter SEQuence')50         while 1:#等触发了才借宿51             time.sleep(1)52             self.inst.write('TRIGGER:STATE?')53             TRIGGER_STATE =self.inst.read()54             if TRIGGER_STATE[0] == "S":55                 print('have triggered')56                 break57 58     def data_caul(self,ch):#通道59         self.inst.write('DATA:SOURCE CH%s'%ch)60         self.inst.write('DATa:ENCdg ASCIi')61         self.inst.write('WFMOUTPRE:BYT_NR 4')62         self.inst.write('DATA:START 1')63         self.inst.write('DATA:STOP 250e6')64         self.inst.write('WFMOUTPRE?')65         preamble= self.inst.read()66         #获取HORIZONTAL:POSITION67         self.inst.write('HORIZONTAL:POSITION?')68         HORIZONTAL_p=self.inst.read()69         HORIZONTAL_pfloat=float(HORIZONTAL_p)70         #获取HORIZONTAL:SCALE71         self.inst.write('HORIZONTAL:SCALE?')72         HORIZONTAL_S=self.inst.read()73         HORIZONTAL_Sfloat=float(HORIZONTAL_S)74         #获取ch POSition75         self.inst.write('CH%s:POSition?'%ch)76         divus_str = self.inst.read()77         divus_float = float(divus_str)78         #获取ch SCAle79         self.inst.write('CH%s:SCAle?'%ch)80         div_str = self.inst.read()81         div_float = float(div_str)82         #########################################################获取采样点数目83         j=084         point_str=' '85         for i in range(0,len(preamble)):86             if preamble[i]==',':87                 j+=188             elif j==4:89                 point_str=point_str+preamble[i]90             elif j==5:91                 point_len=len(point_str)92                 point_str=point_str[2:(point_len-6)]93                 break94         point_int=int(point_str)95         print('point_num:%d'%point_int)96         ######################################################数据处理97         data = self.inst.query('CURVE?')98         x = []99         dat = [' ']
100         dat1 = []
101         j = 0
102         for i in range(0, len(data)):
103             if data[i] == ',':
104                 dat1.append(float(dat[j])/32000*div_float*5-div_float*divus_float)
105                 x.append((int(j)/point_int*HORIZONTAL_Sfloat*10-HORIZONTAL_Sfloat*10*HORIZONTAL_pfloat/100))
106                 j += 1
107                 dat.append(' ')
108             else:
109                 dat[j] = dat[j] + data[i]
110         plt.plot(x, dat1)
111
112     def close(self):
113         self.inst.close()
114         self.rm.close()
115
116     def get_screen(self):
117         self.inst.write('SAVE:IMAGE "E:/waveform_screen.bmp"')
118         time.sleep(1)
119         self.inst.write('FILESYSTEM:READFILE "E:/waveform_screen.bmp"')
120         img = self.inst.read_raw()
121         dt = datetime.now()
122         fileName = dt.strftime("%Y%m%d_%H%M%S.bmp")  # 以当前时间建立文件名
123         imgFile = open('./waveform/' + fileName, "wb")  # 打开图片文件,如果没有就会新建一个
124         imgFile.write(img)
125         imgFile.close()
126         self.inst.write('FILESYSTEM:DELETE "E:/waveform_screen.bmp"')
127
128
129
130
131
132 if __name__ == "__main__":
133     fig = plt.figure()
134     my=Tektronix_MSO64()
135     my.set_HORIZONTAL(10,200)
136     my.open_ch(4)
137     my.open_ch(3)
138     my.open_ch(2)
139     my.open_ch(1)
140     my.vertical_ch(4,2000,1)
141     my.vertical_ch(3,2000,2)
142     my.vertical_ch(2,2000,2)
143     my.vertical_ch(1,2000,2)
144     my.trigger_set(4,2)
145     my.begin_trigger()
146     my.data_caul(4)
147     my.data_caul(3)
148     my.data_caul(2)
149     my.data_caul(1)
150     my.get_screen()
151     plt.show()
152     my.close()

根据示波器编程文档,通过visa发送相应命令,接收相应返回值即可完成对示波器的控制,获取数据等,具体命令可以参考相应的编程文档。

此代码具有以下功能:

设置水平轴相关设置;

设置通道相关设置;

打开,关闭相应通道;

设置触发;

开启一次触发;

获取波形数据,并处理数据,然后通过plot()显示出来;

获取截屏图片,保存到pc本地;

下面是其他控制代码。可以设置测量方式,读取泰克示波器的上升沿等

# coding=utf-8
from datetime import datetime
import pyvisa
import timeclass Tektronix_MSO64:def __init__(self):rm = pyvisa.ResourceManager("C:/Windows/System32/visa32.dll")self.inst = rm.open_resource('USB0::0x0699::0x0368::C031376::INSTR')self.inst.write("*IDN?")  # 返回示波器识别码# print(self.inst.read())self.inst.write('*CLS')  # 清除示波器状态self.inst.write('*ESR?')  # 查询标准状态寄存器的内容# print(self.inst.read())self.inst.write('ALLEV?')  # 使示波器返回所有事件及其消息# print(self.inst.read())# self.inst.write('FACTORY')  # 恢复出厂设置self.inst.timeout = 50000def close(self):self.inst.write('*CLS')  # 清除示波器状态self.inst.write('*ESR?')  # 查询标准状态寄存器的内容# print(self.inst.read())# self.inst.write('FACTORY')  # 恢复出厂设置self.inst.close()def set_horizontal(self, VOLTS, SCALE):self.inst.write('CH1:VOLTS %s' % VOLTS)  # 设置示波器的垂直刻度self.inst.write('HOR:MAIN:SCALE %se-3' % SCALE)  # 设置示波器的水平刻度self.inst.write('TRIG:MAIN:LEVEL 2.4')  # 触发装置设置为2.4Vdef operate_set(self):self.inst.write('AUTORANGE:STATE ON')  # 启动自动量程功能self.inst.write('ACQUIRE:STOPAFTER SEQUENCE')  # 按下RUN/STOP按钮将示波器设置为停止采集self.inst.write('ACQuire:STATE ON')  # 开始采集数据,将采集次数重置为0# self.inst.write('*OPC?')  # 查询OPC操作是否已完成# print(self.inst.read())def period_measure(self):self.inst.write('MEASU:IMMED:TYPE PERIOD')  # 设置为测量周期self.inst.write('MEASU:IMMED:VALUE?')  # 执行前面命令指定的立即示波器测量global reperiodstr_rperiod = self.inst.read()str_rperiod = str_rperiod[str_rperiod.rfind(' '):]rperiod = float(str_rperiod) * 1000rperiod = '%.2f' % rperiodreperiod = float(rperiod)print('实测周期:', reperiod)def frequency_measure(self):self.inst.write('MEASU:IMMED:TYPE FREQ')  # 设置为测量频率self.inst.write('MEASU:IMMED:VALUE?')  # 执行前面命令指定的立即示波器测量global rfrequentstr_frequency = self.inst.read()str_frequency = str_frequency[str_frequency.rfind(' '):]rfrequency = float(str_frequency)rfrequency = '%.2f' % rfrequencyrfrequent = float(rfrequency)print('实测频率:', rfrequent)def duty_measure(self):self.inst.write('MEASU:IMMED:TYPE PDUTY')  # 设置为测量占空比self.inst.write('MEASU:IMMED:VALUE?')  # 执行前面命令指定的立即示波器测量global redutystr_duty = self.inst.read()str_duty = str_duty[str_duty.rfind(' '):]rduty = float(str_duty)rduty = '%.2f' % rdutyreduty = float(rduty)print('实测占空比:', reduty)def rise_time_measure(self):self.inst.write('MEASU:IMMED:TYPE RISE')  # 设置为测量上升时间self.inst.write('MEASU:IMMED:VALUE?')  # 执行前面命令指定的立即示波器测量str_rise = self.inst.read()str_rise = str_rise[str_rise.rfind(' '):]rise = float(str_rise)rise = '%.2f' % riseriser = float(rise)print('实测上升时间:', riser)def positive_pulse_width_measure(self):self.inst.write('MEASU:IMMED:TYPE PWIDTH')  # 设置为测量正脉冲宽度self.inst.write('MEASU:IMMED:VALUE?')  # 执行前面命令指定的立即示波器测量str_positive_pulse_width = self.inst.read()str_positive_pulse_width = str_positive_pulse_width[str_positive_pulse_width.rfind(' ')]positive_pulse_width = float(str_positive_pulse_width)positive_pulse_width = '%.2f' % positive_pulse_widthprint('实测正脉冲宽度为:', positive_pulse_width)def negative_pulse_width_measure(self):self.inst.write('MEASU:IMMED:TYPE NWIDTH')  # 设置为测量负脉冲宽度self.inst.write('MEASU:IMMED:VALUE?')  # 执行前面命令指定的立即示波器测量str_negative_pulse_width = self.inst.read()str_negative_pulse_width = str_negative_pulse_width[str_negative_pulse_width.rfind(' ')]negative_pulse_width = float(str_negative_pulse_width)negative_pulse_width = '%.2f' % negative_pulse_widthprint('实测负脉冲宽度:', negative_pulse_width)def basic_set(self):self.inst.write('*ESR?')  # 查询标准状态寄存器的内容# print(self.inst.read())self.inst.write('ALLEV?')  # 使示波器返回所有事件及其消息# print(self.inst.read())self.inst.write('WFMPRE?')  # 查询波形数据的编码类型# print(self.inst.read())def waveform_save(self):self.inst.write('RECALL:WAVEFORM' 'D:\TST-PRD\TST-01.CSV')self.inst.write('SELECT:REFC')def get_screen(self):self.inst.write('SAVE:IMAGE "D:/waveform_screen.bmp"')time.sleep(1)self.inst.write('FILESYSTEM:READFILE "D:/waveform_screen.bmp"')img = self.inst.read_raw()dt = datetime.now()fileName = dt.strftime("%Y%m%d_%H%M%S.bmp")  # 以当前时间建立文件名imgFile = open('./waveform/' + fileName, "wb")  # 打开图片文件,如果没有就会新建一个imgFile.write(img)imgFile.close()self.inst.write('FILESYSTEM:DELETE "D:/waveform_screen.bmp"')def oscilloscoper():rm = Tektronix_MSO64()rm.set_horizontal(2.0, 10)# rm.operate_set()rm.period_measure()rm.frequency_measure()rm.duty_measure()rm.basic_set()rm.close()if __name__ == "__main__":oscill = Tektronix_MSO64()oscill.set_horizontal(2.0, 1)# oscill.operate_set()oscill.period_measure()oscill.frequency_measure()oscill.duty_measure()# oscill.waveform_save()oscill.basic_set()# oscill.get_screen()

【无标题】py控制泰克示波器,相关推荐

  1. python控制泰克示波器捕捉触发波形

    对于一些针对开关机出现偶发启动异常的问题需要捕获下异常情况的波形,但是异常情况并不是每次都能触发到,所以需要自动化去捕捉波形然后进行分析,这里就介绍下使用python控制泰克示波器进行设置单次触发获取 ...

  2. 泰克示波器控制scpi,程序读取波形数据并显示

    泰克示波器控制scpi,程序读取波形数据并显示,py程序 """ tektronix MDO3000 series oscilloscope test "&qu ...

  3. 泰克示波器校准显示无校准文件怎么办?

    泰克示波器应用于汽车电子,无线信号,高速信号不同行业中调试,验证,纠错,认证等100余种高级应用测试中,今天安泰测试给大家具体分析一下泰克数字示波器的校准调整方法到底有几种? 一.进入调整模式 为了防 ...

  4. 泰克示波器查眼图_泰克示波器

    示波器是设备维修中必不可少的一种仪器.有了它技术人员就能快速.准确的找到故障所在,所以正确.熟练使用示波器是维修人员的的必修课程.同时,也是电子工程师不可或缺的工具,被称为电子工程师的"眼睛 ...

  5. tek示波器软件_Tektronix(泰克示波器)

    美国泰克DPO4000/MSO4000系列数字/混合信号示波器 常用用型号:TDS3054B TDS3052C OPO4554 TDS1012B DPO 3032 TDS 1012B-SC TDS30 ...

  6. 语言 泰克示波器程序_泰克Tektronix 任意波函数发生器AFG2000系列AFG2021

    一.概述 通常,生成多种信号需要投资购买高端的信号发生器.AFG2021 任意波形/函数发生器具有 20 MHz 的带宽,14 位分辨率和 250 MS/s 采样率,可创建简单和复杂波形. 最令人印象 ...

  7. 泰克mdo3014使用手册_泰克示波器MDO3014故障维修案例分享

    近期有客户送修一台泰克示波器MDO3014,反馈示波器通道3有故障,希望我们能够尽快维修.具体维修过程如下: 一.仪器型号: 泰克示波器MDO3014 二.仪器主要参数: 混合域示波器,4个模拟通道( ...

  8. 泰克示波器查眼图_如何用泰克示波器测量眼图

    原标题:如何用泰克示波器测量眼图 示波器作为电子工程师常用的仪器,主要用来观察电信号,现在的数字示波器还加入了频谱分析功能.平常用到的主要是测量电信号波形,抓取快速变化信号.现今示波器的功能越来越强大 ...

  9. 泰克示波器TDS210更换IPS彩色屏幕

    本文将介绍如何为泰克示波器TDS210更换当前流行的IPS彩色屏幕,甚至在以后准备将屏幕图像转换为HDMI输出,彻底对以往的老旧屏幕说拜拜. 文章如有侵权请联系我删除. 目录 一.缘起 1.与TDS2 ...

最新文章

  1. C++中自定义比较函数和重载运算符总结
  2. How to mannuly configure vmtools in VM-Ware?
  3. Linux文件系统的组成部分
  4. linux deepin换源:换成国内镜像源(上海交大镜像源)
  5. 十二 Cent OS下 tomcat启动项目响应速度很慢
  6. 小朋友学数据结构(3):二叉树的建立和遍历
  7. win10 Java JDK环境变量配置
  8. Linux+Apache+PHP+MySQL服务器环境(CentOS篇)
  9. 【接口测试】接口测试用例设计
  10. 泊松分布,指数分布与排队论模型
  11. 奇点云数据中台技术汇 | 数据治理——企业数字化转型的基石
  12. 【MOOC手写体】王文敏教授.《人工智能原理》 第10章 机器学习的任务 Part5 C10.1...
  13. 【容器】Podman容器快速上手
  14. 逻辑回归实现数字手写识别
  15. zblog主题,zblog主题制作,zblog网站模板主题
  16. Deep Learning(深度学习)
  17. Python学习笔记1-内置数据结构
  18. Python中pupl的基础操作
  19. 2021年最新UI/UE设计软件全家桶
  20. 远程连接工具radmin2.2

热门文章

  1. 凡拓数字通过注册:年营收7亿 伍穗颖夫妇控制43%股权
  2. IOS13图标尺寸_7大原则,带你设计出更优秀的图标
  3. QT QLineEdit焦点和键盘问题
  4. Android里的相对坐标
  5. HTML和CSS的知识点总结
  6. 电脑加一个固态硬盘,如何修改电脑的启动项。
  7. 【转】什么是预研?产品预研与技术预研
  8. 华南师范大学计算机考研考场,华南师范大学2018考研考场安排
  9. excel粘贴 粘贴值 使用VBA宏匹配目标格式
  10. jquery中的各种动画效果