蔡晨曦,秦會斌
(杭州電子科技大學,浙江 杭州 310000)
基于IOCP模型的多儀器數據采集與控制系統
蔡晨曦,秦會斌
(杭州電子科技大學,浙江 杭州 310000)
為滿足工業現場中對多種不同類型的儀器進行集中監控的要求,并且針對儀器連接數量大、數據通信頻繁和實時性要求高等特點,提出了以IOCP(I/O完成端口)網絡模型為核心結合了Windows多線程,數據庫編程等技術實現的局域網多智能儀表控制系統。首先介紹了控制系統的總體結構以及IOCP模型工作原理,描述并分析了該系統在設計和實現過程遇到的關鍵問題和解決方案,最后通過移植LwIP輕量級網絡協議棧的STM32單片機作為下位機進行網絡通信測試,驗證了該方案的可行性。
完成端口;重疊IO;TCP/IP;多線程;控制系統
工業現場中通常需要很多不同類型的儀表對現場的溫度、濕度、電流和電壓等進行數據采集與控制。在傳統模式下,每類儀器會用獨立的系統進行數據采集與控制,儀器將采集到的數據通過串口發送到獨立的計算機進行顯示和處理。這種模式既不利于宏觀反應整個工業生產過程,也不便與計算機進行集中監控,同時又增加了生產成本。本文研究的系統沒有將上位機和儀器直接連接,而是采用STM32單片機作為下位機中轉通過工業以太網組網動態接入上位機,實現對所有儀器的統一監控。
Winsock2.0引入的內核級高效處理機制IOCP是迄今為止最高效的Windows下處理并發網絡事件的I/O模型,IOCP全稱為I/O完成端口,利用該機制可提高網絡通信性能[1]。基于IOCP機制的上位機網絡通信方案能同時并發連接大量下位機,進行高效的網絡數據交互。極大提高系統的儀器承載量、可擴展性和穩定性。
多儀器數據采集與控制系統利用工業以太網進行組網,采用服務器/客戶端結構進行設計。本系統創新之處在于沒有將上位機作為網絡服務端,而是利用具有以太網10/100 M接口的STM32單片機作為下位機中介服務器,上位機軟件和儀器均作為客戶端根據設定的IP地址及端口號主動連接到下位機其網絡拓撲結構如圖1所示[2]。在實際工作過程中每個上位機軟件根據設定的IP地址范圍主動掃描連接系統內所有處于工作狀態的下位機,建立連接后每個下位機將與其連接的儀器資源信息、工作模式、測試數據按照規定的通信協議封裝后打包發送到建立連接的上位機軟件。下位機同時接收上位機返回的測試方案對儀器進行控制。

圖1 網絡結構拓撲圖
該網絡拓撲結構可以支持多個上位機和系統中的下位機建立網絡連接,通過交換機或路由器工作人員不僅可以在工業現場還可以在辦公室里直接監控儀器發送的測試數據。本系統還具有較強的靈活性和可擴展性,當系統需要接入更多的儀器時只需增加作為中介服務器的下位機數量,將儀器和下位機接到同一交換機下配置為同一網段,建立網絡連接后下位機即可同作為客戶端的多個儀器進行網絡數據收發,同時上位機軟件會通過掃描連接找到新接入的下位機進行數據交互[3]。
采用上述設計模式少量的上位機可對工業現場所有儀器進行集中監控,提高了上位機的承載量和利用率,大大降低了生產成本。
2.1 IOCP模型原理
IOCP是一種用于同志應用程序異步I/O操作完成的內核對象。要使用IOCP,首先需要創建一個IOCP內核對象,然后將該內核對象與應該監控的設備(套接字)相關聯。當設備完成了一個異步I/O操作之后,系統會把這個I/O操作的完成通知掛到該IOCP的完成通知隊列上去。當IOCP的完成通知隊列上出現一個完成通知時,IOCP將喚醒一個等待線程,讓該線程去處理這個完成通知。每個IOCP對象會關聯2倍于系統CPU數目的線程,這些線程不是在處理完成通知,就是在等待處理完成通知,構成了和該IOCP相關聯的線程池[4]。
一個IOCP內核對象可同時監控多個設備的異步I/O操作。由于任何時候都可能會有多個異步I/O操作的完成通知,因此IOCP內核對象會維護三個線程隊列,即當前所有完成通知的隊列,處于運行狀態線程隊列,以及等待線程隊列,如圖2所示。

