, ,,,
(中國衛星海上測控部,江蘇 江陰 214431)
基于狀態報告的測量同步技術研究及應用
邱斌,夏偉,沈小青,余清華,丁風海
(中國衛星海上測控部,江蘇江陰214431)
自動測試系統中的測量同步對于提高測試系統性能和運行可靠性至關重要,基于狀態報告系統的同步技術比軟件延時法提供了更高的效率和更好的安全性;為解決自動測試系統中的指令同步問題,探討了IEEE488.2和可編程儀器標準命令(SCPI)的狀態報告模型、寄存器及同步機制,對利用SCPI狀態報告機制實現自動測試系統測量指令同步的原理和方法進行了深入研究;通過原理分析和實例解析,分析了幾種測量指令同步實現方法的時序、實現要點及關鍵技術,總結比較了幾種同步方法的區別和適用場合,解決了自動測試系統中測量指令同步的問題。
狀態報告系統;指令同步;自動測試系統
自動測試在科研、生產、國防、計量等領域得到了越來越廣泛的應用。相對手動測試而言,自動測試具有多種優勢,如能夠適應復雜的測試對象和繁重的測試任務、適應極端環境測試和瞬態及長時間測試、測試速度快、結果表示和分析處理功能強、對測試人員要求低等[1]。
自動測試系統在程序統一指揮下,通過各總線設備的互相配合,完成自動測量、狀態采集、數據處理、結果輸出等一系列工作[2]。在自動測試系統中,技術人員要解決的一個關鍵問題是如何處理設備與被測對象、設備與設備、設備與控制器之間的測量狀態同步,例如:當要讀取一臺頻譜分析儀的測量結果,必須在頻譜儀完成一次完整掃描后才能執行讀取指令,而不能提前執行讀操作,否則采集的軌跡數據是肯定不正確的。因此從系統角度考慮,要使測量過程可靠、效率優化、結果準確,首先要解決的問題就是自動測試系統中的測量同步。
20世紀70年代,自動測試領域最重要的進展就是制訂了IEEE 488.1標準(GPIB或IEC 625)。IEEE488.1主要規定了儀器在電氣上、機械上和功能上相容性的要求,保證了系統部件之間正確的電氣、機械連接,并提供傳送字節的可靠方法,但它對運行相容性的要求,即代碼、格式、通信協議和公用命令方面未作規定[3]。為此,1987年頒布的新標準IEEE 488.2“IEEE 標準代碼、格式、協議和公用命令”,解決了IEEE 488.1標準中許多問題。IEEE 488.2標準規定了一套代碼和格式,供IEEE488.1總線連接的系統器件使用。IEEE 488.2還定義了與具體器件無關的必要消息交換通信協議,并進一步定義了少量儀器公用命令[4]。但是,IEEE488.2并未解決器件消息標準化的問題,而器件消息的非標準化給編程人員造成很大的困難。為了解決這個問題,1990年4月,建立在IEEE488.2基礎上的可程控儀器標準命令SCPI(Standard Command for Programmable Instrument)應運而生。
SCPI是架構在IEEE488.2上的新一代儀器控制語法,主要包括語法形式、命令標記和數據交換等三部分內容,采用了僅面向功能而與儀器硬件和面板無關的準則。根據這一準則,SCPI提出3種形式兼容性概念,即“縱向兼容性”、“橫向兼容性”和“功能兼容性”[5]。使得同類型儀器具有相同的控制;不同類型儀器能做相同的測量,與使用的測量技術無關;不同種類儀器在相同的命令下完成相同的功能。SCPI是一個“活”標準,具有可擴充性和擴展能力,任何成員和廠商都可以提出意見,并經過一定手續寫入新版本,目前,最新發布版本SCPI-1999。
狀態報告系統保存所有當前設備操作狀態的信息,例如設備正在執行校準、發生的錯誤等。IEEE 488.2規定了統一的狀態報告模型,將狀態報告的內容歸納、合并,最后綜合反映到標準的狀態字節中。同時,還規定了若干用于服務請求和查詢的公用命令以配合狀態報告工作,通過3條專門用于同步的公用命令,保證程序和器件功能同步。
SCPI規定了專門的狀態子系統,實現了IEEE488.2第11章描述的狀態機制,包括狀態字節寄存器(STB)和事件狀態寄存器(ESR)結構[4]。此外,SCPI還增加定義了操作(Operation)狀態寄存器,以及可疑數據(Questionable)狀態寄存器,圖1給出了“SCPI要求的最小狀態報告結構”,虛線框內是IEEE488.2狀態報告系統最小結構。STB和它的關聯允許寄存器(SRE)構成狀態報告系統最高一層。STB從ESR和包含設備詳細信息的操作狀態寄存器和可疑數據狀態寄存器處采集信息。

