CN101262147B - 远动工作站双机切换的装置 - Google Patents

远动工作站双机切换的装置 Download PDF

Info

Publication number
CN101262147B
CN101262147B CN2008100668101A CN200810066810A CN101262147B CN 101262147 B CN101262147 B CN 101262147B CN 2008100668101 A CN2008100668101 A CN 2008100668101A CN 200810066810 A CN200810066810 A CN 200810066810A CN 101262147 B CN101262147 B CN 101262147B
Authority
CN
China
Prior art keywords
remote station
dual
incident
module
communication module
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN2008100668101A
Other languages
English (en)
Other versions
CN101262147A (zh
Inventor
施江涛
廖辉
周作超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CYG Sunri Co Ltd
Original Assignee
SHENZHEN NARI CO Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by SHENZHEN NARI CO Ltd filed Critical SHENZHEN NARI CO Ltd
Priority to CN2008100668101A priority Critical patent/CN101262147B/zh
Publication of CN101262147A publication Critical patent/CN101262147A/zh
Application granted granted Critical
Publication of CN101262147B publication Critical patent/CN101262147B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02EREDUCTION OF GREENHOUSE GAS [GHG] EMISSIONS, RELATED TO ENERGY GENERATION, TRANSMISSION OR DISTRIBUTION
    • Y02E60/00Enabling technologies; Technologies with a potential or indirect contribution to GHG emissions mitigation
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y04INFORMATION OR COMMUNICATION TECHNOLOGIES HAVING AN IMPACT ON OTHER TECHNOLOGY AREAS
    • Y04SSYSTEMS INTEGRATING TECHNOLOGIES RELATED TO POWER NETWORK OPERATION, COMMUNICATION OR INFORMATION TECHNOLOGIES FOR IMPROVING THE ELECTRICAL POWER GENERATION, TRANSMISSION, DISTRIBUTION, MANAGEMENT OR USAGE, i.e. SMART GRIDS
    • Y04S10/00Systems supporting electrical power generation, transmission or distribution
    • Y04S10/16Electric power substations

Landscapes

  • Data Exchanges In Wide-Area Networks (AREA)
  • Small-Scale Networks (AREA)

Abstract

本发明公开了一种远动工作站双机切换的装置,要解决的技术问题是主、备远动工作站双机切换时,不漏发,尽量不多发数据。本发明的装置设有主、备远动工作站,主、备远动工作站分别设有事件处理模块和双机通讯模块,主远、备远动工作站的双机通讯模块连接,主、备远动工作站的双机通讯模块与事件处理模块之间连接设置有双机调度信息同步模块。本发明与现有技术相比,主、备远动工作站的双机调度信息同步模块,将事件处理模块收到的事件进行列队,检测事件处理模块是否有事件已经上送远方调度系统,从事件列队中标记或删除已上送的事件,通过双机通讯模块将事件列队并告知备机,对主机接收到的内容进行同步,实现不漏发、多发。

Description

远动工作站双机切换的装置
技术领域
本发明涉及一种电力系统通讯的装置,特别是一种变电站通讯监控装置双机切换的装置。
技术背景
在变电站监控系统中,远动工作站负责收集变电站所有采集、测控设备的数据,并上传到远方调度系统(包括省调、地调等),同时也接收远方调度系统下发的命令并转发到测控装置实现远方控制功能,所有远动工作站在变电站中起到“上传下达”的作用,有着重要的地位。因为其作用重要,所以变电站监控系统中一般采用双远动工作站模式,双机互为备用,提高可靠性。在双机模式下,主、备远动工作站双机切换是一个非常重要的问题。常规方式下,如果在主机状态下收到很多事件,如开关变位记录、保护动作记录,还没有来得及处理的情况下就切换为备机,那么可能会丢失事件,或者备机切换为主机后可能会重复向远方调度系统上送主机已经上送过的事件。
下面分析工作站事件处理所经过的几个层次,并分析各个层次中可能出错的环节。如图1所示,是变电站监控系统的典型结构,保护、测控装置将采集到的开关变位信息或保护动作记录同时发送到互为备用的两台远动工作站。在双机主备工作情况下,只有主机才会将收到的这些事件向上远方调度系统转发,从机收到事件后,直接认为主机已上送而丢弃,那么从机切为主机后,原主机来不及上送的事件就不会被新主机上送,从而在调度系统来看,就有事件丢失,并且从主机故障开始到切换成功之间的时间越长,丢失事件的概率越高。
如果要实现主备远动机切换过程中不丢信号,则主备机之间必须实现同步,主机需要将已上送的事件告知备机,备机将主机上送的信号置为已上送。等备机切换为主机时,只上送原主机未上送的事件。但是,如果主机上送事件后,尚未来得及将信息发送到备机时,主机突然死机或网络中断,则备机切为主机后就会多发信息。从理论上讲,这种情况无法避免,只能加快主机发送同步信息的速度,减少这种情况发生的可能。
上述分析中可以看出,在现有技术处理方法下,双机切换时可以实现不丢失事件,但多送事件是必然的。其根本的原因是,一旦主机突然断电,其工作完全停止,不论是测控装置上送的事件,还是给调度上送的事件,都不能及时的告知备机。
发明内容
本发明发目的是提供一种远动工作站双机切换的装置,要解决的技术问题是主、备远动工作站双机切换时,不漏发,尽量不多发数据。
本发明采用以下技术方案:一种远动工作站双机切换的装置,设有主远动工作站和备远动工作站,主远动工作站和备远动工作站分别设有事件处理模块和双机通讯模块,主远动工作站和备远动工作站的双机通讯模块连接,所述主远动工作站和备远动工作站的双机通讯模块与事件处理模块之间连接设置有双机调度信息同步模块。
本发明的主远动工作站和备远动工作站的事件处理模块负责收集变电站所有采集、测控设备的数据,主远动工作站的事件处理模块将数据上传到远方调度系统,备远动工作站的事件处理模块不上传数据到远方调度系统。
本发明的主远动工作站和备远动工作站的双机调度信息同步模块将事件处理模块收到的事件进行列队。
本发明的主远动工作站的双机调度信息同步模块检测事件处理模块是否有事件已经上送远方调度系统,事件处理模块将事件上送远方调度系统,双机调度信息同步模块从事件列队中标记或删除已上送的事件。
本发明的主远动工作站的双机通讯模块将事件列队信息中已上送给调度的事件传递给备远动工作站的双机通讯模块。
本发明的备远动工作站的双机调度信息同步模块将主远动工作站的双机通讯模块送过来的事件列队和本机收到的事件列队进行匹配后,丢弃主远动工作站的已经上送过的信息。
本发明的主远动工作站的双机调度信息同步模块查找调度事件队列中是否有事件记录发送给远方调度系统,每30ms运行一次。
本发明的主远动工作站的双机通讯模块通过以太网向备远动工作站的双机通讯模块发送心跳信息。
本发明的主远动工作站的双机通讯模块向备远动工作站的双机通讯模块发送心跳信息周期为1s,备远动工作站的双机通讯模块连续10次没有收到的心跳信息,则主远动工作站和备远动工作站切换。
本发明的主远动工作站的双机通讯模块向备远动工作站的双机通讯模块发送定期调度、端口通讯状态。
本发明与现有技术相比,采用主远动工作站和备远动工作站的双机通讯模块与事件处理模块之间连接设置有双机调度信息同步模块,将事件处理模块收到的事件进行列队,检测事件处理模块是否有事件已经上送远方调度系统,从事件列队中标记或删除已上送的事件,通过双机通讯模块将事件列队并告知备机,可靠判别故障,尽量缩短主机故障到切换成功的时间,对主机接收到的内容进行同步,从而实现不漏发、多发。
附图说明
图1是变电站监控系统结构图。
图2是现有技术的变电站通讯管理机主、备监控模块结构图。
图3是本发明实施例的变电站通讯管理机主、备监控模块结构图。
具体实施方式
下面结合附图和实施例对本发明作进一步详细说明。如图2所示,现有技术的变电站通讯管理机由主远动工作站、备远动工作站构成,主远动工作站和备远动工作站分别设有事件处理模块和双机通讯模块。事件处理模块负责收集变电站所有采集、测控设备的数据,并上传到远方调度系统。主远动工作站和备远动工作站的通信通过双机通讯模块完成,主、备通讯机的双机模块通过以太网交互本机的状态信息,主要是针对通讯口是否故障、本机是否有异常等情况,根据本机的状态及对备机的状态,双机通讯模块决定是否进行切换;而事件处理模块和双机模块相对独立,主机的事件处理模块负责将接收到的事件上送调度,而备机接收到事件后直接扔掉,所以切换成主机后,原主机来不及上送的事件有可能会丢失。
如图3所示,本发明的远动工作站双机切换的装置,采用在主远动工作站、备远动工作站的双机通讯模块与事件处理模块之间连接设置双机调度信息同步模块,双机调度信息同步模块负责将事件处理模块收到的事件进行列队,检测事件处理模块是否有事件已经上送远方调度系统,若是已经上送远方调度系统,则从事件列队中标记或删除已上送的事件,并在设定的间隔时间内,通过双机通讯模块将事件列队并告知备机。备机则不直接丢弃接收到的事件,而是通过双机调度信息同步模块将主机送过来的事件列队和本机收到的事件列队进行匹配后,丢弃主机已经上送过的信息。
本发明的远动工作站双机切换的方法的工作过程:
1)主从通信切换
主从通讯机之间硬件上通过两路以太网进行连接,在物理上保证可靠备份。在协议上,双机通讯模块使用TCP/IP链接通讯,双机定时通过两个以太网向对侧机发送心跳信息,告知对方本机正在运行,如果10s中没有接收到对侧机的心跳报文,则认为对侧机断电或死机,此时如果是主机死机,则备机自动切为主机。主从之间定时发送周期定位1s,这样只需要连续10次没有收到对侧机的心跳报文就可认为对侧机故障,从机在速度上尽快切为主机,减少丢失事件的可能。
除了心跳信息外,主机双机通讯模块定期的发送本机的调度、端口通讯状态(通讯是否故障)给从机双机通讯模块,从机接收到报文后,与本机的通讯状态进行比较,如果发现主机有端口或者调度通讯故障而本机的端口和调度通讯正常,则本机被切换为主机。
2)主从调度信息同步处理
主、从机事件处理模块接收到变电站监控系统的测控装置发送的事件后形成“事件记录队列”。只有主机将队列中的事件按顺序发送给远方调度系统(地调、省调等),从机则原封不动的保留队列。
以下处理过程中存在两个队列,“调度事件队列”和“事件同步队列”。主机事件处理模块将接收到变电站所有采集、测控设备的数据事件形成队列,称为“调度事件队列”。事件处理模块按调度事件队列中的排列顺序将事件转发给远方调度系统。而主机将已经发送给远方调度系统的事件通过双机通讯模块告知从机,备机则将接收到的这些用于同步处理本机事件的由主机发送过来的事件形成“事件同步队列”。
主机处理:
a)双机调度信息同步模块查找调度事件队列中是否有事件记录发送给远方调度系统,如果有,则针对每一条事件,临时形成一条“调度事件同步记录”,通过双机通讯模块发送给备机。
b)双机调度信息同步模块需加快运行速度,每30ms运行一次,以便及时检测是否有事件记录发送给调度,并及时告知备机。
备机处理:
a)双机通讯模块将接收到的调度事件同步记录交给双机调度信息同步模块,双机调度信息同步模块建立“事件同步队列”,将变电站所有采集、测控设备的数据存入其中。
b)备机的双机调度信息同步模块从“事件同步队列”中取出一条记录,在“事件记录队列”中搜索,如果搜索到匹配的事件,则将该事件丢弃,这样备机以后切为主机就不会再发送该事件,并将“事件同步队列”中的这条记录也丢弃;如果搜索不到,则继续搜索下一条记录。如果“事件同步队列”中的某条记录10s后仍没有搜索到匹配的调度事件,则直接清理掉。
实施例1:本发明的远动工作站双机切换的方法,远动工作站硬件采用:深圳南瑞科技有限公司ISA301C型远动工作站,主控软件系统采用VxWorks,采用C程序语言实现。
实施例2:本发明的远动工作站双机切换的方法,远动工作站硬件采用:西门子工控机IL43,主控软件系统采用linux,采用C程序语言实现。
主、备机事件处理模块接收到变电站监控系统的测控装置发送的事件后并进行列队形成一个“事件记录队列”的命令:
    //=======================================================
