夏玉龍 ,趙懷林 ,和 陽(yáng)
(1.上海應(yīng)用技術(shù)學(xué)院 電氣與電子工程學(xué)院,上海 201418;2.清華大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,北京 100084)
虛擬儀器就是一種基于計(jì)算機(jī)的自動(dòng)化測(cè)試儀器系統(tǒng),通過(guò)軟件將計(jì)算機(jī)硬件資源與儀器硬件資源有機(jī)地融合為一體。與傳統(tǒng)儀器相比,虛擬儀器更加突出軟件的核心地位,具有開(kāi)放性、靈活、價(jià)格低廉、技術(shù)更新周期短、用戶(hù)可以定義儀器功能等特點(diǎn)[1]。
本系統(tǒng)需要完成數(shù)據(jù)采集、傳輸、存儲(chǔ)以及其他功能。軟件設(shè)計(jì)是整個(gè)測(cè)試系統(tǒng)最重要和復(fù)雜的部分,同時(shí)也是整個(gè)測(cè)試系統(tǒng)的核心。因此,選擇恰當(dāng)?shù)能浖_(kāi)發(fā)工具可以起到事半功倍的功效。在當(dāng)今的軟件開(kāi)發(fā)語(yǔ)言中,C、VC++、C#、Java、LabVIEW等都可以完成本系統(tǒng)所要求的功能。
LabVIEW(laboratory virtual instrument engineering workbench)是美國(guó)國(guó)家儀器公司NI(National Instruments)的創(chuàng)新軟件產(chǎn)品。LabVIEW是一種圖形化編程語(yǔ)言,被稱(chēng)作 “G”語(yǔ)言。G指的是Graphical Programming Language。與傳統(tǒng)的軟件開(kāi)發(fā)語(yǔ)言相比,LabVIEW的圖形化編程方式能夠節(jié)省85%以上的程序開(kāi)發(fā)時(shí)間,其運(yùn)行速度卻不受影響,體現(xiàn)出了極高的效率,同時(shí)也可以享受LabVIEW控件帶來(lái)的極大的便捷性,再加上LabVIEW在數(shù)據(jù)采集、分析、圖表顯示等方面的卓越表現(xiàn)成為了本系統(tǒng)開(kāi)發(fā)工具的首選。
LabVIEW程序是由VI組成的,VI包括前面板和程序框圖。一般常規(guī)語(yǔ)言創(chuàng)建的程序,由一個(gè)圖形界面窗口(一般稱(chēng)為GUI)和文本編輯窗口組成。LabVIEW中的VI,前面板相當(dāng)于GUI,程序框圖相當(dāng)于文本編輯器。顯然,前面板是人機(jī)交互的接口,而程序框圖是用來(lái)編寫(xiě)代碼的。LabVIEW最大的特點(diǎn)就是它的代碼以圖形化的方式出現(xiàn)。
前面板中放置的是輸入/輸出控件,程序框圖中放置的則是與控件對(duì)應(yīng)的函數(shù)以及代表 “數(shù)據(jù)流”的連線(xiàn)。LabVIEW程序的核心是數(shù)據(jù)流,也就是說(shuō),只有數(shù)據(jù)流流經(jīng)某節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)才會(huì)執(zhí)行。數(shù)據(jù)按照代表“數(shù)據(jù)流”的連線(xiàn)從一個(gè)函數(shù)(或變量)流向另一個(gè)函數(shù)(或變量)來(lái)完成各種各樣的功能。
如圖1所示,整個(gè)測(cè)試系統(tǒng)由裝有基于Lab-VIEW開(kāi)發(fā)的測(cè)試系統(tǒng)軟件的計(jì)算機(jī)、DSP、傳感器組成。依據(jù)內(nèi)部通訊協(xié)議,上位機(jī)通過(guò)RS422總線(xiàn)與DSP進(jìn)行串口通訊[2]。上位機(jī)通過(guò)如圖2所示的人機(jī)交互界面將來(lái)自于測(cè)試人員的指令封裝成8字節(jié)的具有幀頭、指令數(shù)據(jù)、校驗(yàn)和的數(shù)據(jù)幀。DSP在接收到來(lái)自上位機(jī)的數(shù)據(jù)幀后,先通過(guò)計(jì)算校驗(yàn)和來(lái)驗(yàn)證幀數(shù)據(jù)的準(zhǔn)確性,確認(rèn)幀無(wú)誤后,將幀數(shù)據(jù)進(jìn)行解封裝,得到指令數(shù)據(jù),而后將指令數(shù)據(jù)發(fā)送給驅(qū)動(dòng)器。驅(qū)動(dòng)器得到來(lái)自DSP的指令后,驅(qū)動(dòng)待測(cè)電機(jī),使之按測(cè)試人員的意圖進(jìn)行運(yùn)行。待測(cè)電機(jī)運(yùn)行時(shí)的電壓、電流、轉(zhuǎn)速等參數(shù)由傳感器進(jìn)行捕獲,并形成模擬信號(hào),傳送給A/D轉(zhuǎn)換器。A/D轉(zhuǎn)換器將傳感器傳來(lái)的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),而后發(fā)送給DSP,DSP依據(jù)內(nèi)部通訊協(xié)議,將數(shù)據(jù)封裝成16字節(jié)的數(shù)據(jù)幀,通過(guò)RS422總線(xiàn),由串口設(shè)備發(fā)送給上位機(jī)。上位機(jī)接收到數(shù)據(jù)幀后,同樣先驗(yàn)證校驗(yàn)和,確保幀數(shù)據(jù)無(wú)誤后,對(duì)幀進(jìn)行解析從而得到待測(cè)電機(jī)的電壓、電流、轉(zhuǎn)速等信息,并在界面上顯示出來(lái)[3]。
圖1 電機(jī)測(cè)試系統(tǒng)結(jié)構(gòu)示意圖Fig.1 Diagram of motor test system structure
圖2 人機(jī)交互界面Fig.2 Graphic user interface
串口設(shè)置模塊提供設(shè)置端口號(hào)、波特率等串口屬性的接口。在實(shí)時(shí)轉(zhuǎn)速控制模塊中,單次控制,可通過(guò)修改界面控件值、鍵盤(pán)↑↓光標(biāo)鍵來(lái)控制轉(zhuǎn)速;程序控制,通過(guò)時(shí)序指令配置模塊配置程控指令,而后進(jìn)行測(cè)試時(shí),以2 ms的時(shí)間間隔發(fā)送這些預(yù)先配置好的程控指令。最后,在結(jié)束單次控制或程序控制之后,該系統(tǒng)都會(huì)以2 ms的時(shí)間間隔發(fā)送最近一次控制指令,以達(dá)到對(duì)電機(jī)持續(xù)穩(wěn)定的控制。電機(jī)測(cè)試系統(tǒng)各個(gè)模塊如圖3所示。實(shí)時(shí)數(shù)據(jù)顯示和保存,以各種控件為載體,數(shù)據(jù)以文本、儀表、曲線(xiàn)多種形式呈現(xiàn);保存的數(shù)據(jù)可以在測(cè)試之后做進(jìn)一步的分析。
圖3 電機(jī)測(cè)試系統(tǒng)各個(gè)模塊Fig.3 Each module of motor test system
在這個(gè)模塊中,顯然,單次控制具有偶然性,并且系統(tǒng)對(duì)單次控制的響應(yīng)要具有很好的實(shí)時(shí)性。在前面板的鼠標(biāo)點(diǎn)擊、修改數(shù)值控件或按下鍵盤(pán)上下光標(biāo)鍵的情況下,該系統(tǒng)會(huì)執(zhí)行生成并發(fā)送單次控制指令的程序。輪詢(xún)方式和事件結(jié)構(gòu)均可以完成此目的。輪詢(xún)方式具有結(jié)構(gòu)清晰、程序流程明確、響應(yīng)及時(shí)的特點(diǎn),但是在單次控制任務(wù)不發(fā)生的情況下,輪詢(xún)方式依然會(huì)不斷地查詢(xún)標(biāo)志變量。這會(huì)造成極大的CPU資源浪費(fèi)。相反,事件結(jié)構(gòu)的優(yōu)點(diǎn)則是減少CPU,同時(shí)還具有響應(yīng)及時(shí)的特點(diǎn)。更重要的是事件結(jié)構(gòu)采用隊(duì)列方式來(lái)存儲(chǔ)觸發(fā)時(shí)間,這樣就避免了漏掉事件的可能[4-6]。
與單次控制不同,一旦程序控制開(kāi)始,便要以2 ms的時(shí)間間隔不停發(fā)送控制指令。有2種方案可以采用,第一種是生成一條指令就立即發(fā)送,這樣做的好處是,占用的內(nèi)存空間少,但要求CPU必須在2 ms的時(shí)間內(nèi)完成多次讀寫(xiě)內(nèi)存操作,這對(duì)于CPU來(lái)說(shuō)負(fù)荷過(guò)大,而且在CPU繁忙時(shí),2 ms的定時(shí)精度也不一定能達(dá)到。另一種則是在發(fā)送之前生成所有指令數(shù)據(jù)存入硬盤(pán)文件并一次性讀入內(nèi)存,然后再逐一發(fā)送,這樣做的好處是,在發(fā)送期間CPU的負(fù)擔(dān)大大減輕,只需在連續(xù)的內(nèi)存空間完成讀操作,從而2 ms的定時(shí)精度有了極大的保證,同時(shí),由于數(shù)據(jù)存于硬盤(pán)文件中,又可以達(dá)到同樣程序控制的多次復(fù)用,交換這些好處的成本僅僅是復(fù)出一些內(nèi)存空間和磁盤(pán)空間。比較之下,顯然第二種方案更佳。
以2 ms時(shí)間間隔不間斷發(fā)送最近一條指令和上述2種串口發(fā)送任務(wù)都需要發(fā)送串口數(shù)據(jù)而且情況均不一樣,因此需要調(diào)用3次串口發(fā)送函數(shù)來(lái)完成。顯然,可將3次函數(shù)調(diào)用分別放在3個(gè)線(xiàn)程,通過(guò)設(shè)置檢測(cè)一些標(biāo)志變量實(shí)現(xiàn)任務(wù)間的切換。但是由于LabVIEW對(duì)線(xiàn)程的控制不足以達(dá)到這一要求,會(huì)造成單次發(fā)送任務(wù)和循環(huán)發(fā)送最近一條指令的任務(wù)相互干擾的現(xiàn)象。
正常情況下,圖4中應(yīng)該顯示實(shí)時(shí)發(fā)送的轉(zhuǎn)速,執(zhí)行完單次發(fā)送任務(wù)之后,上位機(jī)會(huì)繼續(xù)發(fā)送最近一條指令。而這里,執(zhí)行完單次發(fā)送任務(wù)之后,上位機(jī)沒(méi)有繼續(xù)發(fā)送最近一條指令,而是繼續(xù)發(fā)送最近一條指令的上一條指令。這樣就造成了圖中顯示的“干擾”現(xiàn)象。
圖4 串口發(fā)送任務(wù)之間的相互干擾Fig.4 Interference between the sending tasks
針對(duì)這種情況,可以利用LabVIEW的生產(chǎn)者-消費(fèi)者設(shè)計(jì)模式來(lái)完成。生產(chǎn)者-消費(fèi)者設(shè)計(jì)模式是多線(xiàn)程編程中最基本的設(shè)計(jì)模式,是while循環(huán)和隊(duì)列消息處理器相結(jié)合而構(gòu)成的復(fù)合設(shè)計(jì)模式。
如圖5最左側(cè)分支所示,生產(chǎn)者循環(huán)可以響應(yīng)鼠標(biāo)單擊、鍵盤(pán)按下等諸多事件直至程序結(jié)束。單次控制事件和程序控制事件發(fā)生以后,系統(tǒng)都會(huì)將指令放入隊(duì)列,然后消費(fèi)者循環(huán)從隊(duì)列中取出指令并將其發(fā)送,同時(shí)在各自的事件分支中還應(yīng)該設(shè)置一些標(biāo)志變量(如“程序控制”和“單次控制”變量),使消費(fèi)者循環(huán)不會(huì)相互影響。
如圖5最右側(cè)分支所示,循環(huán)發(fā)送最近一條指令會(huì)跟單次控制的發(fā)送任務(wù)放在一個(gè)條件結(jié)構(gòu)的不同分支中,同時(shí),這個(gè)條件結(jié)構(gòu)包含在一個(gè)更外層的循環(huán)中。這樣,在同一循環(huán)中,同時(shí)只能執(zhí)行一個(gè)分支下的代碼,因此就不會(huì)出現(xiàn)互相“干擾”的現(xiàn)象了。
如圖5中間分支所示,程序控制的串口發(fā)送任務(wù)則放在另一個(gè)消費(fèi)者循環(huán)當(dāng)中,只要保證程序控制進(jìn)行的過(guò)程中,單次發(fā)送的消費(fèi)者循環(huán)不會(huì)執(zhí)行任務(wù)代碼即可。
圖5 程序流程圖Fig.5 Flow chart of the program
如圖5所示的3個(gè)分支,大部分時(shí)間可以獨(dú)立地并行執(zhí)行,只在等待各自隊(duì)列數(shù)據(jù)的進(jìn)隊(duì)和出隊(duì)時(shí),3個(gè)分支之間才會(huì)有執(zhí)行的先后順序。這樣做的好處是可以充分利用現(xiàn)在計(jì)算機(jī)處理器的并行處理能力,提高了計(jì)算機(jī)程序的執(zhí)行效率。
對(duì)程序運(yùn)行時(shí)間的精確控制是編程者絞盡腦汁所追求的目標(biāo),但令人遺憾的是,在沒(méi)有硬件定時(shí)器的情況下,Windows操作系統(tǒng)能夠達(dá)到的最高精度是1 ms,而且這里所說(shuō)的1 ms指的是由電池保持的計(jì)算機(jī)系統(tǒng)時(shí)間。LabVIEW在7.x版本后,出現(xiàn)了一種新的定時(shí)結(jié)構(gòu)—定時(shí)循環(huán),它是可以用于Windows操作系統(tǒng)中提高程序?qū)r(shí)間控制精度的有效手段。但是,定時(shí)循環(huán)也會(huì)占用比較多的系統(tǒng)資源[6]。
此測(cè)試系統(tǒng)中,出于安全考慮,在非程序控制情況下,測(cè)試系統(tǒng)軟件會(huì)每隔2 ms發(fā)送一次最近一條指令給DSP控制器來(lái)保證電機(jī)不會(huì)失控。在程序控制的情況下,測(cè)試系統(tǒng)軟件也會(huì)每隔2 ms發(fā)送一條指令給DSP控制器來(lái)保證電機(jī)可以按照預(yù)先設(shè)計(jì)的方案運(yùn)行。要完成此目的,使用定時(shí)循環(huán)再合適不過(guò)了,只需將定時(shí)周期設(shè)置為2 ms即可。值得注意的是,如果定時(shí)循環(huán)內(nèi)完成任務(wù)實(shí)際所需時(shí)間高于2 ms,則定時(shí)循環(huán)會(huì)按部就班地執(zhí)行循環(huán)內(nèi)的任務(wù),并不會(huì)通過(guò)某種手段加速任務(wù)執(zhí)行以保證任務(wù)在2 ms內(nèi)完成。因此,在設(shè)計(jì)定時(shí)循環(huán)所要完成的任務(wù)時(shí),要充分精簡(jiǎn)任務(wù)以達(dá)到可以在一個(gè)周期內(nèi)完成。
為了驗(yàn)證本系統(tǒng)的實(shí)際性能,將本測(cè)試系統(tǒng)長(zhǎng)時(shí)間應(yīng)用于實(shí)際的電機(jī)測(cè)試當(dāng)中,并針對(duì)測(cè)試中遇到的問(wèn)題進(jìn)行改善,然后再進(jìn)行測(cè)試。在單次控制過(guò)程中,電機(jī)能及時(shí)響應(yīng),同時(shí)測(cè)試軟件也能及時(shí)動(dòng)態(tài)顯示電機(jī)的相關(guān)狀態(tài)。在程序控制過(guò)程中,不僅能保證電機(jī)和測(cè)試軟件及時(shí)響應(yīng),還能依據(jù)測(cè)試人員要求使轉(zhuǎn)速指令呈現(xiàn)正弦和折線(xiàn)等波形。如圖6所示,在定時(shí)任務(wù)中,通過(guò)示波器測(cè)定串口發(fā)送數(shù)據(jù)之間的時(shí)間間隔是2 ms,與預(yù)期相同,并且沒(méi)有丟幀。這說(shuō)明定時(shí)循環(huán)的定時(shí)精度還是十分精確和可靠的。測(cè)試完成后,系統(tǒng)能對(duì)測(cè)試數(shù)據(jù)執(zhí)行高效率的保存工作。除此之外,系統(tǒng)可以流暢正常運(yùn)行在Windows XP、Win7和Win8等常用操作系統(tǒng)平臺(tái)上,這說(shuō)明系統(tǒng)具有良好的移植性。
圖6 示波器測(cè)定的發(fā)送間隔Fig.6 Sending interval measured by oscilloscope
本測(cè)試系統(tǒng)采用LabVIEW作為開(kāi)發(fā)平臺(tái),將軟件工程思想應(yīng)用到測(cè)試系統(tǒng)開(kāi)發(fā)過(guò)程,使得代碼穩(wěn)定,可靠且執(zhí)行效率很高。本系統(tǒng)主要實(shí)現(xiàn)了串口通信、電機(jī)控制、數(shù)據(jù)顯示與保存。不僅實(shí)現(xiàn)了與被測(cè)電機(jī)的實(shí)時(shí)通信與控制,而且本系統(tǒng)的電機(jī)控制模塊通過(guò)巧妙設(shè)計(jì),使其在操作系統(tǒng)之上有了比較精確的時(shí)間控制。測(cè)試人員不僅可以享受操作系統(tǒng)的便捷性,而且可以使用該系統(tǒng)完成定時(shí)精度要求較高的測(cè)試任務(wù)。系統(tǒng)可以正常運(yùn)行在常見(jiàn)Windows操作系統(tǒng)上。因此,本文在基于虛擬儀器開(kāi)發(fā)測(cè)試系統(tǒng)方面和操作系統(tǒng)之上提高測(cè)試系統(tǒng)實(shí)時(shí)性方面具有良好的參考意義。
[1]楊忠仁,饒程,鄒建,等.基于LabVIEW數(shù)據(jù)采集系統(tǒng)[J].重慶大學(xué)學(xué)報(bào):自然科學(xué)版,2004,27(2):32-35.
[2]盧天海,王見(jiàn).基于LabVIEW的電機(jī)功耗實(shí)時(shí)監(jiān)測(cè)系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2012,20(3):580-582,609.
[3]呂向鋒,高洪林,馬亮,等.基于LabVIEW串口通信的研究[J].國(guó)外測(cè)量電子技術(shù),2009,28(12):27-30,42.
[4]雷振山.LabVIEW 7 Express使用技術(shù)教程[M].北京:中國(guó)鐵道出版社,2004.
[5]National Instrument Corporation.LabVIEW User Manual[Z].April,2007
[6]陳樹(shù)學(xué),劉萱.LabVIEW寶典[M].北京:電子工業(yè)出版社,2011.