《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > 異步響應(yīng)式集群實(shí)時(shí)監(jiān)控系統(tǒng)設(shè)計(jì)
異步響應(yīng)式集群實(shí)時(shí)監(jiān)控系統(tǒng)設(shè)計(jì)
2016年電子技術(shù)應(yīng)用第2期
呂海東1,,陸永林2
1.大連理工大學(xué) 城市學(xué)院,遼寧 大連116600,;2.大連英科時(shí)代科技發(fā)展有限公司,遼寧 大連116600
摘要: 針對(duì)傳統(tǒng)模式DCS的監(jiān)控系統(tǒng)無法滿足高并發(fā)請(qǐng)求的性能要求以及投資過大等問題,,使用低價(jià)的樹莓派嵌入式計(jì)算機(jī),、異步非阻塞服務(wù)器平臺(tái)Node.js和集群技術(shù)設(shè)計(jì)全新的過程監(jiān)控系統(tǒng),以滿足工業(yè)監(jiān)控高性能需求,。
中圖分類號(hào): TH865
文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.2016.02.020
中文引用格式: 呂海東,,陸永林. 異步響應(yīng)式集群實(shí)時(shí)監(jiān)控系統(tǒng)設(shè)計(jì)[J].電子技術(shù)應(yīng)用,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.
Design of asynchronous reactive cluster real-time monitoring system
Lv Haidong1,,Lu Yonglin2
1.City Institute,Dalian University of Technology,,Dalian 116600,,China;2.Dalian Linktimes Co.Ltd,,Dalian 116600,,China
Abstract: To solve the problem that traditional DCS system can′t meet requirements of high concurrent requests performance and investment is too large, using new server platform Node.js with asynchronous, non-blocking,low-cost raspberryPI embedded computer and cluster technology to design a new kind of monitoring system, to meet the high performance requirements of industrial monitoring.
Key words : asynchronous,;reactive,;Node.js;real-time monitoring

0 引言

    大型的工業(yè)過程監(jiān)控系統(tǒng)一般都采用分布式控制系統(tǒng)(Distributed Control System,,DCS[1])模式,,上位控制主機(jī)和下位機(jī)都采用價(jià)格高昂的工業(yè)控制計(jì)算機(jī)。監(jiān)控系統(tǒng)的軟件通常選用專門的組態(tài)軟件,,這些軟件價(jià)格不菲,,導(dǎo)致系統(tǒng)投資過大,增加了企業(yè)的經(jīng)濟(jì)負(fù)擔(dān),。當(dāng)系統(tǒng)性能難以滿足實(shí)時(shí)性需求,,需進(jìn)行系統(tǒng)的升級(jí)改造時(shí),原有主機(jī)基本被淘汰,,造成極大的浪費(fèi),。

    如何用最少的投資實(shí)現(xiàn)超高性能,以滿足工業(yè)過程控制的實(shí)時(shí)性要求,,是當(dāng)今所有監(jiān)控系統(tǒng)設(shè)計(jì)的終極目標(biāo),。

    樹莓派[2]的出現(xiàn)以及性能的不斷提升,在硬件上為實(shí)現(xiàn)低成本監(jiān)控系統(tǒng)提供了可能,。尤其是最新推出的樹莓派第2代B型,,配置了ARM結(jié)構(gòu)的Cortex-A7 64位4核處理器及1 GB內(nèi)存,單價(jià)在200元以內(nèi),,配置16 GB存儲(chǔ)卡,,散熱器和金屬外殼也不超過300元,,性能比原有B型提升6倍,其使用Debain Linux操作系統(tǒng),,可運(yùn)行大部分Linux應(yīng)用程序,。

    軟件方面,使用傳統(tǒng)的多進(jìn)程和多線程軟件技術(shù)無法滿足當(dāng)今應(yīng)用面臨高并發(fā)請(qǐng)求和實(shí)時(shí)性能要求,,全新的Node.js[3]服務(wù)器平臺(tái)技術(shù)應(yīng)運(yùn)而生,。

    Node.js采用了全新的單線程、非阻塞和異步驅(qū)動(dòng)模式[4],,能在使用很少內(nèi)存的情況下,,高性能處理超大量的客戶并發(fā)請(qǐng)求,完美解決了傳統(tǒng)軟件技術(shù)難以逾越的C10K+問題,。

    Node.js支持多種集群技術(shù)[5],,可簡單地實(shí)現(xiàn)橫向和縱向伸縮技術(shù),能適應(yīng)超大規(guī)模應(yīng)用的需求,。

    本文將樹莓派與Node.js結(jié)合,,并利用Node.js的集群技術(shù),完美實(shí)現(xiàn)了一個(gè)超低成本,、高性能的全新模式的集群式過程監(jiān)控系統(tǒng),,并在大連高新園區(qū)廣源熱力有限公司供熱管網(wǎng)監(jiān)控中實(shí)施。

