/******************************************************************************
版权所有：	
文件名称：	Oc.c
文件版本：	01.01
创建作者：	xxxxxx
创建日期：	2012-03-28
功能说明：	过流保护
其它说明：
修改记录：
*/
/*------------------------------- 头文件 --------------------------------------
*/
#include "head.h"
 
/*------------------------------- 宏定义 --------------------------------------
*/

/*------------------------------ 类型结构 -------------------------------------
*/


/*------------------------------ 全局变量 -------------------------------------
*/

/*------------------------------ 函数声明 -------------------------------------
*/

/*------------------------------ 外部函数 -------------------------------------
外部函数供其它实体文件引用，必须仔细检查传入参数的合法性.
*/


bool CalDir_A(int sw,bool bQD,bool bInv)
{
	int indexU,indexI;	
	bool bzx=false;
	indexU=PUB_AC_UBC1;
	indexI=UI_SW_INDEX(sw,SW_AC_IA);	
	if(!tPT.uPT1DX.bFlag.bPTYC&&(g_ui[indexU].m2[0]>pRunSet->dVOL10V_SQR)&&bQD)      // UBC > 10V
	{
		if(!bInv)  //电流反向
		{
			bzx=PowerDirectionalRelay(g_ui[indexU].ri.r ,g_ui[indexU].ri.i,g_ui[indexU].m2[0],g_ui[indexI].ri.r ,g_ui[indexI].ri.i,g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN0 , COS0, SIN300, COS300 );//计算A相电流方向
		}
		else
		{
			bzx=PowerDirectionalRelay(g_ui[indexU].ri.r ,g_ui[indexU].ri.i,g_ui[indexU].m2[0],g_ui[indexI].ri.r ,g_ui[indexI].ri.i,g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN180 , COS180, SIN120, COS120 );//计算A相电流方向
		}
	}
	return bzx;
}


bool CalDir_B(int sw,bool bQD,bool bInv)
{
	int indexU,indexI;	
	bool bzx=false;
	indexU=PUB_AC_UCA1;
	indexI=UI_SW_INDEX(sw,SW_AC_IB);	
	if(!tPT.uPT1DX.bFlag.bPTYC&&(g_ui[indexU].m2[0]>pRunSet->dVOL10V_SQR)&&bQD)      // UCA > 10V
	{
		if(!bInv)
		{
			bzx=PowerDirectionalRelay(g_ui[indexU].ri.r ,g_ui[indexU].ri.i,g_ui[indexU].m2[0],g_ui[indexI].ri.r ,g_ui[indexI].ri.i,g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN0 , COS0, SIN300, COS300 );//计算B相电流方向
		}
		else
		{
			bzx=PowerDirectionalRelay(g_ui[indexU].ri.r ,g_ui[indexU].ri.i,g_ui[indexU].m2[0],g_ui[indexI].ri.r ,g_ui[indexI].ri.i,g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN180 , COS180, SIN120, COS120 );//计算B相电流方向
		}
	}
	return bzx;
}

bool CalDir_C(int sw,bool bQD,bool bInv)
{
	int indexU,indexI;	
	bool bzx=false;
	indexU=PUB_AC_UAB1;
	indexI=UI_SW_INDEX(sw,SW_AC_IC);	
	if(!tPT.uPT1DX.bFlag.bPTYC&&(g_ui[indexU].m2[0]>pRunSet->dVOL10V_SQR)&&bQD)      // UAB > 10V
	{
		if(!bInv)
		{
			bzx=PowerDirectionalRelay(g_ui[indexU].ri.r ,g_ui[indexU].ri.i,g_ui[indexU].m2[0],g_ui[indexI].ri.r ,g_ui[indexI].ri.i,g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN0 , COS0, SIN300, COS300 );//计算C相电流方向
		}
		else
		{
			bzx=PowerDirectionalRelay(g_ui[indexU].ri.r ,g_ui[indexU].ri.i,g_ui[indexU].m2[0],g_ui[indexI].ri.r ,g_ui[indexI].ri.i,g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN180 , COS180, SIN120, COS120 );//计算C相电流方向
		}
	}
	return bzx;
}

