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