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