1 系統(tǒng)總體架構(gòu)設(shè)計(jì)

    為減少系統(tǒng)的投資,,此監(jiān)控系統(tǒng)集群中的主機(jī)沒有使用傳統(tǒng)的工業(yè)控制計(jì)算機(jī),,均采用樹莓派第2代B型,使用其Linux操作系統(tǒng),,安裝Node.js,,構(gòu)成如圖1所示的過程監(jiān)控系統(tǒng)。為提高系統(tǒng)的可靠性和高性能,,系統(tǒng)采用分層的架構(gòu),。

ck5-t1.gif

    現(xiàn)場(chǎng)數(shù)據(jù)采集層依然使用傳統(tǒng)的PLC完成,采用西門子S7-300實(shí)現(xiàn)對(duì)供熱管網(wǎng)溫度,、壓力和流量的監(jiān)測(cè),。

    數(shù)據(jù)采集傳輸層采用多塊樹莓派構(gòu)成集群,通過TCP協(xié)議實(shí)時(shí)讀取PLC的數(shù)據(jù),,并使用socket.io模塊將數(shù)據(jù)實(shí)時(shí)推送到客戶端的Web頁面上,。

    監(jiān)控?cái)?shù)據(jù)的顯示層使用高性能的Nginx[6]發(fā)布HTML頁面和JavaScript代碼到客戶端瀏覽器上。瀏覽器的JavaScript利用socket.io客戶端直接接收數(shù)據(jù)采集層推送的監(jiān)測(cè)數(shù)據(jù),,并集成jQuery框架技術(shù)顯示在Web頁面的指定位置,。由于使用了socket.io的數(shù)據(jù)推技術(shù),克服了傳統(tǒng)Web監(jiān)控系統(tǒng)使用HTTP協(xié)議時(shí)AJAX的請(qǐng)求/響應(yīng)模式低效率和大延遲的缺陷,,極大提高了系統(tǒng)的傳輸性能,,滿足了監(jiān)控系統(tǒng)對(duì)實(shí)時(shí)性的苛刻要求,。

    按照此架構(gòu)設(shè)計(jì)的高性能監(jiān)控系統(tǒng),主機(jī)部分采用了5塊樹莓派,,按每塊300元計(jì)算(已包含核心板和輔助的配件),,共計(jì)1 500元。如果采用較普及的天迪工控機(jī),,即使雙核的最低型也要4 200元,如果使用4核CPU版,,則要5 600元左右,,要組成本系統(tǒng)的集群,則至少3萬元,,可見本系統(tǒng)的成本優(yōu)越性,。

2 監(jiān)控?cái)?shù)據(jù)采集傳輸模塊設(shè)計(jì)

    數(shù)據(jù)采集傳輸模式是系統(tǒng)設(shè)計(jì)的關(guān)鍵,其向下實(shí)時(shí)讀取PLC監(jiān)測(cè)的監(jiān)控?cái)?shù)據(jù),,向上使用Node.js的socket.io模塊采用推技術(shù)直接將數(shù)據(jù)發(fā)送到客戶端,。客戶連接成功后,,不再需要客戶端發(fā)送數(shù)據(jù)請(qǐng)求,,傳輸層定時(shí)將數(shù)據(jù)發(fā)送到客戶端進(jìn)行顯示。

    為提高系統(tǒng)的性能和可靠性,,系統(tǒng)采用2塊樹莓派組成集群,,將來可以隨時(shí)增加更多的板子,以適應(yīng)更高性能的要求,,這也是此系統(tǒng)的最核心優(yōu)勢(shì),。

    樹莓派內(nèi)部有一個(gè)4核64位的CPU A7,系統(tǒng)采用cluster集群模塊,,單板可運(yùn)行4個(gè)Node.js實(shí)例,,集群模塊內(nèi)置了均衡負(fù)載功能實(shí)現(xiàn)請(qǐng)求的均衡處理。如此2塊樹莓派可運(yùn)行8個(gè)Node.js實(shí)例,,使系統(tǒng)處于超高性能數(shù)據(jù)處理和傳輸狀態(tài),。

    Cluster模塊只是單主機(jī)內(nèi)部集群,為解決跨主機(jī)間的Node.js的socket.io模塊的消息處理集群,,系統(tǒng)采用socket.io-proxy代理模塊構(gòu)成主機(jī)集群,,實(shí)現(xiàn)2塊樹莓派之間的消息處理的均衡負(fù)載,未來可根據(jù)需求增加更多的Node.js主機(jī),,以滿足更高的性能需求,。

