皮祖成,陳 文,戴善溪
(中國航天空氣動力技術研究院,北京 10074)
基于LabVIEW面向對象的試車臺實驗控制軟件設計
皮祖成,陳文,戴善溪
(中國航天空氣動力技術研究院,北京10074)
試車臺實驗控制軟件用于發動機測力實驗過程中對攻角的控制、天平及角度傳感器數據的記錄、并實現與總控系統的數據應答。軟件的設計過程通過使用LabVIEW的G#擴展,使得LabVIEW中的對象能夠以引用的方式傳遞,相對于按值傳遞的方式而言擴大了對象的共享范圍,使得軟件編寫的靈活性增加。G#擴展支持了基于接口的面向對象方法,使得諸多的設計模式得以順利的應用到LabVIEW的編程當中。該軟件最后通過采用面向對象的分析、設計方法,并采用LabVIEW圖形化編程平臺,實現了一個可靠、靈活的測控軟件。
接口;LabVIEW;G#;設計模式
本文著錄格式:皮祖成,陳文,戴善溪. 基于LabVIEW面向對象的試車臺實驗控制軟件設計[J]. 軟件,2016,37(8):104-110
該軟件所控制的試車臺用于發動機的測力實驗,其中包括發動機的三個力(推力、升力和側向力)以及三個力矩(偏航、俯仰和滾轉)。通過對臺架傾斜角度的控制來實現實驗過程中對發動機攻角的改變。試車臺的基本結構如圖1所示,其中包括天平、角度傳感器、鎖緊裝置、攻角機構(攻角動平臺、攻角定平臺、電動缸)。天平用于測量六分量的力和力矩;角度傳感器用于測量攻角的實際大小;鎖緊機構用于在流場建立過程中對試車臺的保護,在流場建立穩定后將解除鎖定,以便正常的測力;攻角的動平臺用于安裝和承載被測發動機,定平臺和動平臺之間通過電動缸來調節夾角,從而完成不同攻角情況下的實驗任務。
試車臺的電氣控制原理框圖如圖2所示。NI采集器用于對角度傳感器和天平的六個分量進行測量,同時NI采集器上裝有帶Windows XP操作系統的控制板卡,本文所設計的軟件也運行于NI采集器上,所以NI采集器兼具有HMI的功能;Trio運動控制器用于對兩個鎖緊電機和電動缸電機進行控制。
試車臺的正常運轉是在實驗總控系統的控制下完成的。總控系統與試車臺系統的信息交換是通過8路數字量I/O通道實現,這是通過利用Trio控制器的數字量I/O來實現的。信息交換的內容包括:總控急停、開始命令、解鎖命令、回零命令、臺架急停反饋、解鎖完成反饋、回零到位反饋、攻角到位反饋。

圖1 試車臺基本結構

圖2 電氣系統原理框圖
LabVIEW是National Instrument公司的可視化編程軟件,使用LabVIEW編程的門檻較低,所以在信號測試等工程領域應用比較廣泛[2-5]。然而,較之C++,java,C#等文本類編程語言來說LabVIEW提供的面向對象特性太少,使得在其它面向對象編程語言中產生的成熟設計模式無法正常應用于LabVIEW當中。面向對象方法作為一種高級程序設計方法,能有效的提高程序設計效率并降低軟件模塊之間的耦合度,結合軟件設計模式的應用[6-9],可有效的提高軟件的靈活性和穩定性[9]。G#作為AddQ公司對LabVIEW的面向對象擴展彌補了LabVIEW在面向對象方面的不足。LabVIEW在其2012版本中新增的操作者框架能快速靈活的創建獨立線程,對多任務的處理提供了方便的途徑。
試車臺的運轉由試車臺的操作員來完成,操作員主要是對試車臺狀態的監控、系統的啟動和正常的維護。系統啟動過后臺架的動作是按照總控系統發送的命令來執行。系統的用例如圖3所示,參與者有兩個,一個是試車臺操作員,另一個是本系統外部的總控系統。對于總控系統操作者來說,只需要使用“總控通信”用例進行信息的發送和接收即可。對于試車臺操作員而言,他需要使用“數據采集”、“狀態查看”和“電機控制”三個用例。為滿足實驗后數據分析的需求,必須將實驗過程中的相關數據進行存盤操作,這個包含在“數據存儲”用例中。所有電機的控制是通過Trio運動控制器來實現的,“Trio控制”用例包含了與電機相關的所有任務。與總控系統的通信也是通過Trio控制器的I/O口實現的,所以“Trio控制”用例也兼具通信的用途。“狀態查看”主要是將一些關鍵的系統狀態數據顯示到用戶界面當中。
數據采集過程作為一個需要持續運行的過程,軟件的設計必須考慮到不阻塞UI線程。電機控制過程的目的是為了讓機械結構做一定的運動,這個過程往往需要較多的執行時間,因此也需要考慮阻塞的問題。數據采集所獲取到的結果一方面需要用于數據存儲,另一方面需要用于狀態顯示;同樣電機控制部分的通信命令也既需要顯示也需要存儲到文件當中。
Trio控制器的編程需要使用其自帶的Trio Basic語言,并下載到控制器上來運行。所以,軟件的設計需要體現上位機和下位機的通信,這樣從系統的穩定性和快速性來說系統間的解耦就體現得非常的重要。軟件需要設計上位機基于LabVIEW的主程序,也需要設計基于Trio Basic的電機控制程序,而且這兩部分程序間需要進行數據交互。Trio控制器與NI采集器之間是通過以太網通信的,這個是基于Trio公司提供的TrioPC控件來實現的。Trio控制器提供了兩種數據的通信方式:查詢的方式和事件響應的方式(即Pull和Push方式均可)。最終的程序部署位置如圖4所示。

