作為一名系統和應用工程師,使用LabVIEW等軟體進行自動測量,可節省無數個小時。雖然一直用LabVIEW來構建測量應用,但當我不需要開發好用的圖形化使用者介面(GUI)供他人使用時,開始用Python代替LabVIEW進行基本實驗室測量;且當我只需要快速進行一些測量時,Python允許以易於閱讀的格式保存測量結果,並將結果繪製出來。

為瞭解箇中原因,來看看Python的主要優點並討論Python應用的工作示例。能體驗Python的便利性和強大功能的最佳方式是描述一個完整、能工作的Python自動化腳本,例如用來自動測量電壓穩壓器(voltage regulator;VR)負載調節曲線的方案(負載調節是當輸出電流——負載——增加時,對輸出電壓的變化控制)。

VR分為兩類:零壓降穩壓器和降壓穩壓器。零壓降穩壓器具有零輸出電阻;輸出電壓設定值不應隨輸出電流的增加而變化;相反,降壓穩壓器被認為具有「負載線(loadline)」,這意味著它們被設計成具有特定的等效輸出電阻。本例中使用的穩壓器具有1V的零電流輸出電壓和2.5mΩ的程式設計負載線,圖1顯示了測試設置。

20180918TA31P1 圖1 被測VR連接到電子負載,而DAQ系統透過分流電阻測量輸出電流。

使用Chroma 63201電子負載施加負載電流(VR輸出電流),透過擷取校準的4mΩ分流電阻上的電壓來測量輸出電流。使用是德科技(Keysight Technologies)34970A資料擷取系統(DAQ)擷取電壓和電流,DAQ和電子負載利用GPIB鏈路與電腦通訊。測量的目標是驗證輸出電壓是否在一系列輸出電流範圍內都滿足規範指標,圖2顯示了該應用流程圖。

20180918TA31P2 圖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中呈現的狀況,它酷極了:數值資料和文本在同一個表中,甚至列標題也是從資料幀欄位的名稱自動生成。

20180918TA31P3 圖3 Python腳本可以CSV格式保存資料,並可在Excel中輕鬆打開。

使用Pyplot進行資料分析和繪圖

上述描述的程式碼片段允許我們確定輸出電壓是否在其理想值附近的「容差帶」內。我們可能想要從這個實驗中得到的另一個有趣資訊是負載線的確切值,即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自動生成,它們在終端視窗中像是「橫空出世」。

20180918TA31P4 圖4 Pyplot可以直接繪製資料,無需在Excel中打開。

總結

Python是自動化實驗室設置的極佳選擇,可以避免繁瑣的測量時間,因為它易於使用、便於理解,並且非常靈活和強大,但LabVIEW仍然是GUI的王者。總的來說,我認為LabVIEW更適合需要漂亮圖形介面且不需要執行複雜迴圈或資料處理的應用,例如,我仍然使用LabVIEW來設計針對客戶的大多數應用,此類應用要求介面很漂亮但通常簡單,對於所有其他應用和自動化需求,Python現在是我的首選。

(參考原文: How to automate measurements with Python ,by Fabrizio Guerrieri)