VISA仪器控制 / VISA Instrument Control


1 VISA简介 / VISA Introduction

VISA(Virtual Instrument Software Architecture,简称为VISA),即虚拟仪器软件结构,是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称。VISA提供用于仪器编程的标准I/O函数库,称为VISA。VISA函数库驻留在计算机系统内,是计算机与仪器的标准软件通信接口,计算机通过它来控制仪器。

作为通用I/O标准,VISA提供了统一的设备资源管理、操作和使用机制,它独立于硬件设备、接口、操作系统和编程语言,具有与硬件结构无关的特点。VISA的这一特性使之适用于各种仪器接口,无论仪器使用的串口还是其他任何一种总线,诸如GPIB、VXI、PXI和LXI等,都具有相同的操作函数,从而实现了控制操作上的统一。Visa基于自底向上的结构模型,创造了一个统一形式的I/O控制函数集。一方面,对初学者或是简单任务的设计者来说,Visa提供了简单易用的控制函数集,在应用形式上相当简单;另一方面,对复杂系统的组建者来说,Visa提供了非常强大的仪器控制功能与资源管理。

2 PyVISA / PyVISA Library

PyVISA是Python的一个包,使Python能够独立于接口(如GPIB,RS232,USB,Ethernet)控制各种测量设备。PyVISA极大的简化了对仪器的控制方式,仅仅需要几行代码即可以实现对仪器的操作。

2 PyVISA环境搭建

需要利用Python实现对仪器的控制,首先需要对环境进行相应的配置,基本在于以下几点,

1. 确保系统中有visa32.dll文件的存在;

2. 安装相应的仪器驱动软件;

3. 安装pyvisa包。

其中,visa32.dll文件一般存放的位置在c:/windows/system32/visa32.dll,而仪器的驱动可到相应官网进行下载,而pyvisa包则可以使用pip进行安装,

pip install pyvsia 

3 PyVISA基本用法

下面介绍一下pyvisa用于仪器控制的基本使用方式,十分简单,详细的使用方式可以参考官方说明

  1. 首先导入visa模块,定义一些基本信息,包括visadll的位置,以及仪器控制方式及其信息,如TCP/IP的IP地址,GPIB的端口号信息等,按照指定格式进行填充。
  2. 接着利用visadll文件创建一个visa的实例对象,有了这个实例对象就可以连接仪器。利用创建的visa对象生成连接实例,此处以GPIB和TCPIP为例。
  3. 利用连接实例就可以开始与仪器进行通信了,通信的接口函数主要有以下3种,write() /read() /query(),具体使用哪一种需要根据每种仪器的通信协议命令集查询命令的属性,为写/读/读写等。有了接口函数就可以利用对应的命令集进行命令的发送。而具体的命令则可以通过相应的仪器手册进行查询。
 import visa

 visa_dll = 'c:/windows/system32/visa32.dll'
tcp_addr = 'TCPIP::192.168.1.1::inst0::INSTR'
gpib_addr = 'GPIB0::12::INSTR' # Create an object of visa_dll
rm = visa.ResourceManager(visa_dll) # Create an instance of certain interface(GPIB and TCPIP)
tcp_inst = rm.open_resource(tcp_addr)
gpib_inst = rm.open_resource(gpib_addr) # Command '*IDN?' can fetch instrument info
# Using write()/read()/query() function to make communication with device
# according to the command type
print(tcp_inst.query('*IDN?'))
print(gpib_inst.query('*IDN?'))

4 PyVISA应用实例

下面是一些在使用pyvisa进行仪器控制时编写的基本使用实例,可作为使用参考。

Note: 实例中仅仅是实现了一部分需求,若需要完成更多的命令需求,可以参考手册文件。

4.1 安捷伦E5071C (TCP/IP)

 import visa

 class E50X():
