返回顶部
首页 > 资讯 > 后端开发 > Python >PyVISA使用——用python控制TEK示波器源码实现
  • 820
分享到

PyVISA使用——用python控制TEK示波器源码实现

python开发语言 2023-09-08 18:09:48 820人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

项目要求 项目上提出自动化测试需求,要求能够对板级信号使用示波器等仪器做自动化测量 实现方案 使用PyVISA 方案实现。 VISA (Virtual Instrument Software Arch

项目要求

项目上提出自动化测试需求,要求能够对板级信号使用示波器等仪器做自动化测量

实现方案

使用PyVISA 方案实现。
VISA (Virtual Instrument Software Architecture) 是一个用于访问测量仪器和控制计算机之间的接口标准,由美国国家仪器公司(National Instruments)推出,用于实现仪器之间的通信和控制。VISA提供了一组标准api函数,可以实现多种通信协议和连接方式的仪器控制。VISA相比于VXI11更加灵活,支持多种接口(底层协议),比如GPIB,RS232,USB, VXIBus等,对于仪器控制有更强大的功能。在这里插入图片描述
Pyvisa是一个基于python语言开发的访问VISA资源的工具包。通过调用VISA标准API函数来实现与仪器的通信和控制。Pyvisa提供了一组Python的API函数,可以方便地访问VISA库中的函数和方法,从而实现与仪器的数据读取、写入、控制等操作。Pyvisa相比于LabVIEW,Pyvisa是一种跨平台的软件,可以在linuxwindowsMac OS上运行,且其拥有更灵活的用户界面,可以自行定制。

如果该脚本运行在服务器上,建议使用PyCharm Professional 或者vscode + Remote-ssh 插件进行开发,即本地开发,远程部署或调试。

本例使用SCPI命令访问示波器的VISA库,SCPI命令的格式见示波器软件编程手册

脚本实现功能

(1)连接示波器
注意:电脑并没有使用NI-VISA后台,而是使用纯python代码实现的Pyvisa-py, 因此需要提前安装下 pip install -U pyvisa-py
(2)简单设置示波器参数,包括channal 选择,横轴窗口设置,纵轴电压窗口设置,Trigger触发方式选择
(3)波形数据以csv 和图片格式保存到本地
(4)保存示波器的截图到本地

脚本与注释

import timeimport pyvisa as visaimport numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom datetime import datetimefrom pyvisa.errors import VisaiOErrorfrom PIL import Image# rm = visa.ResourceManager('@py')# rm.list_resources()# Tek = rm.open_resource('tcpIPO::10.163.xxx.xxx::INSTR')# Tek.timeout=10000# print(Tek.query('*IDN?'))# self.inst.write('*RST')# self.inst.write('AUTOSET EXECUTE')class Tektronix_DPO:        def __init__(self):            self.rm = visa.ResourceManager('@py')            self.rm.list_resources()            self.inst = self.rm.open_resource('TCPIPO::10.163.xxx.xxx::INSTR')            self.inst.timeout=10000            print(self.inst.query('*IDN?'))            self.inst.write('CLEAR')            self.inst.write('ACQuire:MODe?')            self.inst.write('ACQUIRE:STOPAFTER RUNSTOP')            self.inst.write('ACQuire:STATE RUN')            self.inst.write('autoset EXECUTE') # autoset                      def set_HORIZONTAL(self, POSITION, SCALE):         #horizontal settings            self.inst.write('HORIZONTAL:POSITION %s'%POSITION)  #position means trigger point on the screen /%            self.inst.write('HORIZONTAL:SCALE %se-6'%SCALE)     #scale means step /us          def open_ch(self,ch):   # open channal            self.inst.write('DISplay:GLObal:CH%s:STATE ON'%ch)          def close_ch(self,ch):  # close channal            self.inst.write('DISplay:GLObal:CH%s:STATE OFF'%ch)          def vertical_ch(self,ch,scale,position):     #channal settings,            self.inst.write('CH%s:BANDWIDTH FULl'%ch) # at its maximum bandwidth            self.inst.write('CH%s:SCAle %sE-3'%(ch,scale))     #channal scale/mv            self.inst.write('CH%s:POSition %s'%(ch,position))  #channal divisions above the center graticule            self.inst.write('CH%s:COUPLING DC'%ch)     # DC coupling            self.inst.write('CH%s:TERMINATION 10.0E+5'%ch) #channal input resistence is 1MΩ          def trigger_set(self,ch,level):        #trigger settings            self.inst.write('TRIGGER:A:EDGE:COUPLING DC')  # DC trigger coupling with input signal to the trigger circuitry            self.inst.write('TRIGGER:A:EDGE:SOURCE CH%s'%ch)            self.inst.write('TRIGGER:A:EDGE:SLOPE RISE')   #triggers on the rising edge of the signal            self.inst.write('TRIGGER:A:LEVEL:CH%s %s'%(ch,level))  # level specifies channal trigger level for seach 1, /V            def begin_trigger(self): #start once trigger action            self.inst.write('acquire:state 0') # stop            self.inst.write('acquire:stopafter SEQUENCE') # single            self.inst.write('acquire:state 1') # run            self.inst.query('*opc?') # sync                def data_caul(self,ch): #calculate the channal value            self.inst.write("HEADER 0")            self.inst.write('DATA:SOURCE CH%s'%ch)            self.inst.write("DAT:ENC SRI")   # Signed Binary FORMat, LSB order            self.inst.write("DAT:WIDTH 1")            self.inst.write("DAT:START 1")            recordLength = int(self.inst.query('horizontal:recordlength?'))            self.inst.write("DAT:STOP {0}".format(recordLength)) # Set data stop to match points available            # Fetch horizontal scaling factors            xinc = float(self.inst.query("WFMO:XINCR?"))            xzero = float(self.inst.query("WFMO:XZERO?"))            pt_off = int(self.inst.query("WFMO:PT_OFF?"))            # Fetch vertical scaling factors            ymult = float(self.inst.query("WFMO:YMULT?"))            yzero = float(self.inst.query("WFMO:YZERO?"))            yoff = float(self.inst.query("WFMO:YOFF?"))            # Fetch waveform data and save as csv file            rawData = self.inst.query_binary_values('curve?', datatype='b', container=np.array)                   dataLen = len(rawData)            t0 = (-pt_off * xinc) + xzerowith open('horizonal_vector.csv',mode='w') as file:                for i in range(0,dataLen):                    xvalues = t0 + xinc * i # Create timestamp for the data point                    file.write(str(xvalues))                    file.write(",")                     yvalues= float(rawData[i] - yoff) * ymult + yzero # Convert raw ADC value into a floating point value                    file.write(str(yvalues))                    file.write("\n")                    # plotting the measurement figure            data = pd.read_csv("horizonal_vector.csv")            data_x = data.iloc[:,0]            data_y = data.iloc[:,1]            plt.plot(data_x, data_y)            plt.title('channel 1') # plot label            plt.xlabel('time (seconds)') # x label            plt.ylabel('voltage (volts)') # y label            print("look for plot window...")            plt.savefig('test.png')     #save test picture            plt.show()                       def close(self):            self.inst.close()            self.rm.close()            def get_screen(self):            self.inst.write("HARDCopy:PORT FILE;")            self.inst.write("EXPort:FORMat PNG")            self.inst.write("HARDCopy:FILEName \"C:\\est_Temp\\Temp.png\"")            self.inst.write("HARDCopy STARt")            self.inst.write("FILESystem:READFile \"C:\\Low_Speed_Test_Temp\\Temp.png\"")            imgData = self.inst.read_raw()            dt = datetime.now()            fileName = dt.strftime("DPO70000_%Y%m%d_%H%M%S.png") # Generate a filename with date and time            file = open(fileName, "wb")            file.write(imgData)            file.close()            self.inst.write('FILESystem:DELEte \"C:\\Test_Temp\\Temp.png\"') # Delete image file from instrument's hard disk.            if __name__ == "__main__":        my=Tektronix_DPO()    my.set_HORIZONTAL(0,40E-3)    my.open_ch(1)    my.vertical_ch(1,200,0)    my.trigger_set(1,0)    my.begin_trigger()    my.data_caul(1)    my.get_screen()    my.close()

参考

【1】TEK DPO系列示波器编程手册
【2】PyVISA官方文档
【3】TEK 技术交流论坛

来源地址:https://blog.csdn.net/qq_27655845/article/details/129602483

--结束END--

本文标题: PyVISA使用——用python控制TEK示波器源码实现

本文链接: https://lsjlt.com/news/400437.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PyVISA使用——用python控制TEK示波器源码实现
    项目要求 项目上提出自动化测试需求,要求能够对板级信号使用示波器等仪器做自动化测量 实现方案 使用PyVISA 方案实现。 VISA (Virtual Instrument Software Arch...
    99+
    2023-09-08
    python 开发语言
  • 如何使用C#实现串口示波器
    这篇文章主要为大家展示了“如何使用C#实现串口示波器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C#实现串口示波器”这篇文章吧。具体内容如下开发工具visual studio2019C...
    99+
    2023-06-29
  • Python使用captcha制作验证码的实现示例
    目录1 生成单张验证码图片并显示2 验证码图片的显示与保存3 批量生成验证码样本集在使用Keras搭建验证码识别模型时,需要大量的验证码图片。在这里,使用captcha模块生成验证码...
    99+
    2024-04-02
  • 如何使用Python实现控制摄像头
    这篇文章主要介绍“如何使用Python实现控制摄像头”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Python实现控制摄像头”文章能帮助大家解决问题。第一部分:环境搭建在使用 Python ...
    99+
    2023-07-05
  • SpringMVC编程使用Controller接口实现控制器实例代码
    Controller简介Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分:收集、验证请求参数并绑定到命令对象;将命令对象交给业务对象,由业务对象处理并返回模型数据;返回ModelAndVi...
    99+
    2023-05-30
    springmvc controller 控制器
  • 使用Python实现管理系统附源码
    目录0. 前言1. 题目要求2. 要求分析3.效果展示3.1 主界面3.2 注册界面3.3 管理员3.3.1 管理员登陆界面3.3.2 管理员——疫苗信息管理...
    99+
    2024-04-02
  • Python编程使用PyQt5库实现动态水波进度条示例
    目录原理介绍代码实操最近做了一个小项目,里面有一个需求需要添加一个动态进度条,进度条的样式就类似于水波来回起伏的那种形状,下面就是最初的展示效果(有一点区别,这里我加了一个进度自动增...
    99+
    2024-04-02
  • 使用Python实现tail的示例代码
    目录前记1.第一版--从文件尾部读取实时数据2.第二版--实现tail -f3.第三版--优雅的读取输出日志文件前记 tail是一个常用的Linux命令, 它可以打印文件的后面n行数...
    99+
    2023-03-01
    Python实现tail Python tail
  • 使用Python轻松实现绘制词云图项目(附详细源码)
    目录项目背景项目实操一、一般词云绘制二、根据词频绘制词云结 语项目背景 虽然现在已经有很多现成的制作词云图的工具了,但一般存在以下几个问题: 问题一:工具太多,眼花缭乱,质量参差不齐...
    99+
    2024-04-02
  • 用Python实现控制电脑鼠标
    目录一、序言二、配置环境二、鼠标控制1、获取鼠标位置函数以及测试源码2、控制鼠标左击/右击/双击函数以及测试源码3、控制鼠标移动/拖动4、控制鼠标滚轮滚动总结一、序言 使用pytho...
    99+
    2024-04-02
  • 怎么使用python实现斐波那契数列
    这篇文章主要介绍“怎么使用python实现斐波那契数列”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用python实现斐波那契数列”文章能帮助大家解决问题。斐波那契数列(Fibonacci s...
    99+
    2023-06-27
  • 用Python实现局域网控制电脑
    程序分为两部分,一个是客户端也是被操控的端口,另一个是服务端就是用来操作被操控的端口 程序很简单,是通过局域网聊天系统改造而成,没有高级的GUI框架,只有简简单单的DOS窗口,这个仅...
    99+
    2024-04-02
  • 使用Python简单的实现树莓派的WEB控制
    先给大家展示下效果如图,感觉还很满意请继续阅读全文: 用到的知识:Python Bottle HTML Javascript JQuery Bootstrap AJAX 当然还有 linux 我去,这...
    99+
    2022-06-04
    简单 Python WEB
  • 使用Python实现控制摄像头的方法详解
    目录前言第一部分:环境搭建步骤一:安装 Python步骤二:安装 OpenCV步骤三:连接摄像头第二部分:摄像头基本操作1. 捕获视频帧2.保存视频总结前言 当今,随着计算机技术的发...
    99+
    2023-03-10
    Python实现控制摄像头 Python控制摄像头 Python 摄像头
  • 含源码,用Python实现浪漫烟花
    目录 前言 环境准备 代码编写 效果展示 前言 Python实现浪漫的烟花特效 现在很多地方都不能放烟花了,既然看不到, 那作为程序猿的我们还不能自己用代码做一个吗? 今天就带大家用代码做一个烟花特效吧。 环境准备 这里使用到的...
    99+
    2023-09-12
    python pandas
  • 使用vue-router实现动态权限控制的示例分析
    这篇文章将为大家详细讲解有关使用vue-router实现动态权限控制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用vue开发带权限管理系统,尤其是采用了vu...
    99+
    2024-04-02
  • 使用clientgo实现自定义控制器的方法
    目录介绍具体实现测试介绍 我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePor...
    99+
    2024-04-02
  • C#wpf使用ListBox实现尺子控件的示例代码
    目录前言一、如何实现?1、设置横向ListBox2、Item设为刻度样式3、绑定数据源二、完整代码三、效果预览总结前言 尺子在客户端开发中有一定的应用场景,比如厘米尺、白板的画线尺、...
    99+
    2024-04-02
  • go语言使用Chromedp实现二维码登陆教程示例源码
    目录1 Chromedp是什么2 为什么不使用Selenium3 文章解决了什么需求4.如何使用chromedp进行二维码登陆4.1 安装chromedp4.2 尝试打开网站4.3 ...
    99+
    2024-04-02
  • 使用Spring.Net如何实现控制反转IoC
    今天就跟大家聊聊有关使用Spring.Net如何实现控制反转IoC,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring.Net包括控制反转(IoC) 和面向切面(AOP)一、首...
    99+
    2023-05-31
    spring.net ioc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作