萬文略 崔冰波
(重慶理工大學機械檢測技術與裝備教育部工程中心,重慶 400054)
虛擬儀器 (virtual instruments,VI)是美國National Instruments(NI)公司在其產品LabVIEW中首先提出的概念。隨著現代測試技術與儀器的發展,虛擬儀器概念已經發展成為一種創新的儀器設計思想,成為設計復雜測控系統與測試儀器的主要方法和手段。
現代測控系統大多需要對被測目標進行全方位的檢測以及多傳感器網絡協調應用,這就使得產生的數據量急劇增長,采用數據庫技術可以準確地反映各類數據間的關系。多數工業測控系統需要設計系統用戶的登錄與管理模塊,它主要用來保障系統的正常運行。設置了軟件使用權限以后,能夠將非專業人員“拒之門外”,有效防止誤操作引起的系統運行障礙,保護工業測試現場的數據安全與可靠性。由于大多數LabVIEW的程序針對的是工業測控領域,其對關于操作對象、配套設施的知識要求都很高,因此,設置對硬件設施參數的保護能保障測試過程的準確性[1]。
本文針對一款工業測控系統,開發了用戶登錄與管理模塊,顯著地提高了系統的使用安全性。同時,本文描述的數據庫訪問方法也可以實現測控系統中其他數據的有效組織與管理,其開發工具為LabVIEW8.2,操作系統使用 Windows XP。
LabVIEW中常用的數據庫訪問方式有以下五種[2-4]。
①使用LabVIEW的ActiveX功能,調用Microsoft ADO控件,利用SQL語言實現數據庫訪問。該方法需要用戶對Microsoft ADO控件和SQL語言有較深的理解,編程復雜。
②使用NI公司的附加工具包LabVIEW SQL Toolkit進行數據庫的訪問。該工具包集成了一系列的高級功能模塊,這些模塊封裝了大多數的數據庫操作和一些高級的數據庫訪問功能,其優點是易于理解、操作簡單,用戶不需要學習SQL語法,但這種工具包價格昂貴,系統成本高,大多數用戶無法承受。
③通過第三方開發的免費LabVIEW數據庫訪問工具包LabSQL來實現對數據庫的訪問。LabSQL利用Microsoft ADO和SQL語言來完成數據庫的訪問,將復雜的底層ADO和SQL操作封裝成一系列的LabSQL VIs。該方法編程簡單、快捷,無需對數據庫底層作深入了解,支持Windows平臺下的任何基于開放式數據庫連接(open database connectivity,ODBC)的數據庫。
④ 通過調用動態鏈接庫(dynamic link library,DLL)實現數據庫訪問,先利用其他語言如Visual C++編寫DLL,再利用LabVIEW的調用庫函數節點(calling function node,CLFN)調用此DLL訪問數據庫。該方法需要從底層進行復雜的編程才能實現,對于非專業編程人員來講是不現實的。
⑤利用中間文件存取數據,先將數據存入文件之中,待測量結束后再用專門的工具將數據導入到數據庫中。該方法需要磁盤文件作為中介且不具有實時性,使用不方便。
前三種方法是工程應用過程中經常使用的,本文設計的數據庫訪問過程是采用免費、跨平臺的LabVIEW數據庫訪問工具包LabSQL實現的。
注冊數據源的方式有手動創建和動態創建兩種。手動創建的步驟為:在開始→控制面板→性能和維護→管理工具→數據源(ODBC)下的數據源管理器中選擇添加數據源,選擇數據源的驅動程序,然后綁定數據庫,給數據源命名。這樣就在主機上完成了數據源的注冊,本設計數據源僅包括系統的用戶登錄數據,所以該方法簡單易行。有些情況下系統使用的數據源可能是多選或不確定的,這種情況下手動創建數據源就無法滿足系統的要求,區別于采用修改注冊表的方式動態創建數據源[3]。本設計首先獲取VI應用程序文件所在的絕對路徑,從得到的路徑字符串中獲得當前目錄;然后在當前目錄中創建名稱為“數據庫文件”的文件夾,用以存放數據庫文件;最后使用連接字符串控件實現數據庫連接字符串的創建。數據源動態注冊實現代碼如圖1所示。