bool pro_check_bh_all(int sw)
{
	if(soe_check(EV_GL1TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL2TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL3TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_LX1TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_LX2TZ+sw*EV_SW_NUM)==true)return true;
#ifdef DISP_SET_LX3
	if(soe_check(EV_LX3TZ+sw*EV_SW_NUM)==true)return true;
#endif

	if(soe_check(EV_GLJS+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_LXJS+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)return true;
#ifdef SOE_RECORD_DELAY
	if(g_soe_queue.fzsoe_wait_flag )return true;
#endif	
	return false;
}

bool pro_check_gl_all(int sw)
{
	if(soe_check(EV_GL1TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL2TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL3TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL1GJ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL2GJ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GL3GJ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_GLJS+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)return true;
#ifdef SOE_RECORD_DELAY
	if(g_soe_queue.fzsoe_wait_flag )return true;
#endif
	return false;
}

bool pro_check_lx_all(int sw)
{
	if(soe_check(EV_LX1GJ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_LX2GJ+sw*EV_SW_NUM)==true)return true;
#ifdef DISP_SET_LX3
	if(soe_check(EV_LX3GJ+sw*EV_SW_NUM)==true)return true;
#endif
	if(soe_check(EV_LX1TZ+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_LX2TZ+sw*EV_SW_NUM)==true)return true;
#ifdef DISP_SET_LX3
	if(soe_check(EV_LX3TZ+sw*EV_SW_NUM)==true)return true;
#endif

	if(soe_check(EV_LXJS+sw*EV_SW_NUM)==true)return true;
	if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)return true;
#ifdef SOE_RECORD_DELAY
	if(g_soe_queue.fzsoe_wait_flag )return true;
#endif	

#ifdef FUN_JDXX
		if(soe_check(EV_JDXX_GJ+sw*EV_SW_NUM)==true)return true;	
		if(soe_check(EV_JDXX_TZ+sw*EV_SW_NUM)==true)return true;		
#endif

	return false;
}

bool pro_check_fault_all(int sw)
{
	bool ret;
	ret=pro_check_gl_all(sw)||pro_check_lx_all(sw);
	return ret;
}

void  pro_check_gl_abc(int sw,DWORD i_set,DWORD I1,DWORD I2,DWORD I3)
{
	bool bIa,bIb,bIc;
	int ui_begin;
	TRELAY_T *pR=&g_tRelay[sw];
	ui_begin = UI_SW_INDEX_BEGIN(sw);

	bIa=(g_ui[ui_begin + SW_AC_IA ].m2[0] > i_set)?true:false;
	bIb=(g_ui[ui_begin + SW_AC_IB ].m2[0] > i_set)?true:false;
	bIc=(g_ui[ui_begin + SW_AC_IC ].m2[0] > i_set)?true:false;

	if(bIa&&bIb&&bIc)
	{
		if(soe_check(EV_IABC_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_IABC_GL+sw*EV_SW_NUM,1, I1,I2,I3 );
			pR->bYcRefresh.bAGl = true;
			pR->bYcRefresh.bBGl = true;
			pR->bYcRefresh.bCGl = true;
		}
	}
	else if(bIa&&bIb)
	{
		if(soe_check(EV_IAB_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_IAB_GL+sw*EV_SW_NUM,1, I1,I2,0 ); 
			pR->bYcRefresh.bAGl = true;
			pR->bYcRefresh.bBGl = true;
		}
	}
	else if(bIa&&bIc)
	{
		if(soe_check(EV_ICA_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_ICA_GL+sw*EV_SW_NUM,1, I1,I3,0 ); 
			pR->bYcRefresh.bAGl = true;
			pR->bYcRefresh.bCGl = true;
		}
	}
	else if(bIb&&bIc)
	{
		if(soe_check(EV_IBC_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_IBC_GL+sw*EV_SW_NUM,1, I2,I3,0 );
			pR->bYcRefresh.bBGl = true;
			pR->bYcRefresh.bCGl = true;
		}
	}
	else if(bIa)
	{
		if(soe_check(EV_IA_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_IA_GL+sw*EV_SW_NUM,1, I1,0,0 ); 
			pR->bYcRefresh.bAGl = true;
		}
	}
	else if(bIb)
	{
		if(soe_check(EV_IB_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_IB_GL+sw*EV_SW_NUM,1, I2,0,0 ); 
			pR->bYcRefresh.bBGl = true;
		}
	}
	else if(bIc)
	{
		if(soe_check(EV_IC_GL+sw*EV_SW_NUM)==false)
		{				
			soe_record_ev( EV_IC_GL+sw*EV_SW_NUM,1, I3,0,0 ); 
			pR->bYcRefresh.bCGl = true;
		}
	}
}

#ifdef ADD_FD_GL_FX_BH_FUN
void  pro_check_fd_gl_abc(int sw,DWORD i_set,DWORD I1,DWORD I2,DWORD I3,int soe_no)
{
    bool bIa,bIb,bIc;
    int ui_begin;
    u32 code;

    ui_begin = UI_SW_INDEX_BEGIN(sw);

    bIa=(g_ui[ui_begin + SW_AC_IA ].m2[0] > i_set)?true:false;
    bIb=(g_ui[ui_begin + SW_AC_IB ].m2[0] > i_set)?true:false;
    bIc=(g_ui[ui_begin + SW_AC_IC ].m2[0] > i_set)?true:false;

    //soe_no--;
    if((soe_no==EV_GL1TZ)||(soe_no==EV_GL1GJ))
        code=EV_GL1_IA+sw*EV_SW_NUM;
    else if((soe_no==EV_GL2TZ)||(soe_no==EV_GL2GJ))
        code=EV_GL2_IA+sw*EV_SW_NUM;
    else if((soe_no==EV_GL3TZ)||(soe_no==EV_GL3GJ))
        code=EV_GL3_IA+sw*EV_SW_NUM;
    else
        return;

    if(bIa)
    {
        if(soe_check(code)==false)
        {
            soe_record_ev(code,1, I1,0,0 );
        }
    }
    if(bIb)
    {
        if(soe_check(code+1)==false)
        {
            soe_record_ev(code+1,1, I2,0,0 );
        }
    }
    if(bIc)
    {
        if(soe_check(code+2)==false)
        {
            soe_record_ev(code+2,1, I3,0,0 );
        }
    }


}

void pro_rst_fd_gl_event(int sw,int soe_no)
{
    u32 code;

    if(soe_no==EV_GL1TZ)
        code=EV_GL1_IA;
    else if(soe_no==EV_GL2TZ)
        code=EV_GL2_IA;
    else if(soe_no==EV_GL3TZ)
        code=EV_GL3_IA;
    else
        return;

    if(soe_check(code+sw*EV_SW_NUM)==true)
    {
        soe_record_ev( code+sw*EV_SW_NUM,0, 0,0,0 );
    }

    if(soe_check(code+sw*EV_SW_NUM+1)==true)
    {
        soe_record_ev( code+sw*EV_SW_NUM+1,0, 0,0,0 );
    }

    if(soe_check(code+sw*EV_SW_NUM+2)==true)
    {
        soe_record_ev( code+sw*EV_SW_NUM+2,0, 0,0,0 );
    }

}



#endif
void pro_rst_event(int sw,int soe_no)
{
	if(soe_check(soe_no+sw*EV_SW_NUM)==true)
	{				
		soe_record_ev( soe_no+sw*EV_SW_NUM,0, 0,0,0 ); 
	}
}

void xb_bs_soe(int sw,u32  dStep)
{
	int i;
	bool bxb_bs[BHOC_NUMBER]={false},xb_soe=false;

	for(i = BH_GL1;i<BHOC_NUMBER;i++) 
	{
		TOC_T *poc = &g_tRelay[sw].tOC[i];

		if((i== BH_GL1)|| (i == BH_GL2) || (i == BH_GL3) ||  (i== BH_GLJS))
			bxb_bs[i]= poc->sta.bFlag.bXBbs;
		else
			bxb_bs[i]=false;

		RunTR(&poc->tXBTime, bxb_bs[i], dStep);
		RunTR(&poc->tXBQD25ms, bxb_bs[i], dStep);

		if((poc->tXBTime.boolTrip)&&(poc->tXBQD25ms.boolTrip))
		{
			xb_soe =true;
			break;
		}	
	}
	
	if(xb_soe)
	{	
		if(soe_check(EV_XBBS+sw*EV_SW_NUM)==false) 
		{
			soe_record_ev(EV_XBBS+sw*EV_SW_NUM,1, 0,0,0 ); 
		}
	}
	else
	{
		if(soe_check(EV_XBBS+sw*EV_SW_NUM)==true) 
		{
			soe_record_ev( EV_XBBS+sw*EV_SW_NUM,0, 0,0,0 ); 
		}
	}

}


void Pro_OC(int sw,u32  dStep,int oc,int soe_no)
{
	bool bQDD,bTrip; 	
	TOC_T *poc = &g_tRelay[sw].tOC[oc];
	OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
	u16 soeno=soe_no+sw*EV_SW_NUM;	
	bool bfxmz,bxbbs,bxb;
	int ui_begin;
	bool bIazx,bIbzx,bIczx;	
	bool bdyenable=true; //低电压闭锁
	bool bTz=false;

	// 电流启动
	ui_begin = UI_SW_INDEX_BEGIN(sw);
	poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin+SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD); 
	poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin+SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD); 
	poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin+SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD); 

	bIazx=CalDir_A(sw,poc->sta.bFlag.bIaQD&&pSet->bDir,pRunSet->tSwSet[sw].bTT_DIR_Inv);  //方向计算
	bIbzx=CalDir_B(sw,poc->sta.bFlag.bIbQD&&pSet->bDir,pRunSet->tSwSet[sw].bTT_DIR_Inv);
	bIczx=CalDir_C(sw,poc->sta.bFlag.bIcQD&&pSet->bDir,pRunSet->tSwSet[sw].bTT_DIR_Inv);

	bxb=pRunSet->tSwSet[sw].bTT_bh_xbbs;
	poc->sta.bFlag.bIaxb =bxb&&XBCalc(sw,SW_AC_IA,pRunSet->tSwSet[sw].d_bh_xbcoe,poc->sta.bFlag.bIaQD);
	poc->sta.bFlag.bIbxb=bxb&&XBCalc(sw,SW_AC_IB,pRunSet->tSwSet[sw].d_bh_xbcoe,poc->sta.bFlag.bIbQD);
	poc->sta.bFlag.bIcxb=bxb&&XBCalc(sw,SW_AC_IC,pRunSet->tSwSet[sw].d_bh_xbcoe,poc->sta.bFlag.bIcQD);

	bfxmz=(tPT.uPT1DX.bFlag.bPTYC) //PT异常，自动满足方向
			||(!pSet->bDir) //方向不投入
			||bIazx
			||bIbzx
			||bIczx;
	bQDD=poc->sta.bFlag.bIaQD||poc->sta.bFlag.bIbQD||poc->sta.bFlag.bIcQD;
	bxbbs=(poc->sta.bFlag.bIaxb||poc->sta.bFlag.bIbxb||poc->sta.bFlag.bIcxb); //谐波闭锁