def __init__(self, ip, visaDLL=None, *args):
self.ip = ip
self.visaDLL = 'c:/windows/system32/visa32.dll' if visaDLL is None else visaDLL
self.address = 'TCPIP::%s::inst0::INSTR' % self.ip
self.resourceManager = visa.ResourceManager(self.visaDLL) def open(self):
self.instance = self.resourceManager.open_resource(self.address)
self.instance.write('MMEM:STOR:SNP:FORM DB') def close(self):
if self.instance is not None:
self.instance.close()
self.instance = None def create_dir(self, path):
print('MMEM:MDIR "%s"' % path)
self.instance.write('MMEM:MDIR "%s"' % path) def recall_sta(self, filename):
print('MMEM:LOAD "%s"' % filename)
self.instance.write('MMEM:LOAD "%s"' % filename)
# Time sleep in case of sta load uncompleted
time.sleep(0.5) def wind_act(self, wind):
self.instance.write('DISP:WIND%d:ACT' % wind) def wind_max(self, wind):
self.instance.write('DISP:MAX %s' % wind) def trigger(self, status):
cmdList = {'hold': 'OFF', 'continuous': 'ON'}
self.instance.write('INIT1:CONT %s' % cmdList[status]) def save_snp(self, name, n=2):
print('MMEM:STOR:SNP "%s.s%dp"' % (name, n))
self.instance.write('MMEM:STOR:SNP "%s.s%dp"' % (name, n)) def save_image(self, imagname, fmt):
assert fmt in ['jpg', 'png'], 'Invalid postfix of image'
print('MMEM:STOR:IMAG "%s.%s"' % (imagname, fmt))
self.instance.write('MMEM:STOR:IMAG "%s.%s"' % (imagname, fmt)) def reset(self):
self.instance.write('*RST') def read_idn(self):
idn = self.instance.query('*IDN?')
print(idn)
return idn def read_data(self, wind=1, trac=1, axis='x'):
posi = {'x': 'XAX?', 'y': 'FDAT?'}
data = self.instance.query('CALC%d:TRAC%d:DATA:%s' % (wind, trac, posi[axis]))
return eval(data) def tran_file(self):
re = self.instance.query(":MMEM:TRAN? 'D:\\22.S2P'")
with open("x.S2P", 'w') as f:
f.write(re)
print(type(re)) if __name__ == '__main__':
e50 = E50X('192.168.1.17')
e50.open()
e50.read_idn()
e50.tran_file()
e50.close()

4.2 安捷伦C34970A (GPIB)

 import visa

 class A34X():
def __init__(self):
self.address = 'GPIB0::8::INSTR'
self.visaDll = 'c:/windows/system32/visa32.dll'
self.resourceManager = visa.resourceManager(self.visaDll)
def open(self):
self.instance = resourceManager.open_resource(self.address)
self.idn = self.instance.query('*IDN?')
print(self.idn) def reset(self):
self.instance.write('*RST') def set_dc(self):
self.instance.write('CONF:CURR:DC AUTO, (@119, 120)')

参考链接


http://pyvisa.readthedocs.io/en/stable/

