張 博 李 黎 何海龍 劉艷行
(西安電子工程研究所 西安 710100)
自20世紀(jì)80年代后期以來(lái),PC機(jī)的性能得到極大提升,針對(duì)測(cè)試分析的通用軟件的需求不斷增長(zhǎng),使得虛擬儀器[1]應(yīng)運(yùn)而生。測(cè)試儀器的發(fā)展經(jīng)歷了,第一代模擬式測(cè)試儀器、第二代分立元件式測(cè)試儀器、第三代數(shù)字式測(cè)試儀器和第四代智能化測(cè)試儀器,虛擬測(cè)試儀器即將成為最新一代的測(cè)試儀器。借助于通用的模擬量或數(shù)字量輸入輸出接口,進(jìn)行程序編寫,并采用成熟的數(shù)學(xué)模型來(lái)實(shí)現(xiàn)對(duì)信號(hào)的測(cè)量、控制、變換、分析、顯示、輸出等功能。虛擬儀器不僅開發(fā)周期短,而且開發(fā)費(fèi)用低廉。隨著硬件載體的不斷提升和新算法的引入,虛擬儀器相比于傳統(tǒng)測(cè)試儀器也可以方便地更新和擴(kuò)展,并具有很強(qiáng)的重用性和可配置性被廣泛應(yīng)用于各個(gè)測(cè)試領(lǐng)域。虛擬示波器是虛擬儀器基礎(chǔ)平臺(tái)的重要組成部分,是技術(shù)發(fā)展的必然,也是客觀要求,具有重要的工程價(jià)值。
虛擬儀器的功能可以在很多硬件平臺(tái)下通過(guò)編程實(shí)現(xiàn)。PC平臺(tái)因其應(yīng)用廣泛而且兼容性強(qiáng),逐漸成為了虛擬儀器的主流平臺(tái)。vxWorks和unix系統(tǒng)因其實(shí)時(shí)性好被廣泛應(yīng)用在試驗(yàn)環(huán)境。而Windows系統(tǒng)作為非實(shí)時(shí)性系統(tǒng)很少被用來(lái)設(shè)計(jì)高速虛擬測(cè)試儀器。本文所述虛擬示波器軟件通過(guò)合理的線程運(yùn)用和精密的定時(shí)器設(shè)計(jì)在PC平臺(tái)Windows系統(tǒng)下完成了高速數(shù)據(jù)錄取式示波器的設(shè)計(jì)。本文示波器軟件通過(guò)串口通信對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)錄取,通過(guò)PCOMM串口庫(kù)的應(yīng)用,達(dá)到了230400bps等常用高速串口的通信速率。并對(duì)傳統(tǒng)示波器的各項(xiàng)分析功能進(jìn)行了模擬實(shí)現(xiàn)。并通過(guò)WPF實(shí)現(xiàn)了美觀的界面設(shè)計(jì)和流暢的圖顯效果。
虛擬示波器作為圖顯軟件,針對(duì)數(shù)據(jù)曲線圖的動(dòng)態(tài)繪制可分為時(shí)間驅(qū)動(dòng)和數(shù)據(jù)驅(qū)動(dòng)兩類。時(shí)間驅(qū)動(dòng)繪圖是指將數(shù)據(jù)與時(shí)間對(duì)應(yīng),以時(shí)間為橫軸,對(duì)數(shù)據(jù)進(jìn)行時(shí)間采樣來(lái)描點(diǎn)繪圖,能反應(yīng)數(shù)據(jù)隨時(shí)間的變化情況。數(shù)據(jù)驅(qū)動(dòng)繪圖(即逐幀顯示)是指將數(shù)據(jù)直接和圖形對(duì)應(yīng),以數(shù)據(jù)幀為橫軸,對(duì)緩沖區(qū)里的每一幀數(shù)據(jù)都進(jìn)行描點(diǎn)繪圖,來(lái)實(shí)現(xiàn)對(duì)高精度要求產(chǎn)品的嚴(yán)格監(jiān)控。本文采用逐幀顯示的數(shù)據(jù)驅(qū)動(dòng)繪圖方式,要求錄取數(shù)據(jù)的完整性和繪圖的高速度,在保證串口不丟數(shù)據(jù)的同時(shí),數(shù)據(jù)處理層必須快速即時(shí)地完成對(duì)接收數(shù)據(jù)的處理并合理地配合UI層的數(shù)據(jù)調(diào)度完成逐幀顯示。
另外,本文虛擬示波器軟件的動(dòng)態(tài)曲線繪圖方式也區(qū)別于傳統(tǒng)時(shí)間驅(qū)動(dòng)的繪圖方式,是采用同示波器儀器一致的逐屏刷新顯示模式,不僅可以表現(xiàn)更多的數(shù)據(jù)信息,而且更契合硬件工程師的儀表使用習(xí)慣。對(duì)實(shí)時(shí)數(shù)據(jù)也提供文件記錄并保存,可以精確地對(duì)應(yīng)每一幀的數(shù)據(jù)情況。對(duì)曲線圖也可以截圖保存,可以直觀的保留數(shù)據(jù)信息。同時(shí)引入終端通信功能,可以通過(guò)虛擬示波器軟件對(duì)被測(cè)系統(tǒng)發(fā)送命令,實(shí)現(xiàn)簡(jiǎn)單的模式控制和參數(shù)修改功能。
本文所述虛擬示波器軟件設(shè)計(jì)主要分為三個(gè)部分:數(shù)據(jù)錄取及實(shí)時(shí)指令通信,曲線圖逐幀顯示,數(shù)據(jù)分析保存。程序的編寫在WPF開發(fā)環(huán)境下完成。
Windows呈現(xiàn)基礎(chǔ)(Windows Presentation Foundation,WPF)[2]是微軟新一代圖形系統(tǒng),運(yùn)用在.NET Framework 3.0以上版本,為用戶界面、2D/3D圖像、文檔和媒體提供了統(tǒng)一的描述和操作方法,同時(shí)提升了處理速度。得益于WPF強(qiáng)大的圖形向量渲染引擎,程序開發(fā)人員可以設(shè)計(jì)出效果豐富的控件系統(tǒng)和靈活美觀的程序應(yīng)用界面。同時(shí)WPF采用DirectX引擎技術(shù),并且支持GPU硬件加速,相比于傳統(tǒng)的GDI+/GDI圖形系統(tǒng)在性能上得到了極大提升。
傳統(tǒng)偏重于利用CPU來(lái)進(jìn)行數(shù)據(jù)與圖形處理的技術(shù),由于占用過(guò)多CPU資源,影響CPU的運(yùn)算速度。但是隨著現(xiàn)代計(jì)算機(jī)顯卡等顯示技術(shù)的不斷提升。WPF技術(shù)充分利用計(jì)算機(jī)的顯卡功能,讓出了更多的CPU空間來(lái)進(jìn)行數(shù)據(jù)處理,這樣大大提升了CPU運(yùn)算速度,保證了軟件運(yùn)行的流程與處理速度。
WPF使用XAML語(yǔ)言作為界面結(jié)構(gòu)語(yǔ)言,后臺(tái)使用C#高級(jí)語(yǔ)言,擁有多種編程模式,適用于多種數(shù)據(jù)訪問(wèn)接口,方便與第三方軟件集成。
虛擬示波器軟件的串口端口,可以使用.NET基本類,System.IO.ports命令空間中的SerialPort類來(lái)實(shí)現(xiàn)。SerialPort類是在C#里被很好封裝的串口類,波特率上限115200bps,適合試驗(yàn)室使用。也可以使用成熟的工業(yè)級(jí)串口工具PComm Lite。配合Moxa模塊波特率上限可達(dá)921600bps,并且在多串口模式下也可以高速穩(wěn)定的工作。具體使用可下載并引用pcomm.dll并編寫接口類可以在WPF下,使用PComm Lite內(nèi)的串口函數(shù),完成對(duì)串口緩沖區(qū)數(shù)據(jù)的合理規(guī)劃和高效管理。
PingPong緩沖機(jī)制[3]是一種數(shù)據(jù)緩存手段,通過(guò)PingPong操作可以提高數(shù)據(jù)傳輸效率。在兩個(gè)功能模塊順序地處理數(shù)據(jù)時(shí),如果上一級(jí)功能模塊所產(chǎn)生的新數(shù)據(jù)不能馬上被下一級(jí)功能模塊處理完成而消費(fèi)掉,為了保證每幀數(shù)據(jù)都被處理,上一級(jí)就必須等待下一級(jí)完成數(shù)據(jù)消費(fèi)才可以產(chǎn)生并發(fā)送新的數(shù)據(jù)。然而在串口通信中,為了保證高速的數(shù)據(jù)率,上一級(jí)的數(shù)據(jù)產(chǎn)生不會(huì)等待下一級(jí)復(fù)雜的數(shù)據(jù)處理以及耗時(shí)的UI更新,這樣就會(huì)嚴(yán)重影響虛擬示波器軟件的數(shù)據(jù)錄取性能,導(dǎo)致數(shù)據(jù)丟失現(xiàn)象發(fā)生,無(wú)法保證對(duì)待測(cè)設(shè)備完整精確的監(jiān)控。使用PingPong緩沖機(jī)制可以不去等待下一級(jí)處理結(jié)束,而是先將上一級(jí)產(chǎn)生的未處理數(shù)據(jù)存在Ping路的緩沖區(qū)中,等存滿后通知下一級(jí)開始對(duì)Ping緩沖區(qū)進(jìn)行消費(fèi)。在Ping緩沖區(qū)被消費(fèi)期間,上一級(jí)產(chǎn)生的未處理數(shù)據(jù)轉(zhuǎn)到Pong緩沖區(qū)存放,當(dāng)Pong緩沖區(qū)存滿時(shí),Ping緩沖區(qū)已經(jīng)被消費(fèi)完成并準(zhǔn)備好保存新數(shù)據(jù)了,此時(shí)下一級(jí)切換到Pong緩沖區(qū)消耗,而Ping緩沖區(qū)再打開并開始存儲(chǔ)。這種雙緩沖機(jī)制,可以使上級(jí)數(shù)據(jù)不間斷地產(chǎn)生,并且都能得到處理,從而提高了處理效率,保證了在高速串口通信情況下,虛擬示波器軟件也依然保持優(yōu)秀的數(shù)據(jù)采集完整性。
在大多數(shù)情況下,傳統(tǒng)示波器儀表只是單方面的信號(hào)采樣。對(duì)于工作在不同工作模式下的信號(hào)源,一般可以外部切換好了之后再連接示波器進(jìn)行監(jiān)測(cè)。然而作為本身就占有一個(gè)串口的虛擬示波器,如果再通過(guò)通過(guò)外部改變待測(cè)設(shè)備的工作狀態(tài),會(huì)產(chǎn)生很多不便。于是在實(shí)際工作情況下,本文所述虛擬示波器軟件可以同時(shí)通過(guò)串口和被測(cè)硬件通信,控制待測(cè)工作模式的切換,并通過(guò)配置文件的修改實(shí)現(xiàn)通信協(xié)議的靈活切換。
本文所述虛擬示波器軟件被用于DSP信號(hào)的監(jiān)測(cè),要求軟件5 ms為周期不間斷發(fā)送工作模式命令和參考信號(hào)才能實(shí)現(xiàn)對(duì)DSP不同工作模式的切換監(jiān)測(cè)。這對(duì)以Windows為平臺(tái)的虛擬示波器軟件設(shè)計(jì)是一個(gè)難點(diǎn)。NET Framework支持四種定時(shí)器,然而精密度都不準(zhǔn)(最低只能達(dá)到15 ms),無(wú)法滿足高速設(shè)計(jì)要求。Windows不是實(shí)時(shí)操作系統(tǒng),所以在不涉及內(nèi)核驅(qū)動(dòng)層面的條件下,想要實(shí)現(xiàn)高精密定時(shí)器,需要使用等待機(jī)制和計(jì)時(shí)工具兩種基礎(chǔ)功能。這里不討論多媒體定時(shí)器[4]的原因,是在WPF下的多媒體定時(shí)器依托事件機(jī)制,而在多線程應(yīng)用中,事件由于低的優(yōu)先級(jí),經(jīng)常會(huì)受到干擾,影響定時(shí)器精度。
等待機(jī)制有兩種分為自旋等待和阻塞等待。自旋等待就是讓CPU以空轉(zhuǎn)的方式來(lái)完成時(shí)間消耗,雖然使用了較多CPU時(shí)間,但是時(shí)間的精度高。阻塞等待就是所處線程阻塞,在等待規(guī)定時(shí)間后再由操作系統(tǒng)控制返回運(yùn)行狀態(tài)。雖然阻塞不占CPU,但是需要操作系統(tǒng)控制執(zhí)行,時(shí)間無(wú)法控制。
計(jì)時(shí)機(jī)制在WPF下最適合的就是Stopwatch類。精度取決于硬件的主頻,精度可以高達(dá)幾十ns。
本文虛擬示波器軟件使用自旋等待機(jī)制配合Stopwatch計(jì)時(shí),實(shí)現(xiàn)了高精度的定時(shí)器,偽代碼如下:
var計(jì)時(shí)開始時(shí)刻 = 目前時(shí)刻;
while((目前時(shí)刻-計(jì)時(shí)開始時(shí)刻)<規(guī)定延遲時(shí)長(zhǎng))
{
自旋;
}
改成實(shí)際代碼如下:
void Spin(Stopwatch timer, int duration )
{
var current = timer.ElapsedMilliseconds;
while ((timer.ElapsedMilliseconds - current) < duration)
Thread.SpinWait(10);
}
這里timer是Stopwatch類的一個(gè)對(duì)象,其中ElapsedMilliseconds屬性可以實(shí)現(xiàn)毫秒級(jí)的精度,而ElapsedTicks屬性可以實(shí)現(xiàn)高達(dá)微秒級(jí)的時(shí)間精度。運(yùn)用高優(yōu)先級(jí)的線程[5]單獨(dú)運(yùn)行這種定時(shí)器可以保證在微秒級(jí)的定時(shí)精度下,穩(wěn)定觸發(fā)指定任務(wù),保證本文虛擬示波器軟件達(dá)到了200Hz穩(wěn)定可靠的數(shù)據(jù)率。
虛擬示波器軟件在確保錄取數(shù)據(jù)完整的同時(shí),還應(yīng)該確保數(shù)據(jù)曲線圖顯示的完整性。如果程序只有一個(gè)線程在運(yùn)行,當(dāng)程序進(jìn)行數(shù)據(jù)接收并處理與曲線圖逐幀顯示的這段時(shí)間內(nèi),無(wú)法處理數(shù)據(jù)命令發(fā)送,使得下位機(jī)返回?cái)?shù)據(jù)丟失,也有很大的概率造成整個(gè)界面卡死。因此為了提升程序效率,使程序能夠同時(shí)處理多種并行功能,不可避免地要引入多線程技術(shù)[6]。
線程是操作系統(tǒng)分派CPU時(shí)間的基本單元。每個(gè)線程所分派的CPU時(shí)間片很小,程序是對(duì)時(shí)間片的輪轉(zhuǎn)訪問(wèn)來(lái)運(yùn)行的。其實(shí)多線程是異步運(yùn)行的。在避免線程之間數(shù)據(jù)競(jìng)爭(zhēng)的前提下,本文虛擬示波器軟件分別為串口通信任務(wù)和曲線繪制任務(wù)開辟線程。使得多條任務(wù)線程同時(shí)運(yùn)行,顯著提高了系統(tǒng)性能。
本文pingpong緩存機(jī)制也保證了線程之間沒(méi)有同時(shí)調(diào)取的數(shù)據(jù),不會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)。同時(shí)使用WaitOneEevent來(lái)分時(shí)觸發(fā)并行任務(wù),進(jìn)一步保證了程序的線程安全。本文軟件中的線程框圖如圖1所示:
圖1 軟件多線程框圖
示波器被譽(yù)為“工程師的眼睛”。最初是通過(guò)狹窄并且高速的電子束,打在熒光平面上通過(guò)描繪待測(cè)電信號(hào)瞬時(shí)值變化曲線,來(lái)描述電現(xiàn)象的變化過(guò)程的。其經(jīng)典的掃描式顯示模式一直深入人心,也成為工程師的儀表使用習(xí)慣。本文虛擬示波器軟件模擬了這一經(jīng)典顯圖風(fēng)格。
人類視覺(jué)系統(tǒng)(HVS)對(duì)時(shí)間頻率的反應(yīng)時(shí)間是,在普通亮度環(huán)境下,圖像幀的變化頻率應(yīng)該在15 Hz到20 Hz之間。平衡顯示圖像的幀速率一般為22fps到30fps之間。然而本虛擬示波器軟件采用數(shù)據(jù)驅(qū)動(dòng)繪圖方式,每屏應(yīng)盡量容納更多的數(shù)據(jù)信息,也就使得最終圖像畫布上承載上千個(gè)數(shù)據(jù)點(diǎn)的信息。要一次性連接千個(gè)數(shù)據(jù)點(diǎn)并形成曲線,如果點(diǎn)與點(diǎn)之間變化很大,就相當(dāng)于WPF要通過(guò)PolyLine在畫布上大范圍地掃來(lái)掃去,這樣會(huì)每幀產(chǎn)生上百萬(wàn)個(gè)像素點(diǎn)。即使WPF有著硬件加速,但是要完成這樣的任務(wù)還是非常耗時(shí)的,無(wú)法保證曲線平滑的顯示。為了滿足25fps的幀速率,需要每40ms更新一次圖像??紤]到本文應(yīng)用場(chǎng)景是200 Hz的數(shù)據(jù)率,所以每次只能對(duì)8個(gè)點(diǎn)進(jìn)行更新顯示。因此可以把PolyLine的思路換成上千個(gè)成員的Line數(shù)組添加到畫布上,每次只在8個(gè)需要更新的數(shù)據(jù)點(diǎn)處進(jìn)行連接直線的刪除和新建這樣的更新操作,而其他的位置不變,就可以在40ms的周期內(nèi)完成每幀數(shù)據(jù)的更新。接著再模仿示波器掃描圖顯模式,橫掃的方式確定需要更新的那8個(gè)點(diǎn)的位置進(jìn)行替換,這樣就可以在保證平滑顯示的前提下完成對(duì)示波器掃描圖形顯示模式的模擬。而且這種繪圖方式也可以同時(shí)進(jìn)行多通道數(shù)據(jù)的多曲線繪圖顯示。
本文使用虛擬示波器軟件與串口數(shù)據(jù)率200 Hz的DSP待測(cè)硬件進(jìn)行了模式信號(hào)監(jiān)測(cè)和指令交互式信號(hào)監(jiān)測(cè)。從實(shí)驗(yàn)結(jié)果上看,完全滿足設(shè)計(jì)要求。CPU使用率和內(nèi)存使用率等性能指標(biāo)也符合要求。
本文虛擬示波器界面如圖2所示:
圖2 虛擬示波器界面圖