引言
組態(tài)軟件是面向工程監(jiān)控和數(shù)據(jù)采集的軟件平臺工具,具有豐富的設(shè)置項目。組態(tài)軟件所涉及的工業(yè)領(lǐng)域非常廣泛,在工業(yè)監(jiān)控系統(tǒng)中發(fā)揮著越來越重要的作用。組態(tài)軟件要接收現(xiàn)場的采集數(shù)據(jù),并形成動態(tài)畫面,以反映工業(yè)現(xiàn)場的各種狀態(tài),并能夠?qū)ΜF(xiàn)場設(shè)備進行控制。這些都依賴于組態(tài)軟件的通信模塊。通信模塊作為組態(tài)運行環(huán)境中數(shù)據(jù)交互的重要渠道,通常處于監(jiān)控組態(tài)軟件運行環(huán)境的核心區(qū),其功能直接決定著組態(tài)軟件的性能。本文在基于TCP/IP網(wǎng)絡(luò)協(xié)議和SOCKET接口技術(shù)的基礎(chǔ)上,介紹了基于IEC61131-3標準的組態(tài)軟件通訊模塊的設(shè)計與實現(xiàn)方法。
1、通信模塊功能
組態(tài)監(jiān)測系統(tǒng)分為控制器和工程師站兩部分,圖1所示是系統(tǒng)的總體結(jié)構(gòu)圖。圖中的控制器負責采集并處理數(shù)據(jù),工程師站負責接收控制器發(fā)送過來的數(shù)據(jù),并將數(shù)據(jù)顯示和保存。通信模塊根據(jù)用戶定義的通信協(xié)議實現(xiàn)工程師站組態(tài)軟件與控制器之間的數(shù)據(jù)通信,完成數(shù)據(jù)通信幀的組織下行和上行數(shù)據(jù)幀的校驗、解析。由此可見,在整個組態(tài)軟件中,通信功能模塊擔負著上層組態(tài)運行環(huán)境與下層控制器之間數(shù)據(jù)交互的重要作用。
2、通信模塊設(shè)計
為了能夠及時、準確的反映設(shè)備運行狀況,設(shè)計時可采用基于TCP/IP協(xié)議的流式套接字(SOCK_STREAM)來實現(xiàn)組態(tài)軟件通信模塊的程序設(shè)計。
為了實現(xiàn)網(wǎng)絡(luò)通訊,Windows為應用程序提供了各種編程接口,如Windows Sockets API等,應用程序可以直接使用這些API函數(shù)。但對于較大型的應用程序來說,應該設(shè)計一個虛擬網(wǎng)絡(luò)接口層,以使能用windows提供的各種通訊API來為應用程序提供通用的網(wǎng)絡(luò)功能。這樣的接口層可以采用中間DLL的形式,它將應用程序和windows的各種API隔離開來,使程序員能更方便地設(shè)計自己的應用程序。這樣的設(shè)計可使應用程序更易于維護和移植。
基于通信需求和上述思路,利用基于TCP_IP的SOCKET接口可以實現(xiàn)網(wǎng)絡(luò)通信,通信模塊通常以動態(tài)鏈接庫的形式存在。
2.1 Socket套接字
Windows Sockets不是一種網(wǎng)絡(luò)協(xié)議,而是一套開放的、可支持多種協(xié)議的、Windows下的網(wǎng)絡(luò)編程接口。Winsock實際在計算機中提供了一個通信接口,應用程序在網(wǎng)絡(luò)上傳輸信息都可以通過這個Socket接口來實現(xiàn)。Windows Sockets分為三種類型:其中流式套接字(sock-stream)定義了一種可靠的面向連接的服務(wù),它使用TCP作為傳輸層協(xié)議,可實現(xiàn)無差錯無重復地順序數(shù)據(jù)包傳輸;數(shù)據(jù)報套接字(sock-dgram)定義了一種無連接的服務(wù),它使用UDP協(xié)議,數(shù)據(jù)通過相互獨立的報文進行傳輸,而且是無序的,同時不保證可靠和無差錯;原始套接字(sock-raw)允許對低層協(xié)議(如IP或ICMP)直接訪問,主要用于新網(wǎng)絡(luò)協(xié)議的實現(xiàn)和測試等。
圖2給出了一種典型的C/S(客戶端服務(wù)器)面向連接套接字調(diào)用的實現(xiàn)流程。
本系統(tǒng)中,工程師站組態(tài)軟件一般可作為客戶端向控制器發(fā)送連接請求,以建立連接。由于控制器采集數(shù)據(jù)是周期性的,組態(tài)軟件采用異步選擇機制判斷控制器是否有數(shù)據(jù)發(fā)送過來。Windows Sockets的異步選擇函數(shù)提供了消息機制的網(wǎng)絡(luò)事件選擇功能,當它所登記的網(wǎng)絡(luò)事件發(fā)生時,應用程序相應的窗口會收到一個消息,消息中指明了所發(fā)生的網(wǎng)絡(luò)事件以及與該網(wǎng)絡(luò)事件相關(guān)的一些信息。
連接建立之后,即可調(diào)用Winsock提供的函數(shù)來發(fā)送和接收數(shù)據(jù),進程結(jié)束時,則關(guān)閉兩個套接字。
2.2 數(shù)據(jù)交互
通訊模塊主要與框架、在線兩個模塊以及控制器存在數(shù)據(jù)交互。圖3所示是其通訊模塊與組態(tài)軟件的其它模塊及控制器之間進行數(shù)據(jù)交互的流程圖。其中,通訊模塊發(fā)送給框架窗口的消息主要有三項功能:一是通知在線模塊讀取控制器返回的應答數(shù)據(jù);二是在通訊中出現(xiàn)異常時,返回錯誤信息;三是在通訊出現(xiàn)超時時,返回超時信息。
2.3 數(shù)據(jù)傳輸協(xié)議
TCP/IP協(xié)議族的核心部分是傳輸層和網(wǎng)絡(luò)層。傳輸層主要為應用程序提供端到端的通信,TCP/IP協(xié)議族有兩個互不相同的傳輸協(xié)議,即TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。
TCP是一種面向連接的協(xié)議,它可給用戶進程提供可靠的全雙工的數(shù)據(jù)通信,其所做的工作是把應用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,同時確認接收到的分組,并提供流量控制、設(shè)定超時及重傳等機制。由于TCP提供有高可靠性的端到端的通信,因此,應用程序可以忽略所有這些細節(jié)。
Winsock的Nagle算法會降低小數(shù)據(jù)包的發(fā)送速度,因此應當定義一種數(shù)據(jù)結(jié)構(gòu),以將發(fā)送的數(shù)據(jù)按照這種數(shù)據(jù)結(jié)構(gòu)以字符型ASCII發(fā)送,客戶端接收到服務(wù)器傳來的數(shù)據(jù),按照這種數(shù)據(jù)結(jié)構(gòu)解析數(shù)據(jù),這樣做可以減少小數(shù)據(jù)包的數(shù)目,避免協(xié)議使用Nagle算法。此外通過消息響應代替輪詢也是提高傳輸實時性的一種措施。
2.4 阻塞的預防及處理
TCP/IP協(xié)議本身的滑動窗口控制可以有效的防止阻塞的發(fā)生。假設(shè)服務(wù)器和客戶端的收發(fā)緩沖區(qū)大小為100 K字節(jié),服務(wù)器每發(fā)送一個大小為80 K字的數(shù)據(jù)包,客戶端接收到這個數(shù)據(jù)包后,將返回一個應答,應答中包含有下次服務(wù)器能夠發(fā)送的最大的字節(jié)數(shù),即下次服務(wù)器只能發(fā)送大小不能超過20 K字的數(shù)據(jù)。按照這種控制方法,TCP/IP可根據(jù)滑動窗口的大小控制發(fā)送的速度,滑動窗口大,則發(fā)送的數(shù)據(jù)量大,滑動窗口過小,則發(fā)送的數(shù)據(jù)量也會減小,這樣即可以防止阻塞的發(fā)生。
該通訊模塊中使用的防阻塞方法是在同步方式中采用select函數(shù)來檢查接收發(fā)送緩沖區(qū)的讀寫可用狀態(tài)。服務(wù)器端發(fā)送數(shù)據(jù)前,應先檢查服務(wù)器的發(fā)送緩沖區(qū)是否可寫,如不可寫,說明發(fā)送緩沖區(qū)己經(jīng)寫滿,需要等待發(fā)送緩沖區(qū)有剩余空間時再發(fā)送,以避免阻塞。同樣,客戶端在讀緩沖區(qū)數(shù)據(jù)前,也應先檢查一下緩沖區(qū)是否可讀。如果發(fā)送緩沖區(qū)一直不可寫,那么可能是因為網(wǎng)絡(luò)斷開,或者網(wǎng)絡(luò)負載過大,使數(shù)據(jù)不能發(fā)送出去。
設(shè)置一個超時時限,可以阻塞發(fā)生時,當發(fā)送緩沖區(qū)不可寫的狀態(tài)超過設(shè)置的超時時間,系統(tǒng)則重新建立一個連接。
將這種方法和TCP/IP協(xié)議本身的防阻塞控制結(jié)合使用,可以有效地防止阻塞的發(fā)生。
3、通信模塊的實現(xiàn)
3.1 實現(xiàn)思路
為了實現(xiàn)與控制器之間的異步通訊,通訊模塊的總體設(shè)計如圖4所示。
首先,由主線程調(diào)用外部接口函數(shù)以建立連接,同時,創(chuàng)建發(fā)送和接收線程,以分別用于數(shù)據(jù)的發(fā)送和接收。
當要發(fā)送數(shù)據(jù)時,主線程調(diào)用外部接口函數(shù)來發(fā)送數(shù)據(jù)。該函數(shù)先將待發(fā)送的數(shù)據(jù)填充到通訊模塊的發(fā)送緩沖區(qū)中,然后通知發(fā)送線程,并由發(fā)送線程負責將發(fā)送緩沖區(qū)中的數(shù)據(jù)發(fā)送出去。
當數(shù)據(jù)發(fā)送成功后,可由發(fā)送線程發(fā)送消息,通知接收線程準備接收數(shù)據(jù)。
當有應答數(shù)據(jù)到來時,接收線程將接收數(shù)據(jù)并將數(shù)據(jù)放入通訊模塊的接收緩沖區(qū)。接收完后,接收線程將發(fā)送消息以通知主線程讀取應答數(shù)據(jù)。
主線程接到通知后,將調(diào)用外部接口函數(shù)接收數(shù)據(jù)。該函數(shù)可將通訊模塊的接收緩沖區(qū)中的應答數(shù)據(jù)復制到應用程序指定的緩沖區(qū)中。
數(shù)據(jù)的發(fā)送和接收交替進行,就可以完成特定的操作。
3.2 模塊封裝
通過動態(tài)鏈接庫技術(shù)可以提供一種方便、快捷的資源共享途徑。這實質(zhì)上是一些函數(shù)、數(shù)據(jù)和類集合成的可執(zhí)行模塊。通信模塊采用動態(tài)鏈接庫形式,可以在實現(xiàn)同一臺機器上的多個工程師站組態(tài)軟件進程的同時與多個控制器進行通訊。
將通信模塊中套接字的建立、端口的綁定、數(shù)據(jù)的接收和發(fā)送封裝到動態(tài)鏈接庫中,同時屏蔽一些操作細節(jié),這樣的方法可以方便地被其它程序所調(diào)用,更易于程序維護和移值,也方便將來程序的升級。
根據(jù)窗口句柄發(fā)送消息至該窗口,然后通知應用程序有數(shù)據(jù)到達。最后,還需要在函數(shù)前面使用extern“C”_declspec(dllexport)關(guān)鍵字,以使該PEI數(shù)能夠被其它程序所調(diào)用。函數(shù)的參數(shù)分別為端口號和應用程序的句柄。在應用程序中,只需要調(diào)用該函數(shù),就可以開啟TCP/IP服務(wù)。按照同樣的方法,也可以封裝連接服務(wù)函數(shù)和發(fā)送數(shù)據(jù)函數(shù)。組態(tài)軟件的在線等模塊通過調(diào)用這些導出函數(shù),就可以完成與控制器的通訊,而不用考慮具體的通訊細節(jié)。具體的通訊細節(jié)可在這些導出函數(shù)中實現(xiàn)。
4、結(jié)束語
在基于TCP/IP協(xié)議網(wǎng)絡(luò)通訊的基礎(chǔ)上,針對狀態(tài)監(jiān)測中數(shù)據(jù)傳輸?shù)拈g歇這一特殊性,提出了一種基于事件驅(qū)動的網(wǎng)絡(luò)通訊模塊的設(shè)計方法,并將這種方法封裝到動態(tài)鏈接庫中,然后通過函數(shù)接口與應用程序交互。由于該通訊模塊是以動態(tài)鏈接庫形式給出的,編程者可以不需要深入了解TCP/IP協(xié)議以及Socket高級編程,而中需簡單地調(diào)用通訊模塊中的函數(shù),即可實現(xiàn)局域網(wǎng)中數(shù)據(jù)的傳輸。本文所介紹的通信模塊的設(shè)計方法目前已經(jīng)實現(xiàn),其可行性也得到了驗證,并已應用在實際的組態(tài)軟件開發(fā)項目中。
責任編輯:gt
評論
查看更多