摘 要: 创新性地使用最新的Vert.x框架,利用其异步、非阻塞、实时性、高并发的工作模式,对现有的工业过程监控系统进行全面改造,极大提升了系统的响应速度,实时性得到显著提高,完全满足大量客户端并发的实时请求。
关键词: Vert.x;过程监控;PLC;数据推送
0 引言
工业生产监控系统的Web化[1]已成为标准,客户端只使用浏览器即可实现对监控数据的实时显示,不需要安装各种监控组件,简化了监控系统维护。实现监控数据的实时传输和显示技术也在不断地出现,从传统HTTP请求/响应模式,到AJAX的Comet及HTML5的WebSocket,采用数据推送技术,使得Web监控系统的实时性得到极大提高。然而监控服务器在面对大量客户连接的并发请求时,实时性难以满足。无论JavaEE,还是NET都如此,它们的多线程工作模式是根源所在。为解决此问题,Vert.x框架[2-3]应运而生,它采用全新工作模式,特别适合开发实时性要求极高的系统。
Vert.x是用于下一代异步、可伸缩、并发应用的框架,轻量级的高性能JVM应用平台,适合开发各种移动及企业应用。它彻底解决了业界遭遇C10K问题,即当并发连接超过一万以上时,传统技术会引发暂停。以Tomcat为例,它在超过100个并发长请求就堵塞,而Vert.x可支持超10万个并发请求。
本文采用Vert.x对现有的供热监控系统进行改造,对监控服务器端和客户端进行重构。在服务器端使用Vert.x的Web服务器取代现有Tomcat7,采用Vert.x TCP读取西门子PLC300的监控数据。用户端采用Vert.x的Event Bus Bridge技术,实时接收服务器端监控数据,改造后的监控系统的性能和响应速度比原有系统有显著的提高。
1 Vert.x框架概述
Vert.x核心采用与Node.js相同的事件驱动的异步工作模式,使用单线程的事件循环机制实现高并发的请求处理,而不像传统的服务器采用多线程的模式。
Vert.x的核心组件是Verticle,运行在Vert.x实例中。Vert.x启动后,根据服务器CPU的内核数,自动创建对应的Vert.x实例,并发运行Verticle。
Vert.x采用事件驱动的异步编程模式,通过触发事件以及注册事件处理器完成所有编程任务。Verticle之间不能直接调用,只能发送和接收事件实现协作。
Vert.x的核心是事件总线,Verticle在事件总线发送和接收事件。事件总线是分布式的,能连接服务器和客户端。事件总线支持点对点和发布-订阅模式的事件传输,监控系统中服务器向所有连接的客户端发送监控数据就使用发布订阅模式,使得所有客户端浏览器都能实时接收到监控数据。
2 实时监控系统设计与实现
大连柳树供热公司监控系统现场采用西门子PLC S7-300[4],通过屏蔽双绞线连接到中心机房的核心交换机上,中心监控主机CPU采用志强8核服务器,可并发运行8个Vert.x实例,能支持十几万个并发请求。页面采用最新的Bootstrap模版技术[5],自动适应不同尺寸的屏幕显示,包括手机、平板等。
2.1 读取PLC监控数据TCP编程
西门子S7-300采用TCP FETCH WRITE通信方式[6],该模式下通过TCP协议的Socket,主机可与PLC进行数据交换。
Vert.x内置TCP Client方法,如下是TCP客户端读取PLC数据的代码:
var vertx=require(′vertx′);//获得Vert.x运行实例
var eb=require(′vertx/event_bus′)//获得Event Bus对象
var client=vertx.createNetClient();//创建TCP客户端
client.reconnectAttempts(1000);//设置连接尝试次数
client.reconnectInterval(500);//设置尝试间隔时间
//连接PLC Socket端口,并定义回调函数
client.connect(config.port,config.ip,function(err,socket){//定义接收到PLC数据的事件处理器
socket.dataHandler(function(buffer){
var data=JSON.parse(buffer);
//将接收的数据发布到Evnet Bus上
eb.publish("rtdata.in.receive",{info:data},function(result){});
//使用定时器,每间隔0.5 s发送请求数据指令到PLC
var timer=vertx.setPeriodic(500,function(timerID){sock.write("datain");});
}});
客户端定时发送数据指令,PLC数据到达后,Socket上的事件监听器工作,从回调函数中取得监控数据,并转换为JSON格式,使用总线方法publish发布事件。总线上监听的Web客户端都能同步接收监控数据。Vert.x采用推模式实现数据传输,由Vert.x服务器主动发送数据,不需客户端请求,节省了网络带宽,提高了传输速度,满足了监控系统实时性。监控系统的总体架构如图1所示。
在Vert.x服务器中,可启动多个TCP客户端Verticle,实现多路监测数据的并发读取,如下代码展示主服务器依次启动Http Web Server和TCP Client监控Verticle等实例。
//获得Vert.x实例容器
var container=require("vertx/container");
//启动Web服务器
container.deployVerticle("HttpServer.js");
//启动PLC TCP客户端
container.deployVerticle("TCPClient.js",{port:2201,ip:192.168.1.101});
2.2 监控Web服务器的编程
系统采用Vert.x的服务器模块web-server~2.0,实现功能强大的Web服务器,并使用异步模式接收客户端浏览器的HTTP请求,支持客户高并发的HTTP连接请求,示意代码如下。
var container=require("vertx/container");
container.deployModule("io.vertx~mod-web-server~2.0.0-final",{port:80,host:"localhost",
bridge:true,
inbound_permitted:[
{address:′rtdata.in.receive′},
{address:′rtdata.out.receive′}
]);
Vert.x通过deployModule载入Web模块,Web模块自动将目录/web作为站点发布目录,在/web目录中存储站点的页面文件。
代码中bridge:true表示将服务器端的事件总线延伸到Web客户端,实现服务器和客户端的数据传输。每个Verticle都可以在Event Bus注册事件处理器,以此实现数据的接收和发送。
2.3 监控客户端编程
客户端使用普通的HTML即可,不需要动态页面。为实现与Vert.x服务器的Event Bus通信,客户端页面需要引入Vert.x的Event Bus Bridge的库文件vertxbus-2.1.js。
监控数据显示使用
$(document).ready(function(){
var eb=new vertx.EventBus(′localhost/eventbus′);
eb.onopen=function(){
eb.registerHandler("rtdata.in.receive",function(args){var data=args.data;
$("#rt1010").html(data);});
};});
代码中关键是取得Vert.x的Event Bus对象,通过事件总线提供的vertx.EventBus,使用Javascript创建一个实例即可。如果与服务端的Event Bus连接成功,则eb.onopen回调函数工作。在此方法内,通过Event Bus的registerHandler对指定的地址进行监听,当有此地址的事件event到达时,定义的回调函数function(args)开始运行,参数args为事件中包含的JSON数据,解析出JSON数据,使用jQuery的函数html()将数据显示在指定的
3 结论
Vert.x具有的实时通信、全新的异步响应式工作模式和分布式Event Bus等特性,使其必将在实时系统开发中得到广泛应用。与Node.js相比,Vert.x以其性能压倒性的绝对优势,必将推动实时Web的飞速发展,进而引起Web领域颠覆性的革命,彻底淘汰以AJAX为主的Web2.0,引领新的Web发展趋势。
参考文献
[1] 李玉珠,吴敏,徐福仓.基于Web的炼焦实时监视系统设计与实现[J].自动化与仪表,2009(4):1-4.
[2] PARVIAINEN T.Real-time Web application development using Vert.x 2.0[M]. Birmingham-Mumbai: Packt Publishing,2013.
[3] Vert.x[EB/OL]. http://vertx.io/.
[4] 潜立标,杨马英,俞立,等.基于Web和S72300 PLC的远程控制实验室系统[J].浙江工业大学学报,2007(2):73-77.
[5] 陈群.基于ASP.NET AJAX新型Web Scada的设计与实现[J].工业控制计算机,2009(6):42-44.
[6] 赵佳宝,付羽.基于SVG的实时监控流程图实现技术[J].工业控制计算机,2009(6):10-12.