=========
    //形成SOE事件记录
    //wIndexYX_All超出允许范围,则认为是普通遥信,重新计算出全遥信库
位置
    BOOLEAN Event_FormRecordSOE(WORD wUnitID,WORD wChannel,
 WORD wIndexYX_All,BYTE byStatus,tagPTimeBCD ptTimeAct)
    {
       tagPTypeSet    ptTypeSet;
       tagPUnitVal    ptUnitVal;
       tagPRtdbPosi   ptRtdbPosi;
       tagPQueueCtrl  ptQueueCtrl;
       tagPRecordSOE  ptRecordSOE;
       tagPTimeBCD    ptTimeSoe;
       WORD    wOffsetCH,wSave,wCmp,wLoop;
       if(FALSE==Fun_GetUnitVariableByID(wUnitID, & ptUnitVal))return
FALSE;
        if(wIndexYX_All>=CONST_NUM_YX)
        {//wIndexYX_All超出允许范围,则认为是普通遥信,重新计算出全遥
信库位置
            ptTypeSet=ptUnitVal->ptTypeSet;
            ptRtdbPosi= & ptUnitVal->tRtdbPosi;
            if(ptRtdbPosi->wBaseDB_YX>=CONST_NUM_YX)return
FALSE;      //信号在数据库中偏移错误
             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;
//信号在数据库中位置错误
    }//end″if(wIndexYX_All>=CONST_NUM_YX)″
    //过滤重复的记录
    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->wUnitID  !=wUnitID  )continue;
              //if(ptRecordSOE->wChannel!=wChannel)continue;
                 if(ptRecordSOE->wIndex  !=wIndexYX_All)continue;
                 if(ptRecordSOE->byStatus!=byStatus)continue;
 if(memcmp((void*)ptTimeAct,(void*)( & ptRecordSOE->tTimeBcdSOE),sizeof(tagT
 imeBCD))!=0)continue;
                   return FALSE;//重复的记录
              }
         }
         semTake(ptQueueCtrl->ptSemID,WAIT_FOREVER);               //获
 取写权限
         wSave=ptQueueCtrl->wSave;
         ptRecordSOE                                            =
