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