圖2 IOCP線程隊列圖
根據圖中顯示的IOCP線程隊列的工作方式,當某個設備的一個異步I/O操作完成時,系統會把一個完成通知添加到完成通知隊列,然后再從等待線程隊列中喚醒一個線程,讓該線程處理完成通知,同時把該線程從等待線程隊列移到運行線程隊列[5]。
2.2 數據結構
在通過IOCP模型進行網絡編程過程中,會用到2個重要的IOContex和OverLappedPlus結構體。IOContex結構體主要存放連接下位機套接字的相關信息,包括該套接字所對應的IP地址和端口號以及數據緩沖區。

OVERLAPPED結構體參數是用于向完成端口投遞IO請求時傳遞給完成端口的。由于OVERLAPPED結構體本身只存儲了一些簡單的信息,應用程序不能確定完成的是哪個操作。因此需要設計一個擴展OVERLAPPED結構體,使它包含一些其他信息并將OVERLAPPED結構作為擴展結構體變量的第一個成員。具體的定義如下所示[6]:


2.3 程序的實現流程
上位機軟件網絡通信程序基于IOCP模型進行實現,其功能主要由3類線程來完成:分別是1個主線程,1個負責網絡連接掃描線程和4個IOCP工作者線程。線程之間的調度和切換由Windows系統自動處理。IOCP模型的網絡通信程序流程圖如圖3所示。

圖3 IOCP通信程序流程圖
具體工作流程如下[7]:
①主線程調用CreateIoCompletionPort函數創建一個完成端口對象;
②根據設置網絡掃描IP地址范圍依次調用WSASocket函數創建重疊套接字并調配置IP地址及端口號;
③調用CreateIoCompletionPort函數把重疊套接字關聯到完成端口對象,調用AfxBeginThread函數創建系統內核數乘以2數量的IOCP工作者線程;
④創建一個掃描連接線程,調用ConnectEx函數投遞連接套接字對嵌入式終端主動發起TCP連接請求;
⑤在線程中等待完成通知,當套接字成功建立連接或者讀寫操作完成,會喚醒IOCP工作者線程由工作者線程進行處理;
⑥如果程序退出或者主線程接收到斷開網絡命令則按順序依次退出連接掃描線程和工作者線程并清理套接字資源[8]。
主線程和工作者線程通過調用WSARecv和WSASend發起異步I/O請求,即執行讀、寫操作后立即返回,由IOCP工作者線程函數ThreadPoolFunc負責等待并處理IOCP對象的I/O完成通知[6]。ThreadPoolFunc函數建立了一個while循環,在循環中調用GetQueuedCompletionStatus函數,然后線程就進入等待狀態。當函數返回值為FALSE且錯誤代碼為WSA_IO_PENDING表明I/O操作還未正式完成繼續循環等待,當函數成功返回且擴展重疊結構指針不為NULL時說明完成一個成功的I/O操作,則一個工作者線程被喚醒并處理I/O完成隊列中的I/O完成通知。工作者線程根據m_NetWorkE-nents變量的值來判斷哪一類I/O操作完成。如果是套接字讀寫操作完成,調用OnRecvRead或On-SendWrite函數處理,OnRecvRead函數先對收到的數據進行解析,如果數據未發生丟失并且符合格式則調用ReceiveMessageProcess函數對數據進行分析處理,否則要求下位重新發送數據。如果m_Net-WorkEnents變量值表示接到IOCP線程退出通知,則關閉相對應的套接字并清理資源,然后退出線程[9]。
基于以上設計思路設計上位機軟件,根據負載要求設計20塊帶RJ45網絡接口的STM32F103ZET6單片機作為下位機,搭建測試平臺對系統網絡通信功能進行測試[10]。
3.1 測試環境
硬件環境:上位機電腦采用Inter Core(Tm) 2CPU 6300 2.1 GHz內存2 GB。下位機使用STM32F103單片機。上下位機之間通過10/100 M交換機進行數據交換。
網絡環境:10/100 M局域網絡。
系統環境:上位機軟件在Microsoft Windows7 32位操作系統下運行,下位機STM32單片機移植μC/OS-II嵌入式實時操作系統加LwIP嵌入式網絡協議棧[11]。
3.2 測試方法
(1)網絡掃描連接測試:STM32單片機在上位機軟件打開前或打開后開啟,上位機軟件均能掃描連接STM32單片機進行并發網絡通信。
(2)網絡通信測試:每個下位機每隔200 ms向上位機發送數據量為2 048 B的儀器測試數據。在程序中對上位機接收的數據量進行統計,和所有下位機發送的總數據量比較驗證測試數據接收是否完整性和實時性[12]。
3.3 測試結果
按照上述測試方法對本系統進行多次測試,測試結果如表1和表2所示。其中表1中每項測試次數為30次,全部下位機成功接入次數為30次。

