1. 海軍潛艇學院 青島 266071;2. 海軍工程大學 武漢 430033
利用LabVIEW開發(fā)應用軟件時,由于LabVIEW本身并不具備數(shù)據(jù)庫訪問功能,常用的解決方法如下[1-3]:
1) 利用NI公司的附加數(shù)據(jù)庫接口工具包LabVIEW SQL Toolkit進行數(shù)據(jù)庫訪問。
2) 利用LabVIEW的ActiveX功能,調用Microsoft ADO控件,利用SQL語言實現(xiàn)數(shù)據(jù)庫訪問。
3) 利用其他語言如VisualC++編寫DLL程序訪問數(shù)據(jù)庫,再利用LabVIEW所帶的DLL接口——調用庫函數(shù)節(jié)點CLFN(Call Library Function Node)訪問該程序,這樣可以實現(xiàn)間接訪問數(shù)據(jù)庫。
4) 利用免費的LabVIEW數(shù)據(jù)庫訪問工具LabSQL。
LabSQL的開發(fā)是在LabVIEW中利用ActiveX功能,通過調用Microsoft ADO控件,結合SQL語言,并通過ODBC接口函數(shù)庫驅動程序實現(xiàn)對數(shù)據(jù)庫的訪問,其結構層次見圖1。
圖1 數(shù)據(jù)庫訪問結構層次
Microsoft ADO是微軟最新的數(shù)據(jù)訪問技術[4],通過編程模型實現(xiàn)對數(shù)據(jù)庫的操作。編程模型是訪問和更新數(shù)據(jù)源所必需的操作順序,它概括了的全部功能。ADO的目標是訪問、編輯和更新數(shù)據(jù)源;利用ADO所提供的類和對象可以完成以下操作:
1) 連接到數(shù)據(jù)源;
2) 指定訪問數(shù)據(jù)源的命令同時可帶變量參數(shù)或優(yōu)化執(zhí)行;
3) 執(zhí)行命令;
4) 如果這個命令使數(shù)據(jù)按表中行的形式返回,則將這些行存儲在易于檢查、操作或更改的緩存中;
5) 可使用緩存行的更改內容來更新數(shù)據(jù)源;
6) 提供常規(guī)方法檢測錯誤。ADO對象模型如圖2所示。
圖2 ADO對象模
這些操作都是對數(shù)據(jù)庫最基本的操作,可以分為Connection、Command、Recordset等三類,在應用程序開發(fā)過程中,為實現(xiàn)對數(shù)據(jù)庫進行訪問,這些操作方法以子函數(shù)的形式進行封裝,例如經過封裝后的SQL Execute.vi,SQL Fetch Data.vi等函數(shù)便可直接進行調用,按照輸入的SQL命令可實現(xiàn)數(shù)據(jù)庫的不同操作。
利用LabSQL訪問數(shù)據(jù)庫的基本步驟是連接數(shù)據(jù)庫、執(zhí)行操作、斷開數(shù)據(jù)庫連接等三個步驟,用戶在執(zhí)行操作階段輸入不同的SQL命令,可實現(xiàn)不同的數(shù)據(jù)庫操作,包括查詢全部數(shù)據(jù)記錄、按條件查詢數(shù)據(jù)、添加記錄、刪除記錄等。
在開發(fā)某自動測試系統(tǒng)過程中,由于有大量的測試信息需要存入數(shù)據(jù)庫記錄,同時為了滿足方便日后查詢的需要,測試系統(tǒng)應用軟件包含了用于數(shù)據(jù)庫管理操作的應用程序,通過點擊系統(tǒng)管理用戶界面的“數(shù)據(jù)庫管理”便可進入數(shù)據(jù)庫管理應用程序。在開發(fā)過程中,選用Access作為數(shù)據(jù)庫,在LabVIEW中使用LabSQL工具包對數(shù)據(jù)庫進行訪問。
測試平臺的數(shù)據(jù)庫名稱為Test.mdb,該數(shù)據(jù)包含兩個數(shù)據(jù)表項,分別是test_condition和test_reslut;這兩個表是進行數(shù)據(jù)庫操作的基礎。通過控制面板中的數(shù)據(jù)源(ODBC)設置工具,對Test.mdb進行數(shù)據(jù)源的注冊設置。開發(fā)的數(shù)據(jù)庫管理用戶界面如圖3所示。該界面分三個區(qū)域,分別是操作提示區(qū)、操作區(qū)、結果顯示區(qū)等三個部分。
圖3 數(shù)據(jù)庫管理界
操作提示區(qū)用于提示用戶如何進行相關的數(shù)據(jù)庫操作。操作區(qū)用于具體的數(shù)據(jù)庫操作,用戶可按測試時間、被測電路板名稱、測試結果等三個索引對測試結果數(shù)據(jù)進行查詢、打印、刪除等操作。在進行該部分程序開發(fā)時,為避免用戶直接輸入SQL查詢語句,在編程上將SQL查詢語句放入后臺進行處理,用戶僅需根據(jù)提示區(qū)的提示,在查詢命令框中輸入簡單的關鍵詞即可實現(xiàn)對數(shù)據(jù)庫的操作。
為實現(xiàn)對數(shù)據(jù)庫的操作管理以及數(shù)據(jù)獲取的需要,以下子函數(shù)在數(shù)據(jù)庫管理應用程序得開發(fā)過程中扮演者重要的角色。
1) Insert Table.vi,該子函數(shù)用于將測試結果寫入數(shù)據(jù)庫。該函數(shù)的主要操作對象是test_result數(shù)據(jù)表,將該子函數(shù)進行封裝,見圖4。
圖4 封裝后的
函數(shù)圖標留有若干輸入輸出端口,主要的數(shù)據(jù)連接端口有DSN(database source name,數(shù)據(jù)源名稱)端口、board_name(電路板名稱)端口、f1_value(輸出信號頻率測量值)、amp1_value(輸出信號幅度測量值)、f1_standard(輸出信號頻率標準值)、amp1_standard(輸出信號幅度標準值)、result(測試結論)等端口。
DSN端口用于打開數(shù)據(jù)庫中的存儲測試結果表項;board_name用于將當前被測電路板的名稱存入數(shù)據(jù)庫,便于查詢索引;f1_value和amp1_value為被采集信號經過分析后的測量值;f1_standard和amp1_standard來自測試條件數(shù)據(jù)表,這兩個值的獲取也是通過數(shù)據(jù)庫操作函數(shù)得到的;result來自測試結果處理子函數(shù),若被測電路板通過測試,則表達為“合格”,反之為“不合格”。
2) _fetch one element.vi,該子函數(shù)用于從數(shù)據(jù)庫中獲取一個值,主要用于程序開發(fā)時的參數(shù)獲取,例如獲得電路板X的輸入信號的頻率值。該子函數(shù)的操作對象主要是test_condition數(shù)據(jù)表,獲取的值主要用于傳送給信號源模塊PXI-5412的參數(shù)設置端。源代碼程序見圖5,封裝后的程序見圖6。
圖5 取單個元素的圖形化源代
圖6 取單個元素子函數(shù)程
DSN端口用于打開數(shù)據(jù)庫中的測試條件表項;board_name端口作為查詢的行索引,取出與電路板名稱相符的測試條件數(shù)據(jù);parameter(參數(shù)名)端口的輸入作為查詢的列字段索引;輸出端口output1和output2為類型不同的輸出,分別是數(shù)值型和字符型。例如,為取得電路板X的輸入信號的頻率值,那么在board_name端口輸入字符串“X”,在parameter端口輸入signal1_f,那么在程序運行時,從output1端口,就可從數(shù)據(jù)庫的測試條件test_condition表中獲得電路板X輸入信號的頻率值。
3) DB_delete.vi,該子程序用于將查詢結果從數(shù)據(jù)庫中進行刪除操作。
以上幾個數(shù)據(jù)庫操作子函數(shù)是數(shù)據(jù)庫管理應用程序開發(fā)時常用的函數(shù),在開發(fā)過程中,對上述的功能子函數(shù)進行適當?shù)恼{用或二次開發(fā)封裝可以滿足對不同數(shù)據(jù)獲取的要求。
在數(shù)據(jù)庫管理軟件的開發(fā)過程中,雖然利用了LabSQL工具包,但不可避免地要用到簡單的SQL查詢命令語句。在開發(fā)的過程中,常用到的SQL語句有以下幾種。
1) 數(shù)據(jù)查詢。在SQL語句中使用SELECT可以對數(shù)據(jù)進行查詢,一般格式如下:
SELECT<查詢內容>FROM<表或視圖>WHERE<條件>ORDER BY<列名>。
開發(fā)時常用到的SQL語句有查詢全部測試結果記錄語句:
SELECT * FROM test_result
查詢指定方式的SQL語句為:
SELECT * FROM test_result WHERE Test_time=‘060920’
2) 插入記錄。向測試結果數(shù)據(jù)表中插入一次測試的結果記錄時,SQL語句格式為:
INSERT INTO <表名>(<列名1>,……)VALUES(<列值>,……)
向測試結果表test_result中插入記錄的SQL語句如下:
INSERT INTO test_result (Test_time,bord_name,f1_value,amp1_value,f1_standard, amp1_standard , result) VALUES(<列值>,……)
3) 刪除記錄。刪除記錄的SQL語句格式為:
DELETE FROM <表名>WHERE<條件>
下面是對查詢結果進行刪除的SQL語句:
DELETE FROM test_result WHERE board_name=‘XX’
當程序執(zhí)行完上述語句后,在rest_result表中,所有關于電路板XX的測試信息全部被刪除??梢愿鶕?jù)刪除條件的不同,刪除不同的測試信息。
實踐證明,在LabVIEW中使用LabSQL來調用數(shù)據(jù)庫非常方便、簡單,無需深入了解ActiveX技術和SQL語言,只需知道各VI的功能和數(shù)據(jù)庫的設計及相關概念,即可設計出滿足要求的程序。由于LabSQL不具備開發(fā)遠程數(shù)據(jù)訪問功能,在涉及到遠程數(shù)據(jù)訪問問題時,必須使用其他方法。由此可見LabSQL值得應用于要求不是很復雜的數(shù)據(jù)庫開發(fā)。
[1] 尹仁平,劉 剛,汪立新,喬云生.LabVIEW中的數(shù)據(jù)庫訪問[J].電子測量技術,2006,29(3):51-52.
[2] 畢 虎,律方成,李燕青,李和明.LabVIEW中訪問數(shù)據(jù)庫的幾種不同方法[J].微計算機信息,2006,22(1):131-134.
[3] 羅文輝.LabVIEW中的數(shù)據(jù)庫訪問[J].武漢理工大學學報,2006,28(3):13-16.
[4] 劉 玉,董志斌,吳建軍,孟 宏.基于ADO技術的LabVIEW訪問數(shù)據(jù)庫的方法[J].國外電子測量技術,2003(增刊):55-56.