2.1 現(xiàn)場(chǎng)監(jiān)控?cái)?shù)據(jù)采集實(shí)現(xiàn)

    西門子S7-300支持TCP協(xié)議通信[7],可實(shí)現(xiàn)數(shù)據(jù)的直接相互傳輸,。系統(tǒng)使用Node.js的TCP Client核心模塊讀取PLC的監(jiān)測(cè)數(shù)據(jù),,節(jié)省了購買昂貴的西門子數(shù)據(jù)采集組件的費(fèi)用,。

    西門子S7-300內(nèi)置TCP FETCH WRITE通信方式,該模式下通過TCP協(xié)議,,Node.js使用內(nèi)置的net模塊創(chuàng)建TCP客戶端實(shí)現(xiàn)與PLC的數(shù)據(jù)交換,,其示意代碼如下所示:

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);

  });

}  

});

}

    數(shù)據(jù)讀取程序使用JavaScript的面向?qū)ο筇匦苑庋b在對(duì)象構(gòu)造函數(shù)中,以便進(jìn)行集群處理,。在數(shù)據(jù)采集程序之前,,使用Node.js的文件模塊fs,將保存所有PLC設(shè)備IP和端口的配置文件plc.json讀入到數(shù)組plcs對(duì)象中,,通過Node.js創(chuàng)建TCP客戶端,,連接到所有的PLC,使用Socket對(duì)象的on事件以異步響應(yīng)模式接收監(jiān)測(cè)數(shù)據(jù),。接收到PLC監(jiān)測(cè)數(shù)據(jù)后,,使用專門的轉(zhuǎn)換函數(shù)轉(zhuǎn)換為JSON格式的數(shù)據(jù),其中包含監(jiān)控點(diǎn)的編號(hào),、監(jiān)測(cè)的數(shù)據(jù)類型(溫度,、流量或壓力)和數(shù)據(jù)值,使用socket.io模式實(shí)時(shí)推送到Web客戶端,。

2.2 數(shù)據(jù)傳輸集群設(shè)計(jì)實(shí)現(xiàn)

    針對(duì)樹莓派4核64位CPU的特性,,系統(tǒng)使用Node.js的cluster[8]模塊,在每塊樹莓派內(nèi)部運(yùn)行與CPU核數(shù)對(duì)應(yīng)的Node.js實(shí)例,,實(shí)現(xiàn)數(shù)據(jù)監(jiān)測(cè)和傳輸層的集群,,以滿足監(jiān)控系統(tǒng)的高性能需求。其核心的示意代碼如下所示:

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();

}

    代碼在每個(gè)樹莓派內(nèi)部創(chuàng)建4個(gè)Node.js實(shí)例,,并且cluster模塊自動(dòng)具備動(dòng)態(tài)負(fù)載均衡功能,,實(shí)現(xiàn)采集任務(wù)處理的均衡分配。

    由于cluster模塊不具備跨不同樹莓派的集群功能,,只能在單個(gè)主機(jī)內(nèi)多CPU內(nèi)核實(shí)現(xiàn)縱向的可伸縮性,,為實(shí)現(xiàn)跨不同主機(jī)Node.js的橫向可伸縮性,本系統(tǒng)采用集群模塊node-http-proxy[9],。

    服務(wù)器端與客戶端通過Socket.io模塊與其底層使用的WebSocket協(xié)議實(shí)時(shí)通信,,此協(xié)議在連接初期依然使用HTTP協(xié)議,待握手成功后,,升級(jí)為WebSocket協(xié)議,,以實(shí)現(xiàn)全雙工的實(shí)時(shí)通信。因此為實(shí)現(xiàn)多主機(jī)集群,,原則上可以使用任何支持HTTP協(xié)議的動(dòng)態(tài)均衡負(fù)載的集群服務(wù)器產(chǎn)品,,如著名的Nginx,同時(shí)Node.js也提供了多種模塊實(shí)現(xiàn)相同的功能。為與Node.js模塊更好地融合,,系統(tǒng)選擇了node- http-proxy實(shí)現(xiàn)橫向集群,,其簡化示意代碼如下所示:

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主機(jī),在addresses變量定義中增加新主機(jī)的配置項(xiàng)即可,,極其簡便,。