& g_tQueueSOE.tRecordSOE[wSave%CONST_NUM_REC_SOE];
         Time_GetSystemTimeTAG( & ptRecordSOE->tTimeTagRecv);//接
收时间
         ptTimeSoe  = & ptRecordSOE->tTimeBcdSOE;      //发
生时间
         memcpy((void*)ptTimeSoe,(void*)ptTimeAct,sizeof(tagTimeBCD));
         ptRecordSOE->wIndex  =wIndexYX_All;           //在
全遥信库中的位置
         ptRecordSOE->wUnitID  =wUnitID;                //
 ^^
         ptRecordSOE->wChannel=wChannel;
         ptRecordSOE->byStatus=byStatus;
         wSave=wSave+1;
         ptQueueCtrl->wSave=wSave;
         if(wSave>=CONST_NUM_REC_SOE)ptQueueCtrl->bFull=TRUE;
         semGive(ptQueueCtrl->ptSemID);                //释放
写权限
         return TRUE;
    }
主机事件处理模块将事件按顺序发送给远方调度系统的命令:
//====================================================
//返回第一个SOE记录信息的读指针
//====================================================
BOOLEAN Event_GetHostFirstSoe(BYTE byHostNo,WORD*pwRead)
{
   tagPQueueCtrl     ptQueueCtrl;
   WORD                 wReadCtrl,wSaveCtrl,wLoop;
   BOOLEAN    bValid;
   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规约向上发送SOE记录
*============================================================
====*/
       BOOLEAN Rtu_Cdt_Send_SOE(BYTE byHostNo)
       {
          tagPortVal      *ptPortVal;
          tagSendCtrl     *ptSendCtrl;
          tagQueueCtrl    *ptQueueCtrl;
          tagRecordSOE    *ptRecordSOE;
          tagTimeBCD      *ptTimeBcdSOE;
          tagWordByte2N   tWB2;
          WORD            wNumYX,wIndexMap,wReadCtrl,wCounter,
wBase;
          BYTE            *pbySendBuf,cLoop,byBlock;
         if(FALSE==Fun_GetPortVariable(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;//functional  byte
      //pbySendBuf[8]=0xxx;//Block Num
        pbySendBuf[9]=(BYTE)(g_tHostSet[byHostNo].wStationNo);//
S-Addr
        pbySendBuf[10]=(BYTE)(g_tHostSet[byHostNo].wMasterNo);//
D-Addr
     //pbySendBuf[11]=Fun_CreateCrcCdt(&pbySendBuf[6],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[wReadCtrl%CONST_NUM_REC_SOE];
            Event_UpdateHostSoeRead(byHostNo);//更新读指针
            if(ptRecordSOE->byStatus==CONST_FLAG_YX_CLOSE)
                 wIndexMap=wIndexMap|0x8000;
            else
                 wIndexMap=wIndexMap & 0x7FFF;
            ptTimeBcdSOE= & ptRecordSOE->tTimeBcdSOE;
            wBase=byBlock*6+12;
            pbySendBuf[wBase]=0x80;
            tWB2.wWord  = Fun_CodeBcdToHex(ptTimeBcdSOE->byMS_L,
 ptTimeBcdSOE->byMS_H);
            pbySendBuf[wBase+1]=tWB2.cByte[CN_BYTE_LO];//MS_L
            pbySendBuf[wBase+2]=tWB2.cByte[CN_BYTE_HI];//MS_H
            pbySendBuf[wBase+3]=BcdToHex(ptTimeBcdSOE->bySecond);
 //Second
            pbySendBuf[wBase+4]=BcdToHex(ptTimeBcdSOE->byMinute);
//Minute
            pbySendBuf[wBase+5]=Fun_CreateCrcCdt( & pbySendBuf[wBase],
5);
            pbySendBuf[wBase+6]=0x81;
            pbySendBuf[wBase+7]=BcdToHex(ptTimeBcdSOE->byHour);
//Hour
            pbySendBuf[wBase+8]=BcdToHex(ptTimeBcdSOE->byDay);
//Day
            pbySendBuf[wBase+9]=GetByteLo(wIndexMap);
//Status_L
            pbySendBuf[wBase+10]=GetByteHi(wIndexMap);
//Status_H
            pbySendBuf[wBase+11]                                     =
Fun_CreateCrcCdt( & pbySendBuf[wBase+6],5);
            byBlock=byBlock+2;//update the Block Num.
            if(byBlock>=4)    break;
        }
        if(byBlock)
        {
             pbySendBuf[8]=byBlock;
          pbySendBuf[11]=Fun_CreateCrcCdt( & pbySendBuf[6],5);//CRC
          ptSendCtrl->wSendLen=(byBlock+2)*6;
          ptSendCtrl->wSendRead=0;
          ptSendCtrl->wSendFlag=CONST_STATUS_SEND_BUSY;
          return TRUE;
    }else return FALSE;
}
主机双机调度信息同步模块查找调度事件队列中有事件记录发送给远方调度系统,通过双机通讯模块发送给备机的命令:
//发送调度同步信息
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_BAK_LEN_HEADER];
        if((g_tBakCtrl.bCommOK[0]==FALSE) & &
(g_tBakCtrl.bCommOK[1]==FALSE))
        {//双网之间通讯中断,直接丢弃认为所有记录都上送
        #ifdefCN_BAKSYSN_SOE
memcpy(g_tQueuegSynCtrl.wSOERead,ptQueueCtrl->wRead,sizeof(g_tQueuegSyn
Ctrl.wSOERead));
        #endif
        }
   #ifdefCN_BAKSYSN_SOE
        {//发送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)//清记录可能被
改为0
                  {
                       wBakRead=wReadCtrl;
                       g_tQueuegSynCtrl.wSOERead[byHostNo]=wBakRead;
                  }
                  while(wBakRead!=wReadCtrl)
                  {
                     ptRecordSOE                                        =
& (g_tQueueSOE.tRecordSOE[wBakRead%CONST_NUM_REC_SOE]);
                     wBakRead++;
                     //只发送本监控的信号
if(Fun_GetHostIndexYX(byHostNo,ptRecordSOE->wIndex)==0xFFFF)continue;
memcpy( & pbySendBuf[wPos],ptRecordSOE,sizeof(tagRecordSOE));//拷贝记
录结构
                     wPos+=sizeof(tagRecordSOE);
                     pbySendBuf[wPos]            =              byHostNo;
//监控序号
                wPos++;
                wNum++;
                if(wPos>1000)
                {//报文长度过长,先发送
                    pbySendBuf[6]=wNum & 0xFF;//数量
                    pbySendBuf[7]=wNum>>8;//数量
                    wLen                                        =
SimpLP_Send_SetLPCIAndSn(ptSendCtrl->bySendBuf,wPos,
g_tBakCtrl.wSendNo);//Form LPCI
                       ptSendCtrl->wSendLen=wLen;
                       Bak_SendStart();//直接发送
                       wPos=8;
                       wNum=0;
                   }
                }
                g_tQueuegSynCtrl.wSOERead[byHostNo]=wBakRead;
            }
            if(wNum)//有内容,发送报文
            {
                pbySendBuf[6]=wNum & 0xFF;//数量
                  pbySendBuf[7]=wNum>>8;//数量
                  wLen=SimpLP_Send_SetLPCIAndSn(ptSendCtrl->bySendBuf,
wPos,g_tBakCtrl.wSendNo);//Form LPCI
                  ptSendCtrl->wSendLen=wLen;
                  Bak_SendStart();//直接发送
                  if(g_uiLogBak & CN_SYSN_BIT_SOE)printf(″\n Send
SOE:%d″,wNum);
               }
            }
