文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.2016.02.020
中文引用格式: 呂海東,陸永林. 異步響應式集群實時監控系統設計[J].電子技術應用,2016,42(2):74-77.
英文引用格式: Lv Haidong,Lu Yonglin. Design of asynchronous reactive cluster real-time monitoring system[J].Application of Electronic Technique,2016,42(2):74-77.
0 引言
大型的工業過程監控系統一般都采用分布式控制系統(Distributed Control System,DCS[1])模式,上位控制主機和下位機都采用價格高昂的工業控制計算機。監控系統的軟件通常選用專門的組態軟件,這些軟件價格不菲,導致系統投資過大,增加了企業的經濟負擔。當系統性能難以滿足實時性需求,需進行系統的升級改造時,原有主機基本被淘汰,造成極大的浪費。
如何用最少的投資實現超高性能,以滿足工業過程控制的實時性要求,是當今所有監控系統設計的終極目標。
樹莓派[2]的出現以及性能的不斷提升,在硬件上為實現低成本監控系統提供了可能。尤其是最新推出的樹莓派第2代B型,配置了ARM結構的Cortex-A7 64位4核處理器及1 GB內存,單價在200元以內,配置16 GB存儲卡,散熱器和金屬外殼也不超過300元,性能比原有B型提升6倍,其使用Debain Linux操作系統,可運行大部分Linux應用程序。
軟件方面,使用傳統的多進程和多線程軟件技術無法滿足當今應用面臨高并發請求和實時性能要求,全新的Node.js[3]服務器平臺技術應運而生。
Node.js采用了全新的單線程、非阻塞和異步驅動模式[4],能在使用很少內存的情況下,高性能處理超大量的客戶并發請求,完美解決了傳統軟件技術難以逾越的C10K+問題。
Node.js支持多種集群技術[5],可簡單地實現橫向和縱向伸縮技術,能適應超大規模應用的需求。
本文將樹莓派與Node.js結合,并利用Node.js的集群技術,完美實現了一個超低成本、高性能的全新模式的集群式過程監控系統,并在大連高新園區廣源熱力有限公司供熱管網監控中實施。
1 系統總體架構設計
為減少系統的投資,此監控系統集群中的主機沒有使用傳統的工業控制計算機,均采用樹莓派第2代B型,使用其Linux操作系統,安裝Node.js,構成如圖1所示的過程監控系統。為提高系統的可靠性和高性能,系統采用分層的架構。
現場數據采集層依然使用傳統的PLC完成,采用西門子S7-300實現對供熱管網溫度、壓力和流量的監測。
數據采集傳輸層采用多塊樹莓派構成集群,通過TCP協議實時讀取PLC的數據,并使用socket.io模塊將數據實時推送到客戶端的Web頁面上。
監控數據的顯示層使用高性能的Nginx[6]發布HTML頁面和JavaScript代碼到客戶端瀏覽器上。瀏覽器的JavaScript利用socket.io客戶端直接接收數據采集層推送的監測數據,并集成jQuery框架技術顯示在Web頁面的指定位置。由于使用了socket.io的數據推技術,克服了傳統Web監控系統使用HTTP協議時AJAX的請求/響應模式低效率和大延遲的缺陷,極大提高了系統的傳輸性能,滿足了監控系統對實時性的苛刻要求。
按照此架構設計的高性能監控系統,主機部分采用了5塊樹莓派,按每塊300元計算(已包含核心板和輔助的配件),共計1 500元。如果采用較普及的天迪工控機,即使雙核的最低型也要4 200元,如果使用4核CPU版,則要5 600元左右,要組成本系統的集群,則至少3萬元,可見本系統的成本優越性。
2 監控數據采集傳輸模塊設計
數據采集傳輸模式是系統設計的關鍵,其向下實時讀取PLC監測的監控數據,向上使用Node.js的socket.io模塊采用推技術直接將數據發送到客戶端。客戶連接成功后,不再需要客戶端發送數據請求,傳輸層定時將數據發送到客戶端進行顯示。
為提高系統的性能和可靠性,系統采用2塊樹莓派組成集群,將來可以隨時增加更多的板子,以適應更高性能的要求,這也是此系統的最核心優勢。
樹莓派內部有一個4核64位的CPU A7,系統采用cluster集群模塊,單板可運行4個Node.js實例,集群模塊內置了均衡負載功能實現請求的均衡處理。如此2塊樹莓派可運行8個Node.js實例,使系統處于超高性能數據處理和傳輸狀態。
Cluster模塊只是單主機內部集群,為解決跨主機間的Node.js的socket.io模塊的消息處理集群,系統采用socket.io-proxy代理模塊構成主機集群,實現2塊樹莓派之間的消息處理的均衡負載,未來可根據需求增加更多的Node.js主機,以滿足更高的性能需求。
2.1 現場監控數據采集實現
西門子S7-300支持TCP協議通信[7],可實現數據的直接相互傳輸。系統使用Node.js的TCP Client核心模塊讀取PLC的監測數據,節省了購買昂貴的西門子數據采集組件的費用。
西門子S7-300內置TCP FETCH WRITE通信方式,該模式下通過TCP協議,Node.js使用內置的net模塊創建TCP客戶端實現與PLC的數據交換,其示意代碼如下所示:
var net = require("net");
var MonoteData=function(){};
MonoteData.prototype.monitor =function(){
var io = require('socket.io')(9000);
io.on('connection',function (socket){
var client=new Array();
for(var i=0;i<plcs.length;i++){
client[i] = net.connect(plc[i].port, plc[i].ip);
client[i].on('data', function(data) {
var plcdate=convertToReal(data);
iosocket.broadcast.emit("plcdata",plcdata);
});
}
});
}
數據讀取程序使用JavaScript的面向對象特性封裝在對象構造函數中,以便進行集群處理。在數據采集程序之前,使用Node.js的文件模塊fs,將保存所有PLC設備IP和端口的配置文件plc.json讀入到數組plcs對象中,通過Node.js創建TCP客戶端,連接到所有的PLC,使用Socket對象的on事件以異步響應模式接收監測數據。接收到PLC監測數據后,使用專門的轉換函數轉換為JSON格式的數據,其中包含監控點的編號、監測的數據類型(溫度、流量或壓力)和數據值,使用socket.io模式實時推送到Web客戶端。
2.2 數據傳輸集群設計實現
針對樹莓派4核64位CPU的特性,系統使用Node.js的cluster[8]模塊,在每塊樹莓派內部運行與CPU核數對應的Node.js實例,實現數據監測和傳輸層的集群,以滿足監控系統的高性能需求。其核心的示意代碼如下所示:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if(cluster.isMaster) {
for(var i = 0; i < numCPUs; i++) {
cluster.fork();
}
}
if(cluster.isWorker){
new MonoteData().monitor();
}
代碼在每個樹莓派內部創建4個Node.js實例,并且cluster模塊自動具備動態負載均衡功能,實現采集任務處理的均衡分配。
由于cluster模塊不具備跨不同樹莓派的集群功能,只能在單個主機內多CPU內核實現縱向的可伸縮性,為實現跨不同主機Node.js的橫向可伸縮性,本系統采用集群模塊node-http-proxy[9]。
服務器端與客戶端通過Socket.io模塊與其底層使用的WebSocket協議實時通信,此協議在連接初期依然使用HTTP協議,待握手成功后,升級為WebSocket協議,以實現全雙工的實時通信。因此為實現多主機集群,原則上可以使用任何支持HTTP協議的動態均衡負載的集群服務器產品,如著名的Nginx,同時Node.js也提供了多種模塊實現相同的功能。為與Node.js模塊更好地融合,系統選擇了node- http-proxy實現橫向集群,其簡化示意代碼如下所示:
var httpProxy = require('http-proxy');
var addresses = [
{ host: '172.30.39.230',port:9000},
{ host: '172.30.39.231',port:9000}
];
httpProxy.createServer(function(req, res, proxy) {
var target = addresses.shift();
proxy.proxyRequest(req, res, target);
addresses.push(target);
}).listen(9000);
如果要增加新的Node.js主機,在addresses變量定義中增加新主機的配置項即可,極其簡便。
3 數據發布Web服務器實現
本系統的Web客戶端全部采用純的HTML和JavaScript實現,通過socket.io的客戶端與Node.js進行數據傳輸。雖然使用Node.js的express模塊也能實現靜態Web站點的發布,但Nginx是此類應用的最佳選擇,在所有靜態Web內容的請求處理上,Nginx性能是最佳的。為提高系統的請求處理性能,本系統采用1塊單獨的樹莓派運行Nginx服務器,使用其默認的配置,將監控系統的Web客戶端文件保存在Nginx的html目錄下即可,該Nginx監聽80端口上的HTTP請求。
4 數據顯示客戶端設計與實現
監控系統的客戶端采用Web方式,可以使用PC、手機、平板等訪問監控頁面。客戶端使用HTML、JavaScript、jQuery和socket.io客戶端實現。頁面上的顯示數據使用絕對位置的div實現,每個div通過id屬性與特定的監控點對應。socket.io客戶端監聽Node.js服務器廣播的數據事件,從中解析出監控點編號和監測數據,使用jquery顯示在指定的div中。
頁面HTML的主div定義指定的監控區域,將監控設備圖作為其背景圖片,定義每個監控數據div,并通過CSS進行絕對位置定義,并懸浮在監控點上,其簡化示意代碼如下:
<link rel=”stylesheet” type=”text/css” href=”main,css”>
<script type="text/javascript" src="../socketio/socket. io.js"></script>
<script type="text/javascript" src="main.js"></script>
<div id="area01">
<div id="t01"></div>
<div id="p01"></div>
<div id="l01"></div>
</div>
其中area01為第1個監控區域,每個監控區域使用不同的頁面,用戶可以選擇查看不同監控區域的數據。t01表示第1個溫度檢測數據,p01為壓力數據,l01為流量檢測數據。
頁面元素的定位采用CSS進行控制,其示意代碼如下(為簡化只演示一個顯示元素,其余相似):
div#area01{
background-image:url(../images/area01.jpg);
width:960px;
heighty:650px; }
div#t01 {
position:fixed;
top:212px;
left:467px;
width:12px;
height:11px;
}
客戶端接收服務器發送的監控數據和顯示,通過JavaScript結合jQuery和socket.io客戶端實現。通過接收異步響應式事件,取得采集服務器發送的數據,顯示在指定的div元素上,其簡化示意代碼如下:
$(document).ready(function(){
var socket = io.connect("http://172.30.39.100:8082");
socket.on("plcdata",function(data){
var dataid=data.plc.id;
var value=data.plc.data;
$("div"+dataid).html(value);
});
});
這里socket.io客戶端連接的是node-http-proxy代理Node.js主機,該代理按照負載均衡算法轉發到數據采集主機,實現高并發請求的處理。系統顯示的監控頁面截圖如圖2所示。
5 結論
此系統的設計與實施是低成本監控系統的創新實踐,極大減輕了企業的經濟負擔,提高了企業投入技術改造的積極性。使用全新的異步響應式編程模式和高性能的Node.js結合,極大簡化了監控系統的編程和維護,加快了系統的建設和實施效率,通過集群技術,提供了監控系統的性能,更好地滿足了監控系統對處理速度和實時性的需求。
參考文獻
[1] 張士超,儀垂杰,郭健翔,等.集散控制系統的發展及應用現狀[J].微計算機信息,2007(1):94-96.
[2] Samarth Shah.Learning raspberry PI[M].Birmingham:Packt Publishing,2015.
[3] 陸凌牛.Node.js權威指南[M].北京:機械工業出版社,2014.
[4] Diogo Resende.Node.js high performance[M].Birmingham:Packt Publishing,2015.
[5] Pedro Teixeira.Professional Node.js[M].Indianapolis:John Wiley&Sons,Inc,2013.
[6] Rahul Sharma.Nginx high performance[M].Birmingham:Packt Publishing,2015.
[7] 席英杰,劉文麗.簡述西門子S7-300/400的通訊功能及工業應用[J].自動化與儀表,2007(1):37-40.
[8] TILKOV S,VINOSKI S.Node.js:using JavaScript to build high-performance network programs[J].Internet Computing,IEEE,2010,14(6):80-83.
[9] 姚立.IBM云計算平臺下NodeJS應用支持環境的設計與實現[D].哈爾濱:哈爾濱工業大學,2013.