宋曉玉 施 波 馬建新
(杭州和利時(shí)自動(dòng)化有限公司,浙江 杭州 310018)
分布式控制系統(tǒng)(distributed control system,DCS)通常由現(xiàn)場(chǎng)控制站、服務(wù)器、工程師站、操作員站和網(wǎng)絡(luò)組成,現(xiàn)已廣泛應(yīng)用于核電、火電和化工等工業(yè)自動(dòng)化控制領(lǐng)域。在這些領(lǐng)域里,現(xiàn)場(chǎng)生產(chǎn)中發(fā)生的異常工況和DCS系統(tǒng)本身出現(xiàn)的故障都要實(shí)時(shí)上報(bào),提醒操作人員及時(shí)處理,避免發(fā)生大的安全事故。DCS報(bào)警系統(tǒng)可以自動(dòng)監(jiān)視電站工況,并吸引操作員的注意力,它能提醒操作員電站發(fā)生的重大變化,需要操作員進(jìn)行評(píng)估或者采取行動(dòng)[1-2]。
報(bào)警系統(tǒng)是報(bào)警數(shù)據(jù)處理的中心環(huán)節(jié),其能力和效率的高低直接影響著整個(gè)DCS系統(tǒng)的性能指標(biāo)。因此,報(bào)警系統(tǒng)需要保證具有極高的實(shí)時(shí)性和可靠性,不允許缺漏或重復(fù)記錄[3],并能夠及時(shí)響應(yīng)報(bào)警信息的查詢和確認(rèn)等操作。
報(bào)警是一條診斷的、預(yù)測(cè)的或指導(dǎo)的信息,用來提醒操作員并促使其注意到過程或系統(tǒng)偏差[4],操作員需要響應(yīng)以保證系統(tǒng)的正常運(yùn)行[5]。報(bào)警處理技術(shù)是工控系統(tǒng)中實(shí)時(shí)服務(wù)的核心部分,承擔(dān)著維護(hù)系統(tǒng)穩(wěn)定和安全的艱巨使命。大多國內(nèi)外DCS系統(tǒng)都具有報(bào)警處理過程,支持報(bào)警判斷、報(bào)警存儲(chǔ)、報(bào)警查詢和報(bào)警確認(rèn)等功能。報(bào)警判斷是根據(jù)用戶組態(tài)的報(bào)警參數(shù),對(duì)現(xiàn)場(chǎng)測(cè)點(diǎn)實(shí)時(shí)數(shù)據(jù)進(jìn)行邏輯判斷,確定其是否發(fā)生報(bào)警[6]。報(bào)警存儲(chǔ)是將判斷出的報(bào)警信息寫入報(bào)警表進(jìn)行有效管理,同時(shí)將報(bào)警信息進(jìn)行磁盤存儲(chǔ),以方便故障分析。報(bào)警查詢是按照指定的查詢條件(如報(bào)警級(jí)、開關(guān)量/模擬量等)和查詢順序(如時(shí)間順序和點(diǎn)名順序)從報(bào)警表中讀取報(bào)警信息,當(dāng)瞬間發(fā)生多起報(bào)警時(shí),操作員可按照?qǐng)?bào)警的條件進(jìn)行查看,快速識(shí)別出最危險(xiǎn)的報(bào)警事件。報(bào)警確認(rèn)是操作員站對(duì)已經(jīng)接收到的報(bào)警信號(hào)進(jìn)行確認(rèn),將確認(rèn)指令發(fā)送給報(bào)警處理系統(tǒng)。
國內(nèi)外大型DCS系統(tǒng)都已經(jīng)從早期的模擬式、單點(diǎn)式發(fā)展為現(xiàn)今流行的報(bào)警列表處理方式,并且都具有完備的報(bào)警處理功能。但是,由于采用的技術(shù)和實(shí)現(xiàn)的方式不同,每一個(gè)DCS廠家的報(bào)警系統(tǒng)達(dá)到的技術(shù)和性能指標(biāo)也各不相同。目前,傳統(tǒng)的報(bào)警列表處理方式仍是大多數(shù)DCS廠家處理報(bào)警的主流技術(shù)。然而隨著DCS系統(tǒng)對(duì)報(bào)警技術(shù)要求的不斷提高,傳統(tǒng)技術(shù)越來越無法滿足實(shí)時(shí)處理和快速查詢等需求。
報(bào)警事件處理通常包括報(bào)警發(fā)生、報(bào)警恢復(fù)和報(bào)警刪除。其中,報(bào)警發(fā)生和報(bào)警恢復(fù)屬于同類事件,同類事件不可能同時(shí)存在于報(bào)警表中。在報(bào)警處理過程中,如果報(bào)警表中已經(jīng)存在一個(gè)點(diǎn)的報(bào)警發(fā)生事件,那么當(dāng)該點(diǎn)的報(bào)警恢復(fù)時(shí),報(bào)警恢復(fù)事件將覆蓋報(bào)警發(fā)生事件。傳統(tǒng)的報(bào)警處理流程是:查找同類事件記錄——?jiǎng)h除同類事件記錄——移動(dòng)后面事件記錄——添加新事件記錄。傳統(tǒng)流程的缺點(diǎn)在于事件記錄的無序查找和數(shù)據(jù)的頻繁移動(dòng)。這些無疑都降低了系統(tǒng)的高效性和穩(wěn)定性;同時(shí),其在支持報(bào)警確認(rèn)功能和按點(diǎn)名順序的報(bào)警查詢功能上也有著極大的局限性。
單報(bào)警表結(jié)構(gòu)只包括一張用于處理報(bào)警事件的表格,報(bào)警信息按報(bào)警事件發(fā)生的先后順序存放于報(bào)警表中。查詢報(bào)警記錄時(shí)必須從前向后依次比較每一條記錄,直到找到相同的報(bào)警信息為止。寫入新報(bào)警事件時(shí),如果不存在同類事件,只需簡(jiǎn)單地將新記錄添加到表的末尾;如果存在同類事件,則需將同類事件從報(bào)警表中刪除,并將其后所有記錄向前移動(dòng),最后在表的末尾添加新事件。
單報(bào)警表結(jié)構(gòu)非常簡(jiǎn)單,且易維護(hù)。但是,其查詢效率很低,在添加和刪除報(bào)警記錄時(shí)可能會(huì)移動(dòng)大量記錄。因此,單報(bào)警表的結(jié)構(gòu)設(shè)計(jì)根本無法滿足大型DCS系統(tǒng)對(duì)報(bào)警事件處理的實(shí)時(shí)、高效和可用等要求。
雖然單報(bào)警表的結(jié)構(gòu)很簡(jiǎn)單,但在報(bào)警事件處理和查詢上存在致命的缺陷,為此設(shè)計(jì)了帶點(diǎn)名索引的報(bào)警表結(jié)構(gòu)。這種結(jié)構(gòu)除包括一張用于處理報(bào)警事件的表格外,還包括一張點(diǎn)名索引表。
點(diǎn)名索引表是在處理新報(bào)警事件過程中建立的,且以點(diǎn)名的順序排列。當(dāng)查詢某一報(bào)警記錄時(shí),首先采用二分查找法,在點(diǎn)名索引表中快速查找報(bào)警點(diǎn),然后按照點(diǎn)名索引表所指向的報(bào)警表中的記錄位置查找出報(bào)警記錄。當(dāng)產(chǎn)生一個(gè)新報(bào)警事件時(shí),先判斷點(diǎn)名索引表中是否存在此報(bào)警點(diǎn)的同類事件,如果不存在,則將報(bào)警點(diǎn)插入到點(diǎn)名索引表中,同時(shí)將報(bào)警記錄添加到報(bào)警表的末尾;如果報(bào)警點(diǎn)存在,則按照點(diǎn)名索引表中的記錄位置查找報(bào)警表中的記錄,將其從報(bào)警表中刪除,同時(shí)向前移動(dòng)后面的所有記錄,再將新報(bào)警事件添加到報(bào)警表的末尾。
帶點(diǎn)名索引的報(bào)警表結(jié)構(gòu)也比較簡(jiǎn)單,查詢效率比單報(bào)警表高出許多,但是同樣存在大量且頻繁移動(dòng)報(bào)警記錄的問題,極大地影響了報(bào)警處理的速度。
隨著國際核電標(biāo)準(zhǔn)的不斷完善,大型DCS系統(tǒng)對(duì)報(bào)警子系統(tǒng)的可用性和可靠性提出了更高的要求,國外一些DCS廠家在新一代報(bào)警處理技術(shù)上也已做了很大改進(jìn)[7],這也促使國內(nèi)DCS廠家對(duì)報(bào)警系統(tǒng)進(jìn)行新一輪的研發(fā)和創(chuàng)新。為了彌補(bǔ)單報(bào)警表和帶點(diǎn)名索引的報(bào)警表存在的技術(shù)缺點(diǎn),本文對(duì)報(bào)警表進(jìn)行改進(jìn),提出了帶雙索引的報(bào)警表處理技術(shù)。
帶雙索引的報(bào)警表主要由表頭、點(diǎn)名索引表、時(shí)序索引表和報(bào)警記錄區(qū)組成,其結(jié)構(gòu)如圖1所示。其中,表頭包括空閑單元個(gè)數(shù)、空閑單元首址、點(diǎn)名索引表首址、時(shí)序索引表首址和報(bào)警記錄區(qū)首址。
圖1 報(bào)警表結(jié)構(gòu)Fig.1 Structure of the alarm table
空閑單元首址指向報(bào)警記錄區(qū)中首個(gè)空閑單元的位置。所有空閑單元的位置不一定是連續(xù)的,它們之間的鏈接依賴于報(bào)警記錄區(qū)中每一個(gè)記錄單元的“鏈接下一個(gè)空閑單元”信息。
點(diǎn)名索引表包括點(diǎn)名信息以及點(diǎn)的時(shí)序號(hào),即該點(diǎn)的報(bào)警信息在時(shí)序索引表中的位置。點(diǎn)名索引表中的點(diǎn)名按從小到大的次序排列,這有助于使用高效的查找算法快速定位點(diǎn)的位置。點(diǎn)名對(duì)應(yīng)的時(shí)序號(hào)表示該點(diǎn)報(bào)警發(fā)生的時(shí)間順序,通過時(shí)序號(hào)能對(duì)應(yīng)到時(shí)序索引表中的時(shí)序信息。
時(shí)序索引表包括報(bào)警點(diǎn)在點(diǎn)名索引表中的位置和在報(bào)警記錄區(qū)中的位置,時(shí)序索引表的每組信息都按時(shí)間順序排列。通過時(shí)序索引表中的點(diǎn)位置可以對(duì)應(yīng)到報(bào)警點(diǎn)在點(diǎn)名索引表中的位置,通過報(bào)警記錄位置可以定位報(bào)警事件在報(bào)警記錄區(qū)中的位置。
報(bào)警記錄區(qū)中記錄著每一條報(bào)警記錄的詳細(xì)信息,包括報(bào)警時(shí)間、報(bào)警點(diǎn)名、報(bào)警級(jí)、報(bào)警狀態(tài)、報(bào)警描述以及“鏈接下一個(gè)空閑單元”等。值得注意的是,每一個(gè)報(bào)警記錄單元都具有“鏈接下一個(gè)空閑單元”的信息,它僅用于指向下一個(gè)空閑單元并且僅在記錄單元為空閑單元時(shí)才有效。在報(bào)警表初始化時(shí),每一個(gè)記錄單元的“鏈接下一個(gè)空閑單元”均指向此記錄單元的下一個(gè)記錄單元位置。
報(bào)警發(fā)生是現(xiàn)場(chǎng)生產(chǎn)發(fā)生異常狀況或DCS系統(tǒng)出現(xiàn)故障時(shí)發(fā)出的報(bào)警。在報(bào)警發(fā)生之時(shí),可能存在該點(diǎn)的恢復(fù)事件并未被確認(rèn)的情況,按照一個(gè)點(diǎn)的同類事件不能同時(shí)存在于報(bào)警表的原則,在新報(bào)警寫入時(shí)應(yīng)刪除存在的同類事件。因此,在新報(bào)警信息寫入之前要在點(diǎn)名索引表中查找報(bào)警點(diǎn),確定是否存在同類事件?,F(xiàn)分別以同類事件不存在和同類事件存在的兩種情況介紹報(bào)警發(fā)生時(shí)的處理過程。
3.2.1 同類報(bào)警不存在時(shí)
以報(bào)警點(diǎn)PN3’為例,同類報(bào)警不存在時(shí)報(bào)警發(fā)生的處理過程如圖2所示。
圖2 同類報(bào)警不存在時(shí)處理報(bào)警發(fā)生的過程Fig.2 Alarm occurrence processing when no similar alarm exists
同類報(bào)警不存在時(shí)的處理過程有以下幾個(gè)步驟。
①在點(diǎn)名索引表中找到新報(bào)警點(diǎn)的插入位置;同時(shí),將新報(bào)警記錄添加到空閑單元首址所指向的報(bào)警記錄區(qū)中的記錄位置,并將空閑單元首址修改為該記錄單元的“鏈接的下一個(gè)空閑單元”,如圖2(a)所示。
②在時(shí)序索引表的空閑位置追加一條時(shí)序記錄,其記錄位置為報(bào)警點(diǎn)在報(bào)警記錄區(qū)中的記錄位置,點(diǎn)位置為報(bào)警點(diǎn)在點(diǎn)名索引表中的插入位置,如圖2(b)所示。
③在點(diǎn)名索引表中將插入位置及其后的所有記錄向后移一位,同時(shí)這些記錄的時(shí)序號(hào)所指向的時(shí)序索引表中的記錄的點(diǎn)位置都加1。將新報(bào)警記錄的點(diǎn)名寫入點(diǎn)名索引表的插入位置,其時(shí)序號(hào)為時(shí)序索引表中新追加的時(shí)序記錄的時(shí)序位置,如圖2(c)所示。
3.2.2 同類報(bào)警存在時(shí)
以報(bào)警點(diǎn)PN3為例,同類報(bào)警存在時(shí)報(bào)警發(fā)生的處理過程如圖3所示。
圖3 同類報(bào)警存在時(shí)處理報(bào)警發(fā)生的過程Fig.3 Alarm occurrence processing when similar alarm exists
同類報(bào)警存在時(shí)的處理過程有以下幾個(gè)步驟。
①在點(diǎn)名索引表中找到報(bào)警點(diǎn)位置;根據(jù)報(bào)警點(diǎn)位置在點(diǎn)名索引表中獲取該報(bào)警點(diǎn)的時(shí)序位置;在時(shí)序索引表中根據(jù)時(shí)序位置獲得報(bào)警記錄位置,如圖3(a)所示。
②在時(shí)序索引表中刪除時(shí)序位置的記錄,且其后所有時(shí)序記錄中的點(diǎn)位置所指向的點(diǎn)名索引表中的記錄的時(shí)序號(hào)都減1;同時(shí),在報(bào)警記錄區(qū)中修改處于記錄位置的報(bào)警記錄的內(nèi)容,如圖3(b)所示。
③在時(shí)序索引表中追加一條記錄,該時(shí)序記錄中的記錄位置為報(bào)警信息在報(bào)警記錄區(qū)中的記錄位置,點(diǎn)位置為報(bào)警點(diǎn)在點(diǎn)名索引表中的位置(報(bào)警點(diǎn)位置)。同時(shí),在點(diǎn)名索引表中將該點(diǎn)記錄的時(shí)序號(hào)修改為時(shí)序索引表中追加的時(shí)序位置,如圖3(c)所示。
報(bào)警刪除是刪除報(bào)警表中存在的報(bào)警記錄。以刪除PN3的報(bào)警記錄為例,刪除過程有以下幾個(gè)步驟。
①在點(diǎn)名索引表中找到刪除報(bào)警點(diǎn)的位置;根據(jù)報(bào)警點(diǎn)位置在點(diǎn)名索引表中獲取該報(bào)警點(diǎn)的時(shí)序位置;在時(shí)序索引表中根據(jù)時(shí)序位置獲得報(bào)警記錄位置。
②在報(bào)警記錄區(qū)中,將記錄位置的單元信息中“鏈接下一個(gè)空閑單元”修改為表頭的空閑單元首址指向的位置,將表頭的空閑單元首址修改為此報(bào)警記錄位置。同時(shí),在時(shí)序索引表中刪除該記錄,并且其后所有時(shí)序記錄中的點(diǎn)位置所指向的點(diǎn)名索引表中的記錄的時(shí)序號(hào)都減1。
③刪除點(diǎn)名索引表中的報(bào)警點(diǎn)位置的記錄,同時(shí)被刪除記錄之后的所有記錄的時(shí)序號(hào)所指向的時(shí)序索引表中的記錄的點(diǎn)名位置都減1。
報(bào)警刪除后的結(jié)果如圖4所示。
圖4 刪除報(bào)警事件后的結(jié)果Fig.4 Result after deleting alarm events
報(bào)警恢復(fù)是在報(bào)警發(fā)生后現(xiàn)場(chǎng)生產(chǎn)或DCS設(shè)備等異常狀況消失時(shí)發(fā)出的事件。
基于上述介紹的傳統(tǒng)報(bào)警處理技術(shù)和帶雙索引的報(bào)警處理技術(shù),本文通過試驗(yàn)對(duì)其進(jìn)行對(duì)比,并給出了分析結(jié)果。
驗(yàn)證傳統(tǒng)報(bào)警處理技術(shù)和帶雙索引的報(bào)警處理技術(shù)的基本思想是:在同樣的試驗(yàn)環(huán)境下,采用同樣的實(shí)例對(duì)比單報(bào)警表、帶點(diǎn)名索引的報(bào)警表和帶雙索引的報(bào)警表的優(yōu)缺點(diǎn)。試驗(yàn)環(huán)境:CPU為Intel Pentium E2160.1.8 GHz,內(nèi)存為1 GB ,操作系統(tǒng)為 Windows XP,開發(fā)平臺(tái)為VC6.0。試驗(yàn)數(shù)據(jù):準(zhǔn)備4 000個(gè)產(chǎn)生報(bào)警事件的報(bào)警點(diǎn)(AlarmA[0 ~160]、AlarmB[0 ~160]、AlarmC[0~160]、…、AlarmY[0~160])。下面以兩個(gè)實(shí)例對(duì)比不同報(bào)警技術(shù)在處理報(bào)警事件時(shí)的情況。
① 以 AlarmA0、AlarmB0、…、AlarmY0,AlarmA1、AlarmB1、…、AlarmY1…的順序分別產(chǎn)生 500、1 000、1 500、2 000、2 500、3 000、3 500 和 4 000 個(gè)報(bào)警事件。單報(bào)警表、帶點(diǎn)名索引的報(bào)警表和帶雙索引的報(bào)警表在添加新報(bào)警事件的耗時(shí)情況如圖5所示。
圖5 添加新報(bào)警事件的耗時(shí)情況Fig.5 Time-consuming for adding new alarm events
② 在實(shí)例①的基礎(chǔ)上,以AlarmA0、AlarmB0、…、AlarmY0,AlarmA1、AlarmB1、…、AlarmY1…的順序添加同樣數(shù)量的同類報(bào)警事件。添加同類報(bào)警事件時(shí)記錄移動(dòng)規(guī)模的試驗(yàn)結(jié)果如圖6所示。其中,每條報(bào)警記錄大小為200 B,每個(gè)點(diǎn)名索引記錄為34 B,每個(gè)時(shí)序索引記錄為4 B。
圖6 記錄移動(dòng)的規(guī)模Fig.6 Scale of moving records
在實(shí)際過程中,我們也做了大量且不同情況的試驗(yàn),得出的結(jié)果和上述實(shí)例基本一致。
4.2.1 時(shí)間復(fù)雜度
添加新報(bào)警事件的時(shí)間主要耗費(fèi)在查找同類報(bào)警記錄和移動(dòng)記錄上。帶點(diǎn)名索引和帶雙索引的報(bào)警表可以采用二分法在點(diǎn)名索引表中查找同類報(bào)警,其時(shí)間復(fù)雜度為O(log2n);而單報(bào)警表需要逐個(gè)比較已產(chǎn)生的事件,其時(shí)間復(fù)雜度為O(log2n)。在移動(dòng)記錄上由于移動(dòng)數(shù)據(jù)的空間不同,帶雙索引的報(bào)警表也將比傳統(tǒng)技術(shù)要省時(shí)。
4.2.2 查詢報(bào)警信息的效率
傳統(tǒng)的報(bào)警記錄是按時(shí)間順序排列的,而帶雙索引表的報(bào)警表中雖然報(bào)警記錄不是按時(shí)間排序的,但是其具有時(shí)序索引表。因此,在按時(shí)間順序查詢上,傳統(tǒng)方法和雙索引表結(jié)構(gòu)方法效率基本相同;在按點(diǎn)名順序查詢效率上,由于帶點(diǎn)名索引和帶雙索引的報(bào)警表具有點(diǎn)名索引表,因此它們支持按點(diǎn)名順序的快速查找方式,而單報(bào)警表的點(diǎn)名順序查找就極其低效。
4.2.3 報(bào)警記錄的移動(dòng)規(guī)模
對(duì)比一個(gè)點(diǎn)名索引信息和一個(gè)時(shí)序索引信息所占的內(nèi)存空間,一條報(bào)警記錄所占的內(nèi)存空間要大許多倍。在雙索引表結(jié)構(gòu)中,報(bào)警處理過程中只需要移動(dòng)點(diǎn)名索引表和時(shí)序索引表中的信息。相比傳統(tǒng)方法移動(dòng)大量報(bào)警記錄而言,帶雙索引結(jié)構(gòu)的報(bào)警表需要移動(dòng)的數(shù)據(jù)量小,直接效果就是報(bào)警處理的速度非常高效。
本文在傳統(tǒng)報(bào)警處理技術(shù)的基礎(chǔ)上,對(duì)報(bào)警表進(jìn)行了改進(jìn),實(shí)現(xiàn)了雙索引結(jié)構(gòu)的報(bào)警處理技術(shù)。試驗(yàn)證明,與傳統(tǒng)的報(bào)警處理技術(shù)相比,帶雙索引的報(bào)警處理技術(shù)在處理效率上更加高效,在提供的功能上更加完善。該技術(shù)目前已應(yīng)用于大型核電站和火電站的自動(dòng)化控制系統(tǒng)中。
[1]The Engineering Equipment and Materials Users Association.EEMUA 191:2007 Alarm systems-a guide to design,management and procurement[S].London UK,1999.
[2]張淑慧.報(bào)警系統(tǒng)設(shè)計(jì)方法綜述[J].核科學(xué)與工程,2008,28(3):273 -279.
[3]馬旭東.DCS系統(tǒng)異常事件管理實(shí)時(shí)軟件設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用研究,1995,12(2):50 -51.
[4]International Electrotechnical Commission.IEC 62241:2004 Nuclear power plantsmain control roomalarm functions and presentation[S].Germany,2004.
[5]馬國華.監(jiān)控組態(tài)軟件及其應(yīng)用[M].北京:清華大學(xué)出版社,2001.
[6]董艷,陸會(huì)明,張東練.RTDB報(bào)警與事件的訂閱/發(fā)布研究[J].電子測(cè)量與儀器學(xué)報(bào),2008,22(z1):247 -250.
[7]陳浩,鄭明光.核電站診斷與報(bào)警系統(tǒng)的發(fā)展[J].上海鐵道大學(xué)學(xué)報(bào):自然科學(xué)版,2000,21(6):108-113.