#ifndef OCI_XB_0MS
	if(BH_ALL_EN(sw))
	{
		if((oc== BH_GL1)|| (oc == BH_GL2) || (oc == BH_GL3) ) 
		{
			poc->sta.bFlag.bXBbs = (BH_ALL_EN(sw)
						&& (pSet->bTz||pSet->bGj)
						&& bQDD) 
						&& bxbbs;
			if( oc== BH_GL1)
				xb_bs_soe(g_protect.sw,dStep);
		}
	}
#endif

	poc->sta.bFlag.bddyQD = LowRelay(g_sw_pub.m2_min[2], pRunSet->dU_DDYBS, pRunSet->dU_DDYBS, poc->sta.bFlag.bddyQD); 
	bdyenable=(!pRunSet->bTT_DDYBS) //低电压闭锁未投入，自动满足
			||(poc->sta.bFlag.bddyQD&&!tPT.uPT1DX.bFlag.bPTYC)		//低电压满足，TV正常
			||(tPT.uPT1DX.bFlag.bPTYC);  //PT异常，低电压自动满足


	poc->sta.bFlag.bQD  = (BH_ALL_EN(sw)
						&& (pSet->bTz || pSet->bGj)
						&& bQDD 
						&&bdyenable
						&&(!bxbbs)
						&& bfxmz); 

	if(poc->sta.bFlag.bQD)  //幅值启动
	{
		if(!poc->sta.bFlag.bQDWave)
		{
			rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); 	//录波类型：跳闸类
			poc->sta.bFlag.bQDWave=true;
		}

	}
	else
	{
		poc->sta.bFlag.bQDWave=false;
	}
#ifdef EV_GL_STATR
	gl_start_soe_set(poc->sta.bFlag.bQD,sw,soe_no+2);//过流启动SOE
