組態(tài)軟件實現(xiàn)組件間通信的一種典型技術(shù)
時間:2007-03-28 15:55:00來源:zhangyx
導(dǎo)語:?組態(tài)軟件作為用戶可定制功能的軟件平臺工具,目前已經(jīng)在各個行業(yè)和領(lǐng)域得到了廣泛應(yīng)用
1 引言
組態(tài)軟件作為用戶可定制功能的軟件平臺工具,目前已經(jīng)在各個行業(yè)和領(lǐng)域得到了廣泛應(yīng)用。組態(tài)軟件伴隨著DCS及計算機控制技術(shù)的發(fā)展而逐漸成熟進來,組件化、分布式已經(jīng)成為組態(tài)軟件的基本特征。優(yōu)秀的組態(tài)軟件大多將它的實時數(shù)據(jù)庫、HMI、I/O服務(wù)器、數(shù)據(jù)服務(wù)器等幾個主要部分設(shè)計成分別可獨立運行的組件。這些組件可以同時運行在一臺計算機內(nèi),也可以分布式地運行在不同的計算機內(nèi),通過網(wǎng)絡(luò)等方式實現(xiàn)組件間的通信。這種體系結(jié)構(gòu)可以讓用戶靈活地配置自己的系統(tǒng),合理地分配各個服務(wù)器的運算負荷。
但實現(xiàn)組件化同時也帶來了軟件設(shè)計上的復(fù)雜性。特別是如何實現(xiàn)組件間的高效、實時、可靠地通信成為一個關(guān)鍵問題。
2 組件間通信技術(shù)
組件間在實現(xiàn)通信過程時,包括兩種方式:本地方式和遠程方式。在設(shè)計時,可以考慮將本地方式作為遠程方式的基礎(chǔ)?;蛘哒f,實現(xiàn)了本地通信,也就實現(xiàn)了遠程通信。因為可以將組件間交換的數(shù)據(jù)通過遠程方式,傳送到目的機后,再通過本地方式與遠程組件通信。下面我們分別討論如何實現(xiàn)組件間的本地通信和遠程通信。
3 本地通信
組件間實現(xiàn)本地通信時,在底層上要解決的本質(zhì)問題上是進程間通信問題。進程間通信是一種與OS密切相關(guān)的技術(shù)。本文所介紹的方法是以微軟的Windows操作系統(tǒng)為基礎(chǔ)的。Windows各個版本的操作系統(tǒng)都提供了豐富的進程間通信手段。從早期版本提供的管道、郵件槽、DDE技術(shù),到后來推出的COM技術(shù),以及目前最新的“.NET”中提供的全新方法等。本文介紹的技術(shù)屬于“傳統(tǒng)”技術(shù),它的基礎(chǔ)是Windows的消息傳遞功能,同時輔助內(nèi)存文件映射和信號量技術(shù)。筆者認為這種方法有以下幾個優(yōu)點:
1)、實現(xiàn)簡便。因為涉及的技術(shù)都不很復(fù)雜,因此實現(xiàn)起來比較容易。
2)、實時性高。這種方法使用的都是OS的底層技術(shù),中間環(huán)節(jié)少,運行效率高,可以實現(xiàn)快速數(shù)據(jù)通信。
3)、移植性好。因為采用的是OS底層技術(shù),這種方法受OS版本升級的影響很小,也很容易移植到非Windows操作系統(tǒng)上。而某些進程間通信技術(shù),如DDE,在新版的Windows操作系統(tǒng)上已經(jīng)不再被支持。其它一些技術(shù)也因OS升級在接口形式和實現(xiàn)方法上發(fā)生了很大變化,使應(yīng)用程序受到影響。
4)、功能可控性好。這里的可控性是指開發(fā)人員在使用一種技術(shù)時,能否有效地控制這種技術(shù)的運用。例如,開發(fā)人員在選用一種技術(shù)時,如果這種技術(shù)作了過多的封裝,雖然應(yīng)用簡單,但要實現(xiàn)自己的靈活控制時就會處處受縛。
5)、可靠性易控。這一點與上面提到的可控性是相關(guān)的。操作系統(tǒng)越是底層的技術(shù),可靠性就越強。封裝得越多的技術(shù),其可靠性就越無法控制。
6)、對系統(tǒng)環(huán)境的適應(yīng)能力強。這個問題可以用一個簡單的例子說明:用過基于COM/DCOM技術(shù)開發(fā)的軟件產(chǎn)品(如:OPC類軟件)的用戶,很多人都經(jīng)歷過因不同系統(tǒng)環(huán)境而必須面對COM/DCOM復(fù)雜配置的困惑。
本地通信在計算模式上仍然屬于C/S結(jié)構(gòu)。主要問題是如何實現(xiàn)多個Client與Server之間快速、并發(fā)式的數(shù)據(jù)交換。下面結(jié)合實例進行說明。
假設(shè)Client和Server是采用這種技術(shù)的客戶端和服務(wù)器端程序,它們都是基于窗口的獨立進程。每次進行數(shù)據(jù)交換時Client向Server發(fā)送一個請求報文,Server收到請求報文后,再向Client回復(fù)一個應(yīng)答報文,如此不斷往復(fù)。
因為可能有多個Client與同一Server同時進行快速數(shù)據(jù)交換,因此上述交互過程必須采用異步方式方能保證可靠性和并發(fā)性。為了實現(xiàn)方便,需要抽象一個專用于進程通信的中間件ICom以供各個Client同時調(diào)用。ICom提供3個最基本的接口:
1)、Open()。在這個接口里ICom實現(xiàn)的功能包括:初始化用于數(shù)據(jù)交換的內(nèi)存映射文件、創(chuàng)建上行(Client到Server)和下行(Server到Client)事件通知的信號量對象、創(chuàng)建用于防止共享沖突的信號量對象,啟動服務(wù)線程,同時Client向Server發(fā)送消息進行身份認證和注冊。
2)、Close()。Client在關(guān)閉進程或斷開與Server的通信時調(diào)用該接口。這個接口ICom要釋放在執(zhí)行Open()方法時創(chuàng)建的對象資源,同時Client向Server發(fā)送消息執(zhí)行注銷操作。
3)、SendMessage()。Client向Server發(fā)送報文時調(diào)用該接口。
這里重點介紹報文的傳遞過程。
當(dāng)Client調(diào)用ICom的SendMessage()方法向Server發(fā)送報文時,需要使用信號量控制時序。當(dāng)用SDK函數(shù)SendMessageTimeout()將報文發(fā)送給Server后,通過信號量等待Server的回復(fù),一旦等到回復(fù)信號,便知道Server已經(jīng)將回復(fù)報文放到內(nèi)存映射文件中,就可以取得該報文并以參數(shù)的形式傳遞給Client。
為了接收對方發(fā)送的消息,Server程序的主窗口類上要增加消息“WM_COPYDATA”的映射函數(shù)。當(dāng)Client調(diào)用ICom的SendMessage()方法向Server發(fā)送報文時,Server會立刻接收到WM_COPYDATA消息,并通過消息參數(shù)獲取報文信息。但是Server在接收到請求報文后并不立即處理、回復(fù),要首先用ReplyMessage()方法對WM_COPYDATA消息進行應(yīng)答,以免對方進程發(fā)生無謂等待,然后將報文放到內(nèi)部緩沖隊列中,再向自身的主窗口用PostMessage()發(fā)送一個通知消息,在另外一個消息映射函數(shù)中處理緩沖隊列中的請求報文。Server的這種處理機制是保證交互過程為異步方式的關(guān)鍵。這種異步機制非常重要,它可以在多個Client程序與Server之間進行頻繁的大數(shù)據(jù)量交換時合理地分配CPU資源,避免發(fā)生“死鎖”現(xiàn)象。
Server解析請求報文的內(nèi)容,將回復(fù)報文放至ICom中分配的內(nèi)存映射文件中,并通過信號量通知ICom接收回復(fù)報文。一次完整信息交互過程完成。
報文的格式由報頭和數(shù)據(jù)尾兩部分組成。報頭為固定結(jié)構(gòu),其中要包含消息號、數(shù)據(jù)長度、Client的ID等信息。數(shù)據(jù)尾部分為不定長的任何內(nèi)容。
3 遠程通信
遠程通信完全建立在本地通信的基礎(chǔ)之上。但要增加兩個專用于網(wǎng)絡(luò)通信服務(wù)的組件:NetClient和NetServer。NetClient和NetServer也是兩個完全獨立的進程。以采用TCP/IP網(wǎng)絡(luò)為例,NetClient和NetServer分別相當(dāng)于Socket client和Socket server端。NetClient和NetServer并不關(guān)心傳送的報文的內(nèi)容,它們只負責(zé)網(wǎng)絡(luò)連接的建立、報文的傳輸、網(wǎng)絡(luò)通信故障時的數(shù)據(jù)緩存與恢復(fù)等。
仍結(jié)合上一節(jié)中的實例。當(dāng)Client程序與Server進行遠程數(shù)據(jù)交換時,Client將與NetClient運行在同一計算機內(nèi),而Server與NetServer運行在同一計算機內(nèi)。此時ICom將Client的請求報文首先通過本地通信方式發(fā)送給NetClient,再由NetClient通過網(wǎng)絡(luò)發(fā)送給遠程的NetServer,然后由NetServer通過本地通信方式傳送給Server。而Server的回復(fù)報文的傳送過程正好相反。
在實際開發(fā)產(chǎn)品時,NetClient和NetServer可以設(shè)計成為更具廣泛意義上的網(wǎng)絡(luò)服務(wù)組件。除了支持TCP/IP網(wǎng)絡(luò),還可以支持UDP/IP、串行通信、GPRS等任何一種通信形式。而無論使用哪一種通信方式對于Client和Server來說都是完全透明的,這也正是產(chǎn)品實現(xiàn)組件化的優(yōu)勢所在。
4 結(jié)束語
組件間通信技術(shù)是設(shè)計組態(tài)軟件、數(shù)據(jù)通信類軟件的關(guān)鍵技術(shù)之一。如何能夠在實現(xiàn)快速、高效、多用戶并發(fā)處理的前提下,保證可靠性、靈活性和廣泛適應(yīng)性,值得設(shè)計人員思考。本文介紹的技術(shù)在筆者設(shè)計的組態(tài)軟件產(chǎn)品中多處得到運用,經(jīng)過逾千應(yīng)用案例的證明是成熟可靠的。
標簽:
中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責(zé)任。