趙立軍 程增杰 李文一 蘇國營 張晶


摘要:在VisualC++平臺上編寫了水準儀磁致誤差檢定程序。利用NIVISA接口對產生磁場的可編程電源輸出電流進行精確控制,通過Access數據庫實現對儀器信息和檢定數據的存儲與提取,最終根據規程要求計算出檢定結果并將其在對話框中進行打印(或預覽),可應用于磁致誤差檢定裝置中以提高檢定效率和自動化水平。
關鍵詞:磁致誤差檢定;NIVISA;數據庫;打印及打印預覽
中圖分類號:TP317文獻標識碼:A
1引言
水準儀是以儀器的水平視準線作為基準線,進行高差測量的計量器具。它廣泛地用于大地水準測量、地形變測量、各種工程水準測量與大型精密機械安裝等。對于高精度的水準測量,必須考慮到儀器的磁致誤差影響,尤其是在對補償器進行修理之后,更應及時對水準儀的磁致誤差進行檢定,以確保精密水準測量成果[1-2]。
本單位自上世紀80年代建立了水準儀磁致誤差檢定實驗室[3],利用亥姆赫茲線圈產生勻強磁場的方法對置于其中的水準儀的磁致誤差進行測量,通過改變可調電源輸出的電流調節線圈所產生的磁場。該裝置對電流的調整均需通過檢定人員人工設置實現,電流輸出精度往往很難達到規程要求的0.01A,且檢定過程中的數據記錄和處理均由手寫完成,嚴重影響了檢定精度及效率。因此,急需開發出一套具有電源輸出控制和數據記錄處理功能的磁致誤差檢定程序以取代傳統的人工操作,從而提高水準儀磁致誤差的檢定效率及裝置精度。
本文利用VisualC++平臺進行程序開發,重點解決了USBTMC協議可編程數字電源控制、儀器檢定數據庫的設計及對話框模式下的打印(預覽)等實際問題,最終編寫了水準儀磁致誤差檢定程序。該程序利用VISA接口對產生磁場的可編程電源輸出電流進行精確控制,使電流輸出精度達到0.01A,并通過Access數據庫實現對儀器信息和檢定數據的存儲與提取,最終按照規程要求計算出檢定結果并將其在對話框中進行打印(或、預覽),可應用于磁致誤差檢定裝置中以提高檢定效率和自動化水平。
2磁致誤差檢定方法及檢定程序
《JJG425-2003水準儀檢定規程》對水準儀磁致誤差的檢定方法進行了規定[4],儀器置于如圖1所示的兩維亥姆赫茲線圈中,通過電源分別為該線圈施加電流以控制儀器所處的磁場大小及方向。檢定過程中,需要根據規程逐漸變化磁場條件并通過測微光管讀取不同磁場下的儀器十字絲偏移量,對這些數據進行數學計算可得到該臺儀器全方位直(交)流水平磁場最大磁致誤差方位角和全方位直(交)流豎直磁場最大磁致誤差方位角,最終擬合出最大磁致誤差方位上的特性曲線檢定以計算儀器在一倍地磁場下的磁致誤差值。
圖1磁致誤差檢定裝置示意圖
本文利用VisualC++平臺開發了磁致誤差檢定程序[5],采用基于對話框的構架進行設計,程序界面如圖2(a)所示,包括了檢定日期、檢定人員、證書編號、儀器基本信息等內容,同時針對直(交)流水平磁場最大磁致誤差方位角、直(交)流豎直磁場最大磁致誤差方位角以及最大磁致誤差方位上的直(交)流特性曲線分別設計了相應的檢定程序。
以最大磁致誤差方位上的直流特性曲線檢定程序界面(圖2(b))為例。在分別輸入“水平、垂直最大方位角”以及“電流最大值”后,根據規程要求程序將計算出第1測回、第1檢測點的正向往測電流值的水平及垂直分量,并分別通過可編程電源施加于水平及垂直線圈中,在每個檢測點均需檢定員通過測微光管分別讀取通電、斷電情況下的儀器十字絲位置各兩次并將數據輸入至程序中,直至兩個測回共計28個檢測點均測量完畢即完成此項檢測工作。
計算技術與自動化2016年3月
第35卷第1期趙立軍等:水準儀磁致誤差檢定程序的VC++實現
在六個項目的檢測工作均完成后,程序會根據規程方法對測量數據進行計算,檢定人員可以通過程序查看計算結果,并在程序中對檢測報告進行預覽并打印。
(a)程序主界面
(b)直流特性曲線檢定程序界面
3基于VISA接口的可編程電源控制
檢定裝置選用兩臺固瑋公司生產的APS-1102型可編程電源分別驅動亥姆赫茲線圈產生水平、垂直方向磁場,通過程序實現對輸出電流的精確控制。該電源可通過USB線與電腦相連,遵循USBTMC(USBTest&MeasurementClass)協議,同時提供了標準VISA(VirtualInstrumentSoftwareArchitecture,以下簡稱為"Visa")接口,可采用SCPI指令結構進行通信[5]。
3.1VISA接口及其基本指令
Visa是美國國家儀器公司開發的一種用來與各種儀器總線進行通信的高級應用編程接口。Visa總線軟件是不受平臺、總線和環境的限制的虛擬儀器系統I/O接口軟件,可用來對遵循USBTMC協議的儀器進行配置、編程和調試[6-7]。
在使用時需要在VC工程中導入庫文件庫文件visa32.lib。在VC環境下使用VISA接口與儀器進行連接,并實現指令傳輸及數據讀取的基本程序如下:
ViSessiondefaultRm,instr;
ViStatusstatus=viOpenDefaultRM(&defaultRm);
//建立VISA資源管理對象
if(status//判斷是否初始化成功
ViCharrsc[256];
sprintf(rsc,"USB0:0x0D4A:12:%s:INSTR",serial);
//VISA儀器信息(用于連接)
viOpen(defaultRm,rsc,accessMode,timeout,&instr);
//通過VISA接口連接設備
ViUInt32count;
Cstringwritestr=":VOLT3.0;:MEAS:CURR?";
//符合USBTMC協議的SPCI命令
char*p=(LPSTR)(LPCSTR)writestr;
ViBufbuf=(ViBuf)p;
viWrite(instr,buf,(ViUInt32)strlen((ViPChar)buf),&count);
//向儀器寫數據
ViCharresult[257];
viRead(instr,(ViPBuf)result,256,&count);//從儀器讀數據至ViChar型數組
result[count]=0;
viClose(instr);
viClose(defaultRm);
//關閉VISA連接
其中:
viOpen(Sesn1,rsrcName,acessMode,timeout,Sesn2)用于與名為”rsrcName”的儀器進行連接;
viWrite(Sesn,CommStr,Count,retCount)用于向儀器寫內容為”CommStr”的指令;
viRead(Sesn,CommStr,Count,retCount)用于從儀器讀取”Count”字節的數據,并存入數組”CommStr”中。
3.2輸出電流精確控制程序的設計
APS-1102型可編程電源可以通過VISA接口設置輸出電壓及控制輸出的打開及關閉,并對其實時電流進行讀取,主要用到以下四類命令:
[SOURce:]VOLTage[:LEVel][:IMMediate][:AMPLitude]
該命令設置了AC+DC模式下的交流電壓。例如:”VOLT100”表示輸出交流電壓為100V。
[SOURce:]VOLTage:OFFSet[:IMMediate]
該命令設置了AC+DC模式下的直流電壓。例如:”VOLT:OFFS10”表示輸出直流電壓為10V。
OUTPut[:STATe]
該命令控制輸出繼電器的開關。例如:”OUTPON”表示打開電源輸出繼電器。
MEASure[:SCALar]:CURRent[:AC]?
該命令返回輸出單位為A的電流值。例如:”MEAS:CURR?”。
為了快速而精確地控制電源輸出電流,檢定過程中先根據線圈內阻計算出所需電流對應的理論電壓值,再根據施加理論電壓后線圈電流的實時測量值對輸出電壓進行閉環微調,以保證電流輸出精度控制在±0.01A之內的同時保證調整速度,程序流程圖如圖3所示。4檢定數據庫的設計與實現
4.1檢定數據庫結構及設計思想
根據磁致誤差檢定時儀器信息和檢定數據存儲的具體需要,對數據庫的結構進行了設計。
1)設備管理數據庫:使用一個數據庫文件“sjb.mdb”來存儲被檢儀器的有關信息,包括檢定證書號、檢定日期、儀器型號規格、儀器編號、檢定單位、檢定人員、檢定環境條件等,這些信息均以證書號為主鍵保存在數據庫表中。
圖3電流輸出精確控制程序流程圖
2)檢定數據庫:每個證書號所對應的儀器檢定數據均保存在以證書號命名的.mdb數據庫文件中,文件內有六個數據表分別用于存儲該證書儀器檢定過程中六個項目的全部檢測點的觀測數據。
檢定過程中數據庫的工作方式為(以證書號C1504001為例):
1)在程序主界面中輸入證書號C1504001并按回車,程序會在“sjb.mdb”中的數據庫表“sjlb”的主鍵中搜尋該證書號,如果存在該主鍵則會讀取該行內容并依次將儀器信息顯示在主界面中;如果該主鍵不存在則會在數據庫表“sjlb”創建一條新信息,同時創建一個“C1504001.mdb”文件用來存儲檢定信息。點擊“保存資料”可以將儀器的所有信息儲存在數據庫表“sjlb”中。
2)點擊主界面中的任意檢定項目,即可進入到相應的檢定程序界面中,在界面中輸入某個檢測點的測量數據后,按“確定”鍵即可將該檢測點的數據存入C1504001.mdb中對應該項目的數據庫表中,直至完成所有檢測點的測量。
4.2Access數據庫及其訪問方法
MicrosoftOfficeAccess是由微軟發布的關系數據庫管理系統,具有等優點。其符合ODBC數據庫標準,同時VisualC++編程環境中提供了諸如ADO(ActiveXDataObject)數據庫應用程序開發接口,便于數據庫程序的開發。本軟件使用Access數據庫實現對檢定信息及數據結果的存取。
VisualC++平臺下訪問和處理Access數據庫的步驟如下:
1)初始化COM庫,并用#import指令引入ADO類型庫;
2)用Connection對象連接數據庫;
3)建立好連接后,利用Connection、Command對象執行SQL命令以完成對記錄集中數據記錄查詢、添加、刪除、更新等操作;
4)使用完畢后關閉連接釋放對象。
5對話框中的打印程序
在VisualC++環境中,單/多文檔構架下的打印機操作可以在向導模式下利用CView類添加消息映像來完成,只需根據實際需要添加少量打印內容的代碼就可以滿足功能,但對于對話框VisualC++并沒有配備專門的打印庫文件,因此需要進行基于對話框的打印程序移植及開發工作[9]。本文在對話框結構下實現了對檢測報告的打印及預覽功能,打印界面如圖4所示。
在程序開發過程中通過虛擬的文檔視圖框架結構和視圖類來實現與設備無關的圖像繪制及打印工作。具體流程如下:
1)重新定義并導入利用VisualC++在文檔結構中打印時用到的三個類:①CframeWnd的派生類CmainFrame作為用來定義打印的主框架窗口;②CpreviewView的派生類CmyPreviewView用來實現打印預覽界面的子窗口;③CscrollView的派生類CwrapperView用來控制打印過程中的視圖,將預覽的內容輸出到打印機進行打印。
2)在預編譯頭文件stdafx.h中增加的指向顯示內容的函數指針的定義語句:typedefvoid(*DRAWFUN)(CDC*pDC,CPrintInfo*pInfo,void*pVoid=NULL)。
3)在打印內容繪制函數OnPrint(CDC*pDC,CPrintInfo*pInfo)中對要打印的內容進行繪制。在此函數中可以使用CDC*虛擬設備變量(即打印紙面)定義一個畫板,利用Cfont類及Cpen類分別對打印的字體和劃線進行定義,最后在畫板中進行字符的書寫和線型的繪制。pInfo為CPrintInfo類型的指針,其包括了頁數、頁眉、頁腳等信息。
4)通過以下語句實現對OnPrint中繪制內容的打印及預覽:m_PreFrame=newCMainFrame(DRAWFUNpDraw,CWnd*pOldWnd,CWnd*pCallWnd,BOOLbDirect);
其中:DRAWFUNpDraw為顯示內容函數指針;
CWnd*pOldWnd和CWnd*pCallWnd分別指主對話框和調用窗口指針;
BOOLbDirect決定是否直接打印。
6結語
使用VC++平臺開發了水準儀磁致誤差檢定程序,重點解決了基于VISA接口的USBTMC協議可編程數字電源輸出電流精確控制、儀器檢定數據庫的設計及對話框模式下的打印(預覽)等實際問。該軟件目前經實驗驗證,已成功應用于中,有效地提高了檢定效率和自動化水平。
參考文獻
[1]任道勝,陳如麗,楊輝.精密補償器水準儀磁致誤差及其測試方法[J].地殼形變與地震,1997,17(04):67-72.
[2]彭沛民.對國家標準GB12897-91部分條款的修改建議[J].地殼形變與地震,1996,16(2):85-89.
[3]董熾.磁場對Ni002水準儀影響的實驗[J].地殼形變與地震,1987,7(3):240-46.
[4]國家技術監督局.JJG425-2003,水準儀檢定規程[S].北京:中國計量出版社,2003.
[5]黃維通,姚瑞霞.VisualC++程序設計教程[M].北京:機械工業出版社,2001.
[6]GWINSTEK.ProgrammbleAC/DCPowerSource(APS-1102)[M].2009.
[7]孫景發,李剛,李素芬,等.嵌入到VC程序中控制HP34401A進行高精度電壓測量[J].儀表技術與傳感器,2003,(9):13-15.
[8]朱波,李華.基于SCPI語言的智能儀器LabVIEW驅動程序設計[J].儀表技術與傳感器,2008,(9):53-54.
[9]鄒漢斌,雷紅艷.在VC++6.0中利用MFC類庫實現打印功能[J].湖南文理學院學報,2004,16(2):58-59.第35卷第1期2016年3月計算技術與自動化ComputingTechnologyandAutomationVol35,No1Mar.2016第35卷第1期2016年3月計算技術與自動化ComputingTechnologyandAutomationVol35,No1Mar.2016