#endif

	RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
	RunTR(&poc->tQD25ms, poc->sta.bFlag.bQD, dStep);

	// 如果速断时间到，启动时间未到，调用幅值启动加速模块
	if(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
	{
		if(protect_amp_qd_js(sw))
		{
			// 预置25ms，让下个循环再出口
			PreSetTime(&poc->tQD25ms, T_25ms);	
#ifdef CPU_FUXI
			//FUXI平台等待下一个循环会导致偶尔动作时间超40ms，改为不等待，本循环处理完
			poc->tQD25ms.boolTrip = 1;
#endif			
		}
	}

	bTrip = poc->tQDTime.boolTrip&& poc->tQD25ms.boolTrip;	
	poc->sta.bFlag.bGj=bTrip && pSet->bGj;  // 告警
	poc->sta.bFlag.bGjEvent=poc->sta.bFlag.bGj;


	// 过流三段闭锁重合闸
	poc->sta.bFlag.bBSCH = poc->sta.bFlag.bTz && !pRunSet->tSwSet[sw].dT_ch_gl_tt; 
	
	if(bTrip)	// 条件满足，置动作灯
	{	
		poc->sta.bFlag.bTripBak = true;
		//poc->sta.bFlag.bDzLed = true;		
	}	
	poc->sta.bFlag.bTz=bTrip&&pSet->bTz;	

#ifdef SOE_RECORD_DELAY	
	bTz = poc->sta.bFlag.bTz && soe_check(EV_TZFAIL+sw*EV_SW_NUM)==false;
#else
	bTz =poc->sta.bFlag.bTz;
#endif
		
#ifdef YX_RESET_TIME
	{
		bool bY1;
		//故障遥信延时复归
		bY1=(!poc->sta.bFlag.bGj)&&poc->sta.bFlag.bGjEvent;
		RunTR(&poc->tGjEvRstTime, bY1, dStep);	
		poc->sta.bFlag.bGjEvent=poc->sta.bFlag.bGj||(!poc->tGjEvRstTime.boolTrip&&bY1); 	
	
		bY1=(!poc->sta.bFlag.bTz)&&poc->sta.bFlag.bTzEvent;
		RunTR(&poc->tTzEvRstTime, bY1, dStep);	
		poc->sta.bFlag.bTzEvent=poc->sta.bFlag.bTz||(!poc->tTzEvRstTime.boolTrip&&bY1); 
	}
	bTz = poc->sta.bFlag.bTzEvent;
#endif

	if(bTz)
	{
		gl_soe_set_clr(1,sw,soeno,pSet->dI,false);
		if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false)  //保护总
		{				
			soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
		}
		poc->sta.bFlag.bDzLed = true;	
	}
	else
	{
		gl_soe_set_clr(0,sw,soeno,pSet->dI,false);
		if(pro_check_bh_all(sw)==false)
		{
			pro_rst_event(sw,EV_BH_FAULT);	 //保护总
		}
	} 

	//告警记录及出口
	if(poc->sta.bFlag.bGjEvent) 
	{
	
		gl_soe_set_clr(1,sw,soeno+1,pSet->dI,BH_WAVETIME_EN(pSet->dT));		// 大于150毫秒，出口也启动录波
		if(poc->sta.bFlag.bDzLed==false) 
		{
			poc->sta.bFlag.bGjLed = true;	
		}
	}
	else
	{
		gl_soe_set_clr(0,sw,soeno+1,pSet->dI,false);
	} 

	
}

void Pro_LX(int sw,u32  dStep,int oc,int soe_no)
{
	bool bQDD,bQDD1,bTrip; 	
	TOC_T *poc = &g_tRelay[sw].tOC[oc];
	OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
	u16 soeno=soe_no+sw*EV_SW_NUM;	
	int ui_begin;
	bool bTz=false;
	TRELAY_T *pR=&g_tRelay[sw];
	
	ui_begin = UI_SW_INDEX_BEGIN(sw);
	// 电流启动
	bQDD = OverRelay(g_ui[ui_begin+SW_AC_I0].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD); 

	bQDD1 = OverRelay(g_ui[PUB_AC_U01].m2[0], pRunSet->dU_U0BS, pRunSet->dU_U0BS, false);
	
	poc->sta.bFlag.bQD  = (BH_ALL_EN(sw))
					&& (pSet->bTz || pSet->bGj)
					&& bQDD 
					&& ((bQDD1&&pRunSet->bTT_U0BS)||(!pRunSet->bTT_U0BS));  
					

	if(poc->sta.bFlag.bQD)  //幅值启动
	{
		if(!poc->sta.bFlag.bQDWave)
		{
			rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); 	//录波类型：跳闸类
			poc->sta.bFlag.bQDWave=true;
		}
	}	
	else
	{
		poc->sta.bFlag.bQDWave=false;
	}
#ifdef EV_GL_STATR
	lx_start_soe_set( poc->sta.bFlag.bQD,sw,soe_no+2);//过流启动SOE