#endif//#ifdef CN_BAKSYSN_SOE
     return;
}
备机的双机调度信息同步模块从“事件同步队列”中取出一条记录,在“事件记录队列”中搜索并丢弃匹配的事件的命令:
void Bak_SynProcSynRcdSOE(void)
{
     tagPQueueCtrl ptQueueCtrl,ptQueueCtrlSyn;
     tagSynSOERec  *ptSynSOERec;
     tagTimeTAG    tTimeTagCur;
     tagTimeTAG    *ptTimeTag;
     WORD               wReadCtrlSyn,wSaveCtrlSyn,wMaxNumSyn,
wMaxNum,wLoop;
BYTE    byMinuteRecv,byMinuteCur;
WORD    wCmpOff,wCmpSize;
ptQueueCtrlSyn= & (g_tQueueSynSOE.tQueueCtrl);
wMaxNumSyn=CONST_NUM_SYN_SOE;
//检查同步记录队列是否满
wSaveCtrlSyn=ptQueueCtrlSyn->wSave;
wReadCtrlSyn=ptQueueCtrlSyn->wRead[0];
if((WORD)(wSaveCtrlSyn-wReadCtrlSyn)>=wMaxNumSyn)
{   /*The Queue have been FULL since last reading*/
    wReadCtrlSyn=wSaveCtrlSyn-wMaxNumSyn+1;
    ptQueueCtrlSyn->wRead[0]=wReadCtrlSyn;
}
if(wSaveCtrlSyn==wReadCtrlSyn)return;//队列空
Time_GetSystemTimeTAG( & tTimeTagCur);//当前时间
byMinuteCur=tTimeTagCur.Minute;
ptQueueCtrl= & g_tQueueSOE.tQueueCtrl;
wMaxNum=CONST_NUM_REC_SOE;
            {//计算记录内存比较的偏移和大小
               tagRecordSOE  tTmp;
               wCmpOff=sizeof(tagTimeTAG);//不比较接收时标
               wCmpSize=(int) & tTmp.byRES-(int) & tTmp-wCmpOff;
         }
         //用同步记录匹配调度记录
         for(wLoop=0;wLoop<wMaxNumSyn;wLoop++,wReadCtrlSyn++)
         {
             tagPRecordSOE  ptRecordSOESyn,ptRecordSOE;
             WORD    wReadCtrl,wSaveCtrl,i,wYXIndex;
             BYTE    byHostNo;
             BOOLEAN    *pbValid,bFound;
             if(wReadCtrlSyn==wSaveCtrlSyn)break;
             ptSynSOERec        =
& g_tQueueSynSOE.tSynSOERec[wReadCtrlSyn%wMaxNumSyn];
             if(ptSynSOERec->bValid==FALSE)continue;
             ptRecordSOESyn= & ptSynSOERec->tRecordSOE;
             ptTimeTag= & ptSynSOERec->tTimeTagRecv;
              //判断同步记录是否过期(3分钟未能匹配到)
              byMinuteRecv=ptTimeTag->Minute;
              if((byMinuteCur-byMinuteRecv)>3)
              {//3分钟前收到的记录,直接丢弃
                  ptSynSOERec->bValid=FALSE;
                  continue;
              }
              //匹配调度记录
              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)==0xFFFF)
                 {//不是本监控的信号,直接置为无效
                    *pbValid=FALSE;
                    continue;
                 }
                 //通过内存比较确定是否同一条记录
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:%d,%d″,byHostNo,wReadCtrlSyn);
              }
          }
          //更新读指针
          wReadCtrlSyn=ptQueueCtrlSyn->wRead[0];
          for(wLoop=0;wLoop<wMaxNumSyn;wLoop++,wReadCtrlSyn++)
          {
             if(wReadCtrlSyn==wSaveCtrlSyn)break;
             ptSynSOERec                                            =
& g_tQueueSynSOE.tSynSOERec[wReadCtrlSyn%wMaxNumSyn];
            if(ptSynSOERec->bValid==TRUE)break;
         }
         ptQueueCtrlSyn->wRead[0]=wReadCtrlSyn;
         return;
    }.

