摘 要: 創新性地使用最新的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。
監控數據顯示使用<div>,使用Bootstrap框架布局,將<div>懸浮在圖片指定位置。監控客戶端頁面的數據接收和顯示代碼如下:
$(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()將數據顯示在指定的 <div>元素內,實現監控數據的實時顯示。實時監控系統監控界面如圖2所示。
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.