專利名稱:遠動工作站雙機切換的裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種電力系統(tǒng)通訊的裝置,特別是一種變電站通訊監(jiān)控裝置雙 機切換的裝置。 技術(shù)背景在變電站監(jiān)控系統(tǒng)中,遠動工作站負責(zé)收集變電站所有采集、測控設(shè)備的 數(shù)據(jù),并上傳到遠方調(diào)度系統(tǒng)(包括省調(diào)、地調(diào)等),同時也接收遠方調(diào)度系統(tǒng) 下發(fā)的命令并轉(zhuǎn)發(fā)到測控裝置實現(xiàn)遠方控制功能,所有遠動工作站在變電站中 起到"上傳下達"的作用,有著重要的地位。因為其作用重要,所以變電站監(jiān) 控系統(tǒng)中一般采用雙遠動工作站模式,雙機互為備用,提高可靠性。在雙機模 式下,主、備遠動工作站雙機切換是一個非常重要的問題。常規(guī)方式下,如果 在主機狀態(tài)下收到很多事件,如開關(guān)變位記錄、保護動作記錄,還沒有來得及 處理的情況下就切換為備機,那么可能會丟失事件,或者備機切換為主機后可 能會重復(fù)向遠方調(diào)度系統(tǒng)上送主機已經(jīng)上送過的事件。下面分析工作站事件處理所經(jīng)過的幾個層次,并分析各個層次中可能出錯 的環(huán)節(jié)。如圖1所示,是變電站監(jiān)控系統(tǒng)的典型結(jié)構(gòu),保護、測控裝置將采集 到的幵關(guān)變位信息或保護動作記錄同時發(fā)送到互為備用的兩臺遠動工作站。在 雙機主備工作情況下,只有主機才會將收到的這些事件向上遠方調(diào)度系統(tǒng)轉(zhuǎn)發(fā), 從機收到事件后,直接認為主機已上送而丟棄,那么從機切為主機后,原主機 來不及上送的事件就不會被新主機上送,從而在調(diào)度系統(tǒng)來看,就有事件丟失,4并且從主機故障開始到切換成功之間的時間越長,丟失事件的概率越高。如果要實現(xiàn)主備遠動機切換過程中不丟信號,則主備機之間必須實現(xiàn)同步, 主機需要將已上送的事件告知備機,備機將主機上送的信號置為已上送。等備 機切換為主機時,只上送原主機未上送的事件。但是,如果主機上送事件后, 尚未來得及將信息發(fā)送到備機時,主機突然死機或網(wǎng)絡(luò)中斷,則備機切為主機 后就會多發(fā)信息。從理論上講,這種情況無法避免,只能加快主機發(fā)送同步信 息的速度,減少這種情況發(fā)生的可能。上述分析中可以看出,在現(xiàn)有技術(shù)處理方法下,雙機切換時可以實現(xiàn)不丟 失事件,但多送事件是必然的。其根本的原因是, 一旦主機突然斷電,其工作 完全停止,不論是測控裝置上送的事件,還是給調(diào)度上送的事件,都不能及時 的告知備機。 發(fā)明內(nèi)容本發(fā)明發(fā)目的是提供一種遠動工作站雙機切換的裝置,要解決的技術(shù)問題 是主、備遠動工作站雙機切換時,不漏發(fā),盡量不多發(fā)數(shù)據(jù)。本發(fā)明采用以下技術(shù)方案 一種遠動工作站雙機切換的裝置,設(shè)有主遠動 工作站和備遠動工作站,主遠動工作站和備遠動工作站分別設(shè)有事件處理模塊 和雙機通訊模塊,主遠動工作站和備遠動工作站的雙機通訊模塊連接,所述主 遠動工作站和備遠動工作站的雙機通訊模塊與事件處理模塊之間連接設(shè)置有雙 機調(diào)度信息同步模塊。本發(fā)明的主遠動工作站和備遠動工作站的事件處理模塊負責(zé)收集變電站所 有采集、測控設(shè)備的數(shù)據(jù),主遠動工作站的事件處理模塊將數(shù)據(jù)上傳到遠方調(diào) 度系統(tǒng),備遠動工作站的事件處理模塊不上傳數(shù)據(jù)到遠方調(diào)度系統(tǒng)。本發(fā)明的主遠動工作站和備遠動工作站的雙機調(diào)度信息同步模塊將事件處 理模塊收到的事件進行列隊。本發(fā)明的主遠動工作站的雙機調(diào)度信息同步模塊檢測事件處理模塊是否有 事件已經(jīng)上送遠方調(diào)度系統(tǒng),事件處理模塊將事件上送遠方調(diào)度系統(tǒng),雙機調(diào) 度信息同步模塊從事件列隊中標記或刪除已上送的事件。本發(fā)明的主遠動工作站的雙機通訊模塊將事件列隊信息中己上送給調(diào)度的 事件傳遞給備遠動工作站的雙機通訊模塊。本發(fā)明的備遠動工作站的雙機調(diào)度信息同步模塊將主遠動工作站的雙機通 訊模塊送過來的事件列隊和本機收到的事件列隊進行匹配后,丟棄主遠動工作 站的已經(jīng)上送過的信息。本發(fā)明的雙機調(diào)度信息同步模塊査找調(diào)度事件隊列中是否有事件記錄發(fā)送給遠方調(diào)度系統(tǒng),每30ms運行一次。本發(fā)明的主遠動工作站的雙機通訊模塊通過以太網(wǎng)向備遠動工作站的雙機 通訊模塊發(fā)送心跳信息。本發(fā)明的主遠動工作站的雙機通訊模塊向備遠動工作站的雙機通訊模塊發(fā) 送心跳信息周期為ls,備遠動工作站的雙機通訊模塊連續(xù)IO次沒有收到的心跳 信息,則主遠動工作站和備遠動工作站切換。本發(fā)明的主遠動工作站的雙機通訊模塊向備遠動工作站的雙機通訊模塊發(fā) 送定期調(diào)度、端口通訊狀態(tài)。本發(fā)明與現(xiàn)有技術(shù)相比,采用主遠動工作站和備遠動工作站的雙機通訊模 塊與事件處理模塊之間連接設(shè)置有雙機調(diào)度信息同步模塊,將事件處理模塊收 到的事件進行列隊,檢測事件處理模塊是否有事件已經(jīng)上送遠方調(diào)度系統(tǒng),事件列隊中標記或刪除已上送的事件,通過雙機通訊模塊將事件列隊并告知備 機,可靠判別故障,盡量縮短主機故障到切換成功的時間,對主機接收到的內(nèi) 容進行同步,從而實現(xiàn)不漏發(fā)、多發(fā)。
圖l是變電站監(jiān)控系統(tǒng)結(jié)構(gòu)圖。圖2是現(xiàn)有技術(shù)的變電站通訊管理機主、備監(jiān)控模塊結(jié)構(gòu)圖。 圖3是本發(fā)明實施例的變電站通訊管理機主、備監(jiān)控模塊結(jié)構(gòu)圖。
具體實施方式
下面結(jié)合附圖和實施例對本發(fā)明作進一步詳細說明。如圖2所示,現(xiàn)有技 術(shù)的變電站通訊管理機由主遠動工作站、備遠動工作站構(gòu)成,主遠動工作站和 備遠動工作站分別設(shè)有事件處理模塊和雙機通訊模塊。事件處理模塊負責(zé)收集 變電站所有采集、測控設(shè)備的數(shù)據(jù),并上傳到遠方調(diào)度系統(tǒng)。主遠動工作站和 備遠動工作站的通信通過雙機通訊模塊完成,主、備通訊機的雙機模塊通過以 太網(wǎng)交互本機的狀態(tài)信息,主要是針對通訊口是否故障、本機是否有異常等情 況,根據(jù)本機的狀態(tài)及對備機的狀態(tài),雙機通訊模塊決定是否進行切換;而事 件處理模塊和雙機模塊相對獨立,主機的事件處理模塊負責(zé)將接收到的事件上 送調(diào)度,而備機接收到事件后直接扔掉,所以切換成主機后,原主機來不及上 送的事件有可能會丟失。如圖3所示,本發(fā)明的遠動工作站雙機切換的裝置,采用在主遠動工作站、 備遠動工作站的雙機通訊模塊與事件處理模塊之間連接設(shè)置雙機調(diào)度信息同步 模塊,雙機調(diào)度信息同步模塊負責(zé)將事件處理模塊收到的事件進行列隊,檢測 事件處理模塊是否有事件已經(jīng)上送遠方調(diào)度系統(tǒng),若是已經(jīng)上送遠方調(diào)度系統(tǒng),則從事件列隊中標記或刪除己上送的事件,并在設(shè)定的間隔時間內(nèi),通過雙機 通訊模塊將事件列隊并告知備機。備機則不直接丟棄接收到的事件,而是通過 雙機調(diào)度信息同步模塊將主機送過來的事件列隊和本機收到的事件列隊進行匹 配后,丟棄主機已經(jīng)上送過的信息。本發(fā)明的遠動工作站雙機切換的方法的工作過程 1)主從通信切換主從通訊機之間硬件上通過兩路以太網(wǎng)進行連接,在物理上保證可靠備份。 在協(xié)議上,雙機通訊模塊使用TCP/IP鏈接通訊,雙機定時通過兩個以太網(wǎng)向?qū)?側(cè)機發(fā)送心跳信息,告知對方本機正在運行,如果10S中沒有接收到對側(cè)機的 心跳報文,則認為對側(cè)機斷電或死機,此時如果是主機死機,則備機自動切為 主機。主從之間定時發(fā)送周期定位1S,這樣只需要連續(xù)10次沒有收到對側(cè)機 的心跳報文就可認為對側(cè)機故障,從機在速度上盡快切為主機,減少丟失事件 的可能。除了心跳信息外,主機雙機通訊模塊定期的發(fā)送本機的調(diào)度、端口通訊狀 態(tài)(通訊是否故障)給從機雙機通訊模塊,從機接收到報文后,與本機的通訊 狀態(tài)進行比較,如果發(fā)現(xiàn)主機有端口或者調(diào)度通訊故障而本機的端口和調(diào)度通 訊正常,則本機被切換為主機。 2)主從調(diào)度信息同步處理主、從機事件處理模塊接收到變電站監(jiān)控系統(tǒng)的測控裝置發(fā)送的事件后形 成"事件記錄隊列"。只有主機將隊列中的事件按順序發(fā)送給遠方調(diào)度系統(tǒng)(地 調(diào)、省調(diào)等),從機則原封不動的保留隊列。以下處理過程中存在兩個隊列,"調(diào)度事件隊列"和"事件同步隊列"。主機事件處理模塊將接收到變電站所有采集、測控設(shè)備的數(shù)據(jù)事件形成隊列,稱 為"調(diào)度事件隊列"。事件處理模塊按調(diào)度事件隊列中的排列順序?qū)⑹录D(zhuǎn)發(fā)給 遠方調(diào)度系統(tǒng)。而主機將已經(jīng)發(fā)送給遠方調(diào)度系統(tǒng)的事件通過雙機通訊模塊告 知從機,備機則將接收到的這些用于同步處理本機事件的由主機發(fā)送過來的事 件形成"事件同步隊列"。 主機處理a) 雙機調(diào)度信息同步模塊查找調(diào)度事件隊列中是否有事件記錄發(fā)送給遠方 調(diào)度系統(tǒng),如果有,則針對每一條事件,臨時形成一條"調(diào)度事件同步 記錄",通過雙機通訊模塊發(fā)送給備機。b) 雙機調(diào)度信息同步模塊需加快運行速度,每30ms運行一次,以便及時檢 測是否有事件記錄發(fā)送給調(diào)度,并及時告知備機。備機處理a) 雙機通訊模塊將接收到的調(diào)度事件同步記錄交給雙機調(diào)度信息同步模 塊,雙機調(diào)度信息同步模塊建立"事件同步隊列",將變電站所有采集、 測控設(shè)備的數(shù)據(jù)存入其中。b) 備機的雙機調(diào)度信息同步模塊從"事件同步隊列"中取出一條記錄,在"事件記錄隊列"中搜索,如果搜索到匹配的事件,則將該事件丟棄, 這樣備機以后切為主機就不會再發(fā)送該事件,并將"事件同步隊列"中 的這條記錄也丟棄;如果搜索不到,則繼續(xù)搜索下一條記錄。如果"事 件同步隊列"中的某條記錄10s后仍沒有搜索到匹配的調(diào)度事件,則直接 清理掉。實施例l:本發(fā)明的遠動工作站雙機切換的方法,遠動工作站硬件采用深圳南瑞科技有限公司ISA301C型遠動工作站,主控軟件系統(tǒng)采用VxWorks,采 用C程序語言實現(xiàn)。實施例2:本發(fā)明的遠動工作站雙機切換的方法,遠動工作站硬件采用西 門子工控機IL43,主控軟件系統(tǒng)采用linux,采用C程序語言實現(xiàn)。主、備機事件處理模塊接收到變電站監(jiān)控系統(tǒng)的測控裝置發(fā)送的事件后并進行列隊形成一個"事件記錄隊列"的命令〃===================== ======= ====〃形成SOE事件記錄〃 wIndexYX—All超出允許范圍,則認為是普通遙信,重新計算出全遙信庫BOOLEAN Event一FormRecordSOE( WORD wUnitID, WORD wChannel, WORD wIndexYX—All, BYTE byStatus, tagPTimeBCD ptTimeAct)tagPTypeSet tagPUnitValptTypeSet; ptUnitVal;tagPRtdbPosi ptRtdbPosi;tagPQueueCtrl ptQueueCtrl;tagPRecordSOE ptRecordSOE;tagPTimeBCD ptTimeSoe;WORD wOffsetCH, wSave, wCmp, wLoop;if( FALSE ==Fun—GetUnitVariableByID( wUnitID, &ptUnitVal) ) return10FALSE;if( wIndexYX—All >=CONST—NUM_YX ){〃wIndexYX—All超出允許范圍,則認為是普通遙信,重新計算出全遙信庫位置ptTypeSet = ptUnitVal->ptTypeSet; ptRtdbPosi = &ptUnitVal->tRtdbPosi;if( ptRtdbPosi->wBaseDB_YX >=CONST—NUM_YX ) return FALSE; //信號在數(shù)據(jù)庫中偏移錯誤wOffsetCH = wChannel 國 ptTypeSet->wBaseCH—YX; 〃遙信通道號偏移if( wOffsetCH >=ptTypeSet->wNumYX ) return FALSE;//通道號無效過大if( wChannel < ptTypeSet->wBaseCH—YX ) return FALSE; 〃通道號無效過小wIndexYX_All = ptRtdbPosi-〉wBaseDB一YX + wOffsetCH; //在全遙信庫中的位置〃 if( wIndexYX—All >=CONST—NUM—YX ) return FALSE; 〃信號在數(shù)據(jù)庫中位置錯誤} 〃 end "if( wIndexYX—All 〉=CONST_NUM_YX )"〃過濾重復(fù)的記錄ptQueueCtrl = &g—tQueueSOE.tQueueCtrl;if( ptUnitVal->ptUnitSet->bySlotNo =g_tSysVal.bySlotNo){〃本板的記錄需要過濾,通過FIFO傳的記錄可以不過濾ptTimeAct->byDate = 0; 〃清除星期,防止比較時出錯wCmp = ptQueueCtrl->wSave;for( wLoop=0; wLoop〈64; wLoop++ )wCmp —;ptRecordSOE = &g_tQueueSOE.tRecordSOE[wCmp%CONST_NUM—REC—SOE];〃if( ptRecordSOE-〉wUnitlD != wUnitID ) continue; 〃if( ptRecordSOE->wChannel != wChannel ) continue;if( ptRecordSOE->wIndex!= wlndexYX—All) continue;if( ptRecordSOE->by Status != by Status ) continue;if( memcmp((void*)ptTimeAct,(void*)(&ptRecordSOE->tTimeBcdSOE),sizeof(tagT imeBCD))!=0 )continue;return FALSE; 〃重復(fù)的記錄semTake( ptQueueCtrl->ptSemID, WAIT—FOREVER ); 〃獲取寫權(quán)限wSave = ptQueueCtrl->wSave;ptRecordSOE = &g—tQueueSOE.tRecordSOE[wSave%CONST—NUM—REC—SOE];Time—GetSystemTimeTAG( &ptRecordSOE->tTimeTagRecv ); 〃接收時間ptTimeSoe= &ptRecordSOE->tTimeBcdSOE; 〃發(fā)生時間memcpy( (void*)ptTimeSoe, (void*)ptTimeAct, sizeof(tagTimeBCD));ptRecordSOE->wIndex= wlndexYX—All; 〃在全遙信庫中的位置ptRecordSOE-〉wUnitlD = wUnitID; 〃AAAAAAAAptRecordSOE->wChannel = wChannel; j)tRecordSOE-勿Status = byStatus;wSave = wSave + 1; ptQueueCtrl->wSave = wSave;if( wSave 〉=CONST_NUM—REC—SOE ) ptQueueCtrl-〉固l = TRUE; semGive( ptQueueCtrl->ptSemID ); 〃釋放寫權(quán)限r(nóng)eturn TRUE;主機事件處理模塊將事件按順序發(fā)送給遠方調(diào)度系統(tǒng)的命令 〃—-==—==_-==================== ===〃返回第一個SOE記錄信息的讀指針〃== —=====—=== ========—== ==BOOLEAN Event一GetHostFirstSoe( BYTE byHostNo, WORD *pwRead )tagPQueueCtrl ptQueueCtrl;WORD wReadCtrl, wSaveCtrl, wLoop;BOOLEAN 固id;if( byHostNo >=CN—NUM一READCTRL ) return FALSE; ptQueueCtrl = &g_tQueueSOE.tQueueCtrl;wSaveCtrl = ptQueueCtrl->wSave; wReadCtrl = ptQueueCtrl-〉wRead[byHostNo];for( wLoop-0; wLoop<CONST—NUM_REC_SOE; wLoop++)if( wReadCtrl ==wSaveCtrl) return FALSE;bValid : g—tQueueSOE.tRecordSOE[wReadCtrl%CONST—NUM_REC—SOE].bValid[byHost No];if( bValid==TRUE )*pwRead -—- wReadCtrl; return TRUE;wReadCtrl++;ptQueueCtrl-〉wRead[byHostNo] = wReadCtrl;〃=======—=============================〃更新SOE記錄信息的讀指針〃==== ==========—== ====—=void Event一UpdateHostSoeRead( BYTE byHostNo )tagPQueueCtrl ptQueueCtrl; WORD wReadCtrl;if( byHostNo >=CN—NUM—READCTRL) return; ptQueueCtrl = &g_tQueueSOE.tQueueCtrl;wReadCtrl = ptQueueCtrl-〉wRead[byHostNo];ptQueueCtrl->wRead[byHostNo] = wReadCtrl+1;return;====*cdt規(guī)約向上發(fā)送SOE記錄BOOLEAN Rtu—Cdt—Send—SOE( BYTE byHostNo )tagPortValtagSendCtrltagQueueCtrltagRecordSOEtagTimeBCDtagWordByte2NWORD*ptPortVal;承ptSendCtrl;*ptQueueCtrl;承ptRecordSOE; *ptTimeBcdSOE;tWB2;wNumYX, wlndexMap, wReadCtrl, wCounter,wBasqBYTEbpbySendBuf, cLoop, byBlock;if(FALSE==Fun—GetPort Variable(g一tHostVal [byHostNo] .byCommPort, &ptPortVal) ) return FALSE;ptSendCtrl = &ptPortVal->tSendCtrl; pbySendBuf = ptSendCtrl->bySendBuf;for( cLoop = 0; cLoop < 6; cLoop = cLoop + 1 ) pbySendBuf[cLoop] = g一byHeaderCdt[cLoop];pbySendBuf[ 6] = 0x71; 〃 controlling byte pbySendBuf[ 7] = 0x26; 〃 flinctional byte 〃 pbySendBufl 8] = 0xxx; 〃 Block NumpbySendBuf[ 9] = (BYTE)(g_tHostSet[byHostNo].wStationNo); 〃S-AddrpbySendBuf[10] = (BYTE)(g—tHostSet[byHostNo].wMasterNo ); 〃D-Addr〃 pbySendBuf[l 1] = Fun—CreateCrcCdt( &pbySendBuft6], 5 ); 〃 CRC byBlock = 0;wNumYX = (g_tHostVal[byHostNo].ptHostMap)->wNumYX;for( wCounter=0; wCounter<CONST—NUM—REC一SOE; wCounter++ )if( FALSE ==Event—GetHostFirstSoe( byHostNo,&wReadCtrl ))break;ptQueueCtrl = &g—tQueueSOE.tQueueCtrl; ptRecordSOE&g—tQueueSOE.tRecordSOE[wReadCtr度ONST—NUM—REC_SOE];Event—UpdateHostSoeRead(byHostNo); 〃更新讀指針if( ptRecordSOE-〉byStatus == CONST—FLAG—YX—CLOSE ) wIndexMap = wIndexMap | 0x8000;elsewIndexMap = wIndexMap & 0x7FFF;ptTimeBcdSOE = &ptRecordSOE->tTimeBcdSOE; wBase = byBlock * 6 + 12; pbySendBuflwBase] = 0x80;tWB2.wWord = Fun一CodeBcd菌ex( ptTimeBcdSOE國〉byMS一L, ptTimeBcdSOE->byMS—H );pbySendBuflwBase+l ] = tWB2.cByte[CN—BYTE—LO]; 〃 MS一L pbySendBuf[wBase+2 ] = tWB2.cByte[CN—BYTE—HI〗;〃 MS一H pbySendBuf[wBase+3 ] = BcdToHex( ptTimeBcdSOE國〉bySecond );〃 SecondpbySendBuf[wBase+4 ] = BcdToHex( ptTimeBcdSOE->byMinute );〃 MinutepbySendBuf[wBase+5 ] = Fun—CreateCrcCdt( &pbySendBuf[wBase],5);pbySendBuflwBase+6 ] = 0x81;pbySendBuf[wBase+7 ] = BcdToHex( ptTimeBcdSOE畫〉byHour );〃 HourpbySendBuf[wBase+8 ] = BcdToHex( ptTimeBcdSOE國〉byDay );〃DaypbySendBuf[wBase+9 ] =GetByteLo(wlndexMap );〃 Status_LpbySendBuf[wBase+10] = GetByteHi( wlndexMap );〃 Status一HpbySendBuf[wBase+11] = Fun—CreateCrcCdt( &pbySendBuf[wBase+6], 5 );byBlock = byBlock + 2;〃 update the Block Num. if( byBlock >= 4 ) break;if( byBlock)pbySendBufI 8] == byBlock;19pbySendBuf[ll] = Fun—CreateCrcCdt( &pbySendBuf[6], 5 ); 〃 CRCptSendCtrl誦〉wSendLen = (byBlock + 2) * 6; ptSendCtrl-〉wSendRead = 0;PtSendCtrl->wSendFlag = CONST—STATUS_SEND_BUSY;return TRUE; }else return FALSE;主機雙機調(diào)度信息同步模塊査找調(diào)度事件隊列中有事件記錄發(fā)送給遠方調(diào) 度系統(tǒng),通過雙機通訊模塊發(fā)送給備機的命令 〃發(fā)送調(diào)度同步信息 void Bak一SendSynMessage( void )tagPQueueCtrl ptQueueCtrl; tagPRecordSOE ptRecordSOE;tagPSendCtrl ptSendCtrl;BYTE 承pbySendBuf;WORD wLen,wPos,wNum;WORD wReadCtrl, wBakRead;BYTE byHostNo;ptSendCtrl = &g—tBakCtrl.tSendCtrl;pbySendBuf = &ptSendCtrl->bySendBuf!CONST—B AK—LEN一HEADER];if( (g」BakCtrl.bCommOK
==FALSE) &&(g—tBakCtrl.bCommOK[l]==FALSE)){〃雙網(wǎng)之間通訊中斷,直接丟棄認為所有記錄都上送 #ifdef CN—BAKSYSN—SOEmemcpy( g—tQueuegSynCtrl.wSOERead,ptQueueCtrl->wRead,sizeof(g_tQueuegSyn Ctrl.wSOERead)); #endif#ifdef CN_B AKS YSN—SOE {//發(fā)送SOE同步信息pbySendBuf[4] = ENUM—CODE_SYN; 〃特征碼 pbySendBuf[5] = EMUN—ARRAY_SOE; 〃記錄類型wPos = 8; wNum = 0;ptQueueCtrl = &(g—tQueueSOE.tQueueCtrl);for( byHostNo=0;byHostNo<CONST—NUM_HOST;byHostNo++ )wReadCtrl = ptQueueCtrl->wRead[byHostNo];wBakRead = g—tQueuegSynCtrl.wSOERead[byHostNo];if( (WORD)(wReadCtrl - wBakRead) >=256 ) 〃清記錄可能被改為0wBakRead = wReadCtrl;g—tQueuegSynCtrl.wSOERead[byHostNo] = wBakRead;while( wBakRead != wReadCtrl ) ptRecordSOE&(g—tQueueSOE.tRecordSOE[wBakRead%CONST_NUM_REC—SOE]);wBakRead ++;//只發(fā)送本監(jiān)控的信號if( Fun_GetHostIndexYX(byHostNo,ptRecordSOE->wIndex)=0xFFFF ) continue;memcpy(&pbySendBuf[wPos],ptRecordSOE,sizeof(tagRecordSOE)); 〃拷貝記錄結(jié)構(gòu)wPos += sizeof(tagRecordSOE);pbySendBuf[wPos]= byHostNo;〃監(jiān)控序號wPos ++;wNum ++:if(wPos>1000){〃報文長度過長,先發(fā)送pbySendBuf[6] = wNum & OxFF;pbySendBuf[7] = wNum》8;wL6n〃數(shù)〗 //數(shù)iSimpLP—Send—SetLPCIAndSn( ptSendCtrl-〉bySendBuf, g—tBakCtrl.wSendNo );〃 Form LPCIptSendCtrl->wSendLen = wLen;Bak—SendStart(); 〃直接發(fā)送wPos,wPos = 8; wNum = 0;g_tQueuegSynCtrl.wSOERead[byHostNo] = wBakRead; if( WNum) //有內(nèi)容,發(fā)送報文pbySendBuf[6] = wNum & 0xFF; 〃數(shù)量pbySendBuf17] = wNum 8; 〃數(shù)量wLen = SimpLP_Send—SetLPCIAndSn( ptSendCtrl-〉bySendBuf, wPos, g一tBakCtrl.wSendNo );〃 Form LPCIptSendCtrl->wSendLen = wLen; Bak一SendStartO; //直接發(fā)送if(g—uiLogBak&CN—SYSN—BIT一SOE)printf("\n SendSOE:%d",wNum);弁endif 〃 #ifdef CN—BAKSYSN—SOEreturn;備機的雙機調(diào)度信息同步模塊從"事件同步隊列"中取出一條記錄,在"事 件記錄隊列"中搜索并丟棄匹配的事件的命令void Bak_SynProcSynRcdSOE( void)tagPQueueCtrl ptQueueCtrl,ptQueueCtrlSyn;tagSynSOERec tagTimeTAG tagTimeTAG WORD wMaxNum, wLoop;承ptSynSOERec;tTimeTagCur;*ptTimeTag5wReadCtrlSyn, wSaveCtrlSyn, wMaxNumSyn,; WORD wCmpOff,wCmpSize;ptQueueCtrlSyn = &(g—tQueueSynSOE.tQueueCtrl); wMaxNumSyn = CONST—NUM—SYN—SOE;//檢查同步記錄隊列是否滿wSaveCtrlSyn = ptQueueCtrlSyn->wSave;wReadCtrlSyn = ptQueueCtrlSyn-〉wRead
;if( (WORD)(wSaveCtrlSyn國wReadCtrlSyn) >=wMaxNumSyn ){/* The Queue have been FULL since last reading */wReadCtrlSyn = wSaveCtrlSyn - wMaxNumSyn + 1;ptQueueCtrlSyn->wRead
= wReadCtrlSyn;if(wSaveCtrlSyn ==wReadCtrlSyn ) return; 〃隊列空Time—GetSystemTimeTAG( &tTimeTagCur ); 〃當前時間 byMinuteCur = tTimeTagCur.Minute;ptQueueCtrl = &g_tQueueSOE.tQueueCtrl; wMaxNum = CONST—NUM一REC一SOE;{〃計算記錄內(nèi)存比較的偏移和大小tagRecordSOE tTmpjwCmpOff=sizeof(tagTimeTAG); 〃不比較接收時標 wCmpSize= (int)&tTmp.byRES - (int)&tTmp - wCmpOff;〃用同步記錄匹配調(diào)度記錄for( wLoop=0; wLoop〈wMaxNumSyn; wLoop++,wReadCtrlSyn++ )tagPRecordSOE ptRecordSOESyn,ptRecordSOE;WORD wReadCtrl, wSaveCtri, i, wYXIndex;BYTE byHostNo;BOOLEAN *pbValid,bFound;if( wReadCtrlSyn =wSaveCtrlSyn ) break;ptSynSOERec&g—tQueueSynSOE.tSynSOERec[wReadCtrlSyn%wMaxNumSyn];if( ptSynSOERec-〉固id == FALSE ) continue; ptRecordSOESyn = &ptSynSOERec->tRecordSOE; ptTimeTag = &ptSynSOERec->tTimeTagRecv;//判斷同步記錄是否過期(3分鐘未能匹配到) byMinuteRecv = ptTimeTag-〉Minute; if( (byMinuteCur誦byMinuteRecv) >3 ) {〃3分鐘前收到的記錄,直接丟棄ptSynSOERec->bValid = FALSE;continue;〃匹配調(diào)度記錄byHostNo = ptSynSOERec-〉byHostNo;bFound = FALSE;wSaveCtrl = ptQueueCtrl->wSave;if( FALSE =Event—GetHostFirstYXRcd( byHostNo,&wReadCtrl,EMUN—ARRAY一SOE )) break;//等待備機接收裝置信息,或者記錄超時for( i=0; i<wMaxNum; i++,wReadCtrl++ )if( wReadCtrl ==wSaveCtrl) break;ptRecordSOE&(g_tQueueSOE.tRecordSOE[wReadCtrl%wMaxNum]);pbValid = &ptRecordSOE->bValid[byHostNo];if( *pbValid == FALSE ) continue; wYXIndex = ptRecordSOE->wIndex; if( Fun_GetHostIndexYX(byHostNo,wYXIndex)==OxFFFF ) ' {//不是本監(jiān)控的信號,直接置為無效*pbValid = FALSE; continue;〃通過內(nèi)存比較確定是否同一條記錄if( 0==memcmp( (void*)((int)ptRecordSOESyn+wCmpOff),(void*)((int)ptRecordSO E+wCmpOff),wCmpSize ))*pbValid = FALSE; bFound = TRUE; break;if( bFound)ptSynSOERec->bValid = FALSE;〃置無效標志,即丟棄本條記if(g—uiLogBak&CN—SYSN_BIT_SOE)printf("\n match SOE,byHostNo:o/od,o/od",byHostNo,wReadCtrlSyn);〃更新讀指針wReadCtrlSyn = ptQueueCtrlSyn->wRead
;for( wLoop=0; wLoop<wMaxNumSyn; wLoop++,wReadCtrlSyn++ )if( wReadCtrlSyn ==wSaveCtrlSyn ) break;ptSynSOERec&g—tQueueSynSOE.tSynSOERec[wReadCtrlSyn%wMaxNumSyn]; if( ptSynSOERec->bValid == TRUE) break;ptQueueCtrlSyn->wRead
= wReadCtrlSyn;return;
權(quán)利要求
1. 一種遠動工作站雙機切換的裝置,設(shè)有主遠動工作站和備遠動工作站,主遠動工作站和備遠動工作站分別設(shè)有事件處理模塊和雙機通訊模塊,主遠動工作站和備遠動工作站的雙機通訊模塊連接,其特征在于所述主遠動工作站和備遠動工作站的雙機通訊模塊與事件處理模塊之間連接設(shè)置有雙機調(diào)度信息同步模塊。
2. 根據(jù)權(quán)利要求1所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站和備遠動工作站的事件處理模塊負責(zé)收集變電站所有采集、測控設(shè) 備的數(shù)據(jù),主遠動工作站的事件處理模塊將數(shù)據(jù)上傳到遠方調(diào)度系統(tǒng),備遠 動工作站的事件處理模塊不上傳數(shù)據(jù)到遠方調(diào)度系統(tǒng)。
3. 根據(jù)權(quán)利要求2所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站和備遠動工作站的雙機調(diào)度信息同步模塊將事件處理模塊收到的 事件進行列隊。
4. 根據(jù)權(quán)利要求3所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站的雙機調(diào)度信息同步模塊檢測事件處理模塊是否有事件已經(jīng)上送 遠方調(diào)度系統(tǒng),事件處理模塊將事件上送遠方調(diào)度系統(tǒng),雙機調(diào)度信息同步 模塊從事件列隊中標記或刪除已上送的事件。
5. 根據(jù)權(quán)利要求4所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站的雙機通訊模塊將事件列隊信息中已上送給調(diào)度的事件傳遞給備 遠動工作站的雙機通訊模塊。
6. 根據(jù)權(quán)利要求5所述的遠動工作站雙機切換的裝置,其特征在于所述備遠動工作站的雙機調(diào)度信息同步模塊將主遠動工作站的雙機通訊模塊送過來 的事件列隊和本機收到的事件列隊進行匹配后,丟棄主遠動工作站的已經(jīng)上 送過的信息。
7. 根據(jù)權(quán)利要求5所述的遠動工作站雙機切換的裝置,其特征在于所述雙機 調(diào)度信息同步模塊査找調(diào)度事件隊列中是否有事件記錄發(fā)送給遠方調(diào)度系統(tǒng),每30ms運行一次。
8. 根據(jù)權(quán)利要求7所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站的雙機通訊模塊通過以太網(wǎng)向備遠動工作站的雙機通訊模塊發(fā)送 心跳信息。
9. 根據(jù)權(quán)利要求8所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站的雙機通訊模塊向備遠動工作站的雙機通訊模塊發(fā)送心跳信息周 期為ls,備遠動工作站的雙機通訊模塊連續(xù)10次沒有收到的心跳信息,則 主遠動工作站和備遠動工作站切換。
10. 根據(jù)權(quán)利要求9所述的遠動工作站雙機切換的裝置,其特征在于所述主遠 動工作站的雙機通訊模塊向備遠動工作站的雙機通訊模塊發(fā)送定期調(diào)度、端 口通訊狀態(tài)。
全文摘要
本發(fā)明公開了一種遠動工作站雙機切換的裝置,要解決的技術(shù)問題是主、備遠動工作站雙機切換時,不漏發(fā),盡量不多發(fā)數(shù)據(jù)。本發(fā)明的裝置設(shè)有主、備遠動工作站,主、備遠動工作站分別設(shè)有事件處理模塊和雙機通訊模塊,主遠、備遠動工作站的雙機通訊模塊連接,主、備遠動工作站的雙機通訊模塊與事件處理模塊之間連接設(shè)置有雙機調(diào)度信息同步模塊。本發(fā)明與現(xiàn)有技術(shù)相比,主、備遠動工作站的雙機調(diào)度信息同步模塊,將事件處理模塊收到的事件進行列隊,檢測事件處理模塊是否有事件已經(jīng)上送遠方調(diào)度系統(tǒng),從事件列隊中標記或刪除已上送的事件,通過雙機通訊模塊將事件列隊并告知備機,對主機接收到的內(nèi)容進行同步,實現(xiàn)不漏發(fā)、多發(fā)。
文檔編號H04L29/02GK101262147SQ200810066810
公開日2008年9月10日 申請日期2008年4月18日 優(yōu)先權(quán)日2008年4月18日
發(fā)明者周作超, 輝 廖, 施江濤 申請人:深圳南瑞科技有限公司