圖1 數據源的動態注冊實現代碼Fig.1 Implementation for dynamic registration of data source
軟件人機界面是評價軟件的重要指標,良好的人機界面可顯著減少誤操作,方便用戶使用。構建界面友好的人機界面,主要包括協調的色調搭配、鮮明的控件排版以及軟件功能主次的突出顯示等。LabVIEW可以快速地開發出良好的人機交互界面,這得益于其高效的G語言編程方式和靈活的控件屬性設置[5]。本文設計的系統包括登錄系統、密碼修改、用戶管理等模塊。當系統開始運行時,界面上只存在登錄系統和退出系統事件,初始時通過設置控件的“可見”屬性,使密碼修改、用戶管理和進入系統模塊為隱藏狀態。當用戶輸入的用戶名和密碼通過登錄系統查詢到相應的信息后,就更新用戶的界面狀態。登錄系統后,主界面顯示用戶登錄系統的歷史信息和當前用戶的權限,以便于用戶的使用管理。
2.2.1 系統初始化
系統的初始化主要完成兩個任務:隱藏相關的控件,清空輸入和顯示字符串控件;鼠標指向用戶名輸入欄。
2.2.2 用戶信息驗證
用戶信息的驗證主要由兩部分組成,首先是數據庫信息的讀取,本系統設計的數據庫只包含用戶登錄信息表。記錄集的遍歷查詢實現代碼如圖2所示。程序首先使用數據源動態注冊SubVI,生成數據庫連接字符串,然后執行SQL查詢語句,導出數據庫數據并顯示到名稱為ReadData的表格控件中,其中NI為數據庫文件名稱,數據庫用戶名為admin,密碼為123。

圖2 數據表信息的遍歷查詢實現代碼Fig.2 Implementation for traversal inquiry of data sheet information
另外一部分是用戶信息的驗證,用戶信息驗證部分主要實現用戶登錄權限的查詢。以用戶名和用戶密碼為參數查詢記錄集的匹配數據,如包含此用戶且密碼正確,則進入到權限分級模塊。該部分的實現代碼如圖3所示,其中外層的條件語句實現程序運行的總體使能。
程序首先從讀取的數據庫信息中獲得列索引的一維數組(該數組存儲的是用戶名信息),再調用搜索一維數組函數,對搜索結果進行判斷后,進入密碼的匹配以及用戶登錄信息的分割輸出顯示。

圖3 登錄信息的驗證實現代碼Fig.3 Implementation for verification of the login information
當用戶信息驗證完成后,對系統用戶的權限進行判斷,使系統功能分級顯示給不同權限的用戶。其實現方法是在得到當前用戶的登錄信息且密碼正確后,判斷該用戶的權限:如果是管理員,就隱藏登錄系統,顯示進入系統、用戶管理模塊和密碼修改模塊;如果是普通用戶,就隱藏系統用戶的管理模塊,其余功能與管理員相同。當用戶密碼輸入錯誤且繼續出錯超過3次時,就彈出提示框,并將此次登錄活動記錄到日志文件中。
2.2.3 用戶信息修改
用戶在完成信息驗證后,就獲得了修改自己密碼信息的權限。該過程主要包括編輯新的密碼和更新數據庫中的對應信息。其實現代碼如圖4所示。

圖4 數據表信息更新實現代碼Fig.4 Implementation for the data sheet information update
編輯用戶的新密碼主要采用確認密碼的形式,防止用戶遺忘和誤輸入,并基于輸入框的事件元素V鍵,設置鍵盤按鍵的連續操作。更新數據庫中的信息是修改用戶信息的最終目的,以確保用戶下一次登錄時信息有效。
2.2.4 登錄信息的更新
用戶登錄系統后,系統的相應功能也就分級完成,這樣用戶點擊“進入系統”就完成了整個用戶登錄與管理系統的使用。由于本系統只設計了登錄與用戶管理模塊,所以進入系統事件發生后就停止了VI主界面的運行,但用戶的登錄信息,包括登錄的時間、登錄的次數都會在下一次的登錄系統后顯示出來,這在工程實踐中是十分有用的。這些參數的更新是在“進入系統”事件中完成的,其實現過程與用戶信息修改類似。
2.2.5 管理模塊的設計
為有效管理軟件操作人員的數量和權限,需要修改用戶表中的數據項。修改可通過兩種方式實現:一種是直接修改數據庫,但是在沒有安裝Access的工控機上難以實現且操作不靈活;另一種方法是為系統增加用戶管理模塊,方便系統用戶的增刪查改。本文采用后者完成對系統用戶的管理。在管理過程中,設置了管理員和普通用戶身份,其中,管理員能夠進行系統用戶的管理,包括添加系統用戶、刪除系統用戶和修改系統用戶權限與密碼。
由于增加用戶與修改用戶只在用戶名的處理上有區別,所以增加和修改用戶信息共用了編輯信息SubVI前面板。當增加用戶事件發生時,用戶名編輯框為輸入;當修改用戶事件發生時(列表框的雙擊事件),用戶名設置為輸出。通過設置編輯框屬性即可完成修改和添加界面的復用,用戶編輯完成后即可更新數據庫中的數據,其實現代碼如圖5所示,其中UserEdit和 UserAdd 為 SubVI。

