当我不需要开发好用的图形化使用者介面供他人使用时,我开始用Python代替LabVIEW进行基本实验室测量。Python允许以易于阅读的格式保存测量结果,并将结果绘制出来。

作为一名系统和应用工程师,使用LabVIEW等软体进行自动测量,可节省无数个小时。虽然一直用LabVIEW来构建测量应用,但当我不需要开发好用的图形化使用者介面(GUI)供他人使用时,开始用Python代替LabVIEW进行基本实验室测量;且当我只需要快速进行一些测量时,Python允许以易于阅读的格式保存测量结果,并将结果绘制出来。

为了解其中原因,来看看Python的主要优点并讨论Python应用的工作示例。能体验Python的便利性和强大功能的最佳方式是描述一个完整、能工作的Python自动化脚本,例如用来自动测量电压稳压器(voltage regulator;VR)负载调节曲线的方案(负载调节是当输出电流——负载——增加时,对输出电压的变化控制)。

VR分为两类:零压降稳压器和降压稳压器。零压降稳压器具有零输出电阻;输出电压设定值不应随输出电流的增加而变化;相反,降压稳压器被认为具有「负载线(loadline)」,这意味着它们被设计成具有特定的等效输出电阻。本例中使用的稳压器具有1V的零电流输出电压和2.5mΩ的程式设计负载线,图1显示了测试设置。

图1 被测VR连接到电子负载,而DAQ系统透过分流电阻测量输出电流。

使用Chroma 63201电子负载施加负载电流(VR输出电流),透过撷取校准的4mΩ分流电阻上的电压来测量输出电流。使用是德科技(Keysight Technologies)34970A资料撷取系统(DAQ)撷取电压和电流,DAQ和电子负载利用GPIB链路与电脑通讯。测量的目标是验证输出电压是否在一系列输出电流范围内都满足规范指标,图2显示了该应用流程图。

图2 该应用设置电子负载、测量VR输出电压和电流,并保存结果。

接下来将详细介绍这些用于测量的程式码。

以下可以看到自动化脚本程式码清单的第一部分。在Python中,#后的部分为注释内容:

import numpy as np # 1

import pandas as pd # 2

import visa, time # 3

chroma = visa.instrument('GPIB::2') # 4

daq = visa.instrument('GPIB::9') # 5

results = pd.DataFrame() # 6

loads = np.arange(0,20+2,2) # 7

for load in loads: # 8

#Measure the current and the voltage

#Save the results

第1行到第3行导入在后面将会用到的方法库:

•Numpy是用于科学运算的套装软体。在此示例中,Numpy用于生成输出电流值的阵列;

•Pandas(用于资料处理和分析的库)创建了一个非常强大的资料结构来储存测量结果;

•Visa是用来控制仪器的PyVISA库;

•Time是一个方便的库,用其产生一定时间延迟。

请注意,导入的Numpy和Pandas库已重新命名为np和pd以保持程式码的整齐。本文提到的所有库或现有的Python版本中已有,或可从线上资料库轻松安装。

第4到第5行创建了将用于访问Chroma电子负载和是德科技DAQ的物件。这就是PyVISA派上用场的地方:需要做的就是调用仪器(instrument)方法并提供一个字串来指示汇流排上仪器的GPIB位址。

第6行创建结果(results)资料帧以储存测量结果。资料帧是二维标记资料结构,具有资料类型可能不同的列,使用资料帧而不是阵列将允许使用易于记忆的字串而不是数位引用列,并在资料本身中混合数位和文本。

第7行创建一个0~20的实数阵列,步长为2。这些数字将代表要测量VOUT的输出电流值(以安培为单位)。

第8行用于构造「for」回圈。请注意,语法很容易理解:每次执行回圈时,都会生成一个名为负载(load)的变数,其值等于loads阵列的新元素。当使用了阵列的所有元素时,回圈结束。有趣的是,要强调Python如何使用缩进来定义程式码层次结构,而不依赖于任何类型的括弧,这非常有用,因为它使程式码保持清晰并容易阅读。

现在已经定义了主要的for回圈,需要与仪器通讯以程式设计电流,然后读取电压并保存结果。

看程式码的第二部分:

for load in loads: # 8

chroma.write('CURR:STAT:L1 %.2f' % load) # 9

chroma.write('LOAD ON') # 10

time.sleep(1) # 11

temp = {} # 12

daq.write('MEAS:VOLT:DC? AUTO,DEF,(@101)')# 13

temp['Vout'] = float(daq.read()) # 14

daq.write('MEAS:VOLT:DC? AUTO,DEF,(@102)') # 15

temp['Iout'] = float(daq.read())/0.004 # 16

results = results.append(temp, ignore_index =True) # 17

print "%.2fA\t%.3fV" % (temp['Iout'],temp ['Vout']) # 18

chroma.write('LOAD OFF') # 19

results.to_csv('Results.csv') # 20

