用 Python(PyVISA) 实现仪器自动化

这篇具有很好参考价值的文章主要介绍了用 Python(PyVISA) 实现仪器自动化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文介绍一个远程仪器控制的例子,包含一些 Python 脚本实现自动在示波器上进行简单的测量。

Python 介绍

Python 是免费和开源的,它为核心开发人员提供了责任、庞大的支持基础以及 Python 用户检查和改进其代码库的能力。Python 有很多包用来扩展了 Python 的基本功能。Python 的包可以使用其包管理工具(称为“pip”)添加到Python 安装中。Python 无需许可,可以非常轻松地安装和配置。 而且Python简单易学,语法和结构非常人性化和直观。基于以上优点非常适合用来实现仪器自动化,可以用来替代Labview。

仪器自动化

仪器自动化涉及在计算机上编写脚本或应用程序,通过向其发送 ASCII 消息来控制测试设备。 每个仪器都有自己的一组 ASCII 消息,使用可编程仪器标准命令(或 Standard Commands for Programmable Instruments)协议定义。

SCPI

每个可远程控制的仪器都有一组记录的 SCPI 命令,允许用户使用编程接口而不是使用前面板控件或图形用户界面来控制仪器。在某些情况下,仪器的 SCPI 命令集包含在其用户手册中,但制造商通常会提供独立的程序员手册,其中记录了所有可用的命令。每个支持 SCPI 的仪器都提供一些标准命令,包括 *RST(重置/默认设置)、*ESR? (检查错误状态寄存器),*OPC? (操作完成查询)、*CLS(清除状态寄存器)和*IDN? (身份查询),但大多数命令是仪器特定。

pyVISA

仪器通信通常通过 VISA 标准来实现。 VISA 是虚拟仪器软件架构,它是测试设备和控制计算机之间通信的标准化机制。 PyVISA 是支持“虚拟仪器软件架构”(VISA) 的 Python 包,以便通过 GPIB、RS232、以太网或 USB 控制测量设备和测试设备。PyVISA 还包括有用的自定义功能、广泛的文档和有用的示例。

可以使用多种硬件接口与仪器进行通信,包括 USB、串行 (RS-232)、GPIB 和以太网,但 VISA 将其抽象化,并允许用户以相同的方式与设备交互,而不管使用的物理硬件如何 与测试设备连接。

代码示例准备

在使用 PyVISA 控制仪器之前,必须配置 VISA 应用程序,并且必须将仪器添加到 VISA 资源列表中。这通常使用制造商特定的 VISA 应用程序(例如 Keysight IO Libraries)来完成。如果使用TCP/IP通信方法,局域网上的大多数仪器都会在 Keysight IO Libraries 中自动发现,将新仪器添加到资源列表中,就从发现的仪器列表中选择它。VISA也可以通过COM(ASRL?),USB(USB0), PXI(PXI10) (PCI eXtensions for Instrumentation)来连接仪器。

代码示例

该脚本将设置示波器、提取波形数据并绘制它。

仪器控制脚本包括以下步骤:

- 导入所需的Python包

- 连接仪器

- 定义重要的功能函数

- 发送命令并获取数据

- 处理和可视化数据

- 主函数中定义测量变量

通常,Python 脚本中的前几行代码会导入脚本所需的任何 Python 包。 import 语句允许 Python 脚本使用正在导入的包或模块中的任何代码。

​import pyvisa
import matplotlib.pyplot as plt
import time
import numpy as np
import pandas as pd
​

示例文件中的第一行导入 PyVISA 包。 第二行从 matplotlib 包导入 pyplot 模块,并使用“as”关键字为该模块分配一个别名。 这纯粹是为了方便,它允许用户每次想要使用该 Python 模块中的某些内容时编写 plt 而不是 matplotlib.pyplot。numpy库主要用于对多维数组执行计算,会在读取数据时用来临时存放数据。Panda用来对数据进行分析和处理。

与示波器的连接必须使用 PyVISA 软件包。该脚本使用了 PyVISA 的两段代码:ResourceManager 类及其 open_resource 方法。ResourceManager 可以列出所有可用的 VISA 资源,并创建与这些资源的连接。脚本创建了 ResourceManager 类的实例,并将其赋值给变量 resourceManager.

    def __init__(self):
        self.resourceManager = pyvisa.ResourceManager()
        print(self.resourceManager.list_resources())