#endif

	RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
	RunTR(&poc->tQD25ms, poc->sta.bFlag.bQD, dStep);

	// 如果时间到，启动时间未到，调用幅值启动加速模块
	if(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
	{
		if(protect_amp_lx_js(sw))
		{
			// 预置25ms，让下个循环再出口
			PreSetTime(&poc->tQD25ms, T_25ms);	
#ifdef CPU_FUXI
			//FUXI平台等待下一个循环会导致偶尔动作时间超40ms，改为不等待，本循环处理完
			poc->tQD25ms.boolTrip = 1;
#endif
		}
	}



	bTrip = poc->tQDTime.boolTrip&&poc->tQD25ms.boolTrip;	
	poc->sta.bFlag.bGj=bTrip&&pSet->bGj;  // 告警
	poc->sta.bFlag.bTz= bTrip&&pSet->bTz;	// 出口
	// 零序闭锁重合闸
	poc->sta.bFlag.bBSCH = poc->sta.bFlag.bTz && !pRunSet->tSwSet[sw].dT_ch_jd_tt; 

	if(bTrip)	// 条件满足，置动作灯
	{	
		poc->sta.bFlag.bTripBak = true;
		//poc->sta.bFlag.bDzLed = true;		
	}
	


#ifdef SOE_RECORD_DELAY	
	bTz = poc->sta.bFlag.bTz && soe_check(EV_TZFAIL+sw*EV_SW_NUM)==false;
#else
	bTz =poc->sta.bFlag.bTz;
#endif
	
#ifdef YX_RESET_TIME
	{
		bool bY1;
		//故障遥信延时复归
		bY1=(!poc->sta.bFlag.bGj)&&poc->sta.bFlag.bGjEvent;
		RunTR(&poc->tGjEvRstTime, bY1, dStep);	
		poc->sta.bFlag.bGjEvent=poc->sta.bFlag.bGj||(!poc->tGjEvRstTime.boolTrip&&bY1); 	
	
		bY1=(!poc->sta.bFlag.bTz)&&poc->sta.bFlag.bTzEvent;
		RunTR(&poc->tTzEvRstTime, bY1, dStep);	
		poc->sta.bFlag.bTzEvent=poc->sta.bFlag.bTz||(!poc->tTzEvRstTime.boolTrip&&bY1); 
	}
	bTz = poc->sta.bFlag.bTzEvent;
#endif

	if(bTz)
	{
		poc->sta.bFlag.bDzLed = true;	
		if(soe_check(soeno)==false)
		{
			DWORD I0,U0;
			I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
			U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);				
			soe_record_ev( soeno, 1, I0,U0,0 ); 
//			rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
		}

		if(soe_check(EV_LX_FAULT+sw*EV_SW_NUM)==false) // 零序总
		{				
			soe_record_ev( EV_LX_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
			pR->bYcRefresh.bLx = true;
		}
		if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false)  //保护总
		{				
			soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
		}
		if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false)  //保护总
		{				
			soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
		}
		
	}
	else
	{
		if(soe_check(soeno)==true)
		{
			soe_record_ev( soeno, 0, 0,0,0 );    
		}

		if(pro_check_lx_all(sw)==false)
		{
			pro_rst_event(sw,EV_LX_FAULT);	 //零序总
		}
		if(pro_check_bh_all(sw)==false)
		{
			pro_rst_event(sw,EV_BH_FAULT);	 //保护总
		}
		if(pro_check_fault_all(sw)==false)
		{
			pro_rst_event(sw,EV_ALL_FAULT);	 //事故总
		}
		
	} 

	// 告警记录及出口
	if(poc->sta.bFlag.bGj) 
	{		
		if(poc->sta.bFlag.bDzLed==false) 
		{
			poc->sta.bFlag.bGjLed = true;	
		}
		if(soe_check(soeno+1)==false)
		{
			DWORD I0,U0;
			I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
			U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);				
			soe_record_ev( soeno+1, 1, I0,U0,0 ); 
			if(BH_WAVETIME_EN(pSet->dT))  rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
		}
		if(soe_check(EV_LX_FAULT+sw*EV_SW_NUM)==false) // 零序总
		{				
			soe_record_ev( EV_LX_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
			pR->bYcRefresh.bLx = true;
		}
		if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false)  //保护总
		{				
			soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
		}
	}
	else
	{
		if(soe_check(soeno+1)==true)
		{
			soe_record_ev( soeno+1, 0, 0,0,0 );    
		}

		if(pro_check_lx_all(sw)==false)
		{
			pro_rst_event(sw,EV_LX_FAULT);	 //零序总
		}
		if(pro_check_fault_all(sw)==false)
		{
			pro_rst_event(sw,EV_ALL_FAULT);	 //事故总
		}
	} 
}
/**************************************************************************
函数名称：Pro_Accheck
函数版本：1.00 
作者：    保护产品部
创建日期：2007.10.15    

函数功能说明：加速功能块
输入参数：
其他输入:
输出参数：
返回值：  
***************************************************************************/
void Pro_Accheck(int sw,u32  dStep,int oc,int soe_no)
{
	bool bQDD,bTrip; 	
	bool bJS3,bJS4,bJS5;
	bool bY1,bY2; 
	TOC_T *poc = &g_tRelay[sw].tOC[oc];
	OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
	u16 soeno=soe_no+sw*EV_SW_NUM;	
	bool bxbbs,benable;
	int ui_begin;
	DWORD U0;
	TRELAY_T *pR=&g_tRelay[sw];

	ui_begin = UI_SW_INDEX_BEGIN(sw);

	
	U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k); 			

	if(oc==BH_GLJS||oc==BH_LXJS)
	{
		benable=BH_ALL_EN(sw);
	}
	else
	{
		benable=FA_ALL_EN(sw);
	}

	// 电流启动
	if(oc==BH_GLJS||oc==FA_GL)
	{
		bool bxb;
		DWORD  xbcoe;			// 谐波系数

		if(oc==BH_GLJS)
		{
			bxb=pRunSet->tSwSet[sw].bTT_bh_xbbs;
			xbcoe=pRunSet->tSwSet[sw].d_bh_xbcoe;
		}
		else 
		{
			bxb=pRunSet->tSwSet[sw].bTT_fa_xbbs;
			xbcoe=pRunSet->tSwSet[sw].d_fa_xbcoe;
		}
		poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin+SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD); 
		poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin+SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD); 
		poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin+SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD); 

		poc->sta.bFlag.bIaxb =bxb&&XBCalc(sw,SW_AC_IA,xbcoe,poc->sta.bFlag.bIaQD);
		poc->sta.bFlag.bIbxb=bxb&&XBCalc(sw,SW_AC_IB,xbcoe,poc->sta.bFlag.bIbQD);
		poc->sta.bFlag.bIcxb=bxb&&XBCalc(sw,SW_AC_IC,xbcoe,poc->sta.bFlag.bIcQD);
		bQDD=poc->sta.bFlag.bIaQD||poc->sta.bFlag.bIbQD||poc->sta.bFlag.bIcQD;
		bxbbs=poc->sta.bFlag.bIaxb||poc->sta.bFlag.bIbxb||poc->sta.bFlag.bIcxb; //谐波闭锁
		
		if(BH_ALL_EN(sw))
		{
			if(oc == BH_GLJS) 
			{
				poc->sta.bFlag.bXBbs = (BH_ALL_EN(sw)
							&& (pSet->bTz||pSet->bGj)
							&& bQDD) 
							&& bxbbs;			
				//xb_bs_soe(g_protect.sw,dStep);
			}
		}
	}
	else  //零序加速或FA合后零序过流跳闸
	{
		// 零序电流过量继电器
		bY1 = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD); 
		// 零序电压过量继电器
		//bY2 = OverRelay(g_ui[PUB_AC_U01].m2[0], pRunSet->dU_U0BS, pRunSet->dU_U0BS, false);
		bY2=true;
		bQDD=bY1&& ((bY2&&pRunSet->bTT_U0BS)||(!pRunSet->bTT_U0BS));
		bxbbs=false;

	}
    // 检查合闸加速标    
	if(oc==BH_GLJS||oc==BH_LXJS)
	{
		bJS3 = g_tRelay[sw].tCHZ.sta.bFlag.bCHJS  		// 重合加速标
			                 || g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; 	// 手合加速标
	}
	else
	{
		bJS3 =g_tRelay[sw].tSWST.uSWST.bFlag.bSDJS		//上电加速										
				//|| g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; 	// 手合加速标
				;
	}	
	
	poc->sta.bFlag.bQD  = (benable
						&& (pSet->bTz||pSet->bGj)
						&& bQDD) 
						&& (!bxbbs);//谐波闭锁
	// 加速标保持
	bJS4 = bJS3 || poc->sta.bFlag.bJSBC; 
			                 
	// 后加速启动条件满足
	bJS5 = poc->sta.bFlag.bQD&& bJS4;

	// 合闸加速标保持
	poc->sta.bFlag.bJSBC = bJS5 && bJS4;	


	if(bJS5)  //幅值启动
	{
		if(!poc->sta.bFlag.bQDWave)
		{
			if(oc==BH_GLJS||oc==FA_GL)
			{
				rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); 	//录波类型：跳闸类
			}
			else
			{
				rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); 	//录波类型：跳闸类
			}
			poc->sta.bFlag.bQDWave=true;
		}
	}	
	else
	{
		poc->sta.bFlag.bQDWave=false;
	}
	RunTR(&poc->tQDTime, bJS5, dStep);
	RunTR(&poc->tQD25ms, bJS5, dStep);

	// 如果加速时间到，启动时间未到，调用幅值启动加速模块
	if((oc==BH_GLJS|| oc==FA_GL || BH_LXJS)&&(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip))
	{
		if(oc==BH_GLJS|| oc==FA_GL)
		{
			if(protect_amp_qd_js(sw))
			{
				// 预置25ms，让下个循环再出口
				PreSetTime(&poc->tQD25ms, T_25ms);	
			}
		}
		else
		{
			if(protect_amp_lx_js(sw))
			{
				// 预置25ms，让下个循环再出口
				PreSetTime(&poc->tQD25ms, T_25ms);	
			}
		}
		
	}


	
	bTrip = poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;	

	poc->sta.bFlag.bTz=bTrip;  // 

	if(bTrip)	// 条件满足，置动作灯
	{	
		poc->sta.bFlag.bTripBak = true;
		//poc->sta.bFlag.bDzLed = true;		
	}