圖5 系統新用戶添加實現代碼Fig.5 Implementation for adding new user into the system
單擊列表框,選中一行后,觸發列表框單擊事件;獲取該行的用戶信息后,就可將它作為參數,刪除用戶在數據庫中的記錄。列表框雙擊事件處理實現代碼如圖6所示,在事件處理框圖中完成彈出用戶編輯對話框,此時用戶名作為用戶表的主鍵是不能修改的。完成用戶信息的編輯后,就可以將編輯后的信息更新到數據庫中,更新數據庫的子程序UpdateData與登錄參數的更新過程類似。

圖6 列表框雙擊事件處理實現代碼Fig.6 Implementation for double-click event processing of list box
本系統的設計過程中多次用到SubVI的調用和事件結構的編寫,作者在編寫程序時也總結了一些關于兩者的用法與注意事項,主要包括以下3點。
①在設置SubVI界面運行不彈出時,SubVI中最好不要使用循環,如果界面彈出,則需考慮循環結束條件,如本設計中的用戶驗證信息程序、用戶登錄歷史信息更新等程序;
②事件結構用在主控面板上容易實現程序與面板操作的直接交互,但是事件處理過程不適合運行復雜的程序,如包含的SubVI中如果含有沒有處理好的循環,那么事件結構中的處理程序無法返回到主面板中,這樣主面板上觸發的其他事件就無法工作;
③ 事件結構中超時事件的使用[6],事件結構左上角的漏斗指明該事件處理程序在無其他事件的情況下,延時多長時間進入“超時”事件處理分支。編程實踐中配合while循環中的移位寄存器使用,可以顯著地擴展程序功能。
類似文本語言開發環境,LabVIEW環境集成了豐富的調試策略[7]。下面結合本次設計過程,簡單地闡述labVIEW調試技術的使用方法。
LabVIEW提供斷裂的箭頭,以指示當前程序含有語法錯誤,連線過程中實時提示錯誤類型。同時LabVIEW設有高亮運行模式,用戶在單步運行程序的過程中,可以通過此種方式觀察程序運行的實時數據。右擊數據線選擇Probe命令,數據通過該線段時,探針可顯示數據的值。此外,可設置程序運行斷點,單步運行程序,遇到SubVI,可以配合“跟入”、“跳出”命令出入SubVI,觀察參數傳遞過程中的數據流,以完成進一步的調試。
本文設計了測控系統用戶登錄和管理模塊的方案,主要涉及界面事件處理和使用 LabSQL操作MSAcess。測試結果表明,本設計包含的用戶管理模塊可方便地在工控機上添加或者修改系統用戶,同時,由于系統具有高內聚和松散耦合的特點,可以作為大型應用程序的組件。文章中介紹的LabVIEW訪問數據庫的方法可用來組織和管理工業測控系統中的其他數據。
[1]王魯濤,羅馬吉.基于LabVIEW用戶登錄系統設計[J].軟件導刊,2009,8(6):86 -87.
[2]吉順祥,劉旺鎖,宋曉婷.基于LabVIEW的數據庫訪問技術[J].船海工程,2007,36(3):125 -128.
[3]羅文輝.LabVIEW中的數據庫訪問[J].武漢理工大學學報:信息與管理工程版,2006,28(3):13 -16.
[4]畢虎,律方成,李燕青,等.LabVIEW中訪問數據庫的幾種不同方法[J].微計算機信息,2006,22(1):131 -134.
[5]陳錫輝.LabVIEW8.20程序設計從入門到精通[M].北京:清華大學出版社,2007.
[6]Conwy J,Watts S.軟件工程方法在 LabVIEW 中的應用[M].羅霄,周毅,譯.北京:清華大學出版社,2006.
[7]Travis J.LabVIEW 大學實用教程[M].喬瑞萍,譯.北京:電子工業出版社,2008.