通过list_resources可以得到示波器的地址,然后可以赋值给address变量中:

    def __init__(self):
        self.address = 'USB0::0x0957::0x0588::CN50301291::INSTR'
        self.resourceManager = pyvisa.ResourceManager()
        # self.resourceManager.list_resources()
        print(self.address)

    def open(self):
        self.instance = self.resourceManager.open_resource(self.address)
        self.idn = self.instance.query('*IDN?')
        print(self.idn)

在open函数中使用了 open_resource 的方法创建了一个通信实例instance。该对象可用于与仪器通信。

最开始是对仪器的初始化,一般情况仪器控制脚本应以 *RST 命令开始。该命令由 SCPI 协议定义,适用于所有测试和测量设备。它将仪器返回到默认配置。*OPC? 是另一个非常有用的同步命令。它会等到前面的命令执行完毕,然后再继续执行脚本。

 def reset(self):
        self.instance.write('*rst')

    def opc(self):
        self.instance.write('*opc')

接下是打开示波器的通道,如下可设置耦合方式和单位:

    def open_ch(self, ch, cplg, unit):
        self.instance.write(':channel1:display OFF')
        self.instance.write(f':channel{ch}:display ON')
        self.instance.write(f':channel{ch}:coupling %s' %cplg)
        self.instance.write(f':channel{ch}:unit %s' %unit)

然后是对示波器的垂直和水平轴的控制,其函数如下,指令根据示波器的编程手册。本示例使用的是 F-字符串。F-strings 在运行时将 运行时用一个值替换放在大括号内的任何表达式。

    def vertical_ch(self, ch, scale, position):
        self.instance.write(f':channel{ch}:scale {scale}')
        self.instance.write(f':channel{ch}:offset {position}')

    def horizontal_ch(self, scale, position):
        self.instance.write(f':timebase:scale {scale}')
        self.instance.write(f':timebase:offset {position}')

示波器的触发设置函数如下:

    def trigger_set(self, ch, mode, level, slope):
        self.instance.write(':trigger:mode %s' % mode)
        self.instance.write(f':trigger:edge:source {ch}')
        self.instance.write(f':trigger:edge:level {level}')
        self.instance.write(':trigger:edge:slope %s' %slope)

接下来是从示波器中读取数据,本例中使用 query_binary_values 方法。根据Aligent DSO1024A的编程手册,Byte格式写和读指令之间需间隔大于200ms。经过调试,在 query_binary_values指令前加time.sleep(2)便可正确运行了。

    def get_waveform(self, ch, mode, format):
        #self.instance.write(':waveform:points 600')
        self.instance.write(':waveform:points:mode %s' %mode)
        self.instance.write(':waveform:format %s' %format)
        self.instance.write(f':waveform:source channel{ch}')
        print(self.instance.query(':waveform:preamble?'))
        time.sleep(2)
        rawData = self.instance.query_binary_values('waveform:DATA?', datatype = 'B', container = np.array, delay = 0.2)
        # Query x and y values to scale the data appropriately for plotting
        xIncrement = float(self.instance.query(':waveform:xIncrement?'))
        xOrigin = float(self.instance.query(':waveform:xOrigin?'))
        xReference = float(self.instance.query(':waveform:xReference?'))
        yIncrement = float(self.instance.query(':waveform:yIncrement?'))
        yReference = float(self.instance.query(':waveform:yReference?'))
        yOrigin = float(self.instance.query(':waveform:yOrigin?'))
        #Save as csv file
        length = len(rawData)
        t0 = -xReference*xIncrement+xOrigin
        with open('data.csv', mode = 'w') as file:
            for i in range(0,length):
               xvalues = t0 + xIncrement*i
               file.write(str(xvalues))
               file.write(",")
               yvalues = float(yReference - rawData[i]) * yIncrement - yOrigin
               file.write(str(yvalues))
               file.write("\n")

        #plotting the measurement data
        data = pd.read_csv('data.csv')
        data_x = data.iloc[:,0]
        data_y = data.iloc[:,1]
        plt.plot(data_x, data_y)
        plt.title('Waveform')
        plt.xlabel('Time (Sec)')
        plt.ylabel('Voltage (V)')
        plt.savefig('test.png')
        plt.show()

在query_binary_values语句之后得到的数据需要通过转换才能得到正确的时间和电压值,然后使用with open ... as file 将数据进行保存,最后使用matplotlib.pyplot进行绘画。

主函数的运行程序如下:

if __name__ == "__main__":
    instr = DSO1024A()
    instr.open()
    instr.reset()
    instr.opc()
    instr.open_ch(2, 'DC', 'VOLTS')
    instr.vertical_ch(2, 1, 0)
    instr.horizontal_ch(1.0e-3, 2.0e-3)
    instr.trigger_set(2, 'EDGE', 2, 'positive')
    instr.get_waveform(2, 'maximum', 'BYTE')

最后得到的示波器数据后绘出信号如下:

pyvisa,PyVISA,自动化,python文章来源地址https://www.toymoban.com/news/detail-773716.html

到了这里,关于用 Python(PyVISA) 实现仪器自动化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现接口自动化

    接口自动化是指通过编写脚本来实现对接户外Web服务的测试和验证,可以提高测试效率、缩短测试周期。以下为Python实现接口自动化的基本步骤: 1. 确定接口地址 首先需要明确需要测试的接口地址,可以使用Python中的requests库向该地址发送get/post请求获取返回结果。 ``` pyth

    2023年04月20日
    浏览(30)
  • python实现办公自动化

    目录 一 python办公自动化所需类库 二 python操作excel文件 三 python自动发送邮件 四 python操作word文件 五 python操作PPT文件 一 python办公自动化所需类库 python操作excel、word、ppt所需库如下, 二 python操作excel文件 三 python自动发送邮件 四 python操作word文件 五 python操作PPT文件

    2024年02月05日
    浏览(39)
  • Python自动化实现抖音自动刷视频

    本文主要介绍了Python自动化实现抖音自动刷视频,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 环境准备 实现 Python3.5以上 Appium Server服务器 Android SDK,需要用到adb服务 需要依赖Appium-Pytho

    2024年02月12日
    浏览(28)
  • 【Python】实现公章自动化生成以及自动盖章效果

    前言:因为工作中需要经常自己盖章到模板图片上然后去打印签名,每次基本都是一个重复循环的过程,遂探索是否可以变成自动化脚本供我提高工作效率,同时在这次编码中我也使用chatgpt帮我实现一些代码,整个功能开发的过程非常快。 patr1: 【实现贴图盖章的功能】 原理

    2024年02月12日
    浏览(51)
  • Python自动化测试实现的思路

    Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步: 1. 确定自动化测试的范围和目标: 首先需要明确需要进行自动化测试的范围和目标,包括测试场景、测试用例、测试数据等。 2. 选择自动化测试工具和框架: 根据测试目

    2024年02月10日
    浏览(26)
  • 使用Python实现产品图片自动化处理

    大家好,在当今的数字化时代,产品图片在电子商务和市场营销中发挥着至关重要的作用。然而,为在线平台准备产品图片可能是一项耗时的任务,本文将分享一个Python脚本,用于自动化产品图片的图像处理工作流程。通过使用 Python Imaging Library(PIL) 和 rembg 库,可以实现删

    2024年02月16日
    浏览(29)
  • Python调用selenium库实现自动化

    以下是一个使用Python实现简单自动化的示例代码,该代码使用selenium库来自动化执行Google搜索并返回搜索结果的标题和URL  简单注释: 导入 selenium 库和 selenium.webdriver.common.keys 模块。 创建一个 WebDriver 对象,指定使用Chrome浏览器。 使用 driver.get() 方法访问Google搜索页面。 使用

    2023年04月11日
    浏览(71)
  • 使用【Python+Appium】实现自动化测试

    一、环境准备 1.脚本语言:Python3.x    IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:SoftwareAndroid_SDKplatform-tools 4.安装Appium for windows,官网地址 Redirecting  点击下载按钮会到GitHub的下载页面,选择对应平台下载   安装完成后,启动Appium,host和port默认的即可,然

    2024年02月08日
    浏览(34)
  • Python+Requests实现接口自动化测试

    一般对于自动化的理解,有两种方式的自动化。 第一,不需要写代码,完全由工具实现,这种方式的工具一般是公司自己研发的,方便黑盒测试人员使用。这种工具的特点是学习成本低,方便使用,但是通用性不强,也就是换了一家公司,就很有可能无法使用之前的工具。

    2024年01月16日
    浏览(59)
  • 基于Python 简易实现接口测试自动化

    目录 实现思路 统筹脚本 请求封装  日志封装 结果比对 结果邮件 用例获取及数据格式化 请求url转换 测试用例excel结构 测试报告 邮件接收结果 资料获取方法 使用excel管理用例用例信息,requests模块发送http请求,实现了记录日志,邮件发送测试报告的功能 目录结构如下: 下

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包