專利名稱::變電站監(jiān)控雙網(wǎng)切換設(shè)備的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種電力系統(tǒng)的監(jiān)控設(shè)備,特別是一種變電站的監(jiān)控設(shè)備。
背景技術(shù):
:在變電站監(jiān)控系統(tǒng)中,監(jiān)控服務(wù)器負(fù)責(zé)收集變電站內(nèi)所有保護(hù)、測控設(shè)備的數(shù)據(jù),并實(shí)現(xiàn)數(shù)據(jù)的顯示、存盤、統(tǒng)計(jì)及打印,同時(shí)接收操作員下發(fā)的命令并轉(zhuǎn)發(fā)至測控裝置,實(shí)現(xiàn)遠(yuǎn)方控制功能,監(jiān)控服務(wù)器在變電站監(jiān)控系統(tǒng)中具有舉足輕重的地位,因此變電站監(jiān)控服務(wù)器通常配置為工作網(wǎng)和備用網(wǎng)的雙網(wǎng)結(jié)構(gòu)模式,雙網(wǎng)互為備用,以提高可靠性。在雙網(wǎng)結(jié)構(gòu)模式下,監(jiān)控服務(wù)器的雙網(wǎng)切換是一個(gè)非常重要的問題。常規(guī)方式下,如果在工作網(wǎng)接收到現(xiàn)場設(shè)備發(fā)送上來的信息還沒有來得及顯示和存盤的情況下就進(jìn)行工作網(wǎng)和備用網(wǎng)之間的切換,會(huì)丟失信息,而且從開始切換到完成切換之間的時(shí)間間隔越長,丟失信息的概率越高。如圖l所示,現(xiàn)有技術(shù)的監(jiān)控服務(wù)器采用工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊經(jīng)報(bào)文解析模塊與實(shí)時(shí)庫模塊連接的結(jié)構(gòu),網(wǎng)絡(luò)驅(qū)動(dòng)模塊連接直連裝置。監(jiān)控服務(wù)器信息處理過程中,工作網(wǎng)和備用網(wǎng)切換時(shí)可能出錯(cuò)的環(huán)節(jié)1、網(wǎng)絡(luò)驅(qū)動(dòng)模塊,因?yàn)橹挥泄ぷ骶W(wǎng)才建立與直連裝置或前置機(jī)的連接,當(dāng)工作網(wǎng)收到直連裝置的報(bào)文尚未處理就切換到備用網(wǎng)時(shí),保存在原來工作網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊網(wǎng)卡緩沖區(qū)中的信息就會(huì)丟失。對(duì)于103規(guī)約的直連裝置,由于監(jiān)控服務(wù)器尚未解析報(bào)文,不會(huì)給直連裝置確認(rèn),當(dāng)發(fā)生網(wǎng)絡(luò)切換,其與備用網(wǎng)絡(luò)建立連接時(shí)會(huì)重發(fā)信息報(bào)文,所以在這一層次不會(huì)丟失信息,但無法保證不多發(fā)信息。對(duì)于61850規(guī)約的直連裝置,通常采用InformationR印ort服務(wù)上送四遙及事件信息,InformationR印ort服務(wù)是無確認(rèn)服務(wù),當(dāng)發(fā)生網(wǎng)絡(luò)切換,如無有效的雙網(wǎng)同步機(jī)制,切換過程中的報(bào)告將會(huì)全部丟失。前置機(jī)一般采用104規(guī)約,除保護(hù)信息外的其它信息,如遙信變位、信息順序記錄都沒有重發(fā)機(jī)制,如果此時(shí)發(fā)生切換,工作網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊未處理完畢的遙信變位和信息順序記錄就會(huì)丟失。2、報(bào)文解析模塊,報(bào)文解析模塊解析網(wǎng)絡(luò)驅(qū)動(dòng)模塊收到的報(bào)文,將信息存儲(chǔ)在其數(shù)據(jù)庫中并發(fā)送給實(shí)時(shí)庫模塊。報(bào)文解析模塊必須在信息已經(jīng)發(fā)送到實(shí)時(shí)庫模塊之后才能給直連裝置發(fā)送確認(rèn)報(bào)文,這樣切換后沒有來得及處理的報(bào)文,直連裝置會(huì)向切換完成后建立連接的網(wǎng)絡(luò)重發(fā)信息,所以在這一層次不會(huì)丟失信息,但無法保證數(shù)據(jù)不多發(fā)。3、實(shí)時(shí)庫模塊(實(shí)時(shí)數(shù)據(jù)庫),實(shí)時(shí)數(shù)據(jù)庫中的數(shù)據(jù)來源是報(bào)文解析模塊產(chǎn)生的事件數(shù)據(jù),當(dāng)監(jiān)控服務(wù)器發(fā)生工作網(wǎng)和備用網(wǎng)切換時(shí),沒有存儲(chǔ)到實(shí)時(shí)數(shù)據(jù)庫中的信息會(huì)發(fā)生丟失。從以上分析可以看出,在現(xiàn)有技術(shù)處理方法下,工作網(wǎng)和備用網(wǎng)雙網(wǎng)切換時(shí)漏發(fā)、多發(fā)數(shù)據(jù)不可避免,其原因在于,對(duì)于沒有確認(rèn)機(jī)制的通訊規(guī)約,一旦發(fā)生雙網(wǎng)切換,網(wǎng)絡(luò)驅(qū)動(dòng)模塊無法實(shí)現(xiàn)數(shù)據(jù)的斷點(diǎn)續(xù)傳。
發(fā)明內(nèi)容本發(fā)明的目的是提供一種變電站監(jiān)控雙網(wǎng)切換設(shè)備,要解決的技術(shù)問題是監(jiān)控服務(wù)器雙網(wǎng)切換時(shí)不漏發(fā),不多發(fā)數(shù)據(jù)。本發(fā)明采用以下技術(shù)方案一種變電站監(jiān)控雙網(wǎng)切換設(shè)備,設(shè)有監(jiān)控服務(wù)器,監(jiān)控服務(wù)器設(shè)置有實(shí)時(shí)庫模塊、可相互切換的工作網(wǎng)和備用網(wǎng),工作網(wǎng)和備用網(wǎng)設(shè)有網(wǎng)絡(luò)驅(qū)動(dòng)模塊和報(bào)文解析模塊,工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊與直連裝置連接,用于檢測網(wǎng)絡(luò)連接,將直連裝置發(fā)送來的事件消息傳遞給報(bào)文解析模塊,報(bào)文解析模塊對(duì)收到的事件消息解析,并向?qū)崟r(shí)庫模塊發(fā)送,實(shí)時(shí)庫模塊用于存儲(chǔ)和傳送解析的事件消息,所述報(bào)文解析模塊與實(shí)時(shí)庫模塊之間設(shè)置有雙網(wǎng)信息同步模塊,用于將報(bào)文解析模塊解析后的事件消息更新,并接收網(wǎng)絡(luò)驅(qū)動(dòng)模塊監(jiān)測的網(wǎng)絡(luò)連接信號(hào),在網(wǎng)絡(luò)故障的情況下啟動(dòng)雙網(wǎng)切換;所述實(shí)時(shí)庫模塊提取雙網(wǎng)信息同步模塊更新后的事件消息;工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中設(shè)有事件條目結(jié)構(gòu)數(shù)組,用來實(shí)時(shí)保存最近一次接收到的直連裝置上送的事件消息的條目號(hào),雙網(wǎng)切換時(shí),該條目號(hào)作為直連裝置開始向切換后后的網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送事件消息的始點(diǎn)。本發(fā)明更新后的事件消息為雙網(wǎng)信息同步模塊設(shè)置的事件同步隊(duì)列中緩存記載解析后的事件消息。本發(fā)明的雙網(wǎng)信息同步模塊將從報(bào)文解析模塊接收到的解析后事件消息與事件同步隊(duì)列中的緩存事件消息進(jìn)行匹配、過濾,將新增事件添加到事件同步隊(duì)列。本發(fā)明的實(shí)時(shí)庫模塊提取雙網(wǎng)信息同步模塊更新后的事件消息,為讀取事件同步隊(duì)列中的解析后的事件消息。本發(fā)明的匹配為逐條對(duì)事件消息的狀態(tài)值、時(shí)標(biāo)及數(shù)據(jù)品質(zhì)對(duì)比。本發(fā)明的過濾為新增事件消息的狀態(tài)值、時(shí)標(biāo)及數(shù)據(jù)品質(zhì)與已有消息完全一致,則視新增事件消息為重復(fù)消息,濾除。本發(fā)明的雙網(wǎng)信息同步模塊30秒定時(shí)更新工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中的事件條目結(jié)構(gòu)數(shù)組一次。本發(fā)明更新網(wǎng)絡(luò)驅(qū)動(dòng)模塊中的事件條目結(jié)構(gòu)數(shù)組為用最近一次接收到的事件消息的條目號(hào)值刷新事件條目結(jié)構(gòu)數(shù)組中直連裝置報(bào)告的起始序號(hào)值。本發(fā)明工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊在工作過程中,在5秒沒有接收到直連裝置發(fā)送的報(bào)文,該網(wǎng)絡(luò)驅(qū)動(dòng)模塊向直連裝置發(fā)送心跳檢測報(bào)文,如果10秒沒收到直連裝置的回復(fù)報(bào)文,連續(xù)發(fā)送3次,都檢測到網(wǎng)絡(luò)鏈接失效,網(wǎng)絡(luò)驅(qū)動(dòng)模塊向雙網(wǎng)信息同步模塊報(bào)告,雙網(wǎng)信息同步模塊啟動(dòng)雙網(wǎng)切換。本發(fā)明的心跳檢測報(bào)文頻率為每10秒鐘一次。本發(fā)明與現(xiàn)有技術(shù)相比,在報(bào)文解析模塊與實(shí)時(shí)庫模塊之間設(shè)置雙網(wǎng)信息同步模塊,在其中設(shè)置事件同步隊(duì)列,對(duì)解析后的事件信息進(jìn)行確認(rèn),即對(duì)來自直連裝置的信息解析后,在寫入實(shí)時(shí)庫前先過濾、列隊(duì)后再轉(zhuǎn)送到實(shí)時(shí)庫模塊存儲(chǔ),網(wǎng)絡(luò)驅(qū)動(dòng)模塊在發(fā)生雙網(wǎng)切換重建連接時(shí),從事件隊(duì)列最后添加的事件消息處提取報(bào)告,以此實(shí)現(xiàn)雙網(wǎng)切換時(shí)不漏發(fā),不多發(fā)數(shù)據(jù)。圖1是現(xiàn)有技術(shù)的變電站監(jiān)控雙網(wǎng)切換設(shè)備的結(jié)構(gòu)圖。圖2是本發(fā)明實(shí)施例的變電站監(jiān)控雙網(wǎng)切換設(shè)備的結(jié)構(gòu)圖。圖3是本發(fā)明實(shí)施例的變電站監(jiān)控雙網(wǎng)切換設(shè)備的工作圖。具體實(shí)施例方式下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說明。如圖2所示,本發(fā)明的變電站監(jiān)控雙網(wǎng)切換設(shè)備,設(shè)有監(jiān)控服務(wù)器,監(jiān)控服務(wù)器雙網(wǎng)配置,設(shè)置有實(shí)時(shí)庫模塊、雙網(wǎng)信息同步模塊以及可相互切換的工作網(wǎng)和備用網(wǎng)。工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊經(jīng)其報(bào)文解析模塊與雙網(wǎng)信息同步模塊連接,雙網(wǎng)信息同步模塊與實(shí)時(shí)庫模塊連接,同時(shí)雙網(wǎng)信息同步模塊與工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊連接。雙網(wǎng)信息同步模塊用于將解析后的事件信息定時(shí)更新,并接收網(wǎng)絡(luò)驅(qū)動(dòng)模塊監(jiān)測的網(wǎng)絡(luò)連接信號(hào),在網(wǎng)絡(luò)故障的情況下啟動(dòng)雙網(wǎng)切換。工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊與保護(hù)、測控設(shè)備的直連裝置連接,檢測網(wǎng)絡(luò)連接,將直連裝置發(fā)送來的事件消息傳遞給報(bào)文解析模塊。報(bào)文解析模塊對(duì)收到的事件消息解析,并向雙網(wǎng)信息同步模塊發(fā)送。實(shí)時(shí)庫模塊提取雙網(wǎng)信息同步模塊更新后的事件信息,實(shí)時(shí)庫模塊具有存儲(chǔ)和傳送數(shù)據(jù)信息的功能。工作網(wǎng)工作時(shí),備用網(wǎng)不接收連接裝置的報(bào)文。如圖3所示,本發(fā)明的變電站監(jiān)控雙網(wǎng)切換設(shè)備,在工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中均設(shè)置有"事件條目結(jié)構(gòu)數(shù)組",用來實(shí)時(shí)保存最近一次接收到的直連裝置上送報(bào)告的事件消息的條目號(hào)。在報(bào)文解析模塊與實(shí)時(shí)庫模塊之間設(shè)置的雙網(wǎng)信息同步模塊中設(shè)置有"事件同步隊(duì)列",作為解析后事件消息的中轉(zhuǎn)緩存區(qū),按時(shí)間順序記載解析后的緩存事件消息。每條事件消息都包含狀態(tài)值、時(shí)標(biāo)(消息產(chǎn)生時(shí)刻對(duì)應(yīng)的UTC時(shí)間)及數(shù)據(jù)品質(zhì)(反映事件消息的有效性)三個(gè)成員數(shù)據(jù)。雙網(wǎng)信息同步模塊將從報(bào)文解析模塊接收到的解析后事件消息與事件同步隊(duì)列中的解析后的緩存事件消息從最近時(shí)間往前開始進(jìn)行逐條對(duì)比,如新增事件消息的狀態(tài)值、時(shí)標(biāo)及數(shù)據(jù)品質(zhì)與已有消息完全一致,則視新增事件消息為重復(fù)消息,濾除,過濾后的新增事件添加到事件同步隊(duì)列,實(shí)時(shí)庫模塊讀取事件同步隊(duì)列中的解析后的事件消息,從而保證了切換時(shí)事件信息不多報(bào)。同時(shí)雙網(wǎng)信息同步模塊根據(jù)事件同步隊(duì)列中添加的事件消息,30秒定時(shí)更新工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中的事件條目結(jié)構(gòu)數(shù)組,采用最近一次接收到的事件消息的條目號(hào)值刷新事件條目結(jié)構(gòu)數(shù)組中直連裝置報(bào)告的起始序號(hào)值,起始序號(hào)值為當(dāng)發(fā)生雙網(wǎng)切換后或起始時(shí),雙網(wǎng)信息同步模塊記載直連裝置報(bào)告的事件條目結(jié)構(gòu)數(shù)組集合的起始序號(hào)。工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊在工作過程中,如果在5秒沒有接收到直連裝置發(fā)送的任何報(bào)文,包括事件消息、心跳檢測回復(fù),該網(wǎng)絡(luò)驅(qū)動(dòng)模塊會(huì)向該直連裝置發(fā)送心跳檢測報(bào)文,檢測周期為10s,如果IO秒沒收到直連裝置的回復(fù)報(bào)文,認(rèn)為網(wǎng)絡(luò)鏈接失效,這樣連續(xù)發(fā)送3次,且都檢測到網(wǎng)絡(luò)鏈接失效,則網(wǎng)絡(luò)驅(qū)動(dòng)模塊向雙網(wǎng)信息同步模塊報(bào)告,由雙網(wǎng)信息同步模塊啟動(dòng)雙網(wǎng)切換,工作網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊關(guān)閉,備用網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊開啟。監(jiān)控服務(wù)器雙網(wǎng)切換后,原工作網(wǎng)切換為備用網(wǎng),原備用網(wǎng)切換為工作網(wǎng)。備用網(wǎng)建立連接后,雙網(wǎng)信息同步模塊從網(wǎng)絡(luò)驅(qū)動(dòng)模塊讀取事件條目結(jié)構(gòu)數(shù)組,作為直連裝置上送報(bào)告請(qǐng)求的輸入?yún)?shù)條目號(hào)EntryID的數(shù)值,向直連裝置發(fā)起向切換后的網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送報(bào)告事件消息的請(qǐng)求,依據(jù)通訊規(guī)約,條目號(hào)EntryID的數(shù)值將作為直連裝置開始向5切換后后的網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送報(bào)告事件消息的始點(diǎn),該始點(diǎn)以后的事件數(shù)據(jù)直連裝置將主動(dòng)重新向網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送,從而保證了雙網(wǎng)切換過程中事件信息不漏報(bào)。切換后的工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊將從連接裝置收到的報(bào)文,經(jīng)報(bào)文解析模塊解析后存儲(chǔ)到雙網(wǎng)信息同步模塊的事件同步隊(duì)列。切換后的備用網(wǎng)不接受連接裝置的報(bào)文。下面以雪崩試驗(yàn)過程中的信息處理來說明本發(fā)明的變電站監(jiān)控雙網(wǎng)切換設(shè)備的工作過程,雪崩試驗(yàn)在切換前開始,在切換后才結(jié)束?!⑶袚Q前的處理1.監(jiān)控服務(wù)器工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊從直連裝置接收?qǐng)?bào)文,備用網(wǎng)不與直連裝置通訊。2.工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊從直連裝置接收?qǐng)?bào)文,傳遞給報(bào)文解析模塊解析,同時(shí)工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊的事件條目結(jié)構(gòu)數(shù)組,保存直連裝置最近一次上送的事件條目號(hào)。3.報(bào)文解析模塊解析報(bào)文,提取事件消息,并上送雙網(wǎng)信息同步模塊。4.雙網(wǎng)信息同步模塊中的事件同步隊(duì)列,作為事件消息的中轉(zhuǎn)緩存區(qū),暫存雙網(wǎng)信息同步模塊中解析后的事件消息,用來與在其后面解析后的事件消息進(jìn)行比較,將新增的解析后的事件消息添加到事件同步隊(duì)列中。5.雙網(wǎng)信息同步模塊將接收到的解析后的事件消息和事件同步隊(duì)列中的消息進(jìn)行匹配,過濾重復(fù)冗余事件。6.雙網(wǎng)信息同步模塊將過濾后的新增事件添加到事件同步隊(duì)列。7.雙網(wǎng)信息同步模塊依據(jù)事件同步隊(duì)列中添加的事件消息,定時(shí)更新工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中的事件條目結(jié)構(gòu)數(shù)組,定時(shí)時(shí)間為30秒。8.實(shí)時(shí)庫模塊讀取雙網(wǎng)信息同步模塊的事件同步隊(duì)列。9.實(shí)時(shí)庫模塊保存事件信息到安裝在同一臺(tái)機(jī)器上的物理數(shù)據(jù)庫中。二、切換中的處理1.工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊在工作過程中,如果在5秒沒有接收到直連裝置發(fā)送的任何報(bào)文,該網(wǎng)絡(luò)驅(qū)動(dòng)模塊會(huì)向該直連裝置發(fā)送心跳檢測報(bào)文,如果10秒沒收到直連裝置的回復(fù)報(bào)文,認(rèn)為網(wǎng)絡(luò)鏈接失效;連續(xù)3次都檢測到網(wǎng)絡(luò)鏈接失效,則網(wǎng)絡(luò)驅(qū)動(dòng)模塊報(bào)告雙網(wǎng)信息同步模i央,由雙網(wǎng)信息同步模塊啟動(dòng)雙網(wǎng)切換。2.工作網(wǎng)切換為備用網(wǎng),切換前的工作網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊關(guān)閉網(wǎng)絡(luò)驅(qū)動(dòng)相關(guān)線程,關(guān)閉與直連裝置的網(wǎng)絡(luò)套接字Socket。3.備用網(wǎng)在35秒內(nèi)切換為工作網(wǎng),切換后的工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊啟動(dòng)相關(guān)工作線程,發(fā)起對(duì)直連裝置的連接請(qǐng)求。4.切換后的工作網(wǎng)與直連裝置建立連接后,工作網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊讀取事件條目結(jié)構(gòu)數(shù)組,作為上送報(bào)告請(qǐng)求的輸入?yún)?shù)條目號(hào)EntryID的數(shù)值,向直連裝置發(fā)起上送報(bào)告請(qǐng)求,依據(jù)通訊規(guī)約,條目號(hào)EntryID數(shù)值將作為直連裝置開始上送報(bào)告的始點(diǎn),該始點(diǎn)以后的全部事件數(shù)據(jù)裝置將主動(dòng)上送到切換后的工作網(wǎng)網(wǎng)絡(luò)驅(qū)動(dòng)模塊。5.切換后的實(shí)時(shí)庫模塊開始接收事件同步列隊(duì)的解析后的事件消息。三、切換后的處理切換后備用網(wǎng)切換為工作網(wǎng),工作網(wǎng)切換為備用網(wǎng)。6實(shí)施例1:本發(fā)明的變電站監(jiān)控雙網(wǎng)切換設(shè)備,監(jiān)控服務(wù)器硬件采用DELL公司745型號(hào)主機(jī),主控軟件系統(tǒng)采用ISA主服務(wù)器300+V3.20,采用C++和C語言混合編程實(shí)現(xiàn)。雙網(wǎng)信息同步模塊將收到的報(bào)文數(shù)據(jù)進(jìn)行過濾后添加到事件同步隊(duì)列的命令BOOLCDualEventMng::IfSoeExistAndRefresh(CSOELogsoeLog){MaintainSoeCo皿t();if(soeLog.nValueType==2)soeLog.nValueType=0;CStringstr;str.Format(〃%d,%s=%d,%d:%d年%d月%d日%d時(shí)%d分%(1秒%d毫秒〃,-1,〃SIGNALID〃,soeLog.VarID,soeLog.nValueType,soeLog.EventTime.year,soeLog.EventTime.month,soeLog.EventTime.day,soeLog.EventTime.hour,soeLog.EventTime.mi皿te,soeLog.EventTime.second,soeLog.EventTime.ms);〃臨時(shí)指針void氺pPointer;WaitForSingleObject(m—mutexHandle,INFINITE);B00LbRes=m_soeMap.Lookup(str,pPointer);if(bRes==FALSE){m_soeList.AddTail(str);m_soeMap.SetAt(str,亂U;}ReleaseMutex(m_mutexHandle);returnbRes;}〃保護(hù)事件信息處理B00LCDualEventMng::IfRelaySoeExistAndRefresh(CRelaySOELogrelaySoeLog){MaintainRelaySoeCo皿t();CStringstr;7str.Format(〃%d,%s=%d,%s:%(1年%(1月%d日%(1時(shí)%(1分%(1秒%d毫秒",relaySoeLog.UnitID,"EVENTID",relaySoeLog.EventPointID,relaySoeLog.EventN咖e,relaySoelxig.EventTime.year,relaySoelxig.EventTime.month,relaySoelxig.EventTime.day,relaySoelxig.EventTime.hour,relaySoelxig.EventTime.mi皿te,relaySoelxig.EventTime.second,relaySoelxig.EventTime.ms);〃臨時(shí)指針void氺pPointer;WaitForSingle0bject(m_mutexHandle,INFINITE);B00LbRes=m_relaySoeMap.Lookup(str,pPointer);if(bRes==FALSE)m_relaySoeList.AddTail(str);m_relaySoeMap.SetAt(str,NULL);ReleaseMutex(m_mutexHandle);returnbRes;工作網(wǎng)雙網(wǎng)信息同步模塊實(shí)時(shí)更新最新一次接收到的事件條目信息的命令voidC61850FifoExplainMng::DealSoeFifo0staticCMap〈DW0RD,DWORD,CString,CString&>entryIDMap;staticblnitialized=FALSE;「ni11"Iif(blnitialized==FALSE)l_UIIl」entryIDMap.InitHashTable(3000);blnitialized=TRUE;tagS0ERptsoeRpt;while(m_soeFifo.IsEmpty()==FALSE)ASSERT(m_soeFifo.GetHead(soeRpt));〃傳輸原因非1,2,3則不顯示隊(duì)列8if(soeRpt.ReasonCode!=1)continue;CRTSignal*pRTSignal=GetRTSignalFromlndex(soeRpt.SN);if(pRTSignal==亂Ucontinue;〃更新EntrylDDWORDdwlndex=薩ELPA廳(pRTSignal->wUnitID,WORD(soeRpt.nRcblndex));CStringstrEntryID;if(entryIDMap.Lookup(dwlndex,strEntryID)==FALSE){charchEntryID[100];ZeroMemory(chEntryID,sizeof(chEntryID));〃字符串格式AEntryID低4位AEntryID高四位,BEntryID低4位BEntryID高四位_snprintf(chEntryID,100,〃%d%d,%d%d〃,soeRpt.nAEntryID[O],soeRpt.nAEntryID,soeRpt.nBEntryID,soeRpt.nBEntryID[O]);strEntryID=chEntryID;entryIDMap.SetAt(dwlndex,strEntryID);}else{〃得到儲(chǔ)存的EntryIDintnStoredAEntryIDLow,nStoredAEntryIDHigh,nStoredBEntryIDLow,nStoredBEntrylDHigh;intnResult=sscanf(strEntryID,〃%d%d,%d%d〃,&nStoredAEntryIDlxiw,&nStoredAEntryIDHigh,&nStoredBEntryIDlxiw,&nStoredBEntryIDHigh);ASSERT(nResult==4);〃判斷本次S0EEntryID是否發(fā)生改變B00LbAEntryIDChanged=FALSE,bBEntryIDChanged=FALSE;if((nStoredAEntryIDLow!=soeRpt.nAEntryID)|(nStoredAEntryIDHigh!=soeRpt.nAEntryID[1]))bAEntryIDChanged=TRUE;if((nStoredBEntryIDLow!=soeRpt.nBEntryID)|(nStoredBEntryIDHigh!=soeRpt.nBEntryID[1]))bBEntryIDChanged=TRUE;〃將發(fā)生改變的EntryID寫到共享內(nèi)存if(bAEntryIDChangedl|bBEntryIDChanged){CSingleEntryIDInfosingleEntryIDInfp5singleEntry皿nfo.nUnitID=pRTSignal->wUnitID;singleEntryIDInfo.nRCBIndex=soeRpt.nRcblndex;if(bAEntryIDChanged){singleEntryIDInfo.dwArrayAEntryID=nStoredAEntryIDLow;singleEntryIDInfo.dwArrayAEntryID[1]=nStoredAEntryIDHigh;}if(bBEntryIDCh肌ged){singleEntryIDInfo.dwArrayBEntryID=nStoredBEntryIDLow;singleEntryIDInfo.dwArrayBEntryID[1]=nStoredBEntryIDHigh;}if(pRTSignal->wUnitID==4){TRACE("UnitID=4low4BYte=%x,high4byte=%x〃,soeRpt.nAEntryID,soeRpt.nAEntryID[1]);}m_pSysVirtualNode61850_>m_pCfg61850Mng_>WriteSingle61850EntrylDInfo(pRTSignal->wUnitID,singleEntry皿nfo);〃將最新的EntrylD保存charchEntryID[100];ZeroMemory(chEntryID,sizeof(chEntryID));〃字符串格式AEntryID低4位AEntryID高四位,BEntryID低4位BEntrylD高四位_snprintf(chEntryID,100,〃%d%d,%d%d〃,soeRpt.nAEntryID[O],soeRpt.nAEntryID[1],soeRpt.nBEntryID,soeRpt.nBEntryID[l]);strEntryID=chEntryID;entryIDMap.SetAt(dwIndex,strEntryID);}}備用網(wǎng)重建連接時(shí)最近一次接收到的直連裝置上送的事件消息的條目號(hào),作為直連裝置開始向切換后后的網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送事件消息的始點(diǎn)的命令VOIDStartRCB(ST_INTnACSI,ST_INTnNet){tagTableControl氺pTable;tagDevice氺pDevice;tagRCBTab1e*pRCB;ST—INTi,n咖RCB,len,nldx,RCBNO;ST_CHARrcbName[應(yīng)ESIZE];ST_CHAR*prcbName,*pLDName;pTable=(tagTableControl*)pmemSCADA;pDevice=(tagDevice*)CorrectPointer((ST_L0NG)pmemSCADA,(ST_L0NG)pTable->pDeviceStart);皿mRCB=pDevice[nACSI+sACSI].nRCBTableNum;pRCB=(tagRCBTable*)CorrectPointer((ST_L0NG)pmemSCADA,(ST_L0NG)pDevice[nACSI+sACSI]pRCBTableStart);if(C0NST_A_NET==nNet)RCBNO=ARCBNO;elseif(CONST—B—NET==nNet)RCBNO=BRCBNO;elsereturn;nldx=GetAcsildx(nACSI,nNet);for(i=0;i<誦RCB;i++){strcpy(rcbName,pRCB[i].RCBName);prcbName=strpbrk(rcbName,〃/〃);〃*(prcbName++)=0;*prcbName=0;prcbName++;pLDName=rcbName;len=strlen(prcbName);if(len<=0)continue;〃判斷rcb最后兩位是否為編號(hào),如果是則替換成配置的編號(hào)if(isdigit(prcbName[len_l])&&isdigit(prcbName[len_2])){prcbName[1en-1]=(ST_CHAR)(0x30+RCBN0%10);prcbName[len-2]=(ST_CHAR)(0x30+RCBN0/10);}}實(shí)施例2:本發(fā)明的變電站監(jiān)控雙網(wǎng)切換設(shè)備,監(jiān)控服務(wù)器硬件采用SUN公司ULTRA45型號(hào)主機(jī),主控軟件系統(tǒng)采用PRS主服務(wù)器700U,采用QT程序語言實(shí)現(xiàn)。雙網(wǎng)信息同步模塊將收到的報(bào)文數(shù)據(jù)進(jìn)行過濾、添加到事件同步隊(duì)列的命令voidC61850DualEven他g::MaintainSoeListSize(){if(m_SoeList.size()<MAX_DUALEVENT_MAP_COUNT)r6turnjfor(inti=0;i<MAX_DUALEVENT_MAP_C0UNT/5;i++)if(strstr(prcbName,〃$BR$〃))start_iec_brcb((MVL_NET_INFO)acsi_ctrl_table[nldx].pnet_info,pLDName,prcbName,〃〃&rpt_typeids,nNet);6ls6start_iec_urcb((MVL_NET_INFO)acsi_ctrl_table[nldx].pnet_info,pLDName,prcbName,&rpt_typeids,nNet);QStringList::iteratorit=m_SoeList.erase(m_SoeList.m_SoeMap.erase(—it));begin())}}voidC61850DualEven他g::MaintainRelaySoeListSize(){if(m_RelaySoeList.size()<MAX_DUALEVENT_MAP_COUNT)r6turnjfor(inti=0;i<MAX_DUALEVENT_MAP_C0UNT/5;i++)QStringList::iteratorit=m_RelaySoeList.erase(m—12RelaySoeList.begin());m_RelaySoeMap.erase(*it);}}voidC61850DimlEventMng::SaveSoeLogToScada(CSoeLog&soelxig){QStringstrKey;〃從保護(hù)裝置上來的信號(hào)如果是分閘,則可能被服務(wù)器置為保護(hù)跳閘,〃為避免同一個(gè)信號(hào)nValueType不一致,統(tǒng)一賦值為0if(soeLog.nValueType==2)soeLog.nValueType=0;strKey=strKey.sprintf(〃%d,%s=%d,%(1:%(1年%(1月%(1日%d時(shí)%d分%(1秒%(1毫秒〃,-1,〃SIGNALID〃,soeLog.VarID,soeLog.nValueType,soeLog.EventTime.year,soeLog.EventTime.month,soeLog.EventTime.day,soeLog.EventTime.hour,soeLog.EventTime.mi皿te,soeLog.EventTime.second,soeLog.EventTime.ms);QStringM即iteratorit=m—SoeM即.find(strKey);if(it==m_SoeMap.end()){m_SoeList.push—back(strKey);m_SoeMap.insert(strKey,0);}}voidC61850DualEventMng::SaveRelaySoeLogToScada(CRelaySoeLog&relaySoeLog){QStringstrKey;strKey=strKey.sprintR%d,%s=%d,Xs:Xd年Xd月Xd日%d時(shí)%d分%(1秒%d毫秒〃,relaySoeLog.UnitID,〃EVENTID〃,relaySoelxig.EventPointID,13relaySoeLog.EventName,relaySoelxig.EventTime.year,relaySoeLog.EventTime.month,relaySoelxig.EventTime.day,relaySoelxig.EventTime.hour,relaySoeLog.EventTime.mi皿te,relaySoelxig.EventTime.second,relaySoeLog.EventTime.ms);QStringMap::iteratorit=m_RelaySoeMap.find(strKey);if(it==m_RelaySoeMap.end()){m_RelaySoeList.push—back(strKey);m_RelaySoeMap.insert(strKey,0);}}工作網(wǎng)雙網(wǎng)信息同步模塊實(shí)時(shí)更新最新一次接收到的事件條目信息的命令ST_V0IDUpdataEntryID(ST_INTnACSI,ST_INTnNet){tagTableControl氺pTable;tagDevice氺pDevice;tagRCBTable*pRCB;ST_INTi,nldx,len,nRCBN咖=0;ST_UCHAR氺pEntryID,zeroEntrylD[8];ST_CHARrcbName[應(yīng)ESIZE];memset(zeroEntryID,0,sizeof(zeroEntryID));nldx=GetAcsildx(nACSI,nNet);pTable=(tagTableControl*)pmemSCADA;pDevice=(tagDevice*)CorrectPointer((ST_L0NG)pmemSCADA,(ST_L0NG)pTable->pDeviceStart);pRCB=(tagRCBTable*)CorrectPointer((ST_L0NG)pmemSCADA,(ST—LONG)pDevice[nACSI+sACSI].pRCBTableStart);nRCBNum=pDevice[nACSI+sACSI].nRCBTableNum;if(nRCBNum>MAX—RCB—NUM)return;for(i=0;i<nRCBNum;i++){strcpy(rcbName,pRCB[i].RCBName);len=strlen(rcbName);14if(len<=0)continue;if(!isdigit(rcbName[len_l]))continue;if(C0NST_A_NET==nNet)pEntryID=(ST_UCHAR*)&(pDevice[nACSI+sACSI].nAEntryID[i*2])if(C0NST_B_NET==nNet)pEntryID=(ST_UCHAR*)&(pDevice[nACSI+sACSI].nBEntryID[i*2])if(SD—TRUE==pTable->blsMain)memcpy(pEntryID,acsi_ctrl_table[nldx].EntryID[i],8);if(SD—FALSE==pTable->blsMain)if(memcmp(pEntryID,zeroEntryID,sizeof(zeroEntryID)))/服務(wù)器啟動(dòng)后,主服標(biāo)志未置,客戶端誤把EntryID從共享內(nèi)存區(qū)刷到運(yùn)行變量memcpy(acsi_ctrl_table[nldx].EntryID[i],pEntryID,8);防止}}}備用網(wǎng)重建連接時(shí)最近一次接收到的直連裝置上送的事件消息的條目號(hào),作為直連裝置開始向切換后后的網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送事件消息的始點(diǎn)的命令ST_V0IDStartRCB(ST_INTnACSI,ST_INTnNet,ST_B00LEANisBR)MVL_NET_INF0tag61850RCBTabletag61850TypeSettag61850LDTableST—INTST—INTST—INTST—INTST_CHARSTCHAR氺netjnfo;*pRCB;氺pTypeSet5承pU)Table;i,j,nldx,iUnitBaseRCB=Base_LD=0,End_LD=0;Base_RCB=0,End_RCB=0len=0;rcbName[應(yīng)ESIZE];氺prcbName,氺pLDName;:f(nACSI>g_t61850SysSet.w61850UnitNum)printf('return5StartRCB()nACSIexceed\n〃)nldx=GetAcsildx(nACSI,nNet);net_info=(MVL_NET_INFO*)(acsi_ctrl_table[nldx].pnet_info)if(net_info==NULL)return;pTypeSet=g_t61850UnitVal[nACSI].pt61850TypeSet;Base_LD=pTypeSet->wBaseCfg_LD;EndLD=pTypeSet->wBaseCfg—LD+pTypeSet->wLD_Num;for(i=Base_LD;i<End_LD;i++){pLDTable=&g_t61850LDTable[i];Base_RCB=pLDTable->wBaseCfg_RCB;End_RCB=pLDTable->wBaseCfg_RCB+pLDTable_>wRCB_Num;if(i==Base_LD)iUnitBaseRCB=Base_RCB;〃裝置起始Rcb下標(biāo)for(j=Base_RCB;j<End_RCB;j++){pRCB=&g_t61850RCBTable[j];strcpy(rcbName,pRCB->cRCBName);prcbName=strpbrk(rcbName,〃/〃);if(!prcbName){printf(〃RCB'sNameiswrong!\n〃);continue;}*(prcbName++)=0;pLDName=rcbName;len=strlen(prcbName);if(len<=0)continue;〃判斷rcb最后兩位是否為編號(hào),如果是則替換成配置的編號(hào)if(isdigit(prcbName[len_l])&&isdigit(prcbName[len_2])){prcbName[len-1](ST_CHAR)(0x30+g_t61850SysSet.byRcbNo[nNet_CONST_A_NET]%10);prcbName[len-2](ST_CHAR)(0x30+g_t61850SysSet.byRcbNo[nNet_C0NST_A_NET]/10);}if(strstr(prcbName,〃$BR$〃)){if(!isBR)continue;start_iec_brcb(net_info,pLDName,prcbName,〃",&rpt_typeids,j-iUnitBaseRCB,iUnitBaseRCB);}else{if(isBR)continue;start—iec_urcb(net_info,pLDName,prcbName,&rpt_typeids,j_iUnitBaseRCB,iUnitBaseRCB);}g_t61850UnitVal[nACSI].wSponseGITimes[J-iUnitBaseRCB][nNet-CONSTA—NET]=0;g—t61850UnitVal[nACSI].dwRptRevTimer[J-iUnitBaseRCB][nNet-CONSTA—NET]=time(NULL);}[0432:[0433:1權(quán)利要求一種變電站監(jiān)控雙網(wǎng)切換設(shè)備,設(shè)有監(jiān)控服務(wù)器,監(jiān)控服務(wù)器設(shè)置有實(shí)時(shí)庫模塊、可相互切換的工作網(wǎng)和備用網(wǎng),工作網(wǎng)和備用網(wǎng)設(shè)有網(wǎng)絡(luò)驅(qū)動(dòng)模塊和報(bào)文解析模塊,工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊與直連裝置連接,用于檢測網(wǎng)絡(luò)連接,將直連裝置發(fā)送來的事件消息傳遞給報(bào)文解析模塊,報(bào)文解析模塊對(duì)收到的事件消息解析,并向?qū)崟r(shí)庫模塊發(fā)送,實(shí)時(shí)庫模塊用于存儲(chǔ)和傳送解析的事件消息,其特征在于所述報(bào)文解析模塊與實(shí)時(shí)庫模塊之間設(shè)置有雙網(wǎng)信息同步模塊,用于將報(bào)文解析模塊解析后的事件消息更新,并接收網(wǎng)絡(luò)驅(qū)動(dòng)模塊監(jiān)測的網(wǎng)絡(luò)連接信號(hào),在網(wǎng)絡(luò)故障的情況下啟動(dòng)雙網(wǎng)切換;所述實(shí)時(shí)庫模塊提取雙網(wǎng)信息同步模塊更新后的事件消息;工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中設(shè)有事件條目結(jié)構(gòu)數(shù)組,用來實(shí)時(shí)保存最近一次接收到的直連裝置上送的事件消息的條目號(hào),雙網(wǎng)切換時(shí),該條目號(hào)作為直連裝置開始向切換后后的網(wǎng)絡(luò)驅(qū)動(dòng)模塊上送事件消息的始點(diǎn)。2.根據(jù)權(quán)利要求1所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述更新后的事件消息為雙網(wǎng)信息同步模塊設(shè)置的事件同步隊(duì)列中緩存記載解析后的事件消息。3.根據(jù)權(quán)利要求2所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述雙網(wǎng)信息同步模塊將從報(bào)文解析模塊接收到的解析后事件消息與事件同步隊(duì)列中的緩存事件消息進(jìn)行匹配、過濾,將新增事件添加到事件同步隊(duì)列。4.根據(jù)權(quán)利要求3所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述實(shí)時(shí)庫模塊提取雙網(wǎng)信息同步模塊更新后的事件消息,為讀取事件同步隊(duì)列中的解析后的事件消息。5.根據(jù)權(quán)利要求4所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述匹配為逐條對(duì)事件消息的狀態(tài)值、時(shí)標(biāo)及數(shù)據(jù)品質(zhì)對(duì)比。6.根據(jù)權(quán)利要求5所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述過濾為如新增事件消息的狀態(tài)值、時(shí)標(biāo)及數(shù)據(jù)品質(zhì)與已有消息完全一致,則視新增事件消息為重復(fù)消息,濾除。7.根據(jù)權(quán)利要求6所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述雙網(wǎng)信息同步模塊30秒定時(shí)更新工作網(wǎng)和備用網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊中的事件條目結(jié)構(gòu)數(shù)組一次。8.根據(jù)權(quán)利要求7所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述更新網(wǎng)絡(luò)驅(qū)動(dòng)模塊中的事件條目結(jié)構(gòu)數(shù)組為用最近一次接收到的事件消息的條目號(hào)值刷新事件條目結(jié)構(gòu)數(shù)組中直連裝置報(bào)告的起始序號(hào)值。9.根據(jù)權(quán)利要求8所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述工作網(wǎng)的網(wǎng)絡(luò)驅(qū)動(dòng)模塊在工作過程中,在5秒沒有接收到直連裝置發(fā)送的報(bào)文,該網(wǎng)絡(luò)驅(qū)動(dòng)模塊向直連裝置發(fā)送心跳檢測報(bào)文,如果10秒沒收到直連裝置的回復(fù)報(bào)文,連續(xù)發(fā)送3次,都檢測到網(wǎng)絡(luò)鏈接失效,網(wǎng)絡(luò)驅(qū)動(dòng)模塊向雙網(wǎng)信息同步模塊報(bào)告,雙網(wǎng)信息同步模塊啟動(dòng)雙網(wǎng)切換。10.根據(jù)權(quán)利要求9所述的變電站監(jiān)控雙網(wǎng)切換設(shè)備,其特征在于所述心跳檢測報(bào)文頻率為每10秒鐘一次。全文摘要本發(fā)明公開了一種變電站監(jiān)控雙網(wǎng)切換設(shè)備,要解決的技術(shù)問題是監(jiān)控服務(wù)器雙網(wǎng)切換時(shí)不漏發(fā),不多發(fā)數(shù)據(jù)。本發(fā)明設(shè)置的監(jiān)控服務(wù)器設(shè)有實(shí)時(shí)庫模塊、工作網(wǎng)和備用網(wǎng),報(bào)文解析模塊與實(shí)時(shí)庫模塊之間設(shè)置有雙網(wǎng)信息同步模塊,供實(shí)時(shí)庫模塊提取更新后的事件消息,網(wǎng)絡(luò)驅(qū)動(dòng)模塊中設(shè)有事件條目結(jié)構(gòu)數(shù)組,保存最近的事件消息的條目號(hào),雙網(wǎng)切換時(shí),作為直連裝置開始向切換后的網(wǎng)絡(luò)上送事件消息的始點(diǎn)。本發(fā)明與現(xiàn)有技術(shù)相比,雙網(wǎng)信息同步模塊對(duì)解析后的事件信息進(jìn)行確認(rèn),過濾、列隊(duì)后再轉(zhuǎn)送到實(shí)時(shí)庫模塊,在發(fā)生雙網(wǎng)切換重建連接時(shí),網(wǎng)絡(luò)驅(qū)動(dòng)模塊從事件隊(duì)列最后添加的事件信息處提取報(bào)告,以此實(shí)現(xiàn)雙網(wǎng)切換時(shí)不漏發(fā),不多發(fā)數(shù)據(jù)。文檔編號(hào)H02J13/00GK101710734SQ20091011012公開日2010年5月19日申請(qǐng)日期2009年11月6日優(yōu)先權(quán)日2009年11月6日發(fā)明者李先波,李金申請(qǐng)人:深圳南瑞科技有限公司