王 晶
SCADA系統(tǒng)即數(shù)據(jù)采集與監(jiān)視控制系統(tǒng),是由調(diào)度中心(MS)、通訊網(wǎng)絡(luò)和控制終端(RTU)3大部分構(gòu)成的計(jì)算機(jī)集群實(shí)時(shí)控制系統(tǒng),是實(shí)現(xiàn)高速電氣化鐵路電力調(diào)度自動(dòng)化的主要裝備。
近年來,隨著鐵道電氣化行業(yè)的發(fā)展,對(duì)于SCADA系統(tǒng)可擴(kuò)展性、承載大容量數(shù)據(jù)處理的要求越來越高,既有SCADA系統(tǒng)暴露出下述弊端:既有SCADA系統(tǒng)形式上采用分布式架構(gòu),但大多數(shù)廠商開發(fā)的SCADA系統(tǒng)通常簡(jiǎn)單地將服務(wù)器劃分為應(yīng)用服務(wù)器和數(shù)據(jù)服務(wù)器,通訊模塊與實(shí)時(shí)數(shù)據(jù)庫(kù)模塊緊密耦合在一起構(gòu)成數(shù)據(jù)服務(wù)器,沒有實(shí)現(xiàn)真正的分布式計(jì)算。一方面,使得遠(yuǎn)動(dòng)系統(tǒng)擴(kuò)展性差;另一方面,使得數(shù)據(jù)服務(wù)器端負(fù)載較重,服務(wù)器在運(yùn)行時(shí)可能出現(xiàn)由于崩潰導(dǎo)致的服務(wù)中斷問題,無法實(shí)現(xiàn)遠(yuǎn)動(dòng)業(yè)務(wù)連續(xù)性。另外,分布式的系統(tǒng)構(gòu)架必然涉及到進(jìn)程間通訊的問題。進(jìn)程通訊是一切分布式系統(tǒng)的核心。大多數(shù)SCADA系統(tǒng)通常采用遠(yuǎn)程過程調(diào)用(RPC)、遠(yuǎn)程對(duì)象調(diào)用(RMI)以及消息中間件(MOM)這3類中間件服務(wù)作為系統(tǒng)進(jìn)程間通訊機(jī)制,面對(duì)大數(shù)據(jù)量的服務(wù)器節(jié)點(diǎn)數(shù)據(jù)交互,這些機(jī)制已不能完全滿足SCADA系統(tǒng)對(duì)于實(shí)時(shí)性的要求。
因此,本文從上述問題出發(fā),研究基于組播通訊的SCADA系統(tǒng),力求實(shí)現(xiàn)真正意義上的分布式的、松散耦合的SCADA系統(tǒng)。
在分布式系統(tǒng)中,通常需要將一個(gè)節(jié)點(diǎn)的信號(hào)傳送到多個(gè)節(jié)點(diǎn),這時(shí),無論采用廣播方式,還是采用重復(fù)點(diǎn)對(duì)點(diǎn)的通訊方式(即單播方式),都會(huì)嚴(yán)重浪費(fèi)網(wǎng)絡(luò)帶寬,只有組播才是最好的選擇。因此,在分布式系統(tǒng)中較為推崇的通訊方式是組播。組播通訊是指組成員之間以點(diǎn)對(duì)點(diǎn)、點(diǎn)對(duì)多點(diǎn)的方式進(jìn)行通訊,其中:成員是組的一部分,成員是節(jié)點(diǎn),而組是集群。節(jié)點(diǎn)是一個(gè)主機(jī)上的一個(gè)進(jìn)程,一個(gè)集群可以有一個(gè)或多個(gè)節(jié)點(diǎn),一臺(tái)主機(jī)也可以有一個(gè)或多個(gè)節(jié)點(diǎn),這些節(jié)點(diǎn)可以全部屬于一個(gè)集群,也可以部分屬于一個(gè)集群。
目前,組播通訊中應(yīng)用的比較多的是JGroups技術(shù)。JGroups是一個(gè)純JAVA編寫的可靠的群組通訊工具,其工作模式基于IP多播,但可以在可靠性和群組功能上進(jìn)行擴(kuò)展。其中,可靠性包括:消息不丟失、大消息拆分和重組功能、保證消息有序性、消息原子性(某條消息要么全部成員都收到,或都收不到);群組功能包括:群組成員知曉群組內(nèi)所有其他成員,當(dāng)新成員加入群、舊成員離開群或某現(xiàn)有組成員意外脫離群時(shí),所有群組成員都能收到通知。JGroups在結(jié)構(gòu)上設(shè)計(jì)靈活,提供了一種靈活兼容多種協(xié)議的協(xié)議棧,該協(xié)議??梢宰層脩舾鶕?jù)不同的可靠性指標(biāo),在對(duì)可靠性高但速度慢和可靠性差但速度快的效果之間作出折衷的量化選擇?;谏鲜鎏攸c(diǎn),JGroups多應(yīng)用在服務(wù)器集群、多服務(wù)器通訊、分布式緩存、服務(wù)器復(fù)制等場(chǎng)合。目前在JBoss Application Server Clustering,OSCache Clustering Jetty HTTP session replication,Tomcat HTTP session replication中都使用了JGroups,但國(guó)內(nèi)對(duì)于該技術(shù)的研究、應(yīng)用較少。
根據(jù)SCADA系統(tǒng)的業(yè)務(wù)及性能需求,本文基于JGroups技術(shù)設(shè)計(jì)了圖1所示的系統(tǒng)架構(gòu)。該架構(gòu)采用模塊化的設(shè)計(jì)方式,將系統(tǒng)總體實(shí)現(xiàn)劃分為4個(gè)模塊的實(shí)現(xiàn),各模塊間松散耦合,通過消息管理模塊實(shí)現(xiàn)數(shù)據(jù)交互,如圖1所示。
圖1 基于組播通訊的電鐵SCADA系統(tǒng)體系框架圖
(1)消息管理模塊(GroupsManager)提供消息管理服務(wù),作為系統(tǒng)其他模塊間交互的媒介,以高效的消息交互機(jī)制提供其他各模塊間以單播、組播的方式進(jìn)行交互的功能。該模塊是獨(dú)立的,可以將其部署在各服務(wù)器節(jié)點(diǎn)上,使得其他各模塊通過所在節(jié)點(diǎn)的GroupsManager模塊進(jìn)行消息交互。這樣,可以根據(jù)需要將系統(tǒng)服務(wù)器端劃分成多個(gè)節(jié)點(diǎn),有效減輕服務(wù)器端負(fù)載,實(shí)現(xiàn)真正意義上的分布式的、松散耦合的系統(tǒng)架構(gòu)。
(2)通訊模塊(COMMServer)提供與子站通訊服務(wù),一方面,根據(jù)子站上傳的報(bào)文類型解析報(bào)文,將解析結(jié)果通過封裝的GroupsManager模塊發(fā)布給所有節(jié)點(diǎn);另一方面,為人機(jī)界面提供遠(yuǎn)程調(diào)用接口,向子站發(fā)送命令。
(3)實(shí)時(shí)數(shù)據(jù)庫(kù)模塊(RTDBServer)主要負(fù)責(zé)接收通訊原始數(shù)據(jù)信息,處理數(shù)據(jù),并通過封裝的GroupsManager模塊實(shí)時(shí)發(fā)布數(shù)據(jù)處理結(jié)果。
(4)人機(jī)界面(MMI)是人機(jī)交互的接口。界面實(shí)時(shí)數(shù)據(jù)的刷新同樣依賴 GroupsManager模塊實(shí)現(xiàn)。
容錯(cuò)性是衡量系統(tǒng)性能的關(guān)鍵指標(biāo)。容錯(cuò)主要依靠冗余設(shè)計(jì)實(shí)現(xiàn),它以增加資源的辦法換取可靠性。軟件冗余的基本思想是用多個(gè)不同軟件執(zhí)行同一功能,利用軟件設(shè)計(jì)差異實(shí)現(xiàn)容錯(cuò)。該系統(tǒng)冗余設(shè)計(jì)的典型部署結(jié)構(gòu)如圖2所示。其中,D1和D2互為主備,Server1和Server2互為主備,D1、D2、Server1、Server2分別部署在不同的服務(wù)器上,COMMServer、RTDBServer、MMI分別部署在不同的節(jié)點(diǎn)上。
圖2 系統(tǒng)部署結(jié)構(gòu)示意圖
SCADA系統(tǒng)容錯(cuò)性通過部署在各節(jié)點(diǎn)上的GroupsManager模塊實(shí)現(xiàn)。GroupsManager模塊通過使用Jgroups技術(shù)的發(fā)現(xiàn)、檢測(cè)故障等功能,提高了系統(tǒng)的容錯(cuò)能力。具體而言,GroupsManager模塊通過下述3個(gè)步驟實(shí)現(xiàn)系統(tǒng)容錯(cuò)性:
(1)自動(dòng)偵測(cè)。在組成員改變(節(jié)點(diǎn)加入、離開或意外脫離)時(shí),組中其他成員可以得到視圖改變通知。
(2)自動(dòng)切換。當(dāng)確認(rèn)某一節(jié)點(diǎn)離開時(shí),或當(dāng)故障節(jié)點(diǎn)恢復(fù)后加入組,組內(nèi)同類正常節(jié)點(diǎn)以及新加入的節(jié)點(diǎn)需要根據(jù)相應(yīng)的邏輯進(jìn)行主備切換。
(3)自動(dòng)恢復(fù)。故障節(jié)點(diǎn)被替換后,進(jìn)行故障隔離,離線進(jìn)行故障恢復(fù),恢復(fù)后主動(dòng)加入組。
消息管理模塊的性能優(yōu)劣是能否有效解決既有SCADA系統(tǒng)模塊緊耦合、擴(kuò)展難、數(shù)據(jù)處理效率低等問題的關(guān)鍵。高性能的消息管理模塊應(yīng)建立在高效的進(jìn)程通訊機(jī)制的基礎(chǔ)上。本文采用JGroups技術(shù)設(shè)計(jì)了符合遠(yuǎn)動(dòng)業(yè)務(wù)及性能需求的通訊機(jī)制,并描述了基于該通訊機(jī)制的消息管理模塊的模塊化設(shè)計(jì)結(jié)果。
使用分布式進(jìn)程間通訊方法時(shí),總是要?jiǎng)?chuàng)建一個(gè)相應(yīng)的用于通訊的數(shù)據(jù)結(jié)構(gòu)。發(fā)送數(shù)據(jù)時(shí),系統(tǒng)按照該結(jié)構(gòu)組織消息;接收數(shù)據(jù)時(shí),系統(tǒng)根據(jù)該結(jié)構(gòu)解析消息,獲取需要的數(shù)據(jù)實(shí)體??紤]到遠(yuǎn)動(dòng)系統(tǒng)各節(jié)點(diǎn)間有大量的消息交互,并且消息類型各異,設(shè)計(jì)的消息格式需要有一定的靈活性,因此設(shè)計(jì)了如圖3所示的消息實(shí)體格式,該設(shè)計(jì)結(jié)構(gòu)使得消息接收者可以方便地獲取需要的數(shù)據(jù)。
圖3 消息實(shí)體格式框圖
(1)消息類型標(biāo)識(shí):用以唯一標(biāo)識(shí)一種消息類型。本文把消息類型大致劃分為系統(tǒng)消息與視圖消息2大類:為實(shí)現(xiàn)遠(yuǎn)動(dòng)系統(tǒng)業(yè)務(wù)功能,系統(tǒng)節(jié)點(diǎn)間需要有點(diǎn)對(duì)點(diǎn)、點(diǎn)對(duì)多點(diǎn)的消息交互,該類消息稱之為系統(tǒng)消息,系統(tǒng)消息可以根據(jù)參與交互的節(jié)點(diǎn)類型進(jìn)行細(xì)劃;視圖消息使用了JGroups群組功能的思路,包含所有組成員的一個(gè)組稱為一個(gè)視圖,當(dāng)視圖因?yàn)槟吵蓡T狀態(tài)改變而改變時(shí),視圖其他成員可以得到通知,該類消息主要用于系統(tǒng)容錯(cuò)實(shí)現(xiàn)。
(2)參數(shù)個(gè)數(shù):數(shù)據(jù)實(shí)體所包含的信息量。
(3)參數(shù)類型標(biāo)識(shí):用以唯一標(biāo)識(shí)一種參數(shù)類型,用于數(shù)據(jù)解析時(shí)獲取參數(shù)值。
(4)參數(shù)長(zhǎng)度:某參數(shù)在數(shù)組中所占的位數(shù)。
(5)參數(shù)值:某參數(shù)的字符型數(shù)值。
GroupsManager基于JGroups技術(shù)實(shí)現(xiàn),封裝了JGroups的消息收發(fā)功能,采用JGroups的組播方式傳播消息。模塊劃分如圖4所示。
圖4 系統(tǒng)消息管理模塊劃分示意圖
(1)消息過濾模塊。因?yàn)橄到y(tǒng)某些節(jié)點(diǎn)之間不存在消息交互、或者存在部分消息交互,而系統(tǒng)當(dāng)前的消息機(jī)制是組內(nèi)所有成員均可發(fā)布、接收消息,因此設(shè)計(jì)了消息過濾模塊,該模塊封裝了消息發(fā)送和接收過濾的方法,使得所在節(jié)點(diǎn)只發(fā)送和接收相關(guān)的消息。
(2)消息監(jiān)聽模塊。消息監(jiān)聽模塊負(fù)責(zé)接收集群中視圖消息以及各個(gè)節(jié)點(diǎn)發(fā)送的系統(tǒng)消息。
(3)組消息模塊。JGroups提供了專門的Message類,通過JGroups傳播的消息需要封裝成Message對(duì)象。組消息模塊負(fù)責(zé)將待發(fā)送數(shù)據(jù)組織成2.1節(jié)的消息格式,然后封裝成Message對(duì)象進(jìn)行發(fā)送。
(4)狀態(tài)機(jī)模塊。狀態(tài)機(jī)模塊針對(duì)系統(tǒng)容錯(cuò)性能而設(shè)計(jì),考慮主用節(jié)點(diǎn)退出時(shí),以及當(dāng)退出的節(jié)點(diǎn)再次加入集群時(shí),如何進(jìn)行狀態(tài)轉(zhuǎn)換。
(1)消息定義。JGroups提供了專門的Message類,通過JGroups傳播的消息需要封裝成特定的消息類型,即:
Message message = new Message(Address dest,Address src,Serializable obj);
其中,dest是接收端地址,src為發(fā)送端地址,obj為封裝成2.1節(jié)的消息格式的消息實(shí)體。
(2)會(huì)話通道連接。
JChannel channel = new JChannel(new File("conf/protocol.xml")); //會(huì)話通道創(chuàng)建
channel.connect(clusterName); //會(huì)話通道連接
(3)消息接收。消息接收主要通過擴(kuò)展JGroups中的ExtendedReceiverAdapter類實(shí)現(xiàn):
public void viewAccepted(View new_view); //視圖消息接收處理
public void receive(Message message); //系統(tǒng)消息接收處理
(4)消息發(fā)送。
channel.send(new Message(Address dest,Address src, Serializable obj)); //消息發(fā)送
系統(tǒng)測(cè)試的硬件架構(gòu)如圖5所示。SCADA系統(tǒng)采用分布式架構(gòu),服務(wù)器端采用JAVA語言開發(fā),因此系統(tǒng)具有良好的松散耦合性以及擴(kuò)展性。從負(fù)載均衡考慮,將系統(tǒng)各模塊部署在2臺(tái)服務(wù)器以及2臺(tái)PC機(jī)上。其中,通訊模塊部署在通訊服務(wù)器上,系統(tǒng)數(shù)據(jù)庫(kù)及實(shí)時(shí)數(shù)據(jù)庫(kù)模塊部署在數(shù)據(jù)庫(kù)服務(wù)器上,調(diào)度員工作站1及調(diào)度員工作站2負(fù)責(zé)系統(tǒng)人機(jī)界面的部署、顯示。各臺(tái)服務(wù)器均部署在Linux平臺(tái)下運(yùn)行。
本文對(duì)大數(shù)據(jù)量下的系統(tǒng)實(shí)時(shí)性進(jìn)行了嚴(yán)格測(cè)試,同時(shí)模擬了各同類服務(wù)器節(jié)點(diǎn)相互切換的情況。近2個(gè)月的測(cè)試結(jié)果表明,系統(tǒng)運(yùn)行穩(wěn)定,可以平穩(wěn)地顯示和控制實(shí)時(shí)的供電系統(tǒng)運(yùn)行狀態(tài),具有良好的實(shí)時(shí)性與可靠性。
圖5 系統(tǒng)測(cè)試硬件結(jié)構(gòu)圖
針對(duì)既有SCADA系統(tǒng)緊耦合、擴(kuò)展難、數(shù)據(jù)處理效率低的問題,本文提出了建立基于JGroups技術(shù)的消息處理機(jī)制的解決方案,并在該基礎(chǔ)上實(shí)現(xiàn)了分布式的、松散耦合的SCADA系統(tǒng)。測(cè)試結(jié)果表明該系統(tǒng)具有良好的實(shí)時(shí)性與可靠性,可以作為電鐵SCADA系統(tǒng)的主站解決方案。另外,本文所采用的架構(gòu)在國(guó)內(nèi)SCADA系統(tǒng)中還很少見,可供對(duì)分布式的SCADA系統(tǒng)的研究與應(yīng)用借鑒。
[1] 錢清泉. 電氣化鐵道微機(jī)監(jiān)控技術(shù)[M]. 北京: 中國(guó)鐵道出版社, 2000.
[2] (英) Ian Sommerville. 軟件工程[M]. 北京: 機(jī)械工業(yè)出版社, 中信出版社, 2003.
[3] Eckel B. Thinking in Java[M]. 北京: 機(jī)械工業(yè)出版社,2006.