Python的扩展接口[0] -> VISA仪器控制

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(),具体使用哪一种需要根据每种仪器的通信协议命令集查询命令的属性,为写/读/读写等。有了接口函数就可以利用对应的命令集进行命令的发送。而具体的命令则可以通过相应的仪器手册进行查询。
 1 import visa
 2
 3 visa_dll = ‘c:/windows/system32/visa32.dll‘
 4 tcp_addr = ‘TCPIP::192.168.1.1::inst0::INSTR‘
 5 gpib_addr = ‘GPIB0::12::INSTR‘
 6
 7 # Create an object of visa_dll
 8 rm = visa.ResourceManager(visa_dll)
 9
10 # Create an instance of certain interface(GPIB and TCPIP)
11 tcp_inst = rm.open_resource(tcp_addr)
12 gpib_inst = rm.open_resource(gpib_addr)
13
14 # Command ‘*IDN?‘ can fetch instrument info
15 # Using write()/read()/query() function to make communication with device
16 # according to the command type
17 print(tcp_inst.query(‘*IDN?‘))
18 print(gpib_inst.query(‘*IDN?‘))

4 PyVISA应用实例

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

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

4.1 安捷伦E5071C (TCP/IP)

 1 import visa
 2
 3 class E50X():
 4     def __init__(self, ip, visaDLL=None, *args):
 5         self.ip = ip
 6         self.visaDLL = ‘c:/windows/system32/visa32.dll‘ if visaDLL is None else visaDLL
 7         self.address = ‘TCPIP::%s::inst0::INSTR‘ % self.ip
 8         self.resourceManager = visa.ResourceManager(self.visaDLL)
 9
10     def open(self):
11         self.instance = self.resourceManager.open_resource(self.address)
12         self.instance.write(‘MMEM:STOR:SNP:FORM DB‘)
13
14     def close(self):
15         if self.instance is not None:
16             self.instance.close()
17             self.instance = None
18
19     def create_dir(self, path):
20         print(‘MMEM:MDIR "%s"‘ % path)
21         self.instance.write(‘MMEM:MDIR "%s"‘ % path)
22
23     def recall_sta(self, filename):
24         print(‘MMEM:LOAD "%s"‘ % filename)
25         self.instance.write(‘MMEM:LOAD "%s"‘ % filename)
26         # Time sleep in case of sta load uncompleted
27         time.sleep(0.5)
28
29     def wind_act(self, wind):
30         self.instance.write(‘DISP:WIND%d:ACT‘ % wind)
31
32     def wind_max(self, wind):
33         self.instance.write(‘DISP:MAX %s‘ % wind)
34
35     def trigger(self, status):
36         cmdList = {‘hold‘: ‘OFF‘, ‘continuous‘: ‘ON‘}
37         self.instance.write(‘INIT1:CONT %s‘ % cmdList[status])
38
39     def save_snp(self, name, n=2):
40         print(‘MMEM:STOR:SNP "%s.s%dp"‘ % (name, n))
41         self.instance.write(‘MMEM:STOR:SNP "%s.s%dp"‘ % (name, n))
42
43     def save_image(self, imagname, fmt):
44         assert fmt in [‘jpg‘, ‘png‘], ‘Invalid postfix of image‘
45         print(‘MMEM:STOR:IMAG "%s.%s"‘ % (imagname, fmt))
46         self.instance.write(‘MMEM:STOR:IMAG "%s.%s"‘ % (imagname, fmt))
47
48     def reset(self):
49         self.instance.write(‘*RST‘)
50
51     def read_idn(self):
52         idn = self.instance.query(‘*IDN?‘)
53         print(idn)
54         return idn
55
56     def read_data(self, wind=1, trac=1, axis=‘x‘):
57         posi = {‘x‘: ‘XAX?‘, ‘y‘: ‘FDAT?‘}
58         data = self.instance.query(‘CALC%d:TRAC%d:DATA:%s‘ % (wind, trac, posi[axis]))
59         return eval(data)
60
61     def tran_file(self):
62         re = self.instance.query(":MMEM:TRAN? ‘D:\\22.S2P‘")
63         with open("x.S2P", ‘w‘) as f:
64             f.write(re)
65         print(type(re))
66
67 if __name__ == ‘__main__‘:
68     e50 = E50X(‘192.168.1.17‘)
69     e50.open()
70     e50.read_idn()
71     e50.tran_file()
72     e50.close()

