利用Python語言實(shí)現(xiàn)實(shí)驗(yàn)室自動化
作為一名系統(tǒng)和應(yīng)用工程師,得益于自動化儀器和軟件,我已經(jīng)節(jié)省了不計(jì)其數(shù)的日日夜夜;例如LabVIEW,這是一款系統(tǒng)設(shè)計(jì)平臺和開發(fā)環(huán)境,支持可視化編程語言。LabVIEW支持用戶利用友好的圖形用戶界面(GUI)構(gòu)建應(yīng)用程序。該平臺帶有多個庫和模塊,使其能夠與儀器通信,所以可用于實(shí)驗(yàn)室自動化。作為LabVIEW用戶,我已經(jīng)使用該工具構(gòu)建了多款應(yīng)用程序,但在過去幾年中,我已經(jīng)開始逐步將其淘汰,代之以Python語言(見側(cè)欄:“Python是什么以及如何使用?”)。
本文引用地址:http://cafeforensic.com/article/201703/345661.htm為了理解其中緣由,我們首先了解一下Python相對于現(xiàn)有替代語言的主要優(yōu)勢,以及討論P(yáng)ython應(yīng)用程序的工作實(shí)例。表達(dá)Python方便和強(qiáng)大之處的最佳方式是介紹一個完整、可工作的Python自動化腳本,例如我用來實(shí)現(xiàn)穩(wěn)壓器(VR)負(fù)載調(diào)節(jié)曲線(負(fù)載調(diào)節(jié)是指輸出電壓隨輸出電流(負(fù)載)增大而發(fā)生的變化)自動測量的腳本。
這些穩(wěn)壓器分為兩類:零下垂穩(wěn)壓器設(shè)計(jì)的輸出電阻為零;因此,輸出電壓設(shè)置點(diǎn)不應(yīng)隨輸出電流增大而變化。相比較而言,下垂穩(wěn)壓器具有“載重線”,意味著被設(shè)計(jì)成具有特定的等效輸出電阻。本例中所用穩(wěn)壓器的零電流輸出電壓為1 V,設(shè)定的載重線為2.5 mΩ。
圖1. 測量配置
在圖1所示的試驗(yàn)配置中,使用Chroma 63201電子負(fù)載施加負(fù)載電流(VR輸出電流)。通過采集經(jīng)過校準(zhǔn)的4 mΩ短路器上的電壓,測得輸出電流。利用Agilent 34970A數(shù)字采集器(DAQ)采集電壓和電流,DAQ和電子負(fù)載均通過GPIB連接至計(jì)算機(jī)。我們測量的目的是證明:在一定輸出電流范圍下,輸出電壓在技術(shù)指標(biāo)范圍之內(nèi);圖2所示為應(yīng)用程序的流程圖。
圖2. 應(yīng)用程序流程圖
從基本代碼結(jié)構(gòu)開始
以下是自動化腳本代碼的第一部分。Python語言中,注釋用#表示:
第1至3行引用庫,其中包含隨后代碼中使用的方法:
?Numpy是用于科學(xué)計(jì)算的封裝庫。本例中,Numpy用于產(chǎn)生輸出電流值的數(shù)組。
?Pandas (用于數(shù)據(jù)處理和分析的庫)創(chuàng)建一個功能強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),以儲存我們的測量結(jié)果。
?Visa是PyVISA庫,用來控制我們的儀器。
?Time是一個非常方便的庫,用于產(chǎn)生某些時(shí)間延遲。
注意,引用的Numpy和Pandas庫被重命名為np和pd,以保持代碼整潔。本文中提及的所有庫要么已經(jīng)隨Python 安裝包提供,要么也很容易從在線軟件庫中安裝。
第4至5行創(chuàng)建我們用來訪問Chroma電子負(fù)載和Agilent DAQ的對象。這正是PyVISA的作用:我們只需調(diào)用instrument方法,并提供表示通信接口的字符串(GPIB)以及儀器在總線上的地址。
第6行創(chuàng)建results數(shù)據(jù)框(dataframe),用來儲存測量結(jié)果。數(shù)據(jù)框是一種二維標(biāo)簽數(shù)據(jù)結(jié)構(gòu),各列的數(shù)據(jù)類型可以不同。使用數(shù)據(jù)框而不使用數(shù)組,允許我們通過容易記憶的字符串而不是數(shù)字來引用列,以及在數(shù)據(jù)本身中混合數(shù)字和文本。
第7行創(chuàng)建一個實(shí)數(shù)數(shù)組,從0到20,步長為2。這些數(shù)字表示以安培為單位的輸出電流值,在這些電流點(diǎn)測量VOUT。
第8行用于構(gòu)建“for”循環(huán)。注意,語法很容易理解:每次執(zhí)行循環(huán)時(shí),創(chuàng)建一個load 變量,其值等于loads數(shù)組的新元素。當(dāng)使用了數(shù)組的全部元素時(shí),循環(huán)結(jié)束。有意思的是,Python利用縮進(jìn)定義代碼的層次結(jié)構(gòu),而不依賴于任何類型的括號。這樣能夠保持代碼的整潔和易讀性,非常有用。
既然我們已經(jīng)定義了主循環(huán),就需要告訴儀器設(shè)置電流,然后讀取電壓,并保存結(jié)果。
儀器通信及保存數(shù)據(jù)
我們接下來看看第二部分的代碼:
第9至10行配置相應(yīng)的負(fù)載電流并打開負(fù)載。只需要使用讀/寫方法,并且知道儀器接受的命令串(可查閱儀器手冊),即可通過GPIB接口進(jìn)行通信。與其他編程語言類似,%.2f為占位符,在實(shí)際運(yùn)行時(shí)用變量load的值代替。也表示我們希望數(shù)據(jù)表示為帶兩位小數(shù)的實(shí)數(shù)。第11行產(chǎn)生1秒延遲,這對于確保儀器和電路達(dá)到穩(wěn)態(tài)條件非常有用。
第12行創(chuàng)建一個空對象(在Python中稱為字典),用于暫存執(zhí)行一次循環(huán)的結(jié)果。
第13至16行用來測量輸出電壓和電流。第一條命令告訴儀器我們想要做什么(測量直流電壓,采用自動變比)以及對應(yīng)的采集通道。分別在通道101和102采集輸出電壓和電流。第二條命令讀取返回的結(jié)果并將其儲存在temp中。數(shù)據(jù)以字符串的形式返回,所以必須利用float函數(shù)將其轉(zhuǎn)換為實(shí)數(shù)。此外,由于DAQ測量的是電壓,我們需要將讀數(shù)與短路器電阻(0.004 Ω)相除,得到正確的電流值。
看看使用Python和Pandas有條理地保存數(shù)據(jù)是多么簡單:temp字典中的字段無需提前定義,并且使用具有含義的字符串進(jìn)行訪問。無需記憶列號與數(shù)據(jù)之間的關(guān)系,而如果使用數(shù)組存儲數(shù)據(jù)的話則必須這么做。
在第17行中,我們將字段附加到results數(shù)據(jù)框。注意,results也不需要進(jìn)行初始化;每次附加一個新行時(shí),將增加新字段至數(shù)據(jù)框。
第18行可選,但在終端上打印當(dāng)前電壓和電流值非常有用,尤其對于長時(shí)間測量,可以作為確認(rèn)應(yīng)用程序仍然在運(yùn)行的途徑,以及了解執(zhí)行到了什么程度。
在第19至20行,關(guān)閉負(fù)載,將數(shù)據(jù)保存到硬盤。對于后者,每個數(shù)據(jù)框?qū)ο蠖际褂靡环N內(nèi)置方法將數(shù)據(jù)保存到CSV文件。
評論