Claims (5)

1.一种远动工作站双机切换的装置,设有主远动工作站和备远动工作站,主远动工作站和备远动工作站分别设有事件处理模块和双机通讯模块,主远动工作站和备远动工作站的双机通讯模块连接,其特征在于:所述主远动工作站和备远动工作站的双机通讯模块与事件处理模块之间连接设置有双机调度信息同步模块;所述主远动工作站和备远动工作站的事件处理模块负责收集变电站所有采集、测控设备的数据,主远动工作站的事件处理模块将数据上传到远方调度系统,备远动工作站的事件处理模块不上传数据到远方调度系统;所述主远动工作站和备远动工作站的双机调度信息同步模块将事件处理模块收到的事件进行列队;所述主远动工作站的双机调度信息同步模块检测事件处理模块是否有事件已经上送远方调度系统,事件处理模块将事件上送远方调度系统,双机调度信息同步模块从事件列队中标记或删除已上送的事件;所述主远动工作站的双机通讯模块将事件列队信息中已上送给调度的事件传递给备远动工作站的双机通讯模块;所述备远动工作站的双机调度信息同步模块将主远动工作站的双机通讯模块送过来的事件列队和本机收到的事件列队进行匹配后,丢弃主远动工作站的已经上送过的信息。
2.根据权利要求1所述的远动工作站双机切换的装置,其特征在于:所述主远动工作站的双机调度信息同步模块查找调度事件队列中是否有事件记录发送给远方调度系统,每30ms运行一次。
3.根据权利要求2所述的远动工作站双机切换的装置,其特征在于:所述主远动工作站的双机通讯模块通过以太网向备远动工作站的双机通讯模块发送心跳信息。
4.根据权利要求3所述的远动工作站双机切换的装置,其特征在于:所述主远动工作站的双机通讯模块向备远动工作站的双机通讯模块发送心跳信息周期为1s,备远动工作站的双机通讯模块连续10次没有收到的心跳信息,则主远动工作站和备远动工作站切换。
5.根据权利要求4所述的远动工作站双机切换的装置,其特征在于:所述主远动工作站的双机通讯模块向备远动工作站的双机通讯模块发送定期调度、端口通讯状态。
CN2008100668101A 2008-04-18 2008-04-18 远动工作站双机切换的装置 Active CN101262147B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2008100668101A CN101262147B (zh) 2008-04-18 2008-04-18 远动工作站双机切换的装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2008100668101A CN101262147B (zh) 2008-04-18 2008-04-18 远动工作站双机切换的装置