#ifdef GD_TEST_2021
	// 故障遥信延时复归
	bY1=(!poc->sta.bFlag.bTz)&&poc->sta.bFlag.bTzEvent;
	RunTR(&poc->tTzEvRstTime, bY1, dStep);	
	poc->sta.bFlag.bTzEvent=poc->sta.bFlag.bTz||(!poc->tTzEvRstTime.boolTrip&&bY1); 
#endif 

	// 出口记录及出口
	if(oc==BH_GLJS||oc==FA_GL)
	{
	#ifdef GD_TEST_2021
		if(poc->sta.bFlag.bTzEvent)
	#else
		if(poc->sta.bFlag.bTz) 
	#endif	
		{
			poc->sta.bFlag.bDzLed = true;	
			gl_soe_set_clr(1,sw,soeno,pSet->dI,BH_WAVETIME_EN(pSet->dT));
			if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false)  //保护总
			{				
				soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
			}
			if(oc==FA_GL)
			{
				if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false&&pRunSet->tSwSet[sw].bTT_fa_gzbshz)
				{
					soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
				}				
			}
		}
		else
		{
			gl_soe_set_clr(0,sw,soeno,pSet->dI,false);
			if(pro_check_bh_all(sw)==false)
			{
				pro_rst_event(sw,EV_BH_FAULT);	 //保护总
			}


			
		} 	
	}
	else  // 零序加速
	{
		// 出口记录及出口
	#ifdef GD_TEST_2021
		if(poc->sta.bFlag.bTzEvent) 
	#else	
		if(poc->sta.bFlag.bTz) 
	#endif	
		{
			poc->sta.bFlag.bDzLed = true;	
			if(soe_check(soeno)==false)
			{
				DWORD I0;
				I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
				//U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);				
				soe_record_ev( soeno, 1, I0,U0,0 ); 
				if(BH_WAVETIME_EN(pSet->dT))rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
			}

			if(soe_check(EV_LX_FAULT+sw*EV_SW_NUM)==false) // 零序总
			{				
				soe_record_ev( EV_LX_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
				pR->bYcRefresh.bLx = true;
			}
			if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false)  //保护总
			{				
				soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
			}
			if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false)  //故障总
			{				
				soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 ); 
			}			
			if(oc==FA_LX)
			{
				if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false&&pRunSet->tSwSet[sw].bTT_fa_gzbshz)
				{
					soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
				}
			}
		}
		else
		{
			if(soe_check(soeno)==true)
			{
				soe_record_ev( soeno, 0, 0,0,0 );    
			}
			if(pro_check_lx_all(sw)==false)
			{
				pro_rst_event(sw,EV_LX_FAULT);	 //零序总
			}
			if(pro_check_bh_all(sw)==false)
			{
				pro_rst_event(sw,EV_BH_FAULT);	 //保护总
			}
			if(pro_check_fault_all(sw)==false)
			{
				pro_rst_event(sw,EV_ALL_FAULT);	 //故障总
			}
		} 	
	}	
}

