馬宇,葉衛(wèi)東
(北京航空航天大學(xué),北京 100191)
虛擬儀器是自動(dòng)測(cè)試系統(tǒng)的基礎(chǔ),測(cè)試軟件是虛擬儀器的核心。目前虛擬儀器和測(cè)試軟件常見(jiàn)的開(kāi)發(fā)平臺(tái)包括:NI公司的LabVIEW,LabWindows / CVI,C#,C++和Java等。LabVIEW和LabWindows具有豐富的圖形化測(cè)試控件庫(kù);C#便于開(kāi)發(fā)Windows圖形界面程序;C,C++和Java是目前使用最廣的編程語(yǔ)言。
在實(shí)際的產(chǎn)品測(cè)試開(kāi)發(fā)中,這些平臺(tái)或編程語(yǔ)言也存在一些局限。比如,LabVIEW圖形化語(yǔ)言不便于代碼管理和維護(hù),LabWindows / CVI使用面向過(guò)程的C語(yǔ)言,模塊化開(kāi)發(fā)需要大量的編程技巧,開(kāi)發(fā)效率較低,手工管理內(nèi)存容易導(dǎo)致軟件缺陷(如緩沖區(qū)溢出)。設(shè)計(jì)功能較復(fù)雜的測(cè)試軟件時(shí),靜態(tài)語(yǔ)言在不重新編譯的情況下難以對(duì)軟件的功能進(jìn)行動(dòng)態(tài)配置。
Python是面向?qū)ο蟮母呒?jí)編程語(yǔ)言,動(dòng)態(tài)類(lèi)型、自動(dòng)內(nèi)存管理、解釋執(zhí)行、原生跨平臺(tái),可拓展性極強(qiáng),具有豐富的開(kāi)源庫(kù),能快速實(shí)現(xiàn)應(yīng)用程序所需的各種功能[1]。Python在儀器編程方面已有少量應(yīng)用[2],主要障礙是大量?jī)x器沒(méi)有提供Python的編程接口。SWIG(Simple Wrapper and Interface Generator)是跨語(yǔ)言接口轉(zhuǎn)換工具,支持Python/Perl/ PHP等動(dòng)態(tài)腳本語(yǔ)言與C,C++,C#,Java等靜態(tài)編譯型語(yǔ)言之間的接口轉(zhuǎn)換[3],Python中的很多拓展庫(kù)實(shí)際上來(lái)自SWIG對(duì)C庫(kù)的封裝。
本文采用Python設(shè)計(jì)和開(kāi)發(fā)自動(dòng)測(cè)試軟件,提出將SWIG用于儀器驅(qū)動(dòng)的跨語(yǔ)言、跨平臺(tái)封裝,彌補(bǔ)Python在儀器編程方面的短板,希望能夠促進(jìn)Python在虛擬儀器和自動(dòng)測(cè)試領(lǐng)域的推廣和應(yīng)用。
整個(gè)測(cè)試系統(tǒng)由測(cè)試計(jì)算機(jī)、測(cè)試服務(wù)器和控制主機(jī)組成,通過(guò)交換機(jī)組網(wǎng),如圖1所示。測(cè)試計(jì)算機(jī)采用RS-232,GPIB或PXI等測(cè)試總線(xiàn)連接測(cè)試資源(模塊化儀器或可程控的臺(tái)式儀器),通過(guò)儀器驅(qū)動(dòng)程序控制儀器設(shè)備;測(cè)試服務(wù)器運(yùn)行數(shù)據(jù)庫(kù)和測(cè)試應(yīng)用軟件;控制主機(jī)實(shí)現(xiàn)人機(jī)交互,對(duì)整個(gè)測(cè)試系統(tǒng)進(jìn)行控制。
圖1 系統(tǒng)硬件組成
可根據(jù)測(cè)試需求,調(diào)整和縮放系統(tǒng)規(guī)模,如將三者合為一體,即以傳統(tǒng)的單機(jī)方式運(yùn)行整個(gè)測(cè)試系統(tǒng)。
用Python開(kāi)發(fā)自動(dòng)測(cè)試軟件,其基本層次結(jié)構(gòu)如圖2所示。
圖2 系統(tǒng)軟件層次結(jié)構(gòu)
最上層為測(cè)試應(yīng)用層,負(fù)責(zé)測(cè)試用例執(zhí)行、數(shù)據(jù)存儲(chǔ)和分析、測(cè)試報(bào)告生成等具體的測(cè)試業(yè)務(wù)。應(yīng)用層之下為儀器驅(qū)動(dòng)層,在Python儀器驅(qū)動(dòng)模塊中封裝和調(diào)用底層硬件的API,對(duì)測(cè)試資源進(jìn)行配置和管理。
對(duì)于支持NI-VISA和NI-IVI標(biāo)準(zhǔn)驅(qū)動(dòng)的測(cè)試設(shè)備,Python中的開(kāi)源拓展庫(kù)pyvisa和pyivi分別提供了二者的API封裝,可以直接調(diào)用已封裝好的與具體儀器無(wú)關(guān)的函數(shù)接口或可互換類(lèi)驅(qū)動(dòng)接口[4]。
但實(shí)際的測(cè)試需求往往豐富多變,因?yàn)楦鞣N原因,測(cè)試系統(tǒng)還會(huì)使用很多缺少VISA或IVI驅(qū)動(dòng)支持的測(cè)試儀器,如各種總線(xiàn)通訊接口卡、數(shù)據(jù)采集卡、多功能復(fù)合儀器,以及一些自研或定制的非標(biāo)準(zhǔn)設(shè)備,有時(shí)也包括一些暫時(shí)無(wú)法升級(jí)的老舊測(cè)試設(shè)備。這類(lèi)不被VISA或IVI驅(qū)動(dòng)支持的測(cè)試資源,常被稱(chēng)作專(zhuān)有設(shè)備或非標(biāo)設(shè)備。
將Python作為測(cè)試開(kāi)發(fā)平臺(tái)的主要技術(shù)障礙,就是如何在Python中對(duì)這類(lèi)專(zhuān)有設(shè)備進(jìn)行編程控制。
儀器驅(qū)動(dòng)通常采用C或C++編寫(xiě),一般會(huì)以C語(yǔ)言動(dòng)態(tài)鏈接庫(kù)的形式發(fā)布,并提供頭文件、庫(kù)文件等供二次開(kāi)發(fā)。常見(jiàn)的儀器驅(qū)動(dòng)程序(或SDK)中包含的文件類(lèi)型及作用,如表1所示。
表1 非標(biāo)儀器設(shè)備驅(qū)動(dòng)程序的常見(jiàn)結(jié)構(gòu)
用C,C++調(diào)用專(zhuān)有儀器驅(qū)動(dòng)的API函數(shù)時(shí),一般只需要正確設(shè)置編譯器的鏈接路徑和鏈接方式。在C#中,需要用declare語(yǔ)句對(duì)API函數(shù)的參數(shù)和返回值類(lèi)型等進(jìn)行聲明,之后方可調(diào)用儀器API進(jìn)行編程。有些廠(chǎng)商提供了LabVIEW,C#等環(huán)境的驅(qū)動(dòng)接口聲明代碼(或SDK),以簡(jiǎn)化編程工作。
Python語(yǔ)言在虛擬儀器開(kāi)發(fā)中使用比例比較低,大多數(shù)儀器廠(chǎng)商并沒(méi)有為儀器提供Python SDK支持。Python不支持指針操作,完全使用引用類(lèi)型表示變量、參數(shù)等(傳遞內(nèi)存地址而不是值拷貝),編譯成中間二進(jìn)制字節(jié)碼后通過(guò)解釋器解釋運(yùn)行。Python與C語(yǔ)言雖然語(yǔ)句類(lèi)似,但在數(shù)據(jù)類(lèi)型、內(nèi)存操作、設(shè)計(jì)模式、運(yùn)行方式等方面存在很大的差異,Python無(wú)法簡(jiǎn)單直接地調(diào)用針對(duì)C語(yǔ)言編程而設(shè)計(jì)的儀器驅(qū)動(dòng)。
本文對(duì)在Python中跨語(yǔ)言調(diào)用儀器驅(qū)動(dòng)程序,進(jìn)行了技術(shù)研究和方案驗(yàn)證。
Python本身是開(kāi)放、可拓展的,除了可使用大量的第三方開(kāi)源拓展庫(kù),還可自行編寫(xiě)Python拓展模塊。借助于一些開(kāi)源庫(kù),可以實(shí)現(xiàn)在Python腳本中調(diào)用外部DLL動(dòng)態(tài)鏈接庫(kù)中的C程序。
1)ctypes庫(kù),使用方式與C#中非托管方式調(diào)用DLL類(lèi)似,手工編寫(xiě)接口代碼、聲明每個(gè)API函數(shù)的參數(shù)和返回值類(lèi)型。該方案簡(jiǎn)單易行,但工作量大、難以自動(dòng)化處理,適合API函數(shù)較少的情況。
2)libcffi庫(kù)提供了比ctypes更友好的編程接口,用更少的代碼可完成同樣的功能。
3)用CPython將外部DLL庫(kù)封裝為原生的Python拓展模塊。該方案需要編寫(xiě)C代碼,將儀器驅(qū)動(dòng)頭文件中定義的各種API函數(shù)、數(shù)據(jù)類(lèi)型等轉(zhuǎn)換為相應(yīng)的Python對(duì)象。由于需要了解Python解釋器的底層實(shí)現(xiàn)機(jī)制,工作量和開(kāi)發(fā)難度都很大。
4)SWIG可自動(dòng)解析C或C++的代碼和頭文件,提取API函數(shù)的參數(shù)類(lèi)型、返回值類(lèi)型,自動(dòng)生成CPython接口轉(zhuǎn)換代碼。該方案通用性和自動(dòng)化程度較高,只要熟悉SWIG的配置語(yǔ)法,無(wú)需手工編寫(xiě)底層的轉(zhuǎn)換代碼,即可快速批量地進(jìn)行API封裝。Python中的pyivi模塊,實(shí)際上就是NI-IVI的SWIG封裝。
在以上4種方案中,可能并不存在絕對(duì)的最佳方案。自動(dòng)測(cè)試系統(tǒng)經(jīng)常搭配使用模塊化儀器、臺(tái)式儀器以及其他程控測(cè)試資源,并根據(jù)測(cè)試需求靈活地增加或置換儀器。在選擇驅(qū)動(dòng)封裝方案時(shí),建議根據(jù)驅(qū)動(dòng)API的數(shù)量和復(fù)雜度,結(jié)合開(kāi)發(fā)人員對(duì)相關(guān)工具的熟悉程度,使用ctypes,libcffi或SWIG。
本文所設(shè)計(jì)的測(cè)試系統(tǒng)中使用了較多的非標(biāo)儀器,API數(shù)量和類(lèi)型都比較豐富,因此使用SWIG對(duì)儀器驅(qū)動(dòng)進(jìn)行封裝,通過(guò)自動(dòng)化處理提高開(kāi)發(fā)效率。
本文以某公司的多功能數(shù)據(jù)采集模塊PXI-nuDAQ2206為例(以下簡(jiǎn)稱(chēng)DAQ2206),簡(jiǎn)要介紹將其廠(chǎng)商專(zhuān)有驅(qū)動(dòng)用SWIG轉(zhuǎn)換為Python拓展模塊的關(guān)鍵步驟。
DAQ2206為PXI模塊儀器,測(cè)試資源包括64個(gè)AD通道,2個(gè)DA通道,2個(gè)定時(shí)/計(jì)數(shù)器和24個(gè)IO口。在工業(yè)控制、自動(dòng)測(cè)試中使用多功能復(fù)合測(cè)試設(shè)備,可以提高資源密度、減小設(shè)備體積。但此類(lèi)多功能復(fù)合設(shè)備,往往缺少VISA和IVI驅(qū)動(dòng)的支持。
公司提供了專(zhuān)有驅(qū)動(dòng)包D2K_DASK,支持包括DAQ2206在內(nèi)的多種模塊化儀器。用SWIG對(duì)其進(jìn)行接口封裝的核心工作是按照SWIG庫(kù)的配置語(yǔ)法,在拓展名為*.i的API接口描述文件中對(duì)特殊的API參數(shù)類(lèi)型進(jìn)行聲明,以便于SWIG能夠正確地進(jìn)行類(lèi)型轉(zhuǎn)換和封裝。示例如下(片段):
%module D2KDASK
%include"D2K_DASK.h"
%include"typemaps.i"
%apply int *OUTPUT { BOOLEAN *Stopped,U32 *AccessCnt};
%apply double *OUTPUT { F64 *voltage };
首先用%include指令包含驅(qū)動(dòng)API的頭文件。一般情況下SWIG能自動(dòng)識(shí)別大部分函數(shù)原型、變量和常量[5],并將其轉(zhuǎn)換為相應(yīng)的Python對(duì)象。Python采用動(dòng)態(tài)數(shù)據(jù)類(lèi)型和自動(dòng)內(nèi)存管理,無(wú)法通過(guò)指針直接操作內(nèi)存,所以?xún)x器驅(qū)動(dòng)中經(jīng)常使用的指針類(lèi)型的參數(shù)通常需要特殊處理。
儀器API大多將操作的狀態(tài)碼作為返回值,但由于C / C++函數(shù)不支持多返回值,為了輸出額外的數(shù)據(jù),一般會(huì)使用指針作為參數(shù)、間接地繞開(kāi)這一限制。以函數(shù)D2K_AI_AsyncCheck為例,其函數(shù)原型為I16 D2K_AI_AsyncCheck (U16 CardNumber,BOOLEAN *Stopped,U32*AccessCnt)。其中,指針類(lèi)型的參數(shù)BOOLEAN*Stopped和U32 *AccessCnt,被用于輸出數(shù)據(jù)采集狀態(tài)和已采集數(shù)據(jù)的個(gè)數(shù)。該API函數(shù)實(shí)際上并不關(guān)心這些形參的初始值,只是單向地將輸出數(shù)據(jù)寫(xiě)入指針?biāo)赶虻膬?nèi)存。
借助于SWIG的指針類(lèi)型處理模塊typemaps.i,通過(guò)指令%apply int *OUTPUT { BOOLEAN *Stopped,U32 *AccessCnt },可將對(duì)應(yīng)的參數(shù)聲明為Python整數(shù)類(lèi)型,參數(shù)用途為OUTPUT。
編寫(xiě)好SWIG接口文件后,調(diào)用swig命令可自動(dòng)生成接口的包裝代碼(如D2KDASK_wrap.c),將其編譯為動(dòng)態(tài)鏈接庫(kù)(Windows下還需要修改拓展名為*.pyd),即得到儀器驅(qū)動(dòng)的Python拓展模塊。在Python中可直接import導(dǎo)入儀器驅(qū)動(dòng)拓展模塊。受益于Python語(yǔ)法簡(jiǎn)單、多返回值、動(dòng)態(tài)類(lèi)型、自動(dòng)內(nèi)存管理等特性,無(wú)需繁瑣的定義、聲明和底層操作,可以簡(jiǎn)潔、自然地調(diào)用驅(qū)動(dòng)模塊中的資源,如:
>>>from D2K_DASK import D2K_AI_AsyncCheck
>>>status,stop,count=D2K_AI_AsyncCheck(0)
>>>status,stop,count
(0,1,50)
以上只是使用SWIG封裝儀器驅(qū)動(dòng)的簡(jiǎn)單示例。除typemaps.i外,SWIG還提供了windows.i,cpointer.i,carrays.i,cstring.i,cmalloc.i,cdata.i等拓展庫(kù),能夠處理Windows編程中使用的各種頭文件,在Python腳本中操作函數(shù)指針、數(shù)組、字符串、結(jié)構(gòu)體和聯(lián)合體等C語(yǔ)言數(shù)據(jù)類(lèi)型,通過(guò)malloc動(dòng)態(tài)申請(qǐng)和釋放內(nèi)存,直接對(duì)內(nèi)存進(jìn)行不受保護(hù)地讀寫(xiě)。SWIG大大豐富和擴(kuò)充了Python的底層編程能力,基本能滿(mǎn)足用Python進(jìn)行儀器編程的需求。
將儀器驅(qū)動(dòng)封裝為Python模塊后,還可參考IVI可互換類(lèi)驅(qū)動(dòng)的實(shí)現(xiàn)機(jī)制,利用Python面向?qū)ο蟮奶匦?,將具體的底層API操作封裝在類(lèi)內(nèi)部,對(duì)外抽象出與儀器無(wú)關(guān)的高級(jí)操作接口,逐步將測(cè)試軟件與底層儀器API解耦,提高儀器的可互換性。
設(shè)計(jì)和開(kāi)發(fā)測(cè)試系統(tǒng)時(shí),有時(shí)需要在測(cè)試軟件中集中管理和操作連接到多臺(tái)測(cè)試計(jì)算機(jī)的儀器資源??赡艿脑虬ǎ河?jì)算機(jī)接口類(lèi)型和數(shù)量有限,儀器設(shè)備空間分布較廣,系統(tǒng)中不同的測(cè)試設(shè)備所要求的軟件運(yùn)行環(huán)境無(wú)法統(tǒng)一等。隨著計(jì)算機(jī)軟硬件平臺(tái)不斷升級(jí),測(cè)試設(shè)備會(huì)逐漸過(guò)時(shí),在需要對(duì)老舊的測(cè)試系統(tǒng)進(jìn)行升級(jí)維護(hù)時(shí),上述問(wèn)題可能會(huì)更加突出[6]。將儀器設(shè)備接入到多臺(tái)測(cè)試計(jì)算機(jī)后,傳統(tǒng)的測(cè)試開(kāi)發(fā)平臺(tái)或編程語(yǔ)言往往難以用比較簡(jiǎn)單的方式,解決在分布式、跨平臺(tái)的環(huán)境下,對(duì)儀器驅(qū)動(dòng)進(jìn)行遠(yuǎn)程操作和遠(yuǎn)程調(diào)試等問(wèn)題。
Python具有數(shù)量眾多且功能強(qiáng)大的網(wǎng)絡(luò)編程庫(kù)。其中,RPyC(Remote Python Call)庫(kù)采用對(duì)象代理(Object Proxying)技術(shù),可以像操作本地對(duì)象一樣操作遠(yuǎn)程主機(jī)上的Python模塊和程序。Python作為弱類(lèi)型的動(dòng)態(tài)語(yǔ)言,允許在運(yùn)行時(shí)修改和替換對(duì)象,該技術(shù)被稱(chēng)為“猴子補(bǔ)丁”(MonkeyPatch),可用于在不改變?cè)创a的情況下、對(duì)軟件功能進(jìn)行追加或變更。
結(jié)合RPyC庫(kù)和“猴子補(bǔ)丁”,通過(guò)本地測(cè)試軟件中的代理對(duì)象,可通過(guò)RPyC庫(kù),透明地操作遠(yuǎn)程計(jì)算機(jī)所連接的測(cè)試設(shè)備,如圖3所示。
圖3 實(shí)現(xiàn)遠(yuǎn)程、跨平臺(tái)調(diào)用儀器驅(qū)動(dòng)
>>>import rpyc
>>>server_ip=′192.168.1.22′
>>>server=rpyc.classic.connect(host=server_ip,port=18812)
>>>D2K_AI_AsyncCheck=server.D2K_DASK.D2K_AI_AsyncCheck
>>>status,stop,count=D2K_AI_AsyncCheck(0)
在實(shí)現(xiàn)遠(yuǎn)程調(diào)用的同時(shí),以上方案還支持跨平臺(tái)操作,即遠(yuǎn)程計(jì)算機(jī)和本地計(jì)算機(jī)可分別使用不同類(lèi)型的操作系統(tǒng)(Windows/Linux/Unix等),不同版本的Python,SWIG。
使用pyvisa,pyivi以及SWIG封裝的Python拓展調(diào)用儀器驅(qū)動(dòng),結(jié)合RPyC和“猴子補(bǔ)丁”,可將單機(jī)測(cè)試軟件無(wú)縫遷移到分布式、跨平臺(tái)的網(wǎng)絡(luò)環(huán)境中。該方案能非常好地解決測(cè)試軟件設(shè)計(jì)中遠(yuǎn)程調(diào)試、遠(yuǎn)程操作以及運(yùn)行環(huán)境無(wú)法統(tǒng)一的問(wèn)題,為老舊測(cè)試設(shè)備的聯(lián)網(wǎng)升級(jí)改造、多臺(tái)測(cè)試機(jī)的組網(wǎng)運(yùn)行,提供了一種簡(jiǎn)單易行的技術(shù)方案。
Python腳本在運(yùn)行時(shí)首先會(huì)被編譯為中間字節(jié)碼,再通過(guò)解釋器解釋執(zhí)行,執(zhí)行過(guò)程中解釋器會(huì)進(jìn)行大量的類(lèi)型檢查、自省等操作,導(dǎo)致Python代碼的運(yùn)行效率和實(shí)時(shí)性表現(xiàn)較差[7]。虛擬儀器程序和自動(dòng)測(cè)試軟件,對(duì)運(yùn)行性能和實(shí)時(shí)性往往有較高的要求。調(diào)用經(jīng)SWIG封裝的儀器驅(qū)動(dòng)模塊時(shí),隱含的類(lèi)型轉(zhuǎn)換、數(shù)據(jù)拷貝等跨語(yǔ)言調(diào)用,必然會(huì)引入一定的封裝延遲。因此,有必要定量測(cè)量和研究經(jīng)SWIG封裝后的Python儀器驅(qū)動(dòng)模塊的運(yùn)行效率。
本文選取了DAQ2206的5個(gè)API函數(shù),分別用C語(yǔ)言直接調(diào)用和用Python調(diào)用經(jīng)SWIG封裝后的驅(qū)動(dòng)模塊,統(tǒng)計(jì)執(zhí)行耗時(shí)、計(jì)算封裝開(kāi)銷(xiāo)。
在C程序中精確測(cè)量時(shí)間的原理是:北橋提供了高精度性能計(jì)數(shù)器,調(diào)用QueryPerformanceCounter和QueryPerformanceFrequency這兩個(gè)API可分別獲取其計(jì)數(shù)值和計(jì)數(shù)頻率。在被測(cè)函數(shù)前后插樁、獲取計(jì)數(shù)差值,除以計(jì)數(shù)頻率,即得到函數(shù)的執(zhí)行耗時(shí)。
表2 測(cè)試環(huán)境
嵌入式控制器 cPCI-2510計(jì)數(shù)頻率測(cè)得約為1.46 MHz(硬件決定),相當(dāng)于計(jì)時(shí)分辨力可達(dá)1 μs以上。測(cè)試次數(shù)1000次,數(shù)據(jù)統(tǒng)計(jì)如表3所示。
表3 性能測(cè)試數(shù)據(jù) μs
可以看出,SWIG接口轉(zhuǎn)換引入的封裝耗時(shí)約為2~15 μs。Register_Card,Release_Card的延遲相對(duì)其他API較高,但由于只在初始化階段和程序退出時(shí)調(diào)用,封裝開(kāi)銷(xiāo)對(duì)性能的影響基本可忽略。其他3個(gè)API函數(shù)的封裝開(kāi)銷(xiāo)為2~3 μs,與API本身的執(zhí)行時(shí)間沒(méi)有明顯關(guān)聯(lián)。受操作系統(tǒng)任務(wù)調(diào)度影響,Windows軟件的實(shí)時(shí)性指標(biāo)往往只能達(dá)到10 ms左右,因此微秒級(jí)的調(diào)用開(kāi)銷(xiāo)一般不會(huì)對(duì)測(cè)試任務(wù)產(chǎn)生嚴(yán)重影響。
在對(duì)程序性能要求非常嚴(yán)格的場(chǎng)合,不建議非常頻繁(如每秒數(shù)千次以上)地調(diào)用SWIG封裝后的API函數(shù)(如AI_VoltScale)。此時(shí),可以將最耗時(shí)的底層關(guān)鍵代碼用C語(yǔ)言實(shí)現(xiàn),一并編譯、封裝到Python儀器驅(qū)動(dòng)拓展模塊中,作為整體進(jìn)行調(diào)用,這樣既可以使用Python語(yǔ)言進(jìn)行高效率的開(kāi)發(fā),也不會(huì)由于SWIG封裝和Python解釋運(yùn)行而導(dǎo)致軟件整體的實(shí)時(shí)性受到破壞。
在100 Mbps局域網(wǎng)環(huán)境下,遠(yuǎn)程調(diào)用驅(qū)動(dòng)API會(huì)再引入約2 ms的傳輸延遲,可能對(duì)軟件的執(zhí)行效率產(chǎn)生一定的影響。因此,遠(yuǎn)程調(diào)用一般更適用于軟件調(diào)試、低速數(shù)據(jù)采集等實(shí)時(shí)性要求相對(duì)較低的場(chǎng)景。
測(cè)試軟件是虛擬儀器和自動(dòng)測(cè)試系統(tǒng)的核心,傳統(tǒng)的測(cè)試開(kāi)發(fā)平臺(tái)使用中存在較大的局限性。本文通過(guò)SWIG將儀器驅(qū)動(dòng)程序轉(zhuǎn)換為Python拓展模塊,彌補(bǔ)了Python在底層編程方面的不足,解決了用Python進(jìn)行儀器編程的主要障礙。
受益于Python的自動(dòng)內(nèi)存管理、動(dòng)態(tài)類(lèi)型、面向?qū)ο笠约柏S富的拓展庫(kù),用Python開(kāi)發(fā)測(cè)試軟件,可提高編程效率,降低在分布式、跨平臺(tái)的環(huán)境下設(shè)計(jì)和開(kāi)發(fā)測(cè)試軟件的難度,縮短復(fù)雜測(cè)控系統(tǒng)的開(kāi)發(fā)時(shí)間,一定程度上也有助于提高儀器的可互換性。在對(duì)軟件實(shí)時(shí)性、儀器操作性能等有較高要求的場(chǎng)合,可采用C語(yǔ)言和Python混合編程,在軟件開(kāi)發(fā)效率和運(yùn)行效率之間,取得比較好的平衡。
[1] 丁未.將工業(yè)與科技世界的運(yùn)行統(tǒng)一在Python語(yǔ)言的開(kāi)源框架中[J].中國(guó)儀器儀表,2013(08):23-25.
[2] Hughes J M.真實(shí)世界的Python儀器監(jiān)控 : Real world instrumentation with Python:數(shù)據(jù)采集與控制系統(tǒng)自動(dòng)化[M].北京:電子工業(yè)出版社,2013.
[3] Beazley D M.SWIG: An Easy to Use Tool for Integrating Scripting Languages with C and C++[C]// Usenix Tcl/tk Workshop,1996.
[4] 黃建軍,李宥謀,劉婧,等.基于Python語(yǔ)言的自動(dòng)化測(cè)試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2017,40(4):39-43.
[5] Beazley D M.Automated scientific software scripting with SWIG[J].Future Generation Computer Systems,2003,19(5):599-609.
[6] Weltzin C,Schlonsky S.Reducing obsolescence of Linux-based ATEs with virtualization[J].Instrumentation & Measurement Magazine IEEE,2011,14(4):1-3.
[7] 范浩杰.面向Python程序源代碼的分析與編譯優(yōu)化研究[D].北京:北京信息科技大學(xué),2015.