Publications (2)

Publication Number Publication Date
CN101262147A CN101262147A (zh) 2008-09-10
CN101262147B true CN101262147B (zh) 2010-06-02

Family

ID=39962426

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2008100668101A Active CN101262147B (zh) 2008-04-18 2008-04-18 远动工作站双机切换的装置

Country Status (1)

Country Link
CN (1) CN101262147B (zh)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101984413B (zh) * 2010-11-17 2013-04-03 上海顶竹通讯技术有限公司 不同设备间的数据队列的同步方法及装置
CN101997727B (zh) * 2010-12-16 2012-07-11 广州智光电气股份有限公司 一种通讯管理机主备机无缝切换的装置及其方法
CN103065428A (zh) * 2012-12-13 2013-04-24 辽宁省电力有限公司锦州供电公司 变电站监控系统的报警方法
CN103279386A (zh) * 2013-06-09 2013-09-04 浪潮电子信息产业股份有限公司 一种计算机作业调度系统高可用的方法
CN104243473B (zh) * 2014-09-12 2018-11-30 华为技术有限公司 一种数据传输的方法以及装置
CN104751544B (zh) * 2015-02-10 2017-05-03 国家电网公司 一种智能锁控系统及其管理方法
CN105391788A (zh) * 2015-11-26 2016-03-09 积成电子股份有限公司 基于可变队列的双机事项同步机制
CN106130183B (zh) * 2016-07-06 2018-07-10 国电南瑞科技股份有限公司 一种按介质值班的变电站远动双机互备与无缝切换方法
CN106099870B (zh) * 2016-07-08 2018-07-24 山东鲁能智能技术有限公司 一种智能变电站保护控制功能单套配置运行自动迁移的方法
CN106549500B (zh) * 2016-12-08 2019-01-04 积成电子股份有限公司 一种变电站远动机双机切换装置及其自动切换的方法
CN108306989B (zh) * 2018-04-20 2020-02-14 北京全路通信信号研究设计院集团有限公司 一种用于铁路调度集中系统的主备机数据同步方法
CN114979181B (zh) * 2022-05-25 2023-12-26 南京国电南自维美德自动化有限公司 一种计划值曲线同步方法、装置及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0619663A2 (en) * 1993-04-08 1994-10-12 Symbol Technologies, Inc. Packet data communication system
CN1776994A (zh) * 2005-06-01 2006-05-24 国电南京自动化股份有限公司 远动主备通信的新型切换方法
EP1798902A1 (fr) * 2005-12-13 2007-06-20 Zodianet Système de communication entre terminaux domotiques raccordés à internet

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0619663A2 (en) * 1993-04-08 1994-10-12 Symbol Technologies, Inc. Packet data communication system
CN1776994A (zh) * 2005-06-01 2006-05-24 国电南京自动化股份有限公司 远动主备通信的新型切换方法
EP1798902A1 (fr) * 2005-12-13 2007-06-20 Zodianet Système de communication entre terminaux domotiques raccordés à internet

