蘇娟 郝欣偉 李志超
摘要:基于多線程和模塊化的設(shè)計思想,以abview為開發(fā)平臺,實現(xiàn)了人機交互式控制系統(tǒng)軟件的設(shè)計開發(fā)。本方案的設(shè)計難點是基于Labview開發(fā)平臺的人機交互式控制軟件的架構(gòu)設(shè)計以及高實時性和可靠性的多線程協(xié)同工作模式的實現(xiàn)。本方案具有人機交互界面友好、開發(fā)周期短、穩(wěn)定可靠、控制準(zhǔn)確度高等特點,極大地提高了控制系統(tǒng)的開發(fā)效率和自動化程度。
關(guān)鍵詞:多線程;人機交互式控制;Labview;
中圖分類號:A06-029文獻(xiàn)標(biāo)識碼:A文章編號:1674-3520(2014)-06-00259-021、前言
人機交互式控制模式是指操作人員通過終端設(shè)備輸入信息和操作命令,系統(tǒng)接到后立即處理,并通過終端設(shè)備顯示處理結(jié)果,操作人員根據(jù)處理結(jié)果進(jìn)一步輸入信息和操作命令。系統(tǒng)與操作人員以人機對話的方式一問一答,直至最終獲得理想的結(jié)果,這種方式與傳統(tǒng)的非交互式處理相比,具有靈活、直觀、便于控制的優(yōu)點,在工業(yè)控制領(lǐng)域越來越廣泛地采用。
而傳統(tǒng)的基于Keil平臺狀態(tài)機的開發(fā)模式和基于Vxworks平臺多任務(wù)的開發(fā)模式都不能很好地滿足人交互式控制系統(tǒng)軟件的開發(fā)要求。Labview是一種基于圖形化數(shù)據(jù)流的編程語言,為人機交互式控制軟件的設(shè)計開發(fā)提供了嶄新的平臺。它使用圖形語言(如各種圖標(biāo)、圖形符號、連線等)以框圖的形式編寫程序,在提供強大功能的同時保證了系統(tǒng)的靈活性。
2、軟件結(jié)構(gòu)設(shè)計
2.1Labview多線程運行機制介紹
Labview的運行機制是一種協(xié)作式的多線程并行運行機制,當(dāng)同等優(yōu)先級線程被執(zhí)行時,時間片循環(huán)排序為每個線程分配了同等的處理器時間。在一個線程用完了可用的時間片,操作系統(tǒng)自動地停止處理該線程,開始執(zhí)行隊列中下一個線程。這種混合了搶占式和時間片輪轉(zhuǎn)式的任務(wù)排序能夠保證多任務(wù)的并行實時處理。
基于Labview多線程并行執(zhí)行,分割時間片占用CPU資源的運行機制,根據(jù)軟件需求,將該軟件分為主程序MAIN.VI和它所調(diào)用的各子程序組成。主程序采用面向數(shù)據(jù)流的結(jié)構(gòu)化設(shè)計思路,分為若干個線程并行執(zhí)行,每個線程由一個while循環(huán)構(gòu)成。不同線程的優(yōu)先級不同,通過在循環(huán)空閑時段調(diào)用“等待到下一個整數(shù)倍毫秒”函數(shù)和隊列的使用來調(diào)節(jié)CPU資源占有線程時間和數(shù)據(jù)的讀寫速度,從而達(dá)到不同優(yōu)先級線程并行執(zhí)行的效果。
2.2線程間通訊方式
其他線程之間的數(shù)據(jù)交互通過隊列、局部變量及VI服務(wù)器引用進(jìn)行。通過局部變量進(jìn)行數(shù)據(jù)交互多用于數(shù)據(jù)更新頻率低,數(shù)據(jù)結(jié)構(gòu)簡單的控件的值屬性改變,主要包括CAN總線初始化標(biāo)志位、流程參數(shù)(標(biāo)量)等;為了避免內(nèi)存的消耗和數(shù)據(jù)競爭,保證數(shù)據(jù)不丟失,指令響應(yīng)的及時準(zhǔn)確,采用隊列來進(jìn)行不同線程之間的數(shù)據(jù)傳遞;而人機交互界面上控件的動畫實時顯示則采用VI服務(wù)器引用來與運動控制子VI進(jìn)行信息交互。
3、CAN協(xié)議層的實現(xiàn)
CAN總線協(xié)議層基于已在各型號中廣泛使用的雙通道切換通信原理,基于Labview語言,總線接收采用查詢方式實現(xiàn),開啟獨立2個線程,由當(dāng)前工作通道來決定哪個線程處于工作狀態(tài),而備用通道工作線程處于空閑狀態(tài)。當(dāng)數(shù)據(jù)接收高峰時段,相鄰兩次接收時間間隔小于1ms,當(dāng)數(shù)據(jù)接收空閑時段,相鄰兩次查詢延時設(shè)置為10ms,讓出CPU資源,保證了其他線程執(zhí)行的實時性。
CAN總線發(fā)送采用FIFO隊列模式,當(dāng)不同的線程在相臨時間間隔內(nèi)均需發(fā)送數(shù)據(jù)時,僅需將所要發(fā)送的數(shù)據(jù)放入發(fā)送隊列。而在數(shù)據(jù)發(fā)送線程中,以查詢方式讀取隊列緩沖區(qū)內(nèi)的數(shù)據(jù),當(dāng)發(fā)送函數(shù)返回值為1時,代表本次發(fā)送成功,此時才從隊列中取出下一個待發(fā)送數(shù)據(jù);若發(fā)送失敗,則通過備用通道向總線各節(jié)點發(fā)送切換幀,告之各節(jié)點切換CAN工作通道,并將未發(fā)送成功數(shù)據(jù)重新發(fā)送。當(dāng)總線切換3次均為發(fā)送成功,則在人機交互界面彈出報警對話框,告之操作者總線通訊失敗。
如應(yīng)用局部變量實現(xiàn)線程間數(shù)據(jù)交互,如果查詢速度大于局部變量的速度,則會多次重復(fù)讀取同一數(shù)據(jù);如果查詢速度小于局部變量的改變速度,則會導(dǎo)致數(shù)據(jù)遺漏。
4、過程控制的實現(xiàn)
控制功能的實現(xiàn)是本設(shè)計的重點和難點。怎樣實現(xiàn)控制流程執(zhí)行時在各個狀態(tài)中靈活切換并能及時有效響應(yīng)“停止”按鍵,不出現(xiàn)死循環(huán)或響應(yīng)不及時現(xiàn)象?通過大量實驗,最終確定使用“生產(chǎn)者——消費者”+“狀態(tài)機”的設(shè)計模式來實現(xiàn)人機指令觸發(fā)響應(yīng)和控制狀態(tài)的靈活切換。
4.1生產(chǎn)者——消費者設(shè)計
“生產(chǎn)者——消費者”設(shè)計模式是事件處理器和隊列消息處理器相結(jié)合構(gòu)成的復(fù)合設(shè)計模式。生產(chǎn)者是指令的提供方,產(chǎn)生指令,并將指令放入隊列,由事件結(jié)構(gòu)+while循環(huán)組成;消費者是指令的消費方,依次從隊列中取出指令,由while循環(huán)+條件結(jié)構(gòu)處理。生產(chǎn)者和消費者之間存在一個指令緩沖區(qū),通過隊列來實現(xiàn)。例如當(dāng)“推進(jìn)”指令按下,“推進(jìn)”指令入隊列,在消費者循環(huán)中指令出隊列并執(zhí)行相應(yīng)流程,當(dāng)推進(jìn)過程中“停止”按下,則清空隊列,并執(zhí)行“停止”入隊列最前端,這樣在消費者循環(huán)中就能及時切換并執(zhí)行停止流程。
具體程序結(jié)構(gòu)框圖如圖1所示。
5.1狀態(tài)機設(shè)計
在消費者循環(huán)中,采用“狀態(tài)機”的設(shè)計模式來實現(xiàn)某個事件中各個狀態(tài)的切換,主要采用“while循環(huán)+條件分支”結(jié)構(gòu),并利用移位寄存器來傳遞狀態(tài)。在程序執(zhí)行完任一狀態(tài)時,對狀態(tài)變量賦值并存儲于移位寄存器中,實現(xiàn)將下一個狀態(tài)傳遞到下一次循環(huán)判斷中。下一次執(zhí)行while循環(huán)進(jìn)行狀態(tài)判斷時,通過條件結(jié)構(gòu)對移位寄存器中存儲的狀態(tài)進(jìn)行判斷,來執(zhí)行相應(yīng)的狀態(tài)。這樣,就實現(xiàn)了動態(tài)實時地改變程序執(zhí)行順序,以適應(yīng)多種控制情況的目的。具體結(jié)構(gòu)圖如圖2所示。
當(dāng)控制過程復(fù)雜時,在消費者循環(huán)中需要運行多層狀態(tài)機,即每一個狀態(tài)中又包含若干個子狀態(tài)。這樣,在程序?qū)崿F(xiàn)時就需要調(diào)用多層條件結(jié)構(gòu),每一層條件結(jié)構(gòu)都需要有對應(yīng)的移位寄存器用來判斷本次循環(huán)條件執(zhí)行的分支。如圖3所示。這樣,就造成了程序?qū)哟芜^多,可讀性維護(hù)性差的弊端。因此,我們可分析將每一層狀態(tài)機都封裝為一個函數(shù)功能模塊,而此VI的輸入輸出參數(shù)設(shè)為本次執(zhí)行的狀態(tài)和下一次要執(zhí)行的狀態(tài)。
以對中控制為例,對中的控制過程復(fù)雜,存在多個控制狀態(tài),狀態(tài)切換圖如圖4所示。如對中控制過程分為“左右粗對中”、“上下粗對中”、“左右平行”、“左右對中”、“上下平行”、“上下對中”6個順序執(zhí)行階段,每個控制階段中多次對油缸進(jìn)行控制,油缸有上下左右四個運動方向。油缸控制存在11種狀態(tài)切換,所以將油缸控制編寫為controlMotor.vi模塊,此VI的輸入輸出參數(shù)為本次油缸執(zhí)行狀態(tài)、和下次油缸執(zhí)行狀態(tài)。每次調(diào)用controlMotor.vi時只執(zhí)行一種狀態(tài),通過外層循環(huán)的移位寄存器改變狀態(tài)值來實現(xiàn)狀態(tài)切換,這樣簡化了程序結(jié)構(gòu),也避免了與主VI無法實時進(jìn)行數(shù)據(jù)交互的問題。程序框圖如圖5所示。
10、仿真及桌面聯(lián)調(diào)
各項控制功能調(diào)試:水平裝填車電控系統(tǒng)在實際大型試驗應(yīng)用中,能夠正確執(zhí)行自動對中、抓彈、放彈、裝填、退彈等控制功能,能夠?qū)崟r響應(yīng)停止操作,并能夠正確恢復(fù)繼續(xù)執(zhí)行,各故障狀態(tài)能夠及時準(zhǔn)確報警。
CAN總線通信功能及性能:總線上各節(jié)點給控制單元發(fā)送數(shù)據(jù),當(dāng)總線負(fù)載率為100%時,CAN數(shù)據(jù)接收線程仍能夠正常接收數(shù)據(jù),未出現(xiàn)丟數(shù)現(xiàn)象;水平裝填車電控系統(tǒng)信息傳輸?shù)恼_性、協(xié)調(diào)性,即水平裝填車電控系統(tǒng)內(nèi)部各設(shè)備間軟件接口正確,所有指令、數(shù)據(jù)收發(fā)正確。在運行期間CPU為43%內(nèi)存使用為256M,遠(yuǎn)遠(yuǎn)低于系統(tǒng)總內(nèi)存。在執(zhí)行控制流程或用戶對人機交互界面進(jìn)行操作時,數(shù)據(jù)處理能夠正常收發(fā),未出現(xiàn)丟數(shù)死機等異常現(xiàn)象。
11、程序設(shè)計時應(yīng)注意的問題
11.1多線程的同步執(zhí)行
多線程的同步執(zhí)行,應(yīng)合理分配CPU資源,優(yōu)先級高的線程。如總線數(shù)據(jù)接收線程,應(yīng)避免使用延時函數(shù),以保證數(shù)據(jù)接收的及時性??偩€數(shù)據(jù)存儲線程應(yīng)根據(jù)數(shù)據(jù)接收的最小周期來設(shè)定循環(huán)的周期,做到不占用過多的CPU資源,保證其他線程的執(zhí)行,又不會出現(xiàn)數(shù)據(jù)存儲遺漏。
11.2內(nèi)存泄漏的避免
程序中打開了某些資源(文件、引用等),在程序退出之前,不論是否有異常出現(xiàn),都一定要把資源關(guān)閉。若打開的資源不關(guān)閉,則一直駐留在內(nèi)存中。但程序關(guān)閉后再無法訪問這些資源,這就造成了內(nèi)存泄漏。不論在過程中是否有錯,打開的文件都應(yīng)當(dāng)在程序結(jié)束前被關(guān)閉。
11.3狀態(tài)機的使用
狀態(tài)機的應(yīng)用重點是移位寄存器的靈活使用,移位寄存器會動態(tài)地將狀態(tài)變量存在一個內(nèi)置的緩沖區(qū)中,不能通過局部變量或全局變量在其他線程中賦值來更改狀態(tài)執(zhí)行步驟。
11.4文件存儲過大問題
用TDMS文件將總線數(shù)據(jù)存儲在硬盤中,存儲數(shù)據(jù)線程的執(zhí)行周期如果過小,會造成存儲數(shù)據(jù)文件過大,存儲數(shù)據(jù)索引文件過大的問題,會大大影響硬盤存儲數(shù)據(jù)效率。所以,存儲數(shù)據(jù)線程的周期要根據(jù)數(shù)據(jù)產(chǎn)生周期而定,當(dāng)數(shù)據(jù)以1幀/ms的速率進(jìn)行入隊列操作時,數(shù)據(jù)存儲的周期要大于等于1s。
12結(jié)束語
本文的創(chuàng)新點在于多線程協(xié)同工作的設(shè)計思想,以及處理人機交互式控制的編程框架。以Labview2011為集成開發(fā)環(huán)境,以水平裝填車控制系統(tǒng)軟件為例,對多功能控制系統(tǒng)進(jìn)行了設(shè)計。實驗表明,各功能模塊運行良好,對外界觸發(fā)響應(yīng)及時,線程間數(shù)據(jù)交互準(zhǔn)確無誤。程序中使用動態(tài)設(shè)計,程序方便修改,具有較大的靈活性。很好地保證了系統(tǒng)的可視化操作和應(yīng)用實施的通用性。
參考文獻(xiàn):
[1]Labview寶典/陳樹學(xué),劉萱編著.—北京:電子工業(yè)出版社,2011.3
[2]我和Labview:一個NI工程師的十年編程經(jīng)驗/阮奇楨編著.—北京:北京航空航天大學(xué)出版社,2009.9