3 數(shù)據(jù)發(fā)布Web服務(wù)器實(shí)現(xiàn)

    本系統(tǒng)的Web客戶端全部采用純的HTML和JavaScript實(shí)現(xiàn),通過socket.io的客戶端與Node.js進(jìn)行數(shù)據(jù)傳輸,。雖然使用Node.js的express模塊也能實(shí)現(xiàn)靜態(tài)Web站點(diǎn)的發(fā)布,,但Nginx是此類應(yīng)用的最佳選擇,在所有靜態(tài)Web內(nèi)容的請(qǐng)求處理上,,Nginx性能是最佳的,。為提高系統(tǒng)的請(qǐng)求處理性能,本系統(tǒng)采用1塊單獨(dú)的樹莓派運(yùn)行Nginx服務(wù)器,,使用其默認(rèn)的配置,,將監(jiān)控系統(tǒng)的Web客戶端文件保存在Nginx的html目錄下即可,,該Nginx監(jiān)聽80端口上的HTTP請(qǐng)求,。

4 數(shù)據(jù)顯示客戶端設(shè)計(jì)與實(shí)現(xiàn)

    監(jiān)控系統(tǒng)的客戶端采用Web方式,可以使用PC,、手機(jī),、平板等訪問監(jiān)控頁面??蛻舳耸褂肏TML,、JavaScript、jQuery和socket.io客戶端實(shí)現(xiàn),。頁面上的顯示數(shù)據(jù)使用絕對(duì)位置的div實(shí)現(xiàn),,每個(gè)div通過id屬性與特定的監(jiān)控點(diǎn)對(duì)應(yīng)。socket.io客戶端監(jiān)聽Node.js服務(wù)器廣播的數(shù)據(jù)事件,,從中解析出監(jiān)控點(diǎn)編號(hào)和監(jiān)測(cè)數(shù)據(jù),,使用jquery顯示在指定的div中。

    頁面HTML的主div定義指定的監(jiān)控區(qū)域,,將監(jiān)控設(shè)備圖作為其背景圖片,,定義每個(gè)監(jiān)控?cái)?shù)據(jù)div,并通過CSS進(jìn)行絕對(duì)位置定義,,并懸浮在監(jiān)控點(diǎn)上,,其簡化示意代碼如下:

<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個(gè)監(jiān)控區(qū)域,每個(gè)監(jiān)控區(qū)域使用不同的頁面,,用戶可以選擇查看不同監(jiān)控區(qū)域的數(shù)據(jù),。t01表示第1個(gè)溫度檢測(cè)數(shù)據(jù),p01為壓力數(shù)據(jù),l01為流量檢測(cè)數(shù)據(jù),。

    頁面元素的定位采用CSS進(jìn)行控制,,其示意代碼如下(為簡化只演示一個(gè)顯示元素,其余相似):

div#area01{

    background-image:url(../images/area01.jpg);

    width:960px;

    heighty:650px;  }

div#t01 {

  position:fixed;

  top:212px;

  left:467px;

  width:12px;

  height:11px;

}

    客戶端接收服務(wù)器發(fā)送的監(jiān)控?cái)?shù)據(jù)和顯示,,通過JavaScript結(jié)合jQuery和socket.io客戶端實(shí)現(xiàn),。通過接收異步響應(yīng)式事件,取得采集服務(wù)器發(fā)送的數(shù)據(jù),,顯示在指定的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主機(jī),該代理按照負(fù)載均衡算法轉(zhuǎn)發(fā)到數(shù)據(jù)采集主機(jī),,實(shí)現(xiàn)高并發(fā)請(qǐng)求的處理,。系統(tǒng)顯示的監(jiān)控頁面截圖如圖2所示。

ck5-t2.gif

5 結(jié)論

    此系統(tǒng)的設(shè)計(jì)與實(shí)施是低成本監(jiān)控系統(tǒng)的創(chuàng)新實(shí)踐,,極大減輕了企業(yè)的經(jīng)濟(jì)負(fù)擔(dān),,提高了企業(yè)投入技術(shù)改造的積極性。使用全新的異步響應(yīng)式編程模式和高性能的Node.js結(jié)合,,極大簡化了監(jiān)控系統(tǒng)的編程和維護(hù),,加快了系統(tǒng)的建設(shè)和實(shí)施效率,通過集群技術(shù),,提供了監(jiān)控系統(tǒng)的性能,,更好地滿足了監(jiān)控系統(tǒng)對(duì)處理速度和實(shí)時(shí)性的需求。

參考文獻(xiàn)

[1] 張士超,,儀垂杰,,郭健翔,等.集散控制系統(tǒng)的發(fā)展及應(yīng)用現(xiàn)狀[J].微計(jì)算機(jī)信息,,2007(1):94-96.

[2] Samarth Shah.Learning raspberry PI[M].Birmingham:Packt Publishing,,2015.

[3] 陸凌牛.Node.js權(quán)威指南[M].北京:機(jī)械工業(yè)出版社,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的通訊功能及工業(yè)應(yīng)用[J].自動(dòng)化與儀表,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云計(jì)算平臺(tái)下NodeJS應(yīng)用支持環(huán)境的設(shè)計(jì)與實(shí)現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),,2013.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。