引言
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是虛擬儀器概念的首創者,是世界上最優秀的虛擬儀器軟件開發平臺。它使用圖形化數據流編程語言,這種新興的編程方式給編程人員帶來了新的困難,主要體現于對數據流的控制上。
本文剖析了LabVIEW數據流語言的特點,提供了其若干有效控制方法,指出LabVIEW本身即可解決數據流控制上的變量沖突、響應時序控制、初始狀態自適應調整等問題并保證其通用性,而不必求助于其它代碼語言(如C語言),這樣,既減輕了程序的復雜性,提高了效率,還豐富了LabVIEW的應用。文中以單選功能按鈕設計實例詳述了變量沖突、響應時序控制、初始狀態自適應調整等問題的具體解決方案,在某型裝備測試系統的實際運行中驗證了該方法可行有效。
1 數據流編程的特點
數據流語言的每個節點在執行之前需要提供其所有輸入端口的有效數據,LabVIEW允許用戶在一個圖表上擁有任意數量的不同節點,所有的節點可以并行執行。LabVIEW環境還支持多個VI并行執行,而不管操作系統或者計算機的功能如何。這些功能使得用戶無須做任何特殊編程工作就可以非常自由地同步執行各種不同的任務。
LabVIEW數據流編程克服了文本語言編程內存管理中的許多困難。在LabVIEW中,不必給變量分配內存,也不必為變量賦值或者從變量取值,只需創建一個帶有描述數據轉換關系的內部聯系的框圖程序。產生數據的函數可以精心地為數據分配內存,當數據不再使用時,相應的內存被釋放。當向數組或字符串添加新數據時,管理新數據的足夠內存資源會自動進行分配,這種自動的內存分配操作是LabVIEW的主要優勢之一。
2 數據流編程的難點及若干解決方案
LabVIEW程序的內存管理是自動進行的,中間狀態的捕捉和控制十分困難。例如,實時顯示現場采集數據串的最大值問題、通過按鈕手動控制現場采集數據串某一時刻數據作為比較對象的問題以及單選功能按鈕的實現問題等等,似簡實難。經編程實踐,總結方案如下:
(1)結構控制
循環結構,如For循環和while循環結構;順序(Sequence)結構,適當使用Sequence結構能提高程序可讀性,讓數據清晰流動;分支結構(case Structure);事件結構(Event Structure),允許用戶在前面板的直接干預或程序不同部分之間的交流影響程序的執行;定時循環(Timed Loop)結構,可創建多采樣率(multi-rate)的、對時間要求嚴格(time-critical)的數據采集應用程序,并定義不同優先級的循環。
(2)移位寄存器(Shift Register)控制
移位寄存器與While或For循環結合能夠保存各種狀態信息,未初始化的移位寄存器則保留著以前的內容。
(3)變量控制
變量在這里指局部變量和全局變量。局部變量用來在一個VI程序內部傳遞數據,它不僅可以解決連線的困難,而且可以對同一個控件多次寫入和讀出數據。全局變量則可用于在不同程序之間傳遞數據,全局變量也是用一個控件的形式存放數據,但是這個控件獨立于調用它的VI,以一個特殊的VI作為自己的容器。
(4)通告(Notifier)和隊列(Queue)控制
通告和隊列的方式有時可代替變量方式來傳遞數據。使用通告方式傳遞數據時,只有寫入數據并告知后才能讀取數據。通告以廣播的方式發布,收到廣播的用戶都可以去讀數據。隊列方式傳遞數據是最先去讀數據的用戶讀完數據就將它擦掉,只有一個接收數據的用戶。
單一使用上述某種方案往往力不從心,綜合靈活運用才能在編程中產生較好的效果。
3 實例分析
單選功能按鈕的設計是許多綜合測試系統設計中的一部分。它要求完成的功能是:
?、?某一個按鈕按下去時,其余按鈕全部處于無效的工作狀態。
?、?按下去的按鈕要求能無誤地啟動系統的該項功能。
設計中需要解決以下問題:
⑴ 變量沖突。程序包含按鈕間的相互控制,其控件及局部變量間的沖突問題十分突出;
?、?響應時序控制。按鈕操作和讀按鈕狀態的先后次序需進行適應控制,否則容易產生空檔(按鈕按下卻不啟動系統的功能)和幾個按鈕同時被按下等異常情況,導致程序紊亂;
?、?初始狀態自適應調整問題。
用LabVIEW設計流程圖及流程圖示說明如下所示:
BUTTON ARRAY :按鈕合在一起的數組;
SEARCH 1D ARRAY:比較兩數組的不同,返回不同元素的序號;
INDEX ARRAY(INDEX,ELEM):數組ARRAY, INDEX是序號,ELEM是元素。此函數是找出數組ARRAY中序號為INDEX的元素;
NULL:空操作;
DIFFERENCES:差異信息;
D.B.:Digital buttons數字化按鈕,即用編號表示不同按鈕。
總流程為將框圖1所示流程循環兩次!再進行框圖2所示流程,具體步驟詳述如下:
針對問題⑴,程序遵循“對操作的按鈕不操作”的原則。如框圖1,用SEARCH 1D ARRAY分辨出被操作的按鈕,對其它按鈕置“假”。這樣,按鈕間就可不發生沖突。
框圖1
框圖2
針對問題⑵,則必須充分考慮程序的數據“流”運行過程。分述如下:
?、?每次讀BUTTON布爾值時,都要考慮外界面是否有對按鈕的操作輸入,這在框圖1、2中都體現得很明顯;
?、?框圖1要循環2次很關鍵??紤]這樣一種情況:外界面對按鈕的操作在BUTTON ARRAY(1)與BUTTON ARRAY(2)之間,則在循環的第一次對按鈕的操作沒有起作用,但它以反饋機制把按鈕信息傳給了始端,由于程序運行的速度遠在人工界面上的手動操作速度之上,所以循環的第二次無外界輸入,這樣對按鈕的操作在循環二次后便響應了,沒有掛空。同理,當外界面對按鈕的操作介于BUTTON ARRAY(2)與框圖2的read BUTTONs之間時,外界面對按鈕的操作會在下一循環(對實際測試系統肯定是大范圍循環操作的)產生作用,由于程序運行得很快,操作者看到的是“實時”的操作。如果在read BUTTONs之后,那就回到框圖1的始端了。因此,任何時候按下按鈕,程序皆運行正常。
針對問題⑶,未初始化的移位寄存器能保留原有的狀態。在程序運行前,若出現按鈕異?,F象,由于程序默認一個按鈕按下,異常按鈕會立即得以糾正。
對于數字化按鈕(見流程圖框圖2)的實現,將按鈕狀態轉化為0、1,用一個連加運算根據其和的大小便可知道是否同時有多按鈕或單按鈕或無按鈕按下,從而將按鈕信號引出。
圖2 部分LabVIEW程序示例
4 結束語
單選功能按鈕的設計是個很典型的數據流控制實例,文中給出的用LabVIEW本身解決變量沖突、響應時序控制、初始狀態自適應調整等問題的方法,沒有使用事件驅動結構,避免了在測試系統中并行使用事件驅動結構產生的沖突。
評論
查看更多