黃建軍+李宥謀+劉婧+周歡
摘 要: 通過分析現(xiàn)代工業(yè)生產(chǎn)對自動化測試系統(tǒng)的要求,提出一種基于面向?qū)ο蟮木幊陶Z言Python構(gòu)建的自動化測試系統(tǒng)。利用Python語言的高效、靈活和簡潔等特點(diǎn),結(jié)合Pyvisa,Pyivi和Web.py等擴(kuò)展模塊提供的強(qiáng)大功能,以及 IVI 和 VISA技術(shù)的后臺支持,可以快速組建滿足用戶測試需求且高效的測試系統(tǒng);其次利用NumPy,Matplotlib和PyQt4擴(kuò)展模塊能夠準(zhǔn)確地完成對測試數(shù)據(jù)的各種運(yùn)算處理以及相關(guān)的圖形界面顯示等操作。結(jié)果表明,該系統(tǒng)具有高效性、通用性和擴(kuò)展性,使用Python開發(fā)虛擬儀器與測試系統(tǒng),代碼簡潔、層次清晰、周期性短,具有廣泛的應(yīng)用前景。
關(guān)鍵詞: 測試系統(tǒng); Python; Pyvisa; Pyivi; 可互換性
中圖分類號: TN911?34; TP393 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2017)04?0039?05
Design and implementation of automatic testing system based on Python
HUANG Jianjun, LI Youmou, LIU Jing, ZHOU Huan
(School of Computer Science and Technology, Xian University of Posts and Telecommunications, Xian 710061, China)
Abstract: A kind of automatic testing system based on the object?oriented programming language Python is proposed by analyzing the requirement of the auto testing system for modern industrial production. With the background support of VISA and IVI technology, the efficient testing system satisfying the testing demands of users can be built quickly in combination with the efficient, flexible and concise characteristics of Python language, and the powerful functions of Pyvisa, Pyivi and Web.py extensional modules. Besides, the system can complete each operational processing of testing data and relevant GUI display accurately by means of NumPy, Matplotlib and PyQt4 modules. The result indicates that the system has high efficiency, universality and expansibility. The application of Python for developing the virtual instrument and testing system has the characteristics of concise code, clear hierarchy and short cycle. It has a broad application prospect.
Keywords: testing system; Python; Pyvisa; Pyivi; interchangeability
目前,多數(shù)虛擬儀器和測控平臺的開發(fā)都使用LabVIEW圖形化編程語言,LabVIEW在界面開發(fā)部分占據(jù)優(yōu)勢,但是LabVIEW調(diào)用Matlab的接口方法比較復(fù)雜,將二者很好的結(jié)合也有一定的難度,這使得LabVIEW在數(shù)據(jù)處理方面顯現(xiàn)出不足。其次,后期系統(tǒng)擴(kuò)展對LabVIEW代碼進(jìn)行修改的工作量較大,這對大型的測試系統(tǒng)來說很不利?;贚abVIEW的上述不足,本文提出使用Python腳本語言來編寫可互換儀器測試系統(tǒng)。Python擁有豐富的擴(kuò)展模塊以及第三方的支持包,PyQt可以快速開發(fā)滿足用戶需求的GUI界面,NumPy相當(dāng)于Matlab的Python版本,繼承了Matlab的強(qiáng)大數(shù)據(jù)處理能力。Pyvisa 和Pyivi 是Python對NI?VISA和NI?IVI的封裝工具包,對測試系統(tǒng)實現(xiàn)儀器接口的無關(guān)性和同類儀器的可互換性提供了很好的支持。Python面向?qū)ο蠼Y(jié)構(gòu)化的編程可以把程序代碼組織成邏輯塊重復(fù)使用,這一特性也恰恰彌補(bǔ)了LabVIEW在編寫測試系統(tǒng)中后期修改程序復(fù)雜這一缺陷。
1 系統(tǒng)組成
1.1 系統(tǒng)的硬件結(jié)構(gòu)
測試系統(tǒng)由多個測試子系統(tǒng)組成,系統(tǒng)硬件連接如圖1所示,每個子系統(tǒng)都是一個相對獨(dú)立的測試單元,由一臺控制計算機(jī)、一臺路由器和由該計算機(jī)控制的若干臺設(shè)備儀器組成??刂朴嬎銠C(jī)和LAN型接口的設(shè)備通過路由器連接到同一個局域網(wǎng)中,其他諸如USB,GPIB,RS 232等接口設(shè)備通過相應(yīng)的接口總線與控制計算機(jī)相連,這樣不同接口類型的設(shè)備儀器就直接或間接地接入到控制計算機(jī),并由控制計算機(jī)來發(fā)現(xiàn)、配置和控制。各個測試子系統(tǒng)通過路由器和數(shù)據(jù)備份與存儲服務(wù)器相連,組成整個測試系統(tǒng)的局域網(wǎng)。測試控制管理系統(tǒng)主機(jī)通過控制計算機(jī)的并口向各個測試子系統(tǒng)發(fā)送控制指令,使各個測試子系統(tǒng)在測試的某些階段能夠統(tǒng)一動作[1]。
1.2 系統(tǒng)的軟件組成
該系統(tǒng)由以下5個主要模塊構(gòu)成,如圖2所示。
儀器發(fā)現(xiàn)與驅(qū)動管理模塊,負(fù)責(zé)對接入到控制計算機(jī)上的硬件設(shè)備儀器進(jìn)行發(fā)現(xiàn)以及管理本地安裝的IVI驅(qū)動,其次對儀器和具體IVI驅(qū)動進(jìn)行相關(guān)信息的查詢。
儀器測試模塊分為VISA和IVI兩個測試模塊。VISA測試部分負(fù)責(zé)對驅(qū)動不滿足IVI標(biāo)準(zhǔn)規(guī)范的儀器設(shè)備進(jìn)行控制;IVI測試部分用于對驅(qū)動滿足IVI標(biāo)準(zhǔn)規(guī)范的儀器進(jìn)行控制。兩部分相結(jié)合,使系統(tǒng)完成對不同驅(qū)動標(biāo)準(zhǔn)的儀器的通用功能的實現(xiàn)。
虛擬儀器模塊,集成了某類儀器的通用功能,負(fù)責(zé)對實體儀器的操作和對測試數(shù)據(jù)的結(jié)果進(jìn)行處理和顯示。測試系統(tǒng)中,虛擬儀器模塊可根據(jù)需要進(jìn)行擴(kuò)充,根據(jù)測試對象的不同選調(diào)對應(yīng)的虛擬儀器模塊。
數(shù)據(jù)存儲管理模塊,負(fù)責(zé)測試系統(tǒng)在某一項測試中所有測試信息的存儲,包括測試項目名稱、項目測試人員、測試環(huán)境、測試時間,測試地點(diǎn)和測試結(jié)果數(shù)據(jù)。該模塊和數(shù)據(jù)備份與存儲服務(wù)器采用C/S模式,其中S端(服務(wù)器端)運(yùn)行在數(shù)據(jù)備份與存儲服務(wù)器上,C端(客戶端)嵌入到虛擬儀器模塊中,在測試結(jié)束時由測試系統(tǒng)啟動與服務(wù)器端連接交互并完成數(shù)據(jù)存儲與更新功能。
測試數(shù)據(jù)顯示界面(Web)模塊,提供測試界面的本地瀏覽器訪問和遠(yuǎn)程瀏覽器訪問模式,瀏覽器完成所有測試數(shù)據(jù)的實時顯示。
2 Python擴(kuò)展模塊的說明
2.1 Pyvisa底層驅(qū)動庫
Pyvisa 是對已有VISA 庫進(jìn)行的 Python 格式化封裝的一個共享庫,以 NI?VISA作為其包裝的后臺支撐,可以支持串口,GPIB,GPIB?VXI,VXI,TCP/IP,以及 USB 接口儀器。Python對VISA庫的封裝分為頂層(high?level)、中間層(middle?level)和底層(low?level)三層結(jié)構(gòu),頂層針對VISA資源管理器和資源的操作集合進(jìn)行面向?qū)ο蟮腜ython化封裝,資源管理器類中實現(xiàn)了對接入測試系統(tǒng)的資源進(jìn)行自動檢測。用戶可以使用資源管理器類來打開實例化的資源派生類對象,資源類和派生類用Python 的行為方式訪問底層資源的屬性和方法;中間層采用Python的綁定方法(Bound Method)對VISA庫函數(shù)的操作集合進(jìn)行Python形式的封裝,這一層的作用是將VISA共享庫的操作函數(shù)用Python腳本來實現(xiàn),這樣用戶就可以很方便地利用Python腳本調(diào)用這些函數(shù),實現(xiàn)對相關(guān)儀器的控制;底層定義了每個函數(shù)的參數(shù)類型和返回值類型,所有函數(shù)都是針對VISA庫采用靜態(tài)方法進(jìn)行定義封裝,Pyvisa的具體封裝結(jié)構(gòu)如圖3所示。
2.2 Pyivi應(yīng)用程序接口API
Pyivi支持IVI?COM和IVI?C兩種類型的驅(qū)動,是對測試主機(jī)上的所有IVI驅(qū)動進(jìn)行的一層 Python形式的包裝,能夠滿足符合IVI標(biāo)準(zhǔn)規(guī)范的儀器互換特性以及IVI引擎所提供的一些功能。Pyivi對兩種類型的特定IVI驅(qū)動分別使用ctypes和comtypes進(jìn)行分裝,兩種形式對IVI標(biāo)準(zhǔn)規(guī)范下的儀器的類驅(qū)動都進(jìn)行了封裝,應(yīng)用程序通過調(diào)用IVI類驅(qū)動實現(xiàn)儀器的互換性。Pyivi通過ctypes類與IVI?C類型驅(qū)動進(jìn)行通信,通過comtypes類與IVI?COM類型驅(qū)動進(jìn)行通信。Pyivi使用工廠模式對兩種類型驅(qū)動接口進(jìn)行設(shè)計,首先將接口設(shè)計為一個抽象工廠類,定義儀器的共有屬性。應(yīng)用程序通過Pyivi調(diào)用IVI類驅(qū)動時,工廠類會根據(jù)應(yīng)用程序傳入的參數(shù)來選擇IVI?C或者IVI?COM類型的IVI特定驅(qū)動進(jìn)行底層驅(qū)動函數(shù)的調(diào)用。
Pyivi的接口設(shè)計如圖4所示,圖4中儀器類指Pyivi模塊所支持的儀器類別,包括示波器類、頻譜分析儀類和信號發(fā)生器類[2]。
3 系統(tǒng)模塊功能實現(xiàn)
3.1 儀器發(fā)現(xiàn)與驅(qū)動管理模塊的設(shè)計
程序?qū)隤yvisa,Pyivi模塊,調(diào)用Pyvisa模塊的資源管理器函數(shù)來掃描測試系統(tǒng)各接口上的儀器設(shè)備,調(diào)用Pyivi模塊來查看管理測試主機(jī)的驅(qū)動,查詢確定驅(qū)動的具體信息以便后續(xù)測試部分的需求,具體實現(xiàn)代碼如下:
import pyvisa as visa
import pyivi
rm=visa.ResourceManager()
#打開本地的默認(rèn)資源管理器,并以引用rm的形式返回
rm_list=rm.list_resources([query=u?*::INSTR])
#列出rm中所掃描到的硬件接口設(shè)備
openinstr=rm.open_resource
(resource_name,[access_mode=
#打開rm中的某一個硬件設(shè)備,并將會話資源以openinstr引用的形式返回
instrinfo=openinstr.query(′*IDN?′)
#查詢打開儀器的詳細(xì)硬件信息,保存在instrinfo中
instrmanufacturer=openinstr.manufacturer_name
#查詢儀器的廠商信息
instrmodelname=openinstr.model_name
#查詢該儀器的具體型號
ivisoftmods=pyivi.software_modules
#列出本地安裝的所有IVI特定驅(qū)動
tktdsmod=ivisoftmods[′tktds1k2k′]
#訪問指定的 tktds1k2k 驅(qū)動
supinstrtype=tktdsmod.specialized_instrument_type()
#查詢該驅(qū)動所支持的儀器類型
drivertype=tktdsmod.flavours()
#查詢該驅(qū)動所屬類型(IVI?C 或者IVI?COM)
supmodnames=tktdsmod.supported_instrument_models()
#該驅(qū)動所支持的儀器型號
通過上述代碼,可以確定測試儀器的具體硬件信息和測試主機(jī)上的驅(qū)動類型以及驅(qū)動所支持的儀器類型。
3.2 儀器測試模塊設(shè)計
儀器測試模塊,VISA測試部分負(fù)責(zé)完成普通的測試功能,適用于驅(qū)動不滿足IVI標(biāo)準(zhǔn)規(guī)范的設(shè)備;IVI測試部分適用于驅(qū)動符合IVI標(biāo)準(zhǔn)規(guī)范的設(shè)備,它既可以完成VISA部分的通用功能的測試,同時還能夠滿足儀器設(shè)備互換性的要求。以獲取泰克TDS2410B示波器波形數(shù)值為例進(jìn)行簡要的代碼說明如下:
VISA測試部分:
instr=rm.open_resource("USB0::0x0699::0x0368::c010850::INSTR")
vals=instr.query_binary_values(′curv?′,datatype=′d′, is_big_
endian=True)
其中,rm為資源管理器的引用,利用open_resource()方法建立與設(shè)備的連接,“USB0::0x0699::0x0368::c010850::INSTR”參數(shù)為本測試中連接示波器的實際硬件地址,將打開的連接儀器以會話句柄instr的形式返回。VISA測試的波形獲取采用query_binary_values()方法,參數(shù)含義分別為:獲取波形的SCPI儀器指令、返回的波形數(shù)據(jù)類型為double型以及數(shù)據(jù)存儲采用大端格式。
IVI測試部分代碼如下:
iviscope=pyivi.ivi_instrument
("USB0::0x0699::0x0368::c010850::INSTR","TDS2410B",
simulate=False,flavour=′IVI?C′) //IVI實際測量
iviscope=pyivi.ivi_instrument
("dummy address","TDS2410B",simulate=True,flavour=
′IVI?C′) //IVI仿真測量
iviscpvals=iviscope.fetch_waveform()
調(diào)用Pyivi 模塊的ivi_instrument()方法建立測試系統(tǒng)與IVI設(shè)備的連接,支持仿真和實際測量兩種方式,第一個參數(shù)為實體儀器的硬件地址,若采取仿真模式則該參數(shù)應(yīng)為字符串“dummy address”;第二個參數(shù)為實體儀器的具體型號,本測試中選擇泰克的TDS2410B型示波器;第三個參數(shù)對仿真和實際測量兩種方式進(jìn)行選擇,為False則代表實際測量,Ture則為仿真模式;第四個參數(shù)對IVI?C和IVI?COM兩種類型驅(qū)動進(jìn)行選擇,由于多數(shù)的IVI型儀器廠商都會提供IVI?C類型驅(qū)動,為了實現(xiàn)設(shè)備的通用性,這里選擇IVI?C型驅(qū)動。
建立好的儀器連接以會話引用iviscope返回,基于該引用實現(xiàn)對連接儀器的控制。獲取波形數(shù)據(jù)直接調(diào)用儀器會話的fetch_waveform()方法。硬件地址和儀器型號兩個參數(shù)本文可以通過儀器發(fā)現(xiàn)與驅(qū)動管理模塊獲得,Pyivi會根據(jù)傳入的IVI儀器型號,自動在后臺IVI驅(qū)動中查詢匹配該儀器型號的特定的IVI驅(qū)動,完成IVI類驅(qū)動到IVI特定驅(qū)動再到具體儀器的映射,實現(xiàn)了儀器設(shè)備的可互換性。
3.3 虛擬儀器模塊的開發(fā)
虛擬儀器模塊的開發(fā)采用PyQt4和NumPy擴(kuò)展模塊,PyQt4負(fù)責(zé)界面的開發(fā),NumPy負(fù)責(zé)對采集的數(shù)據(jù)進(jìn)行滿足需求的處理。整體虛擬儀器模塊的開發(fā)采用界面層和邏輯控制層分開設(shè)計的方式,這樣數(shù)據(jù)的采集與處理與最終的結(jié)果顯示分開進(jìn)行,利用QObject類中的connect()方法將界面按鈕事件的信號和邏輯控制塊對應(yīng)的槽函數(shù)(事件處理函數(shù))綁定即可。利用PyQt進(jìn)行界面開發(fā)的步驟如下:
(1) 利用QtDesigner創(chuàng)建GUI;
(2) 根據(jù)需要添加各種部件,并在部件的屬性編輯器中修改部件的相應(yīng)屬性,保存該ui文件;
(3) 通過Pyuic4工具將ui文件轉(zhuǎn)換成Python腳本文件,命令為:Pyuic4?o xxx.py xxx.ui;
(4) 通過調(diào)用生成GUI的類來運(yùn)行該程序;
(5) 對GUI的各個控件編輯對應(yīng)的觸發(fā)信號和槽函數(shù),利用connect()進(jìn)行綁定。
3.4 測試數(shù)據(jù)顯示界面設(shè)計
測試數(shù)據(jù)顯示界面采用Web.py擴(kuò)展模塊進(jìn)行網(wǎng)絡(luò)搭建,在測試主機(jī)上搭建HTTP服務(wù)器,測試系統(tǒng)軟件采用B/S結(jié)構(gòu),這樣既可以通過本地瀏覽器訪問數(shù)據(jù)顯示界面也可以通過遠(yuǎn)端主機(jī)訪問測試主機(jī)請求顯示界面[3],具體的網(wǎng)絡(luò)服務(wù)器代碼如下:
urls = (′/′,′index′,′/system_test′,′Test′)
#定義網(wǎng)頁的索引響應(yīng)函數(shù)
class index:
def GET(self):
return "歡迎登錄測試平臺!"
...
return test_datas()
def test_datas(): #統(tǒng)計測試數(shù)據(jù)
...
reutrn datas #返回測試數(shù)據(jù)
Class Test(object):
def GET(self):
return "測試數(shù)據(jù)顯示界面!"
def data_handle(self, datas): #對測試數(shù)據(jù)進(jìn)行處理
...
return test_result #返回數(shù)據(jù)的處理結(jié)果
def display(self, test_result): #顯示測試結(jié)果
...
if __name__ == "__main__":
app = web.application(urls, global())
app.run()
4 系統(tǒng)測試
搭建測試系統(tǒng)所需軟件環(huán)境,采用DSO?X 4052A 和Tektronix TDS2014B兩臺不同型號的示波器對測試系統(tǒng)的IVI測試部分、VISA測試部分、IVI儀器仿真功能和儀器的可互換性進(jìn)行測試,其中,Tektronix TDS2014B為IVI型示波器,系統(tǒng)整體測試流程圖如圖5所示。
測試中,對接入測試系統(tǒng)中的Tektronix TDS2014B示波器進(jìn)行實時波形獲取,波形選擇鋸齒波,實體儀器和虛擬示波器軟面板波形如圖6所示。IVI互換性測試,將示波器換作DSO?X 4052A 型號,波形選擇三角波,示波器軟面板獲取的實際波形如圖7所示。
系統(tǒng)IVI仿真測試中,選取Tektronix TDS2014B示波器,在IVI測量部分選擇儀器仿真,示波器軟面板波形如圖8所示。
5 結(jié) 論
本測試系統(tǒng)將各個測試子系統(tǒng)通過交換機(jī)連接到同一局域網(wǎng)中,測試子系統(tǒng)中控制主機(jī)與各個測試儀器設(shè)備也處于一個局域網(wǎng)中,系統(tǒng)對外兼容GPIB,LAN,RS 232和USB等接口類型的儀器,同時支持符合IVI標(biāo)準(zhǔn)的儀器的互換操作,做到同一應(yīng)用程序可以對同類不同型號的儀器設(shè)備進(jìn)行控制。系統(tǒng)具有很強(qiáng)的可擴(kuò)充性,VISA支持的儀器類都可以在此系統(tǒng)上進(jìn)行測試控制,用戶只需要根據(jù)測試需求開發(fā)相應(yīng)儀器設(shè)備類的軟面板即可,無需更改系統(tǒng)軟件架構(gòu)。其次,測試系統(tǒng)與數(shù)據(jù)庫結(jié)合,有助于大量測試數(shù)據(jù)長時間存儲管理,給今后對測試設(shè)備的某項特性進(jìn)行數(shù)據(jù)挖掘提供數(shù)據(jù)支持。
參考文獻(xiàn)
[1] 田耕,阮林波,渠紅光.基于VISA技術(shù)的自動測試軟件研制[J].核電子學(xué)與探測技術(shù),2009(6):1397?1400.
[2] 黃娟,李文臻.基于VISA及IVI技術(shù)的儀器儀表自動測試系統(tǒng)軟件設(shè)計[J].電子質(zhì)量,2012(5):12?15.
[3] 周锎,趙楠,李欣.一種基于Python腳本語言的自動化測試系統(tǒng)[J].南開大學(xué)學(xué)報(自然科學(xué)版),2014(5):65?70.
[4] 李宥謀,趙夢屹,王萌.基于IVI引擎技術(shù)的虛擬儀器互換管理系統(tǒng)[J].西安郵電大學(xué)學(xué)報,2015(2):93?97.
[5] 汪君鵬,李宥謀.基于Lua腳本技術(shù)的網(wǎng)絡(luò)化測控系統(tǒng)設(shè)計[J].西安郵電大學(xué)學(xué)報,2013(1):90?94.
[6] 冀博,李宥謀,郭猛.網(wǎng)絡(luò)設(shè)備自動發(fā)現(xiàn)技術(shù)的研究與實現(xiàn)[J].西安郵電學(xué)院學(xué)報,2012(6):33?36.
[7] 李輝,吳偉.一種基于MCS51的低成本LabVIEW實驗教學(xué)系統(tǒng)[J].現(xiàn)代電子技術(shù),2013,36(4):124?128.