问题描述
最近公司有个项目,需要使用使用高精度的电压表来测量偏执电压,用以校准设备:
- 设备型号
AGILENT 34405A
- 数据手册
软件截图
Instruments Supported by Command Expert
- SCPI Command Sets
Command Set Name | Last updated for Firmware Version | Supported Models |
34405 Digital Multimeters | 1.46_3.11 | 34405A |
原理学习
PyVISA 官网
https://pyvisa.readthedocs.io/en/stable/
PyVISA 基本用法
下面介绍一下pyvisa用于仪器控制的基本使用方式,十分简单,详细的使用方式可以参考官方说明。
首先导入visa模块,定义一些基本信息,包括visadll的位置,以及仪器控制方式及其信息,如TCP/IP的IP地址,GPIB的端口号信息等,按照指定格式进行填充。
接着利用visadll文件创建一个visa的实例对象,有了这个实例对象就可以连接仪器。利用创建的visa对象生成连接实例,此处以GPIB和TCPIP为例。
利用连接实例就可以开始与仪器进行通信了,通信的接口函数主要有以下3种,write() /read() /query(),具体使用哪一种需要根据每种仪器的通信协议命令集查询命令的属性,为写/读/读写等。有了接口函数就可以利用对应的命令集进行命令的发送。而具体的命令则可以通过相应的仪器手册进行查询
PyVISA环境搭建
需要利用Python实现对仪器的控制,首先需要对环境进行相应的配置,基本在于以下几点,
- 确保系统中有visa32.dll文件的存在;
- 安装相应的仪器驱动软件;
- 安装pyvisa包。
其中,visa32.dll文件一般存放的位置在c:/windows/system32/visa32.dll,而仪器的驱动可到相应官网进行下载,而pyvisa包则可以使用pip进行安装,
pip install pyvsia
import visa #这里的visa是pyvisa,因为pyvisa就是python的visa在python里直接写作visa,写做import pyvisa也一样
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?'))
实际代码实现
class ewq_tool(QWidget, Ui_Form):
def __init__(self, parent=None):
super(ewq_tool, self).__init__(parent)
...
# 直接访问地址,防止出现找不到库
self.rm = visa.ResourceManager('c:/windows/system32/visa32.dll')
# 切换页
self.tabWidget.currentChanged.connect(self.slot_small_tab)
self.tabWidget.setCurrentIndex(int(self.setting.dtb["TAB"]["tab_idx"]))
self.slot_small_tab()
def tab1_init(self):
# self.slq_com.setCurrentIndex(com_pos)
# 烧录器串口选择
self.slq_com.clear()
self.uart_scan()
com_pos = self.get_com_pos()
self.slq_com.setCurrentIndex(com_pos)
# 电压表USB选择
self.usbs_dict = OrderedDict()
self.usb_com.clear()
usb_list = self.rm.list_resources()
# print usb_list
idx = 0
for i in usb_list:
self.usb_com.addItem(i)
self.usbs_dict[idx] = i
idx = idx + 1
print self.usbs_dict,len(self.usbs_dict)
usb_pos = self.get_usb_pos()
# print usb_pos
self.usb_com.setCurrentIndex(usb_pos)
def slot_small_tab(self):
tab_idx = self.tabWidget.currentIndex()
self.setting.write_item("TAB", "tab_idx", tab_idx)
if tab_idx == 0:
self.tab0_init()
else:
self.tab1_init()
def open_usb(self):
if self.usb_com_btn.text() == u"打开":
usb_str = str(self.usb_com.currentText())
self.usb_dev = self.rm.open_resource(usb_str)
self.usb_com_btn.setText(u"关闭")
self.usb_led_lab.setPixmap(QPixmap(":/ui/ledblue.png"))
else:
self.usb_dev.close()
self.usb_com_btn.setText(u"打开")
self.usb_led_lab.setPixmap(QPixmap(":/ui/ledgray.png"))
def pwr_measure(self):
if self.usb_dev and self.usb_com_btn.text() == u"关闭":
temp_values = self.usb_dev.query_ascii_values(':MEASure:VOLTage:DC?')
dcVoltage = temp_values[0]
self.dev_pwr_edit.setText(str(dcVoltage))
else:
msg_str = u"请请正常打开设备"
self.set_QMessageBox(msg_str)
实际上是可以完成电压的测量的
后记
开发的软件要想在别的电脑上运行:需要安装这个 NI-VISA 的驱动库
- 下载地址
https://www.ni.com/zh-cn/support/downloads/drivers/download.ni-visa.html#329456