蔡晨曦,秦会斌
(杭州电子科技大学,浙江 杭州 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设计、现代传感器设计及应用。