4.2 安捷伦C34970A (GPIB)

 1 import visa
 2
 3 class A34X():
 4     def __init__(self):
 5         self.address = ‘GPIB0::8::INSTR‘
 6         self.visaDll = ‘c:/windows/system32/visa32.dll‘
 7         self.resourceManager = visa.resourceManager(self.visaDll)
 8     def open(self):
 9         self.instance = resourceManager.open_resource(self.address)
10         self.idn = self.instance.query(‘*IDN?‘)
11         print(self.idn)
12
13     def reset(self):
14         self.instance.write(‘*RST‘)
15
16     def set_dc(self):
17         self.instance.write(‘CONF:CURR:DC AUTO, (@119, 120)‘)

参考链接



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

原文地址:https://www.cnblogs.com/stacklike/p/8278876.html

时间: 2024-11-06 09:42:59

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

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

动态链接库 / Dynamic Link Library 目录 动态链接库简介 函数封装DLL 组件对象模型COM 如何判断.dll文件是COM还是DLL 辅助工具 1 动态链接库简介 / DLL Introduction 动态链接库(Dynamic Link Library, DLL),是微软在Windows操作系统中,实现共享函数库概念的一种方式,在Windows下,这些库函数的扩展名可以是.dll/.ocx(ActiveX)/.drv(旧式系统驱动程序),在Linux系统中常常是.so文件

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

串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为一位一位地顺序传送,通信线路简单,一对传输线即可实现双向通信,适用于远距离且传输速度慢的通信.其中最常用的也是标准接口为RS-232,除此之外还有RS-422,RS-485等. 2 pyserial环境搭建 Pyserial的安装可以通过pip进行,直接在命令行输入下列命令进行安装, pip ins

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

Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab的官方文档中介绍了Matlab与其余编程语言之间的引擎接口,其中包括对于Python开放的引擎API,可参考官方教程,其中包括引擎安装,基本使用,以及Python与Matlab之间的数据类型转换及交互. 除了使用官网的Matlab引擎来驱动Matlab外,还可以使用第三方包mlab来进行连接或直接使

hive里的扩展接口

hive里的扩展接口,主要包括CLI(控制命令行接口).Beeline和JDBC等方式访问Hive. CLI和Beeline都是交互式用户接口,并且功能相似,但是语法和实现不同. JDBC是一种类似于编程访问关系型数据库的编程接口. 1.CLI 在UNIX shell环境下输入hive命令可以启用Hive CLI.在CLI下,所有的Hive语句都以分号结束. 在CLI下可以对一些属性做出设置,像是设置底层MapReduce任务中Reducer的实例数.这些信息都详细地记录在在线Hive语言手册中

IoC实践--用Autofac实现MVC5.0的IoC控制反转方法

Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.下面我就用Autofac实现ASP.NET mvc5.0的IOC控制反转的方法.这里用到是vs2013,Autofac ASP.NET MVC 5 Integration和mvc 5.0.Autofac ASP.N

Spring8:一些常用的Spring Bean扩展接口

前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP----开闭原则,即: 1.保证对修改关闭,即外部无法修改Spring整个运作的流程 2.提供对扩展开放,即可以通过继承.实现Spring提供的众多抽象类与接口来改变类加载的行为 开卷有益,阅读Spring源码(无需每个类都看得很细,大体流程能梳理出来即可)对于个人水平的提升是帮助非常大

在python中扩展c语言模块

有一个以前写的c语言代码,我想把它用在python程序中.我先是看了<python基础教程>一书中的方法,书中说可以用swig加python内置distutils模块的方法来实现.我照着书上的步骤试了试,结果在导入模块的时候总是提示"ImportError: dynamic module does not define init function (initprintf)".起初我以为是so文件没有放对位置.但是我试着在目录中建立了一个简单的python模块,然后再导入,发

windows 下 使用codeblocks 实现C语言对python的扩展

本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展很感兴趣,刚好看到了Extending and Embedding the Python Interpreter文档,看的是最低版本(由于工作中用的是2.x, ̄□ ̄),官方文档 链接:http://docs.python.org/2.6/extending/index.html 我使用的IDE是Co

hibernate核心接口,和扩展接口。回顾笔记,以前没记,现在补上,纯手工敲的。

hibernate核心接口: 所有的hibernate应用都会访问hibernate的5个核心接口 1,Configuration接口 Configuration用于配置并且根启动Hibernate.Hibernate应用通过Configuration实例来获取对象-关系映射文件中的元数据,以及动态配置Hibernate的属性,然后创建SessionFactory实例. 2,SessionFactory接口 一个SessionFactory实例对应一个数据存储源,应用从SessionFactor