/******************************************************************************
函数名称：	Pro_BSTZ
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-10-23
函数说明：	大电流闭锁分闸，用于负荷开关，以免过切断容量跳闸
参数说明：	无
返回值：  	成功返回0.
修改记录：	
*/
void Pro_BSTZ(int sw,u32  dStep,int oc,int soe_no)
{	

	bool bQDD,bTrip; 	
	TOC_T *poc = &g_tRelay[sw].tOC[oc];
	OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
	u16 soeno=soe_no+sw*EV_SW_NUM;	
	// 电流启动
	bQDD = OverRelay(g_sw[sw].m2_max, pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD); 
	poc->sta.bFlag.bQD	= (BH_ALL_EN(sw)//现有程序FA模式下已处理遮断，所以只需要BH模式投入此功能
						&& (pSet->bTz||pSet->bGj)
						&& bQDD);
	if(poc->sta.bFlag.bQD)  //幅值启动
	{
		#if 0
		if(!poc->sta.bFlag.bQDWave)
		{
			rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); 	//录波类型：跳闸类
			poc->sta.bFlag.bQDWave=true;
		}
		#endif
	}

	RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
	bTrip = poc->tQDTime.boolTrip;	
	poc->sta.bFlag.bTz = bTrip&&pSet->bTz;
	g_tRelay[sw].bBSTZ = bTrip&&pSet->bTz;
	if(bTrip)	// 条件满足，置动作灯
	{	
		poc->sta.bFlag.bTripBak = true;
		poc->sta.bFlag.bDzLed = true;		
	}
	if(!BH_ALL_EN(sw))
	{
		return;
	}
	// 出口记录及出口
	if(poc->sta.bFlag.bTz) 
	{
		if(soe_check(soeno)==false)
		{
			int ui_begin;
			DWORD Ia,Ib,Ic;
			ui_begin = UI_SW_INDEX_BEGIN(sw);
			Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
			Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
			Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
			soe_record_ev(soeno, 1, Ia,Ib,Ic );       
			//if(BH_WAVETIME_EN(pSet->dT))rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); 	//录波类型：跳闸类
		}	
	}
	else
	{
		if(soe_check(soeno)==true)
		{
			soe_record_ev(soeno, 0, 0,0,0);       
		}	
	} 

}

/***********************************
函数名称：	Pro_over_limit_i
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2015-10-23
函数说明：	电流越限
参数说明：	无
返回值：  	成功返回0.
修改记录：	
*/
void  Pro_over_i(int sw,u32  dStep,int oc,int soe_no)
{
	bool bQDD,bTrip; 	
	int ui_begin;
	DWORD Ia,Ib,Ic;

#ifdef GD_TEST_2021
	bool by1;
#endif

	TOC_T *poc = &g_tRelay[sw].tOC[oc];
	OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
	u16 soeno=soe_no+sw*EV_SW_NUM;	
	// 电流启动
	bQDD = OverRelay(g_sw[sw].m2_max, pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD); 
	poc->sta.bFlag.bQD  = (pSet->bTz || pSet->bGj) && bQDD; 
	RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
	bTrip=poc->tQDTime.boolTrip;  // 告警	
	poc->sta.bFlag.bGj = bTrip;  // 告警

#ifdef GD_TEST_2021
	// 故障遥信延时复归
	by1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
	RunTR(&poc->tGjEvRstTime, by1, dStep);
	poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && by1);
#endif 

	//告警记录及出口
	if(bTrip)	// 条件满足，置动作灯
	{	
		poc->sta.bFlag.bDzLed = true;		
	}
	
	if(poc->sta.bFlag.bGj) 
	{
		// gz_soe_set_clr(1,sw,soeno,pSet->dI);
		if(soe_check(soeno))
			return;
		ui_begin = UI_SW_INDEX_BEGIN(sw);
		Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
		Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
		Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
		soe_record_ev(soeno, 1, Ia,Ib,Ic );       
	}
	else
	{
		// gz_soe_set_clr(0,sw,soeno,pSet->dI);
		if(!soe_check(soeno))
			return;

		soe_record_ev(soeno, 0, 0,0,0 ); 
	} 
}

void  Pro_over_i0(int sw,u32  dStep,int oc,int soe_no)
{
	bool bQDD,bTrip; 	

#ifdef GD_TEST_2021
	bool by1;
#endif

	TOC_T *poc = &g_tRelay[sw].tOC[oc];
	OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
	u16 soeno=soe_no+sw*EV_SW_NUM;	
	// 电流启动
	bQDD = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD); 
	poc->sta.bFlag.bQD  = (pSet->bTz || pSet->bGj) && bQDD; 
	RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
	bTrip=poc->tQDTime.boolTrip;  // 告警	
	poc->sta.bFlag.bGj=bTrip;  // 告警

#ifdef GD_TEST_2021
	// 故障遥信延时复归
	by1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
	RunTR(&poc->tGjEvRstTime, by1, dStep);
	poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && by1);