圖1 SCPI要求的最小狀態報告結構
在前文中已提及測量同步對于自動測試系統的重要性,特別是當運行帶有某些操作,如測量復雜信號或執行自校準等操作時,在下一命令能夠執行前需有較長的等待完成時間。如果在下一命令前不能完成這些操作,就會產生錯誤和程序暫停運行。通常在自動測試程序中,最常用也是最簡單的同步方法是使用“軟件延時”法,即開發者通常在某項操作后及在發送下一控制指令前,在程序中控制插入一個軟件固定延遲,來“修復”這一問題。但問題是,大部分需同步的測量過程并不能事先計算得到準確的等待時間,開發者需要花大量的時間來調試軟件,并且常常會為了獲得足夠的時間安全裕量而故意預留更多的延時時間,不但費時費力,更是人為降低了總的系統吞吐率。更重要的是,“軟件延時法”有時會因為系統運行環境的變化,例如運行在不同的控制計算機上或更換了測試設備,實際延時時間會發生不可預期的變化[6],導致測試失敗,嚴重時甚至損壞測試儀器或被測設備。因此在自動測試程序中,應該任何時候都要盡量避免使用“軟件延時”方法同步測量指令,而SCPI繼承了IEEE488.2的基于狀態報告系統的同步機制,可以很好地解決上述問題。
SCPI中最簡單常用的同步方法是在需要等待執行完成的指令后加上“*WAI”命令[7],發送組合命令或分別發送都可以。“*WAI”不影響程序與其它儀器的通訊,由圖2可看出,寫入另一臺儀器的命令沒有受到“*WAI”指令的影響。
以下是使用“*WAI”同步方法完成頻譜儀掃描結束后讀取最大標記值功能的.NET C#代碼示例,本文后續示例代碼將使用不同的同步方法完成此功能。
mbSessionFsmr.Write("CALC:MARK1:MAX");
mbSessionFsmr.Write("INIT:CONT OFF");//單次掃描
mbSessionFsmr.Write("INIT;*WAI"); //使用*WAI同步
tempSpec = Double.Parse(
mbSessionFsmr.Query("CALC:MARK:MAX;Y?"));
圖2是使用NI I/O Trace軟件監視和記錄的儀器總線I/O通信內容,由圖2可以清楚觀察使用“*WAI”命令同步的I/O時序關系,讀取最大標記指令在等待了3.294 s才執行,這大約是頻譜分析儀在此次測量中的單次掃描時間。使用“*WAI”不影響程序與另一設備通訊。