Python的扩展接口[0] -> VISA仪器控制的更多相关文章

  1. Python的扩展接口[2] -> 动态链接库DLL[0] -> 动态链接库及辅助工具

    动态链接库 / Dynamic Link Library 目录 动态链接库简介 函数封装DLL 组件对象模型COM 如何判断.dll文件是COM还是DLL 辅助工具 1 动态链接库简介 / DLL I ...

  2. Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序

    Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...

  3. Python的扩展接口[1] -> 串口通信

    串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为 ...

  4. Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用

    组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...

  5. 纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例

    查看完整文章点击原文链接:纯python自研接口自动化脚本更新版本,让小白也能实现0到1万+的接口自动化用例 你是否还在用postman\jmeter做接口自动化吗?用python的开源框架[unit ...

  6. 手把手教你 LabVIEW 串口仪器控制——VISA 驱动下载安装篇

           仪器控制,核心在于 VISA 函数..有些仪器可能不需要 VISA,有自己的 DLL 什么的,我就管不着.        正常情况下,大家安装的 LabVIEW,都是不带 VISA 驱动 ...

  7. Python科学测量与计算库Pymeasure: 控制你的仪器进行自动测试和科学计算

    Python这种脚本语言因其语法简单,工具包丰富成熟,使用起来非常方便.在很多领域被广泛使用,今天介绍的是python在仪器控制应用领域,python在仪器控制领域相关的书籍可以参考<真实世界的 ...

  8. 基于Arduino和python的串口通信和上位机控制

    引言 经常的时候我们要实现两个代码之间的通信,比如说两个不同不同人写的代码要对接,例如将python指令控制Arduino控件的开关,此处使用串口通信是非常方便的,下面笔者将结合自己踩过的坑来讲述下自 ...

  9. USB仪器控制教程

    概观 本教程是为出发点使用NI-VISA与USB设备进行通信.它不打算作为一个起点,学习USB构架或USB通讯中使用的各种协议.阅读本教程后,您应该能够安装一个USB设备,并使用NI-VISA与该设备 ...

随机推荐

  1. selenium初识(一)

    Selenium是一个开源的便携式的自动化软件测试工具,用于测试web应用程序.有能力在不同浏览器和操作系统运行.它是一套工具,帮助我们有效地给予web应用程序的自动化. Selenium分为以下几个 ...

  2. 不吹不擂,你想要的Python面试都在这里了【315+道题】+精心整理的解答

    Part01-Py基础篇(80) Part02-网络编程和并发(34) Part03-数据库和缓存(46) Part04-前端框架和其他(155) Part01-Py基础篇(80) 1.为什么学习Py ...

  3. (原) Unreal搬山-引言(图多慎)

    @author:白袍小道 扯淡:(图多) 何为搬山,这里借了剑来少年郎一句.(若有同道中人,甚是开心,开心的很) 江湖岂能没前辈) (江湖很大,足够你浪) (刺客信条 \荒野 \神秘海域 \死亡空间 ...

  4. git使用及一些配置、问题

    安装https://git-for-windows.github.io/ 一.绑定用户名.邮件地址 git config --global user.name "Your Name" ...

  5. 爬虫:Scrapy14 - Telnet 终端(Telnet Console)

    Scrapy 提供了内置的 Telnet 终端,以供检查,控制 Scrapy 运行的进程.Telnet 仅仅是一个运行在 Scrapy 进程中的普通 Python 终端.因此你可以在其中做任何是. T ...

  6. 第三节 MVC应用程序架构和测试

    在查看如何测试单个功能之后,您可能会问,整个Web应用程序如何? 如前所述,有以下级别的测试: 单元测试 集成测试 功能测试 在开始编写测试时考虑这一点很重要. 可能还有其他类型的测试,但现在让我们关 ...

  7. java 用Arrays.binarySearch解读 快速定位数字范围

    在一些时候,需要用给一个数字找到适合的区间,Arrays.binarySearch可达到这个目的. static int binarySearch(int[] a, int key)          ...

  8. SQL小助手——SQL Prompt

    背景: 当数据库设计的比较复杂.庞大时,我们如果对脚本不是很熟悉,就会很难完成看似简单的增.删.改.查的操作.我们需要一款软件来给出相应的提示或帮助,来提高代码的可读性,更快更好的完成任务. 简介: ...

  9. SqlHelper——数据库小助手

    SqlHelper其实就是一个类. 早就听说过"SqlHelper"这个名词,也查过相关的资料,但还是一头雾水.当真的去实践去用它时,就会发现其实它没那么神秘. 当敲第一个窗体的时 ...

  10. (总结)Nginx与Apache、Tomcat、Resin动静分离核心配置

    PS:近来有几个刚使用nginx的新童鞋老问我,nginx+fastcgi不够稳定,偶尔出现502错误,怎么解决?本人使用nginx也有3年多了,也认为php-fpm模块不够稳定,在访问量不大的时候没 ...