圖3 系統用例圖

圖4 程序部署

圖5 下位機的TrioBasic類
2.1上下位機程序的協調
試車臺架需要執行的動作包括:解鎖、鎖緊、變攻角,而電機控制器自身需要初始化各控制設備和響應急停命令,因此有6種操作需要在Trio控制器中執行。Trio Basic并不支持面向對象的編程方式,但在分析過程中仍不妨將Trio控制器中的程序視為一個類,如圖5所示。Initialize方法將與控制器相關的設備都初始化;SendIOState為一個持續向上位機發送I/O口狀態的方法,這樣上位機就可以及時獲取到總控系統發送給本系統的命令;Lock和Release則是對鎖緊機構的鎖緊和釋放;ToAngle則完成變攻角的過程;LenzePos屬性代表了當前攻角的位置。在上位機當中設計了一個TiroPC的類來實現和TrioBasic的交互,對TrioBasic中某個方法的調用順序如圖6所示。對TrioPC的Invoke Lock調用為同步調用,最后需要返回Invoke成功與否的結果;而TrioPC將Invoke Lock操作委托給TrioBasic做,由于TrioPC和TrioBasic之間是通過TCP/IP完成的,所以采用異步調用的方式,此后由TrioPC調用私有方法GetResult來查詢委托給TrioBasic的任務是否已經完成;GetResult方法為一個具有超時輸入的方法。

圖6 TrioPC與TrioBasic的調用順序圖
2.2多線程的構建
系統當中存在持續的數據采集過程,在電機控制過程中也存在大的延遲等待過程,為了系統中各功能之間不要相互阻塞,所以系統需要構建多線程模式。每一個獨立運行的線程通過創建運行于獨立線程中的類來實現,如圖7所示。在系統中構建出了“采集線程”、“數據存儲線程”、“UI線程”和“電機線程”,線程之間的同步則通過使用觀察者模式,建立起靈活的訂閱、退訂和更新操作。多線程之間將需要共享的采樣數據和電機數據進行并發訪問的保護。除了這幾個獨立的線程之外,還有一個響應下位機發送給上位機關于總控命令的事件,該事件也是獨立運行的。事件發生后通過調用電機線程中的MotorControl類的IOStateOperate方法對IOState字段進行設置,IOStateOperate方法的代碼處于臨界段保護中,所以是線程安全的。IOStateOperate方法通過設置Modify參數可以得知是需要對IOState進行設置或者讀取。

圖7 線程間關系
2.3數據的共享
通過NI采集器獲取的數據需要同時給數據存儲和顯示兩個地方使用,同時未來別的地方可能也會使用到該采樣數據,因此采用Observer模式是最合適的。在電機控制的程序中也有部分數據需要同時進行顯示和存盤,同樣可以使用這個模式。基于這個模式的類圖如圖8所示。Subject和Observer之間是多對多的關系,為了在Update之后能正確的獲知數據的來源,需要在Update時加入Subject作為參數。為了能同步Subject所在線程和Observer所在線程之間的處理速度的差異,在Observer中引入了一個Queue類來作為數據緩沖區。由于Attach、Remove和Update操作需要跨線程使用,所以必須通過編程保證其線程安全性。

圖8 Observer模式應用
2.4臺架動作的實現
臺架動作包括:解鎖,鎖緊,變攻角,急停,回零位等方法。這些方法都有一個如圖9所示共同的執行過程。所以使用模板方法模式來建立一個相同的運行模板,然后通過往模板中傳遞不同的類來實現功能的改變。使用模板方法后,在有新的臺架動作需要加入時只需要從Operation類派生一個新的臺架動作類即可。

圖9 動作執行的相同過程
在對象設計過程中系統的實現需要用到面向對象的接口、繼承和多態等特性。但LabVIEW本身并不都具備這些功能,特別是LabVIEW中原生的對象的傳遞方式是按照值傳遞的,所以在跨線程的情況下對象的共享就沒法實現。本系統的實現使用到了LabVIEW的G#擴展包,該包利用LabVIEW提供的“數據值引用”的特性,為所有的G#類(均派生于LabVIEW的基礎類)增加了按引用傳遞的方式。G#擴展包也為G#類提供了面向接口編程的支持,使一些使用到接口的編程模式得以實現。