表1 網絡掃描連接測試結果

表2 網絡通信測試結果
多次測試結果表明上位機軟件實現對所有處于工作狀態下位機的主動掃描連接,連接成功后上位機軟件能準確地接收下位機發送的測試數據,實時更新顯示在主界面上不會阻塞Winodws消息循環導致界面假死現象。
利用IOCP機制實現的上位機網絡通信程序能夠最大限度的利用線程對大量I/O讀寫請求進行高效的處理,提供了最好的網絡伸縮性和負載均衡,保證了上位機軟件對多下位機大數據量并發通信的實時性和高效性,達到了系統設計的預期目標。其良好的可擴展性和兼容性則有利于系統的升級改造,減少開發成本。該系統已在生產過程通過測試,系統運行穩定,符合工業現場數據采集控制的要求。
[1]孫海明.精通Windows Sockets網絡開發:基于Visual C++實現[M].北京:人民郵電出版社,2008:40-100.
[2]彭剛,秦志強.基于ARM Cortex-M3的STM32系列嵌入式微控制器應用實踐[M].北京:電子工業出版社,2011:100-165.
[3]湯莉莉,黃偉,王春波,等.基于Cortex-M3單片機的WiFi物聯網小車的設計[J].無線電工程,2014,44 (4):58-61.
[4]Kevin R,Fall W.Richard Stevens.TCP/IP詳解[M].北京:機械工業出版社,2012:579-591.
[5]張會勇.Winsock網絡編程經絡[M].北京:電子工業出版社,2012:233-235.
[6]汪慶蓮.網絡掃描系統設計與實現[J].湖北第二師范學院學報,2010,27(8):110-119.
[7]廖宏建,楊玉寶,唐連章.完成端口實現高性能服務端通信層的關鍵問題[J].計算機應用,2012,32(3): 812-815.
[8]李健,李麗霞.基于以太網的數字話音傳輸系統設計[J].無線電工程,2014,44(5):68-70,74.
[9]吳鑫,俞建定,汪沁,等.基于W5100的RS485-Ethernet數據轉換器設計[J].無線電通信技術,2014,40(5):93-96.
[10]韓松,李奎,王麗麗,等.基于Modbus/TCP協議的遠程控制網關[J].儀表技術與傳感器,2014(10): 102-104,107.
[11]陸旭.基于μC/OS-II和LwIP的嵌入式設備監控平臺研究[D].重慶:重慶大學,2013.
[12]王景忠,王俊芳,于立佳.一種實現RS232接口一對多通信的方法[J].無線電工程,2012,42(12):1-3,29.
Multi-instrument Data Collection and Control System Based on IOCP Model
CAI Chen-xi,QIN Hui-bin
(Hangzhou Dianzi University,Hangzhou Zhejiang 310000,China)
To meet the requirement of different types of instruments for centralized monitoring,and considering the great amount of instrument connections,frequent data communication and high demands on real-time,a design method,which takes the IOCP network model as the core and combines Windows multi-thread and database programming technology,is proposed in this paper to realize a multi-instrument control system.The principle of IOCP and the control system structure are presented first,then the key problems encountered during system design and implementation and their solutions are described and discussed.Finally the validity of the method is verified by network communication test by using embedded system based on STM32 with Low Weight Internet Protocol(LwIP).
IOCP;overlapped I/O;TCP/IP protocol;multi-thread;control system
TP273
A
1003-3114(2015)05-71-3
10.3969/j.issn.1003-3114.2015.05.19
蔡晨曦,秦會斌.基于IOCP模型的多儀器數據采集與控制系統[J].無線電通信技術,2015,41(5):71-73,85.
2015-03-03
蔡晨曦(1988—),男,碩士研究生,主要研究方向:計算機網絡編程。秦會斌(1972—),博士生導師,主要研究方向:新型電子器件及ASIC設計、現代傳感器設計及應用。