基于SOCK盯編程實(shí)現的組態(tài)軟件與控制器的網(wǎng)絡(luò )通訊
3 通信模塊的實(shí)現
3.1 實(shí)現思路
為了實(shí)現與控制器之間的異步通訊,通訊模塊的總體設計如圖4所示。
首先,由主線(xiàn)程調用外部接口函數以建立連接,同時(shí),創(chuàng )建發(fā)送和接收線(xiàn)程,以分別用于數據的發(fā)送和接收。
當要發(fā)送數據時(shí),主線(xiàn)程調用外部接口函數來(lái)發(fā)送數據。該函數先將待發(fā)送的數據填充到通訊模塊的發(fā)送緩沖區中,然后通知發(fā)送線(xiàn)程,并由發(fā)送線(xiàn)程負責將發(fā)送緩沖區中的數據發(fā)送出去。
當數據發(fā)送成功后,可由發(fā)送線(xiàn)程發(fā)送消息,通知接收線(xiàn)程準備接收數據。
當有應答數據到來(lái)時(shí),接收線(xiàn)程將接收數據并將數據放入通訊模塊的接收緩沖區。接收完后,接收線(xiàn)程將發(fā)送消息以通知主線(xiàn)程讀取應答數據。
主線(xiàn)程接到通知后,將調用外部接口函數接收數據。該函數可將通訊模塊的接收緩沖區中的應答數據復制到應用程序指定的緩沖區中。
數據的發(fā)送和接收交替進(jìn)行,就可以完成特定的操作。
3.2 模塊封裝
通過(guò)動(dòng)態(tài)鏈接庫技術(shù)可以提供一種方便、快捷的資源共享途徑。這實(shí)質(zhì)上是一些函數、數據和類(lèi)集合成的可執行模塊。通信模塊采用動(dòng)態(tài)鏈接庫形式,可以在實(shí)現同一臺機器上的多個(gè)工程師站組態(tài)軟件進(jìn)程的同時(shí)與多個(gè)控制器進(jìn)行通訊。
將通信模塊中套接字的建立、端口的綁定、數據的接收和發(fā)送封裝到動(dòng)態(tài)鏈接庫中,同時(shí)屏蔽一些操作細節,這樣的方法可以方便地被其它程序所調用,更易于程序維護和移值,也方便將來(lái)程序的升級。
根據窗口句柄發(fā)送消息至該窗口,然后通知應用程序有數據到達。最后,還需要在函數前面使用extern“C”_declspec(dllexport)關(guān)鍵字,以使該PEI數能夠被其它程序所調用。函數的參數分別為端口號和應用程序的句柄。在應用程序中,只需要調用該函數,就可以開(kāi)啟TCP/IP服務(wù)。按照同樣的方法,也可以封裝連接服務(wù)函數和發(fā)送數據函數。組態(tài)軟件的在線(xiàn)等模塊通過(guò)調用這些導出函數,就可以完成與控制器的通訊,而不用考慮具體的通訊細節。具體的通訊細節可在這些導出函數中實(shí)現。
4 結束語(yǔ)
在基于TCP/IP協(xié)議網(wǎng)絡(luò )通訊的基礎上,針對狀態(tài)監測中數據傳輸的間歇這一特殊性,提出了一種基于事件驅動(dòng)的網(wǎng)絡(luò )通訊模塊的設計方法,并將這種方法封裝到動(dòng)態(tài)鏈接庫中,然后通過(guò)函數接口與應用程序交互。由于該通訊模塊是以動(dòng)態(tài)鏈接庫形式給出的,編程者可以不需要深入了解TCP/IP協(xié)議以及Socket高級編程,而中需簡(jiǎn)單地調用通訊模塊中的函數,即可實(shí)現局域網(wǎng)中數據的傳輸。本文所介紹的通信模塊的設計方法目前已經(jīng)實(shí)現,其可行性也得到了驗證,并已應用在實(shí)際的組態(tài)軟件開(kāi)發(fā)項目中。
評論