圖10 模板方法和相關的類
LabVIEW編譯器本身能將程序框圖按照最有利于提高程序性能的多線程方式編譯,但是用戶不能隨意的控制這些線程的執行。自從LabVIEW開始提供基于面向對象的Actor Framework框架模式后,這種利用異步調用來創建新線程的方法,給多線程的控制提供了非常有效的手段。本軟件中涉及的四個線程:采集、電機控制、UI和數據存儲,均使用Actor來實現。Actor與G#類之間的關系如圖11所示,Actor用于管理線程,而線程之間的數據交互通過線程安全的G#類來實現,這些G#類的所有公有方法均為跨線程使用做過臨界段保護的方法。
最后實現的程序界面如圖12所示,LabVIEW類層次結構如圖13所示。

圖11 Actor與G#協作關系
通過對試車臺實驗控制過程的分析,結合面向對象的方法對控制軟件進行了設計,最后利用LabVIEW和G#實現了該控制軟件。通過現場實驗證明了該軟件能正常的控制試車臺的實驗過程,并且基于面向對象的設計方法給軟件帶來了較大的靈活性和可擴展性。該軟件的成功應用為Actor Framework和G#以及面向對象的設計模式等手段在LabVIEW和試車臺當中的應用提供了一個良好的實踐參考。

圖12 軟件操作界面

圖13 LabVIEW類層次結構
[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns – Elements of Reuseable Object-Oriented Software[M]. 北京: 機械工業出版社, 2002.
[2] 謝之柱, 楊世錫, 顧小軍. 一種基于LabVIEW的大型測控軟件數據傳遞方式的研究[J]. 工業控制計算機, 2007, 07: 43-46.
[3] 劉瀚文, 萬遂人. 基于LabVIEW的磁共振射頻接收單元自動化測試系統[J]. 軟件, 2014, 35(3): 35-37.
[4] 胡武揚, 段富海, 董科銳. 基于LabVIEW的舵機自動加載測試系統軟件設計[J]. 軟件, 2015, 36(5): 24-29.
[5] 劉瀚文, 萬遂人. 基于LabVIEW的磁共振射頻接收單元自動化測試系統[J]. 軟件, 2014, 35(3): 35-37.
[6] 楊建軍. 論利用OOP設計思想的通訊接口類的設計與應用[J]. 現代電子技術, 2013, 36(12): 148-150.
[7] 李少輝. 面向對象與MVC框架的融合[J]. 軟件, 2013, 34(1): 82-84.
[8] 徐桓, 孫瑜. 基于改進QPSO的單任務Agent聯盟生成[J].軟件, 2015, 36(2): 1-4.
[9] 高玉軍. 面向對象分布式Web自動化實現[J]. 軟件, 2013, 34(11): 86-88.
[10] 易昕昕, 宋美娜, 楊俊, 等. 一種面向對象的全過程需求工程方法[J]. 軟件, 2014, 35(6): 1-5.
[11] 白云, 高育鵬, 胡小江. 基于LabVIEW的數據采集與處理技術[M]. 西安: 西安電子科技大學出版社, 2009.
[12] 雷振山, 肖成勇, 魏麗, 等. LabVIEW高級編程與虛擬儀器工程應用[M]. 2版. 北京: 中國鐵道出版社, 2012.
[13] FOWLER Martin. UML精粹: 標準對象建模語言簡明指南(英文影印版)[M]. 3版. 北京: 清華大學出版社, 2006.
[14] 羅莎, 鄂海紅, 宋美娜, 等. 對象存儲研究綜述[J]. 新型工業化, 2012, 2(11): 32-41. Luo Sha, E Haihong, Song Meina, LI Yan et al. The research on Object Storage[J].The Journal of New Industrialization, 2012, 2(11): 32-41.
Software Design for Controlling Test Bed Based on Object-Oriented LabVIEW
PI Zu-cheng, Chen Wen, Dai Shan-xi
(China Academy of Aerospace Aerodynamics, Beijing 100074, China)
The software for controlling Test Bed which has three basic tasks: control attack angle, record the data of balance and angle sensor, and communicate to general control system. With G# extension LabVIEW object can be shared by reference, that is used to extend the sharing range and flexibility of using the LabVIEW object. G# extended the Object-Oriented Interface to LabVIEW, thus a lot of Design Pattern can be used easily in LabVIEW programming. The software was analyzed and designed in Object-Oriented way. The software was implemented reliably and flexibly by the graphic programming platform of LabVIEW.
Interface; LabVIEW; G#; Design Pattern
V211.72
A
10.3969/j.issn.1003-6970.2016.08.023
皮祖成(1985-),男,工程師,主要研究方向:無人機任務載荷應用、測試軟件。