第9到10行配置所需的负载电流并打开负载。透过GPIB与仪器进行通讯的关键在于使用读/写方法并了解仪器接受的命令串,如仪器手册中所示。与其他程式设计语言类似,%.2f是预留位置,在运作时替换为负载变数的内容,它还表示我们希望资料表示为带有两位小数的实数。第11行产生1秒延迟,有助于确保仪器和电路达到稳态条件。

第12行生成一个空物件(在Python中称为字典),用它来临时储存回圈的一次反覆运算结果。第13至16行用于测量输出电压和电流。第一个命令告诉仪器想要做什么(用自动标度测量直流电压)和所需的采集通道。分别在通道101和102上撷取输出电压和电流。第二个命令读回结果并将其储存到暂存档案夹(temp)中,资料以字串形式返回,因此必须使用浮点(float)函数将其转换为实数。此外,由于DAQ测量的是电压,因此需要将读数除以分流电阻(0.004Ω)以获得正确的电流值。

使用Python和Pandas以有组织的方式保存资料相当容易:temp字典的栏位不需要事先定义,而是使用有意义的字串进行访问。没有必要记住列号和资料之间的关系,但如果决定使用阵列来储存资料,就必须记住这些。

在第17行,将字典附加到结果(results)资料帧。请注意,结果也不需要初始化;每次添加新行时,任何新栏位都将添加到资料帧中。

第18行是可选的,但在终端上列印当前电压和电流是有用的,特别是对于长时间测量,可作为确保应用是否仍在运作并了解已测试多长时间的一种方式。在第19行和20行,关闭负载并将资料保存在磁片上,对于后者,每个资料帧物件都有一个方便的嵌入方法,用于将资料保存在CSV档中。

要探索使用Python和Pandas资料帧的强大功能,只需在第16行和第17行之间添加此程式码即可。

temp['Vout_id'] = 1.0 - 2.5e-3*temp['Iout'] # A

temp['Vout_err'] = temp['Vout_id'] - temp['Vout'] # B

temp['Pass'] = 'Yes' # C

if (abs(temp['Vout_err']) > temp['Vout_id'] *0.001): # D

temp['Pass'] = 'No' # E

A行和B行生成资料帧的两个新栏位。在给定测得电流和理想零电流设定值(1V)和负载线的条件下,Vout_id包含输出电压的理想直流设定值;Vout_err则是理想电压和测得电压之间的绝对误差。

D行和E行将Pass栏位(field)添加到数据帧。该栏位的内容是一个字串,表示是否满足输出电压精准度±0.1%的假设规范。在图3中,可以看到保存的CSV档在Excel中呈现的状况,它酷极了:数值资料和文本在同一个表中,甚至列标题也是从资料帧栏位的名称自动生成。

图3 Python脚本可以CSV格式保存资料,并可在Excel中轻松打开。

上述描述的程式码片段允许我们确定输出电压是否在其理想值附近的「容差带」内。我们可能想要从这个实验中得到的另一个有趣资讯是负载线的确切值,即VOUT-vs-IOUT曲线的斜率。如果不记得如何对撷取的资料进行线性拟合,不要担心,因为Python也有此功能,只需在脚本末尾插入下列程式码:

from scipy.stats import linregress # A

loadline = linregress(results['Iout'], results['Vout']) # B

print "The loadline is %.2f mohm" % (loadline[0]*1000) # C

print "The intercept point is %.3f V" % loadline[1] # D

A行从Scipy的统计(Stats)模组导入一种单一方法。在B行中,使用试图拟合点的X和Y座标来为导入的linregress方法提供馈送。最后,在C和D行的终端上列印结果。Linregress返回组织在阵列中的几个结果,斜率保存在索引0处,截距点(intercept point)保存在索引1处,其他可用资讯是相关系数和标准误差估计数。

就这么小的资料集(20点)来说,可使用Excel生成绘图。一个三行示例显示了如何在Python中完成它:只需在前面描述的脚本末尾添加三行程式码,绘图(plot)方法的ro参数表示我想使用红色圆圈标记:

import matplotlib.pyplot as plt # A

plt.plot(results['Iout'],results['Vout'], 'ro') # B

plt.show() # C

Pyplot是Python的Matplotlib库的一个模组,它包含大量绘制图形的方法。更棒的是,这些方法设计得几乎与MATLAB相同。可以在图4中看到这三行程式码的结果,视窗和图形由Pyplot自动生成,它们在终端视窗中像是「横空出世」。

图4 Pyplot可以直接绘制资料,无需在Excel中打开。

Python是自动化实验室设置的极佳选择,可以避免繁琐的测量时间,因为它易于使用、便于理解,并且非常灵活和强大,但LabVIEW仍然是GUI的王者。总的来说,我认为LabVIEW更适合需要漂亮图形介面且不需要执行复杂回圈或资料处理的应用,例如,我仍然使用LabVIEW来设计针对客户的大多数应用,此类应用要求介面很漂亮但通常简单,对于所有其他应用和自动化需求,Python现在是我的首选。

(参考原文:如何使用Python自动化测量,作者:Fabrizio Guerrieri)

人工智能

每天推送给你人工智能相关的信息

还有为你量身定制的人工智能课程

建议你关注一下