#endif 

	if(bTrip)	// 条件满足，置动作灯
	{	
		poc->sta.bFlag.bDzLed = true;		
	}

	if(poc->sta.bFlag.bGj) 
	{
		if(soe_check(soeno)==false)
		{
			int ui_begin;
			DWORD I0;
			ui_begin = UI_SW_INDEX_BEGIN(sw);
			I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
			soe_record_ev( soeno, 1, I0,0,0 ); 
		}
	}
	else
	{
		if(soe_check(soeno)==true)
		{
			soe_record_ev( soeno, 0, 0,0,0 ); 
		}
	} 
}
#ifdef EV_GL_STATR
void gl_start_soe_set(u8 set_clr, int sw,u16 soe_no)
{
	int ui_begin;
	DWORD Ia,Ib,Ic;
	ui_begin = UI_SW_INDEX_BEGIN(sw);
	Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
	Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
	Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
	ui_begin = UI_SW_INDEX_BEGIN(sw);
	if(soe_check(soe_no)!=set_clr)
	{
		soe_record_ev(soe_no, set_clr, Ia,Ib,Ic );       
	}
}
void lx_start_soe_set(u8 set_clr, int sw,u16 soe_no)
{
	int ui_begin;
	DWORD I0,U0;
	ui_begin = UI_SW_INDEX_BEGIN(sw);
	I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
	U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);		
	if(soe_check(soe_no)!=set_clr)
	{
		soe_record_ev(soe_no, set_clr, U0,I0,0 );       
	}
}
#endif
/******************************************************************************
函数名称：	gl_soe_set_clr
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-16
函数说明：	过流事件的建立和返回
参数说明：	set_clr: 1 建立，0 返回
			soe_no: 事件组的起始序号
			i_set: 当前过流保护的定值
返回值：  	无
修改记录：	
*/
int gl_soe_set_clr(u8 set_clr, int sw, u16 soe_no, u32 i_set,bool bfault)
{
    int ui_begin;
    ui_begin = UI_SW_INDEX_BEGIN(sw);
    switch(set_clr)
    {
        case 1:
        {
            DWORD Ia,Ib,Ic;
            Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
            Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
            Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
            if(soe_check(soe_no)==false)
            {
                soe_record_ev(soe_no, 1, Ia,Ib,Ic );
                if(bfault)rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD);  //录波类型：跳闸类
            }
            pro_check_gl_abc(sw,i_set,Ia,Ib,Ic); // 分相故障判断
#ifdef ADD_FD_GL_FX_BH_FUN
            pro_check_fd_gl_abc(sw,i_set,Ia,Ib,Ic,soe_no); // 分段分相故障判断
#endif
            if(soe_check(EV_GL_FAULT+sw*EV_SW_NUM)==false) // 过流总
            {
                soe_record_ev( EV_GL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
            }
            if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false)  //保护总
            {
                soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
            }
        }
        break;
        case 0:
        {
            if(soe_check(soe_no)==true)
            {
                soe_record_ev( soe_no, 0, 0,0,0 );
            }
            if(pro_check_gl_all(sw)==false)
            {
                pro_rst_event(sw,EV_IABC_GL);
                pro_rst_event(sw,EV_IAB_GL);
                pro_rst_event(sw,EV_IBC_GL);
                pro_rst_event(sw,EV_ICA_GL);
                pro_rst_event(sw,EV_IA_GL);
                pro_rst_event(sw,EV_IB_GL);
                pro_rst_event(sw,EV_IC_GL);
                pro_rst_event(sw,EV_GL_FAULT);   //过流总
#ifdef ADD_FD_GL_FX_BH_FUN
                pro_rst_fd_gl_event(sw,soe_no);  //分段分相故障返回
#endif
            }
            if(pro_check_fault_all(sw)==false)
            {
                pro_rst_event(sw,EV_ALL_FAULT);  //保护总
            }
        }
        break;
    }

	return 0;
}


/******************************************************************************
函数名称：	gz_soe_set_clr
函数版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-16
函数说明：	过流事件的建立和返回
参数说明：	set_clr: 1 建立，0 返回
			soe_no: 事件组的起始序号
			i_set: 当前过流保护的定值
返回值：  	无
修改记录：	
*/
int gz_soe_set_clr(u8 set_clr, int sw, u16 soe_no, u32 i_set)
{
	int ui_begin, i;
	DWORD Idz;
	ui_begin = UI_SW_INDEX_BEGIN(sw);
	switch(set_clr)
	{
		case 1:
		{
			if(soe_check(soe_no)==false)
			{
				DWORD Ia,Ib,Ic;
				Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
				Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
				Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
				soe_record_ev(soe_no, 1, Ia,Ib,Ic );       
			}
		
			for(i=0; i<3; i++)
			{
				if(soe_check(soe_no+i+1)==false)
				{
					if (g_ui[ui_begin + SW_AC_IA + i].m2[0] > i_set)
					{
						Idz = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA + i].m2[0]), 256, g_ui[ui_begin + SW_AC_IA + i].m2_factor_k);
						soe_record_ev( soe_no+i+1, 1, Idz, 0, 0);  
					}
				}
			}
		}
		break;
		case 0:
		{
			if(soe_check(soe_no)==true)
			{
				soe_record_ev( soe_no, 0, 0,0,0 ); 
			}
		
			for (i=0; i<3; i++)
			{
				if(soe_check(soe_no+i+1)==true)
				{
					soe_record_ev( soe_no+i+1, 0, 0,0,0 ); 
				}
			}

		}
		break;
	}

	return 0;
}

bool XBCalc(int sw,int index,DWORD xBcoe,bool bQD)
{
	if(bQD)
	{
		if( g_ui[UI_SW_INDEX(sw,index)].m2[1] > _MulFac_U(g_ui[UI_SW_INDEX(sw,index)].m2[0], xBcoe ))                         
		{
			return(true);
		}
	}
	return(false);
}

/*------------------------------ 测试函数 -------------------------------------
一个实体文件必须带一个本模块的测试函数来进行单元测试，如果的确不方便在本模块中
进行单元测试，必须在此注明实际的测试位置（例如在哪个实体文件中使用哪个测试函数）.
*/


/*------------------------------ 文件结束 -------------------------------------
*/