圖2 “*WAI”同步的的I/O時序關系
另一個較簡單的測量指令同步方法是在需要同步的指令后面加上公用命令“*OPC?”,此命令類似于“*WAI”命令。兩者間的主要區別在于“*OPC?”的詢問結果確定后續同步操作,而在詢問結果響應前這段時間儀器的通訊將被掛起,直到前一個指令執行結束。示例代碼如下,由圖3看出,在查詢測量結果前,等待了約3 s的同步響應時間,這正是頻譜分析儀完成1次掃描的時間。
mbSessionFsmr.Write("CALC:MARK1:MAX");
mbSessionFsmr.Write("INIT:CONT OFF");//單次掃描
mbSessionFsmr.Write("INIT; *OPC?"); //使用*OPC?同步
tmpResult= mbSessionFsmr.ReadString();
tempSpec = Double.Parse(
mbSessionFsmr.Query("CALC:MARK:MAX;Y?"));
需要注意的是使用“*WAI”和“*OPC?”時,在程序中必須先將設備會話超時時間設置大于等待同步過程的時間,否則會產生超時錯誤。此外,“*OPC?”查詢命令在等待響應期間,將阻塞指令發送,使得程序不能向設備發送其它命令。所以,此同步方法通常適用于等待時間較小的場景。
使用“*OPC”命令進行測量同步是最復雜,但也是最靈活的一種方法。需要注意的是使用“*OPC?”和“*OPC”是有很大差別的,是兩種完全不同的方法。“*OPC?”查詢不影響事件狀態寄存器(ESR)的值,其響應結果被放置在輸出緩沖區中,因此其將影響狀態字節寄存器的MAV(bit4)位[8]。
所有遵循IEEE488.2的設備,都須實現事件狀態寄存器(ESR),ESR是一個8位寄存器,該寄存器的bit0被定義為“操作完成”位,如圖1所示。“*OPC”命令完成設備操作同步的原理就是在操作執行命令結束后,設備的狀態報告系統會將ESR的bit0置“1”,測試程序中只要使用“*ESR?”命令輪詢ESR的bit0狀態,即可判斷是否執行完畢,從而實現測量指令的同步。查詢ESR寄存器狀態可以使用公用查詢命令“*ESR?”,完成詢問操作后,ESR寄存器狀態將被清零。
以下是使用“*OPC”和事件狀態寄存器方法完成同樣功能的C#代碼。
mbSessionSA.Write("INIT;*OPC"); //執行指令后使用*OPC同步
while ((Convert.ToByte(mbSessionSA.Query("*ESR?")) amp; 1) == 0) //串行輪詢ESR的bit0狀態
Thread.Sleep(100); // 設置輪詢間隔時間100 ms
tempSpec=Double.Parse(mbSessionSAQuery("CALC:MARK:MAX;Y?"));//掃描完成讀取數據
需要指出的是,作為開發者通常應當盡量避免使用輪詢事件寄存器ESR的方法,因為這會耗費較長的CPU時間,阻塞程序運行。因此,實際自動測試程序中“*OPC”公用命令通常是和服務請求(SRQ)配合,一起使用實現測量指令同步。
IEEE488.2的服務請求機制可以用于處理來自設備或儀器各種源和原因的異步事件。在向儀器或設備發出控制指令后,主控計算機可能轉而處理其它事件,而當設備完成指定操作后,要求主控計算機實時回到原先的指令序列讀取數據或進行其它處理。另外,設備在超量程或輸出緩沖溢出時,也需要主控計算機中斷當前的工作為其服務[9]。服務請求(SRQ)功能就是適應這種需要而產生的。
圖1可以解釋服務請求的工作原理,將計算機配置為可響應IEEE-488服務請求(SRQ)中斷,才能使用該功能。使用狀態字節允許寄存器(*SRE命令)選擇哪些條件位可作為IEEE-488的SRQ線使用。例如狀態字節寄存器(STB)的第4位“MAV”和第5位“ESB”分別代表輸出緩沖區和標準事件寄存器狀態。如果STB第6位(RQS)從“0”轉換到“1”,那么IEEE-488服務請求消息就被發送到計算機上。然后計算機可能通過接口總線對儀器進行輪詢,以確定哪一條為服務請求線。在發出串行輪詢時,在串行輪詢響應中將清除STB第6位(RQS)而不影響其他位,并且清除SRQ線。“*STB?”公用命令與串行輪詢相似,但是它的執行方式與任何其他儀器命令一樣,“*STB?”命令返回的結果也與串行輪詢相同,但只要允許的條件仍然保留,就不會清除STB第6位。
在實際應用中,當服務請求用于“操作完成”同步時,首先需要將狀態字節寄存器的允許寄存器(SRE)的bit5和標準事件狀態寄存器的允許寄存器(ESE)的bit0置“1”,從而允許相應事件發生;然后在設備執行指令后添加公用命令“*OPC”,使得的ESR的bit0在操作完成后置“1”,從而觸發狀態字節寄存器的ESB bit5置“1”,若ESE的相同位已設置為允許,則會產生一個服務請求,程序需在事件處理子程序中處理指令執行完畢后的操作。
以下是使用服務請求法完成頻譜儀掃描結束后讀取最大標記值的.NET C#代碼。
mbSessionFsmr.Write("*SRE 32;*ESE 1"); //使能SRE的‘ESB’位和ESR的‘操作完成’位
mbSessionFsmr.ServiceRequest +=
new MessageBasedSessionEventHandler
(OnServiceRequest); //注冊事件處理程序
mbSessionFsmr.EnableEvent(MessageBasedSessionEventType.ServiceRequest,EventMechanism.Handler);
mbSessionFsmr.Write("CALC:MARK1:MAX");
mbSessionFsmr.Write("INIT;*OPC"); //開始測量,使用*OPC同步
MessageBasedSessionEventArgs rst = mbSessionFsmr.WaitOnEvent(MessageBasedSessionEventType.ServiceRequest,5000)
以下是服務請求的事件處理程序的.NET C#關鍵代碼:
private void OnServiceRequest(object sender, MessageBasedSessionEventArgs e)
{ MessageBasedSession session = sender as MessageBasedSession;
if (session != null)
{ try
{ session.DisableEvent(
MessageBasedSessionEventType.ServiceRequest, EventMechanism.Handler);
StatusByteFlags sb = session.ReadStatusByte();//執行串行輪詢獲取STB的值
if ((sb amp; StatusByteFlags.MessageAvailable) != 0)//判斷STB的MAV位(bit4)
{ ... }
else if ((sb amp; StatusByteFlags.EventStatusRegister) != 0) //判斷STB的ESB位(bit5)
{ if((Convert.ToByte(mbSessionSA.Query("*ESR?")) amp; 1) == 0) //判斷ESR bit0狀態
tmpResult = Double.Parse(session.Query("CALC:MARK:MAX;Y?"));
…}
...
}
由圖4看出,在*OPC命令發出后,在頻譜儀完成1次完整掃描后,設備發出服務請求,然后在異步事件處理程序進行處理。

圖4 使用“*OPC”和SRQ同步的I/O時序關系

表1 幾種基于狀態報告系統的測量同步方法比較
以上闡述了基于SCPI狀態報告機制的幾種指令同步技術及應用,幾種方法有著不同的特點和適用場合,在實際應用時需要根據指令同步需求靈活使用。使用“*WAI”和“*OPC?”指令實現同步相對較簡單,使用場景也最多,因為絕大數操作都屬于短耗時指令。在“*OPC?”命令等待響應期間,將阻塞指令發送。而“*WAI”不影響與其他設備的通訊,因此在下一操作步驟依賴于上一測量步驟結果的場景下,不能使用“*WAI”命令同步。使用“*OPC”指令實現測量同步有兩種方法。一種是輪詢事件狀態寄存器(ESR)的值,另一種是使用服務請求處理程序。使用“*OPC”不會引發超時和阻塞程序,但是相對于“*WAI”和“*OPC”不夠簡單直接。幾種方法中最復雜也是最靈活的是使用服務請求機制,可以大大提高程序效率,以及實現多線程,其多用于一些長耗時指令場景。需注意的是服務請求事件并不包含事件來源,因此控制軟件需要在事件處理程序中判別事件來源和性質,再做相應處理。
表1簡要總結了本文中幾種基于SCPI和IEEE488.2狀態報告系統的測量同步方法比較。
從本文論述可以看出,基于IEEE488.2和SCPI狀態報告系統的自動測試測量同步技術比軟件延時法提供了更高的效率和更好的安全性,狀態報告機制也為自動測試系統的操作及和測量同步提供了多種不同的實現方法,開發者可以根據系統、設備及程序的實際狀況,靈活選用。本文僅就自動測試系統開發中遇到的實際問題,對基于狀態報告系統的測量同步技術做了些許研究與應用,以期拋磚引玉。
[1] 肖明清,胡雷剛,王 邑,等. 自動測試概論[M]. 北京:國防工業出版社,2012.
[2] 魯昌華,王光春,劉 春. GPIB自動測試系統的同步方法[J]. 電測與儀表,2000,37(10):8-11.
[3] 王增沛,江 樺. IEEE 488.1-2003標準的深入研究[J]. 電測與儀表,2005,42(4):48-50.
[4] 朱興邦,李 兵. IEEE 488與SCPI解釋[J]. 儀器儀表標準化與計量,2007,(1):15-17.
[5] Standard Commands for Programmable Instruments version 1999.0[S]. SCPI Consortium,1999:9-1-9-3
[6] Top Ten SCPI Programming Tips for Signal Generators[Z]. Rohde amp; Schwarz,2011:8-9.
[7] FSMR Measuring Receiver Operating Manual[Z]. Rohde amp; Schwarz,2009:5.17-5.18.
[8] Using Service Requests in your GPIB application. National Instruments[Z].2006:1.
[9] Keysight 33210A 10 MHz函數/任意波形發生器用戶指南[Z]. Keysight Technologies,2014:249-255.
ResearchandApplicationofMeasurementSynchronizationTechnologyBasedonStateReport
Qiu Bin,Xia Wei,Shen Xiaoqing,Yu Qinghua,Ding Fenghai
(China Satellite Maritime Trcaking and Control Department, Jiangyin 214431,China)
Auto-test system synchronization for improving reliability and efficiency of the test system is very important, the synchronization technology based on the state report system provides higher efficiency and better security than the software delay method.In order to solve the problem of instruction synchronization in automatic test system,this paper discusses the status report model, register and synchronization mechanism of IEEE488.2 and SCPI,studies the principle and method of automatic measurement system synchronization by using the SCPI status reporting mechanism ;Through theoretical analysis and examples,analyzes the timing relations and key technologies of several measurement instruction synchronization methods,summarizes and compares the differences and applications of several synchronization methods,solves the problem of automatic measurement system synchronization.
status reporting system; command synchronization; auto-test system
2017-01-24;
2017-03-24。
邱 斌(1976-),男,江蘇鹽城人,碩士研究生,主要從事無線電計量測試方向的研究。
1671-4598(2017)09-0102-04
10.16526/j.cnki.11-4762/tp.2017.09.027
TP29
A