摘 要: 創(chuàng)新性地使用最新的Vert.x框架,利用其異步,、非阻塞,、實時性、高并發(fā)的工作模式,,對現(xiàn)有的工業(yè)過程監(jiān)控系統(tǒng)進行全面改造,,極大提升了系統(tǒng)的響應速度,實時性得到顯著提高,,完全滿足大量客戶端并發(fā)的實時請求,。
關鍵詞: Vert.x;過程監(jiān)控,;PLC,;數(shù)據(jù)推送
0 引言
工業(yè)生產(chǎn)監(jiān)控系統(tǒng)的Web化[1]已成為標準,客戶端只使用瀏覽器即可實現(xiàn)對監(jiān)控數(shù)據(jù)的實時顯示,,不需要安裝各種監(jiān)控組件,,簡化了監(jiān)控系統(tǒng)維護,。實現(xiàn)監(jiān)控數(shù)據(jù)的實時傳輸和顯示技術也在不斷地出現(xiàn),從傳統(tǒng)HTTP請求/響應模式,,到AJAX的Comet及HTML5的WebSocket,,采用數(shù)據(jù)推送技術,使得Web監(jiān)控系統(tǒng)的實時性得到極大提高,。然而監(jiān)控服務器在面對大量客戶連接的并發(fā)請求時,,實時性難以滿足。無論JavaEE,,還是NET都如此,它們的多線程工作模式是根源所在,。為解決此問題,,Vert.x框架[2-3]應運而生,它采用全新工作模式,,特別適合開發(fā)實時性要求極高的系統(tǒng),。
Vert.x是用于下一代異步、可伸縮,、并發(fā)應用的框架,,輕量級的高性能JVM應用平臺,適合開發(fā)各種移動及企業(yè)應用,。它徹底解決了業(yè)界遭遇C10K問題,,即當并發(fā)連接超過一萬以上時,傳統(tǒng)技術會引發(fā)暫停,。以Tomcat為例,,它在超過100個并發(fā)長請求就堵塞,而Vert.x可支持超10萬個并發(fā)請求,。
本文采用Vert.x對現(xiàn)有的供熱監(jiān)控系統(tǒng)進行改造,,對監(jiān)控服務器端和客戶端進行重構。在服務器端使用Vert.x的Web服務器取代現(xiàn)有Tomcat7,,采用Vert.x TCP讀取西門子PLC300的監(jiān)控數(shù)據(jù),。用戶端采用Vert.x的Event Bus Bridge技術,實時接收服務器端監(jiān)控數(shù)據(jù),,改造后的監(jiān)控系統(tǒng)的性能和響應速度比原有系統(tǒng)有顯著的提高,。
1 Vert.x框架概述
Vert.x核心采用與Node.js相同的事件驅動的異步工作模式,使用單線程的事件循環(huán)機制實現(xiàn)高并發(fā)的請求處理,,而不像傳統(tǒng)的服務器采用多線程的模式,。
Vert.x的核心組件是Verticle,運行在Vert.x實例中,。Vert.x啟動后,,根據(jù)服務器CPU的內(nèi)核數(shù),,自動創(chuàng)建對應的Vert.x實例,并發(fā)運行Verticle,。
Vert.x采用事件驅動的異步編程模式,,通過觸發(fā)事件以及注冊事件處理器完成所有編程任務。Verticle之間不能直接調用,,只能發(fā)送和接收事件實現(xiàn)協(xié)作,。
Vert.x的核心是事件總線,Verticle在事件總線發(fā)送和接收事件,。事件總線是分布式的,,能連接服務器和客戶端。事件總線支持點對點和發(fā)布-訂閱模式的事件傳輸,,監(jiān)控系統(tǒng)中服務器向所有連接的客戶端發(fā)送監(jiān)控數(shù)據(jù)就使用發(fā)布訂閱模式,,使得所有客戶端瀏覽器都能實時接收到監(jiān)控數(shù)據(jù)。
2 實時監(jiān)控系統(tǒng)設計與實現(xiàn)
大連柳樹供熱公司監(jiān)控系統(tǒng)現(xiàn)場采用西門子PLC S7-300[4],,通過屏蔽雙絞線連接到中心機房的核心交換機上,,中心監(jiān)控主機CPU采用志強8核服務器,可并發(fā)運行8個Vert.x實例,,能支持十幾萬個并發(fā)請求,。頁面采用最新的Bootstrap模版技術[5],自動適應不同尺寸的屏幕顯示,,包括手機,、平板等。
2.1 讀取PLC監(jiān)控數(shù)據(jù)TCP編程
西門子S7-300采用TCP FETCH WRITE通信方式[6],,該模式下通過TCP協(xié)議的Socket,,主機可與PLC進行數(shù)據(jù)交換。
Vert.x內(nèi)置TCP Client方法,,如下是TCP客戶端讀取PLC數(shù)據(jù)的代碼:
var vertx=require(′vertx′),;//獲得Vert.x運行實例
var eb=require(′vertx/event_bus′)//獲得Event Bus對象
var client=vertx.createNetClient();//創(chuàng)建TCP客戶端
client.reconnectAttempts(1000),;//設置連接嘗試次數(shù)
client.reconnectInterval(500),;//設置嘗試間隔時間
//連接PLC Socket端口,并定義回調函數(shù)
client.connect(config.port,,config.ip,,function(err,socket){//定義接收到PLC數(shù)據(jù)的事件處理器
socket.dataHandler(function(buffer){
var data=JSON.parse(buffer),;
//將接收的數(shù)據(jù)發(fā)布到Evnet Bus上
eb.publish("rtdata.in.receive",,{info:data},function(result){}),;
//使用定時器,,每間隔0.5 s發(fā)送請求數(shù)據(jù)指令到PLC
var timer=vertx.setPeriodic(500,,function(timerID){sock.write("datain");}),;
}}),;
客戶端定時發(fā)送數(shù)據(jù)指令,PLC數(shù)據(jù)到達后,,Socket上的事件監(jiān)聽器工作,,從回調函數(shù)中取得監(jiān)控數(shù)據(jù),并轉換為JSON格式,,使用總線方法publish發(fā)布事件,。總線上監(jiān)聽的Web客戶端都能同步接收監(jiān)控數(shù)據(jù),。Vert.x采用推模式實現(xiàn)數(shù)據(jù)傳輸,,由Vert.x服務器主動發(fā)送數(shù)據(jù),不需客戶端請求,,節(jié)省了網(wǎng)絡帶寬,提高了傳輸速度,,滿足了監(jiān)控系統(tǒng)實時性,。監(jiān)控系統(tǒng)的總體架構如圖1所示。
在Vert.x服務器中,,可啟動多個TCP客戶端Verticle,,實現(xiàn)多路監(jiān)測數(shù)據(jù)的并發(fā)讀取,如下代碼展示主服務器依次啟動Http Web Server和TCP Client監(jiān)控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 監(jiān)控Web服務器的編程
系統(tǒng)采用Vert.x的服務器模塊web-server~2.0,,實現(xiàn)功能強大的Web服務器,,并使用異步模式接收客戶端瀏覽器的HTTP請求,支持客戶高并發(fā)的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作為站點發(fā)布目錄,,在/web目錄中存儲站點的頁面文件,。
代碼中bridge:true表示將服務器端的事件總線延伸到Web客戶端,實現(xiàn)服務器和客戶端的數(shù)據(jù)傳輸,。每個Verticle都可以在Event Bus注冊事件處理器,,以此實現(xiàn)數(shù)據(jù)的接收和發(fā)送。
2.3 監(jiān)控客戶端編程
客戶端使用普通的HTML即可,,不需要動態(tài)頁面,。為實現(xiàn)與Vert.x服務器的Event Bus通信,客戶端頁面需要引入Vert.x的Event Bus Bridge的庫文件vertxbus-2.1.js,。
監(jiān)控數(shù)據(jù)顯示使用<div>,,使用Bootstrap框架布局,將<div>懸浮在圖片指定位置,。監(jiān)控客戶端頁面的數(shù)據(jù)接收和顯示代碼如下:
$(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創(chuàng)建一個實例即可,。如果與服務端的Event Bus連接成功,則eb.onopen回調函數(shù)工作,。在此方法內(nèi),,通過Event Bus的registerHandler對指定的地址進行監(jiān)聽,當有此地址的事件event到達時,,定義的回調函數(shù)function(args)開始運行,,參數(shù)args為事件中包含的JSON數(shù)據(jù),解析出JSON數(shù)據(jù),,使用jQuery的函數(shù)html()將數(shù)據(jù)顯示在指定的 <div>元素內(nèi),,實現(xiàn)監(jiān)控數(shù)據(jù)的實時顯示。實時監(jiān)控系統(tǒng)監(jiān)控界面如圖2所示,。
3 結論
Vert.x具有的實時通信,、全新的異步響應式工作模式和分布式Event Bus等特性,使其必將在實時系統(tǒng)開發(fā)中得到廣泛應用,。與Node.js相比,,Vert.x以其性能壓倒性的絕對優(yōu)勢,,必將推動實時Web的飛速發(fā)展,進而引起Web領域顛覆性的革命,,徹底淘汰以AJAX為主的Web2.0,,引領新的Web發(fā)展趨勢。
參考文獻
[1] 李玉珠,,吳敏,,徐福倉.基于Web的煉焦實時監(jiān)視系統(tǒng)設計與實現(xiàn)[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的遠程控制實驗室系統(tǒng)[J].浙江工業(yè)大學學報,,2007(2):73-77.
[5] 陳群.基于ASP.NET AJAX新型Web Scada的設計與實現(xiàn)[J].工業(yè)控制計算機,2009(6):42-44.
[6] 趙佳寶,,付羽.基于SVG的實時監(jiān)控流程圖實現(xiàn)技術[J].工業(yè)控制計算機,,2009(6):10-12.