皮祖成,陳 文,戴善溪
(中國(guó)航天空氣動(dòng)力技術(shù)研究院,北京 10074)
基于LabVIEW面向?qū)ο蟮脑囓嚺_(tái)實(shí)驗(yàn)控制軟件設(shè)計(jì)
皮祖成,陳文,戴善溪
(中國(guó)航天空氣動(dòng)力技術(shù)研究院,北京10074)
試車臺(tái)實(shí)驗(yàn)控制軟件用于發(fā)動(dòng)機(jī)測(cè)力實(shí)驗(yàn)過程中對(duì)攻角的控制、天平及角度傳感器數(shù)據(jù)的記錄、并實(shí)現(xiàn)與總控系統(tǒng)的數(shù)據(jù)應(yīng)答。軟件的設(shè)計(jì)過程通過使用LabVIEW的G#擴(kuò)展,使得LabVIEW中的對(duì)象能夠以引用的方式傳遞,相對(duì)于按值傳遞的方式而言擴(kuò)大了對(duì)象的共享范圍,使得軟件編寫的靈活性增加。G#擴(kuò)展支持了基于接口的面向?qū)ο蠓椒?,使得諸多的設(shè)計(jì)模式得以順利的應(yīng)用到LabVIEW的編程當(dāng)中。該軟件最后通過采用面向?qū)ο蟮姆治?、設(shè)計(jì)方法,并采用LabVIEW圖形化編程平臺(tái),實(shí)現(xiàn)了一個(gè)可靠、靈活的測(cè)控軟件。
接口;LabVIEW;G#;設(shè)計(jì)模式
本文著錄格式:皮祖成,陳文,戴善溪. 基于LabVIEW面向?qū)ο蟮脑囓嚺_(tái)實(shí)驗(yàn)控制軟件設(shè)計(jì)[J]. 軟件,2016,37(8):104-110
該軟件所控制的試車臺(tái)用于發(fā)動(dòng)機(jī)的測(cè)力實(shí)驗(yàn),其中包括發(fā)動(dòng)機(jī)的三個(gè)力(推力、升力和側(cè)向力)以及三個(gè)力矩(偏航、俯仰和滾轉(zhuǎn))。通過對(duì)臺(tái)架傾斜角度的控制來實(shí)現(xiàn)實(shí)驗(yàn)過程中對(duì)發(fā)動(dòng)機(jī)攻角的改變。試車臺(tái)的基本結(jié)構(gòu)如圖1所示,其中包括天平、角度傳感器、鎖緊裝置、攻角機(jī)構(gòu)(攻角動(dòng)平臺(tái)、攻角定平臺(tái)、電動(dòng)缸)。天平用于測(cè)量六分量的力和力矩;角度傳感器用于測(cè)量攻角的實(shí)際大?。绘i緊機(jī)構(gòu)用于在流場(chǎng)建立過程中對(duì)試車臺(tái)的保護(hù),在流場(chǎng)建立穩(wěn)定后將解除鎖定,以便正常的測(cè)力;攻角的動(dòng)平臺(tái)用于安裝和承載被測(cè)發(fā)動(dòng)機(jī),定平臺(tái)和動(dòng)平臺(tái)之間通過電動(dòng)缸來調(diào)節(jié)夾角,從而完成不同攻角情況下的實(shí)驗(yàn)任務(wù)。
試車臺(tái)的電氣控制原理框圖如圖2所示。NI采集器用于對(duì)角度傳感器和天平的六個(gè)分量進(jìn)行測(cè)量,同時(shí)NI采集器上裝有帶Windows XP操作系統(tǒng)的控制板卡,本文所設(shè)計(jì)的軟件也運(yùn)行于NI采集器上,所以NI采集器兼具有HMI的功能;Trio運(yùn)動(dòng)控制器用于對(duì)兩個(gè)鎖緊電機(jī)和電動(dòng)缸電機(jī)進(jìn)行控制。
試車臺(tái)的正常運(yùn)轉(zhuǎn)是在實(shí)驗(yàn)總控系統(tǒng)的控制下完成的。總控系統(tǒng)與試車臺(tái)系統(tǒng)的信息交換是通過8路數(shù)字量I/O通道實(shí)現(xiàn),這是通過利用Trio控制器的數(shù)字量I/O來實(shí)現(xiàn)的。信息交換的內(nèi)容包括:總控急停、開始命令、解鎖命令、回零命令、臺(tái)架急停反饋、解鎖完成反饋、回零到位反饋、攻角到位反饋。
圖1 試車臺(tái)基本結(jié)構(gòu)
圖2 電氣系統(tǒng)原理框圖
LabVIEW是National Instrument公司的可視化編程軟件,使用LabVIEW編程的門檻較低,所以在信號(hào)測(cè)試等工程領(lǐng)域應(yīng)用比較廣泛[2-5]。然而,較之C++,java,C#等文本類編程語(yǔ)言來說LabVIEW提供的面向?qū)ο筇匦蕴伲沟迷谄渌嫦驅(qū)ο缶幊陶Z(yǔ)言中產(chǎn)生的成熟設(shè)計(jì)模式無法正常應(yīng)用于LabVIEW當(dāng)中。面向?qū)ο蠓椒ㄗ鳛橐环N高級(jí)程序設(shè)計(jì)方法,能有效的提高程序設(shè)計(jì)效率并降低軟件模塊之間的耦合度,結(jié)合軟件設(shè)計(jì)模式的應(yīng)用[6-9],可有效的提高軟件的靈活性和穩(wěn)定性[9]。G#作為AddQ公司對(duì)LabVIEW的面向?qū)ο髷U(kuò)展彌補(bǔ)了LabVIEW在面向?qū)ο蠓矫娴牟蛔?。LabVIEW在其2012版本中新增的操作者框架能快速靈活的創(chuàng)建獨(dú)立線程,對(duì)多任務(wù)的處理提供了方便的途徑。
試車臺(tái)的運(yùn)轉(zhuǎn)由試車臺(tái)的操作員來完成,操作員主要是對(duì)試車臺(tái)狀態(tài)的監(jiān)控、系統(tǒng)的啟動(dòng)和正常的維護(hù)。系統(tǒng)啟動(dòng)過后臺(tái)架的動(dòng)作是按照總控系統(tǒng)發(fā)送的命令來執(zhí)行。系統(tǒng)的用例如圖3所示,參與者有兩個(gè),一個(gè)是試車臺(tái)操作員,另一個(gè)是本系統(tǒng)外部的總控系統(tǒng)。對(duì)于總控系統(tǒng)操作者來說,只需要使用“總控通信”用例進(jìn)行信息的發(fā)送和接收即可。對(duì)于試車臺(tái)操作員而言,他需要使用“數(shù)據(jù)采集”、“狀態(tài)查看”和“電機(jī)控制”三個(gè)用例。為滿足實(shí)驗(yàn)后數(shù)據(jù)分析的需求,必須將實(shí)驗(yàn)過程中的相關(guān)數(shù)據(jù)進(jìn)行存盤操作,這個(gè)包含在“數(shù)據(jù)存儲(chǔ)”用例中。所有電機(jī)的控制是通過Trio運(yùn)動(dòng)控制器來實(shí)現(xiàn)的,“Trio控制”用例包含了與電機(jī)相關(guān)的所有任務(wù)。與總控系統(tǒng)的通信也是通過Trio控制器的I/O口實(shí)現(xiàn)的,所以“Trio控制”用例也兼具通信的用途?!盃顟B(tài)查看”主要是將一些關(guān)鍵的系統(tǒng)狀態(tài)數(shù)據(jù)顯示到用戶界面當(dāng)中。
數(shù)據(jù)采集過程作為一個(gè)需要持續(xù)運(yùn)行的過程,軟件的設(shè)計(jì)必須考慮到不阻塞UI線程。電機(jī)控制過程的目的是為了讓機(jī)械結(jié)構(gòu)做一定的運(yùn)動(dòng),這個(gè)過程往往需要較多的執(zhí)行時(shí)間,因此也需要考慮阻塞的問題。數(shù)據(jù)采集所獲取到的結(jié)果一方面需要用于數(shù)據(jù)存儲(chǔ),另一方面需要用于狀態(tài)顯示;同樣電機(jī)控制部分的通信命令也既需要顯示也需要存儲(chǔ)到文件當(dāng)中。
Trio控制器的編程需要使用其自帶的Trio Basic語(yǔ)言,并下載到控制器上來運(yùn)行。所以,軟件的設(shè)計(jì)需要體現(xiàn)上位機(jī)和下位機(jī)的通信,這樣從系統(tǒng)的穩(wěn)定性和快速性來說系統(tǒng)間的解耦就體現(xiàn)得非常的重要。軟件需要設(shè)計(jì)上位機(jī)基于LabVIEW的主程序,也需要設(shè)計(jì)基于Trio Basic的電機(jī)控制程序,而且這兩部分程序間需要進(jìn)行數(shù)據(jù)交互。Trio控制器與NI采集器之間是通過以太網(wǎng)通信的,這個(gè)是基于Trio公司提供的TrioPC控件來實(shí)現(xiàn)的。Trio控制器提供了兩種數(shù)據(jù)的通信方式:查詢的方式和事件響應(yīng)的方式(即Pull和Push方式均可)。最終的程序部署位置如圖4所示。
圖3 系統(tǒng)用例圖
圖4 程序部署
圖5 下位機(jī)的TrioBasic類
2.1上下位機(jī)程序的協(xié)調(diào)
試車臺(tái)架需要執(zhí)行的動(dòng)作包括:解鎖、鎖緊、變攻角,而電機(jī)控制器自身需要初始化各控制設(shè)備和響應(yīng)急停命令,因此有6種操作需要在Trio控制器中執(zhí)行。Trio Basic并不支持面向?qū)ο蟮木幊谭绞剑诜治鲞^程中仍不妨將Trio控制器中的程序視為一個(gè)類,如圖5所示。Initialize方法將與控制器相關(guān)的設(shè)備都初始化;SendIOState為一個(gè)持續(xù)向上位機(jī)發(fā)送I/O口狀態(tài)的方法,這樣上位機(jī)就可以及時(shí)獲取到總控系統(tǒng)發(fā)送給本系統(tǒng)的命令;Lock和Release則是對(duì)鎖緊機(jī)構(gòu)的鎖緊和釋放;ToAngle則完成變攻角的過程;LenzePos屬性代表了當(dāng)前攻角的位置。在上位機(jī)當(dāng)中設(shè)計(jì)了一個(gè)TiroPC的類來實(shí)現(xiàn)和TrioBasic的交互,對(duì)TrioBasic中某個(gè)方法的調(diào)用順序如圖6所示。對(duì)TrioPC的Invoke Lock調(diào)用為同步調(diào)用,最后需要返回Invoke成功與否的結(jié)果;而TrioPC將Invoke Lock操作委托給TrioBasic做,由于TrioPC和TrioBasic之間是通過TCP/IP完成的,所以采用異步調(diào)用的方式,此后由TrioPC調(diào)用私有方法GetResult來查詢委托給TrioBasic的任務(wù)是否已經(jīng)完成;GetResult方法為一個(gè)具有超時(shí)輸入的方法。
圖6 TrioPC與TrioBasic的調(diào)用順序圖
2.2多線程的構(gòu)建
系統(tǒng)當(dāng)中存在持續(xù)的數(shù)據(jù)采集過程,在電機(jī)控制過程中也存在大的延遲等待過程,為了系統(tǒng)中各功能之間不要相互阻塞,所以系統(tǒng)需要構(gòu)建多線程模式。每一個(gè)獨(dú)立運(yùn)行的線程通過創(chuàng)建運(yùn)行于獨(dú)立線程中的類來實(shí)現(xiàn),如圖7所示。在系統(tǒng)中構(gòu)建出了“采集線程”、“數(shù)據(jù)存儲(chǔ)線程”、“UI線程”和“電機(jī)線程”,線程之間的同步則通過使用觀察者模式,建立起靈活的訂閱、退訂和更新操作。多線程之間將需要共享的采樣數(shù)據(jù)和電機(jī)數(shù)據(jù)進(jìn)行并發(fā)訪問的保護(hù)。除了這幾個(gè)獨(dú)立的線程之外,還有一個(gè)響應(yīng)下位機(jī)發(fā)送給上位機(jī)關(guān)于總控命令的事件,該事件也是獨(dú)立運(yùn)行的。事件發(fā)生后通過調(diào)用電機(jī)線程中的MotorControl類的IOStateOperate方法對(duì)IOState字段進(jìn)行設(shè)置,IOStateOperate方法的代碼處于臨界段保護(hù)中,所以是線程安全的。IOStateOperate方法通過設(shè)置Modify參數(shù)可以得知是需要對(duì)IOState進(jìn)行設(shè)置或者讀取。
圖7 線程間關(guān)系
2.3數(shù)據(jù)的共享
通過NI采集器獲取的數(shù)據(jù)需要同時(shí)給數(shù)據(jù)存儲(chǔ)和顯示兩個(gè)地方使用,同時(shí)未來別的地方可能也會(huì)使用到該采樣數(shù)據(jù),因此采用Observer模式是最合適的。在電機(jī)控制的程序中也有部分?jǐn)?shù)據(jù)需要同時(shí)進(jìn)行顯示和存盤,同樣可以使用這個(gè)模式?;谶@個(gè)模式的類圖如圖8所示。Subject和Observer之間是多對(duì)多的關(guān)系,為了在Update之后能正確的獲知數(shù)據(jù)的來源,需要在Update時(shí)加入Subject作為參數(shù)。為了能同步Subject所在線程和Observer所在線程之間的處理速度的差異,在Observer中引入了一個(gè)Queue類來作為數(shù)據(jù)緩沖區(qū)。由于Attach、Remove和Update操作需要跨線程使用,所以必須通過編程保證其線程安全性。
圖8 Observer模式應(yīng)用
2.4臺(tái)架動(dòng)作的實(shí)現(xiàn)
臺(tái)架動(dòng)作包括:解鎖,鎖緊,變攻角,急停,回零位等方法。這些方法都有一個(gè)如圖9所示共同的執(zhí)行過程。所以使用模板方法模式來建立一個(gè)相同的運(yùn)行模板,然后通過往模板中傳遞不同的類來實(shí)現(xiàn)功能的改變。使用模板方法后,在有新的臺(tái)架動(dòng)作需要加入時(shí)只需要從Operation類派生一個(gè)新的臺(tái)架動(dòng)作類即可。
圖9 動(dòng)作執(zhí)行的相同過程
在對(duì)象設(shè)計(jì)過程中系統(tǒng)的實(shí)現(xiàn)需要用到面向?qū)ο蟮慕涌凇⒗^承和多態(tài)等特性。但LabVIEW本身并不都具備這些功能,特別是LabVIEW中原生的對(duì)象的傳遞方式是按照值傳遞的,所以在跨線程的情況下對(duì)象的共享就沒法實(shí)現(xiàn)。本系統(tǒng)的實(shí)現(xiàn)使用到了LabVIEW的G#擴(kuò)展包,該包利用LabVIEW提供的“數(shù)據(jù)值引用”的特性,為所有的G#類(均派生于LabVIEW的基礎(chǔ)類)增加了按引用傳遞的方式。G#擴(kuò)展包也為G#類提供了面向接口編程的支持,使一些使用到接口的編程模式得以實(shí)現(xiàn)。
圖10 模板方法和相關(guān)的類
LabVIEW編譯器本身能將程序框圖按照最有利于提高程序性能的多線程方式編譯,但是用戶不能隨意的控制這些線程的執(zhí)行。自從LabVIEW開始提供基于面向?qū)ο蟮腁ctor Framework框架模式后,這種利用異步調(diào)用來創(chuàng)建新線程的方法,給多線程的控制提供了非常有效的手段。本軟件中涉及的四個(gè)線程:采集、電機(jī)控制、UI和數(shù)據(jù)存儲(chǔ),均使用Actor來實(shí)現(xiàn)。Actor與G#類之間的關(guān)系如圖11所示,Actor用于管理線程,而線程之間的數(shù)據(jù)交互通過線程安全的G#類來實(shí)現(xiàn),這些G#類的所有公有方法均為跨線程使用做過臨界段保護(hù)的方法。
最后實(shí)現(xiàn)的程序界面如圖12所示,LabVIEW類層次結(jié)構(gòu)如圖13所示。
圖11 Actor與G#協(xié)作關(guān)系
通過對(duì)試車臺(tái)實(shí)驗(yàn)控制過程的分析,結(jié)合面向?qū)ο蟮姆椒▽?duì)控制軟件進(jìn)行了設(shè)計(jì),最后利用LabVIEW和G#實(shí)現(xiàn)了該控制軟件。通過現(xiàn)場(chǎng)實(shí)驗(yàn)證明了該軟件能正常的控制試車臺(tái)的實(shí)驗(yàn)過程,并且基于面向?qū)ο蟮脑O(shè)計(jì)方法給軟件帶來了較大的靈活性和可擴(kuò)展性。該軟件的成功應(yīng)用為Actor Framework和G#以及面向?qū)ο蟮脑O(shè)計(jì)模式等手段在LabVIEW和試車臺(tái)當(dāng)中的應(yīng)用提供了一個(gè)良好的實(shí)踐參考。
圖12 軟件操作界面
圖13 LabVIEW類層次結(jié)構(gòu)
[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns – Elements of Reuseable Object-Oriented Software[M]. 北京: 機(jī)械工業(yè)出版社, 2002.
[2] 謝之柱, 楊世錫, 顧小軍. 一種基于LabVIEW的大型測(cè)控軟件數(shù)據(jù)傳遞方式的研究[J]. 工業(yè)控制計(jì)算機(jī), 2007, 07: 43-46.
[3] 劉瀚文, 萬(wàn)遂人. 基于LabVIEW的磁共振射頻接收單元自動(dòng)化測(cè)試系統(tǒng)[J]. 軟件, 2014, 35(3): 35-37.
[4] 胡武揚(yáng), 段富海, 董科銳. 基于LabVIEW的舵機(jī)自動(dòng)加載測(cè)試系統(tǒng)軟件設(shè)計(jì)[J]. 軟件, 2015, 36(5): 24-29.
[5] 劉瀚文, 萬(wàn)遂人. 基于LabVIEW的磁共振射頻接收單元自動(dòng)化測(cè)試系統(tǒng)[J]. 軟件, 2014, 35(3): 35-37.
[6] 楊建軍. 論利用OOP設(shè)計(jì)思想的通訊接口類的設(shè)計(jì)與應(yīng)用[J]. 現(xiàn)代電子技術(shù), 2013, 36(12): 148-150.
[7] 李少輝. 面向?qū)ο笈cMVC框架的融合[J]. 軟件, 2013, 34(1): 82-84.
[8] 徐桓, 孫瑜. 基于改進(jìn)QPSO的單任務(wù)Agent聯(lián)盟生成[J].軟件, 2015, 36(2): 1-4.
[9] 高玉軍. 面向?qū)ο蠓植际絎eb自動(dòng)化實(shí)現(xiàn)[J]. 軟件, 2013, 34(11): 86-88.
[10] 易昕昕, 宋美娜, 楊俊, 等. 一種面向?qū)ο蟮娜^程需求工程方法[J]. 軟件, 2014, 35(6): 1-5.
[11] 白云, 高育鵬, 胡小江. 基于LabVIEW的數(shù)據(jù)采集與處理技術(shù)[M]. 西安: 西安電子科技大學(xué)出版社, 2009.
[12] 雷振山, 肖成勇, 魏麗, 等. LabVIEW高級(jí)編程與虛擬儀器工程應(yīng)用[M]. 2版. 北京: 中國(guó)鐵道出版社, 2012.
[13] FOWLER Martin. UML精粹: 標(biāo)準(zhǔn)對(duì)象建模語(yǔ)言簡(jiǎn)明指南(英文影印版)[M]. 3版. 北京: 清華大學(xué)出版社, 2006.
[14] 羅莎, 鄂海紅, 宋美娜, 等. 對(duì)象存儲(chǔ)研究綜述[J]. 新型工業(yè)化, 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-),男,工程師,主要研究方向:無人機(jī)任務(wù)載荷應(yīng)用、測(cè)試軟件。