蔡晨曦,秦會斌
(杭州電子科技大學(xué),浙江 杭州 310000)
基于IOCP模型的多儀器數(shù)據(jù)采集與控制系統(tǒng)
蔡晨曦,秦會斌
(杭州電子科技大學(xué),浙江 杭州 310000)
為滿足工業(yè)現(xiàn)場中對多種不同類型的儀器進(jìn)行集中監(jiān)控的要求,并且針對儀器連接數(shù)量大、數(shù)據(jù)通信頻繁和實時性要求高等特點,提出了以IOCP(I/O完成端口)網(wǎng)絡(luò)模型為核心結(jié)合了Windows多線程,數(shù)據(jù)庫編程等技術(shù)實現(xiàn)的局域網(wǎng)多智能儀表控制系統(tǒng)。首先介紹了控制系統(tǒng)的總體結(jié)構(gòu)以及IOCP模型工作原理,描述并分析了該系統(tǒng)在設(shè)計和實現(xiàn)過程遇到的關(guān)鍵問題和解決方案,最后通過移植LwIP輕量級網(wǎng)絡(luò)協(xié)議棧的STM32單片機(jī)作為下位機(jī)進(jìn)行網(wǎng)絡(luò)通信測試,驗證了該方案的可行性。
完成端口;重疊IO;TCP/IP;多線程;控制系統(tǒng)
工業(yè)現(xiàn)場中通常需要很多不同類型的儀表對現(xiàn)場的溫度、濕度、電流和電壓等進(jìn)行數(shù)據(jù)采集與控制。在傳統(tǒng)模式下,每類儀器會用獨立的系統(tǒng)進(jìn)行數(shù)據(jù)采集與控制,儀器將采集到的數(shù)據(jù)通過串口發(fā)送到獨立的計算機(jī)進(jìn)行顯示和處理。這種模式既不利于宏觀反應(yīng)整個工業(yè)生產(chǎn)過程,也不便與計算機(jī)進(jìn)行集中監(jiān)控,同時又增加了生產(chǎn)成本。本文研究的系統(tǒng)沒有將上位機(jī)和儀器直接連接,而是采用STM32單片機(jī)作為下位機(jī)中轉(zhuǎn)通過工業(yè)以太網(wǎng)組網(wǎng)動態(tài)接入上位機(jī),實現(xiàn)對所有儀器的統(tǒng)一監(jiān)控。
Winsock2.0引入的內(nèi)核級高效處理機(jī)制IOCP是迄今為止最高效的Windows下處理并發(fā)網(wǎng)絡(luò)事件的I/O模型,IOCP全稱為I/O完成端口,利用該機(jī)制可提高網(wǎng)絡(luò)通信性能[1]。基于IOCP機(jī)制的上位機(jī)網(wǎng)絡(luò)通信方案能同時并發(fā)連接大量下位機(jī),進(jìn)行高效的網(wǎng)絡(luò)數(shù)據(jù)交互。極大提高系統(tǒng)的儀器承載量、可擴(kuò)展性和穩(wěn)定性。
多儀器數(shù)據(jù)采集與控制系統(tǒng)利用工業(yè)以太網(wǎng)進(jìn)行組網(wǎng),采用服務(wù)器/客戶端結(jié)構(gòu)進(jìn)行設(shè)計。本系統(tǒng)創(chuàng)新之處在于沒有將上位機(jī)作為網(wǎng)絡(luò)服務(wù)端,而是利用具有以太網(wǎng)10/100 M接口的STM32單片機(jī)作為下位機(jī)中介服務(wù)器,上位機(jī)軟件和儀器均作為客戶端根據(jù)設(shè)定的IP地址及端口號主動連接到下位機(jī)其網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖1所示[2]。在實際工作過程中每個上位機(jī)軟件根據(jù)設(shè)定的IP地址范圍主動掃描連接系統(tǒng)內(nèi)所有處于工作狀態(tài)的下位機(jī),建立連接后每個下位機(jī)將與其連接的儀器資源信息、工作模式、測試數(shù)據(jù)按照規(guī)定的通信協(xié)議封裝后打包發(fā)送到建立連接的上位機(jī)軟件。下位機(jī)同時接收上位機(jī)返回的測試方案對儀器進(jìn)行控制。
圖1 網(wǎng)絡(luò)結(jié)構(gòu)拓?fù)鋱D
該網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)可以支持多個上位機(jī)和系統(tǒng)中的下位機(jī)建立網(wǎng)絡(luò)連接,通過交換機(jī)或路由器工作人員不僅可以在工業(yè)現(xiàn)場還可以在辦公室里直接監(jiān)控儀器發(fā)送的測試數(shù)據(jù)。本系統(tǒng)還具有較強(qiáng)的靈活性和可擴(kuò)展性,當(dāng)系統(tǒng)需要接入更多的儀器時只需增加作為中介服務(wù)器的下位機(jī)數(shù)量,將儀器和下位機(jī)接到同一交換機(jī)下配置為同一網(wǎng)段,建立網(wǎng)絡(luò)連接后下位機(jī)即可同作為客戶端的多個儀器進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)收發(fā),同時上位機(jī)軟件會通過掃描連接找到新接入的下位機(jī)進(jìn)行數(shù)據(jù)交互[3]。
采用上述設(shè)計模式少量的上位機(jī)可對工業(yè)現(xiàn)場所有儀器進(jìn)行集中監(jiān)控,提高了上位機(jī)的承載量和利用率,大大降低了生產(chǎn)成本。
2.1 IOCP模型原理
IOCP是一種用于同志應(yīng)用程序異步I/O操作完成的內(nèi)核對象。要使用IOCP,首先需要創(chuàng)建一個IOCP內(nèi)核對象,然后將該內(nèi)核對象與應(yīng)該監(jiān)控的設(shè)備(套接字)相關(guān)聯(lián)。當(dāng)設(shè)備完成了一個異步I/O操作之后,系統(tǒng)會把這個I/O操作的完成通知掛到該IOCP的完成通知隊列上去。當(dāng)IOCP的完成通知隊列上出現(xiàn)一個完成通知時,IOCP將喚醒一個等待線程,讓該線程去處理這個完成通知。每個IOCP對象會關(guān)聯(lián)2倍于系統(tǒng)CPU數(shù)目的線程,這些線程不是在處理完成通知,就是在等待處理完成通知,構(gòu)成了和該IOCP相關(guān)聯(lián)的線程池[4]。
一個IOCP內(nèi)核對象可同時監(jiān)控多個設(shè)備的異步I/O操作。由于任何時候都可能會有多個異步I/O操作的完成通知,因此IOCP內(nèi)核對象會維護(hù)三個線程隊列,即當(dāng)前所有完成通知的隊列,處于運行狀態(tài)線程隊列,以及等待線程隊列,如圖2所示。
圖2 IOCP線程隊列圖
根據(jù)圖中顯示的IOCP線程隊列的工作方式,當(dāng)某個設(shè)備的一個異步I/O操作完成時,系統(tǒng)會把一個完成通知添加到完成通知隊列,然后再從等待線程隊列中喚醒一個線程,讓該線程處理完成通知,同時把該線程從等待線程隊列移到運行線程隊列[5]。
2.2 數(shù)據(jù)結(jié)構(gòu)
在通過IOCP模型進(jìn)行網(wǎng)絡(luò)編程過程中,會用到2個重要的IOContex和OverLappedPlus結(jié)構(gòu)體。IOContex結(jié)構(gòu)體主要存放連接下位機(jī)套接字的相關(guān)信息,包括該套接字所對應(yīng)的IP地址和端口號以及數(shù)據(jù)緩沖區(qū)。
OVERLAPPED結(jié)構(gòu)體參數(shù)是用于向完成端口投遞IO請求時傳遞給完成端口的。由于OVERLAPPED結(jié)構(gòu)體本身只存儲了一些簡單的信息,應(yīng)用程序不能確定完成的是哪個操作。因此需要設(shè)計一個擴(kuò)展OVERLAPPED結(jié)構(gòu)體,使它包含一些其他信息并將OVERLAPPED結(jié)構(gòu)作為擴(kuò)展結(jié)構(gòu)體變量的第一個成員。具體的定義如下所示[6]:
2.3 程序的實現(xiàn)流程
上位機(jī)軟件網(wǎng)絡(luò)通信程序基于IOCP模型進(jìn)行實現(xiàn),其功能主要由3類線程來完成:分別是1個主線程,1個負(fù)責(zé)網(wǎng)絡(luò)連接掃描線程和4個IOCP工作者線程。線程之間的調(diào)度和切換由Windows系統(tǒng)自動處理。IOCP模型的網(wǎng)絡(luò)通信程序流程圖如圖3所示。
圖3 IOCP通信程序流程圖
具體工作流程如下[7]:
①主線程調(diào)用CreateIoCompletionPort函數(shù)創(chuàng)建一個完成端口對象;
②根據(jù)設(shè)置網(wǎng)絡(luò)掃描IP地址范圍依次調(diào)用WSASocket函數(shù)創(chuàng)建重疊套接字并調(diào)配置IP地址及端口號;
③調(diào)用CreateIoCompletionPort函數(shù)把重疊套接字關(guān)聯(lián)到完成端口對象,調(diào)用AfxBeginThread函數(shù)創(chuàng)建系統(tǒng)內(nèi)核數(shù)乘以2數(shù)量的IOCP工作者線程;
④創(chuàng)建一個掃描連接線程,調(diào)用ConnectEx函數(shù)投遞連接套接字對嵌入式終端主動發(fā)起TCP連接請求;
⑤在線程中等待完成通知,當(dāng)套接字成功建立連接或者讀寫操作完成,會喚醒IOCP工作者線程由工作者線程進(jìn)行處理;
⑥如果程序退出或者主線程接收到斷開網(wǎng)絡(luò)命令則按順序依次退出連接掃描線程和工作者線程并清理套接字資源[8]。
主線程和工作者線程通過調(diào)用WSARecv和WSASend發(fā)起異步I/O請求,即執(zhí)行讀、寫操作后立即返回,由IOCP工作者線程函數(shù)ThreadPoolFunc負(fù)責(zé)等待并處理IOCP對象的I/O完成通知[6]。ThreadPoolFunc函數(shù)建立了一個while循環(huán),在循環(huán)中調(diào)用GetQueuedCompletionStatus函數(shù),然后線程就進(jìn)入等待狀態(tài)。當(dāng)函數(shù)返回值為FALSE且錯誤代碼為WSA_IO_PENDING表明I/O操作還未正式完成繼續(xù)循環(huán)等待,當(dāng)函數(shù)成功返回且擴(kuò)展重疊結(jié)構(gòu)指針不為NULL時說明完成一個成功的I/O操作,則一個工作者線程被喚醒并處理I/O完成隊列中的I/O完成通知。工作者線程根據(jù)m_NetWorkE-nents變量的值來判斷哪一類I/O操作完成。如果是套接字讀寫操作完成,調(diào)用OnRecvRead或On-SendWrite函數(shù)處理,OnRecvRead函數(shù)先對收到的數(shù)據(jù)進(jìn)行解析,如果數(shù)據(jù)未發(fā)生丟失并且符合格式則調(diào)用ReceiveMessageProcess函數(shù)對數(shù)據(jù)進(jìn)行分析處理,否則要求下位重新發(fā)送數(shù)據(jù)。如果m_Net-WorkEnents變量值表示接到IOCP線程退出通知,則關(guān)閉相對應(yīng)的套接字并清理資源,然后退出線程[9]。
基于以上設(shè)計思路設(shè)計上位機(jī)軟件,根據(jù)負(fù)載要求設(shè)計20塊帶RJ45網(wǎng)絡(luò)接口的STM32F103ZET6單片機(jī)作為下位機(jī),搭建測試平臺對系統(tǒng)網(wǎng)絡(luò)通信功能進(jìn)行測試[10]。
3.1 測試環(huán)境
硬件環(huán)境:上位機(jī)電腦采用Inter Core(Tm) 2CPU 6300 2.1 GHz內(nèi)存2 GB。下位機(jī)使用STM32F103單片機(jī)。上下位機(jī)之間通過10/100 M交換機(jī)進(jìn)行數(shù)據(jù)交換。
網(wǎng)絡(luò)環(huán)境:10/100 M局域網(wǎng)絡(luò)。
系統(tǒng)環(huán)境:上位機(jī)軟件在Microsoft Windows7 32位操作系統(tǒng)下運行,下位機(jī)STM32單片機(jī)移植μC/OS-II嵌入式實時操作系統(tǒng)加LwIP嵌入式網(wǎng)絡(luò)協(xié)議棧[11]。
3.2 測試方法
(1)網(wǎng)絡(luò)掃描連接測試:STM32單片機(jī)在上位機(jī)軟件打開前或打開后開啟,上位機(jī)軟件均能掃描連接STM32單片機(jī)進(jìn)行并發(fā)網(wǎng)絡(luò)通信。
(2)網(wǎng)絡(luò)通信測試:每個下位機(jī)每隔200 ms向上位機(jī)發(fā)送數(shù)據(jù)量為2 048 B的儀器測試數(shù)據(jù)。在程序中對上位機(jī)接收的數(shù)據(jù)量進(jìn)行統(tǒng)計,和所有下位機(jī)發(fā)送的總數(shù)據(jù)量比較驗證測試數(shù)據(jù)接收是否完整性和實時性[12]。
3.3 測試結(jié)果
按照上述測試方法對本系統(tǒng)進(jìn)行多次測試,測試結(jié)果如表1和表2所示。其中表1中每項測試次數(shù)為30次,全部下位機(jī)成功接入次數(shù)為30次。
表1 網(wǎng)絡(luò)掃描連接測試結(jié)果
表2 網(wǎng)絡(luò)通信測試結(jié)果
多次測試結(jié)果表明上位機(jī)軟件實現(xiàn)對所有處于工作狀態(tài)下位機(jī)的主動掃描連接,連接成功后上位機(jī)軟件能準(zhǔn)確地接收下位機(jī)發(fā)送的測試數(shù)據(jù),實時更新顯示在主界面上不會阻塞Winodws消息循環(huán)導(dǎo)致界面假死現(xiàn)象。
利用IOCP機(jī)制實現(xiàn)的上位機(jī)網(wǎng)絡(luò)通信程序能夠最大限度的利用線程對大量I/O讀寫請求進(jìn)行高效的處理,提供了最好的網(wǎng)絡(luò)伸縮性和負(fù)載均衡,保證了上位機(jī)軟件對多下位機(jī)大數(shù)據(jù)量并發(fā)通信的實時性和高效性,達(dá)到了系統(tǒng)設(shè)計的預(yù)期目標(biāo)。其良好的可擴(kuò)展性和兼容性則有利于系統(tǒng)的升級改造,減少開發(fā)成本。該系統(tǒng)已在生產(chǎn)過程通過測試,系統(tǒng)運行穩(wěn)定,符合工業(yè)現(xiàn)場數(shù)據(jù)采集控制的要求。
[1]孫海明.精通Windows Sockets網(wǎng)絡(luò)開發(fā):基于Visual C++實現(xiàn)[M].北京:人民郵電出版社,2008:40-100.
[2]彭剛,秦志強(qiáng).基于ARM Cortex-M3的STM32系列嵌入式微控制器應(yīng)用實踐[M].北京:電子工業(yè)出版社,2011:100-165.
[3]湯莉莉,黃偉,王春波,等.基于Cortex-M3單片機(jī)的WiFi物聯(lián)網(wǎng)小車的設(shè)計[J].無線電工程,2014,44 (4):58-61.
[4]Kevin R,F(xiàn)all W.Richard Stevens.TCP/IP詳解[M].北京:機(jī)械工業(yè)出版社,2012:579-591.
[5]張會勇.Winsock網(wǎng)絡(luò)編程經(jīng)絡(luò)[M].北京:電子工業(yè)出版社,2012:233-235.
[6]汪慶蓮.網(wǎng)絡(luò)掃描系統(tǒng)設(shè)計與實現(xiàn)[J].湖北第二師范學(xué)院學(xué)報,2010,27(8):110-119.
[7]廖宏建,楊玉寶,唐連章.完成端口實現(xiàn)高性能服務(wù)端通信層的關(guān)鍵問題[J].計算機(jī)應(yīng)用,2012,32(3): 812-815.
[8]李健,李麗霞.基于以太網(wǎng)的數(shù)字話音傳輸系統(tǒng)設(shè)計[J].無線電工程,2014,44(5):68-70,74.
[9]吳鑫,俞建定,汪沁,等.基于W5100的RS485-Ethernet數(shù)據(jù)轉(zhuǎn)換器設(shè)計[J].無線電通信技術(shù),2014,40(5):93-96.
[10]韓松,李奎,王麗麗,等.基于Modbus/TCP協(xié)議的遠(yuǎn)程控制網(wǎng)關(guān)[J].儀表技術(shù)與傳感器,2014(10): 102-104,107.
[11]陸旭.基于μC/OS-II和LwIP的嵌入式設(shè)備監(jiān)控平臺研究[D].重慶:重慶大學(xué),2013.
[12]王景忠,王俊芳,于立佳.一種實現(xiàn)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模型的多儀器數(shù)據(jù)采集與控制系統(tǒng)[J].無線電通信技術(shù),2015,41(5):71-73,85.
2015-03-03
蔡晨曦(1988—),男,碩士研究生,主要研究方向:計算機(jī)網(wǎng)絡(luò)編程。秦會斌(1972—),博士生導(dǎo)師,主要研究方向:新型電子器件及ASIC設(shè)計、現(xiàn)代傳感器設(shè)計及應(yīng)用。