Also Published As

Publication number Publication date
CN101262147A (zh) 2008-09-10

Similar Documents

Publication Publication Date Title
CN101262147B (zh) 远动工作站双机切换的装置
CN102195274A (zh) 配电线路故障检测控制方法和系统
CN109799797B (zh) 厂站电能量采集终端双机热备的方法
CN107168197A (zh) 智能电网二次设备远程管控方法
CN101316051A (zh) 基于iec61850变电站自动化系统的网络通信记录分析系统及方法
CN104682214A (zh) 一种智能电源控制盒
CN104993596A (zh) 基于嵌入式多arm处理器的配电网自动化远方终端装置
CN103595626A (zh) 一种环形网络中实现动态路径规划的方法
CN109888922B (zh) 一种故障录波装置、去中心化故障录波系统及方法
WO2019029445A1 (zh) 含柔性互联装置的配电保护的协同架构、装置及协同方法
CN201440163U (zh) 变电站地线状态检测系统
CN109633345B (zh) 一种二次设备在线监测与分析装置
CN102866698B (zh) 一种分布式控制系统控制器的hmi冗余通讯方法
CN114553262A (zh) 一种电能数据高速采集终端及其控制方法
CN203589833U (zh) 备自投装置
CN101808011A (zh) 远动通道自动切换方法
CN103001319B (zh) 一种集成型智能组件
CN101710734B (zh) 变电站监控双网切换设备
CN201892866U (zh) 一种安全隔离的工业数据集散采集和高效复用发布系统
CN112737863A (zh) 一种自动纠错的智能测控系统
CN102843265B (zh) 一种通讯规约的不复位无微扰的热备双连接方法
CN201663607U (zh) 一种以太环网快速自愈装置及设备
CN101729207B (zh) 一种信令采集方法和装置
CN204681092U (zh) 一种低频低压减负荷系统
KR20120048126A (ko) 이더넷 파워링크에서의 마스터 이중화 방법

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C56 Change in the name or address of the patentee

Owner name: CYG SUNRI CO., LTD.

Free format text: FORMER NAME: SHENZHEN NARI CO., LTD.

CP03 Change of name, title or address

Address after: 518057, Shenzhen Province, Nanshan District hi tech Industrial Park, North Hill Road, No. 1, No. 6, building, floor, No. 3

Patentee after: CYG Sunri Automation Co., Ltd.

Address before: 518057 Nanshan District province high tech Industrial Park, Shenzhen, north of the mountain road, No. 1, No. 3,

Patentee before: Shenzhen NARI Co., Ltd.