#include "..\h\predefine.h" #ifdef _atbh_c_ /*SYS relational*/ #include #include "stdio.h" #include "stdLib.h" #include "..\h\lib.h" #include "..\h\variable.h" #include ".\inc\atbh.h" #include "..\h\predefine.h" #include "..\h\com_lib.h" #include ".\inc\parameter_atbh.h" #include ".\inc\analog_atbh.h" #include ".\inc\inout_atbh.h" extern void Reset_Init(void); void timer_interrupt(void); void TimerManage(void); void Check_QDZT (void); //启动AT自投 void Send_QDZT(); //向对侧发启动自投信号 void ATBH_FLDProtect(void); //非电量保护 void JiSuanUI(void); //计算电流电压 void ComputeTemperature(); //计算温度 void FaultProcess(void); //故障处理 void JiSuanMeasureValue(void); //计算测量值 void ChaDongProtect(void); //差动保护 void CheckDLQHW(void); //检测断路器位置 extern void CWWDProtectUnit(NoDirectProtectItemType *CWWDYJ); //温度告警 void SaveFaultData(void); void SaveFaultTime(void); void ATBH_FLDAlarm(void); void Check_PTDX(NoDirectProtectItemType *pPrtcUnit,char tvtype); void ChongHeZha(void); void CheckChongDianTime(void); void StartTiaoZha_atbh(void); extern void StatusLightKCHandle(unsigned int KCNo,unsigned char status); extern int CheckAnLedRecord(AnLEDCtrlType * pObject,unsigned int timeDelay); extern int SwitchContrl(unsigned char ObjectNo, unsigned char Property,unsigned int *timer,unsigned char type); void ATZTDongZuo(void); extern void gse_handle(void); extern void SendGetTimeCommand(); extern void CopyYaoXinBianWei(); extern void digit_mainTask(); void SaveWave_Id(); void atbh_check_u(); void record_reclose_soe(void); void atbh_check_position_change(); //检测位置变化 extern void printf_record(int tag1, int tag2,int tag3,int tag4,int tag5); int fristFaultIndex = 0; static int ZB_fristFaultIndex = 0; static int ZB_SYZT_able = ON; //float xb2,xb3,xb5= 0; /******************************************************** * void timer_interrupt(void) * 描述:保护中断服务程序,中断时间间隔为:20ms/24=5ms/6 * 历史: 创建日期不详 * ******************************************************/ void timer_interrupt(void) { unsigned int BaoHuQiDongIP_OLD; static volatile int intFlag = 0; int isprtcopen; if(0 != intFlag) { printf("ms int is not return\n"); return; } intFlag = 1; ClockTick(&SysTime); ModiClock(); //时钟管理 #ifdef CCES_ADI execute_as_subscriber(); #endif isprtcopen = check_prtc_open(); if(Init_IP==TEST_START) //屏蔽采样中断服务程序 { digit_Polling(); //SaveWave_Id(); #if 0 //20140701 luoyang add for test if(IP != InPort.Status[ATBH_WD2_KR]) { IP = InPort.Status[ATBH_WD2_KR]; //将受到的状态发送出去 RecordSoftYaoXin(ATBH_YAOXIN_WD2,IP); D_OUT(ATBH_QF_TZ_KC,IP); } #endif //changeFourierVarType();// JiSuanUI(); //计算电流电压 CheckAnalogZcp(&ZcpSet); //#ifdef DEVICE_TYPE_CONVENTIONAL //ComputeTemperature(); //计算温度 //#endif //TimerManage(); //定时器管理 //SaveWave(); //保存4周波实时波形数据 SaveLoadWave(); //负荷录波 //SaveFaultWave(); //故障录波 CheckChuanDongTest(); //传动试验 CheckChongDianTime(); //重合闸充电 //OUTManage(); //开出管理 Check_QDZT(); //启动AT自投 ATZTDongZuo(); ItemClsDwnProcess();// if(LS_TR == ATBH_LS) { block_CheckYaoXin(); } BaoHuQiDongIP_OLD=BaoHuQiDongIP; FaultSoeStartCode = get_protect_soe_write_ip(); atbh_check_position_change(); //检测位置变化 //用户定值正确 if(isprtcopen) { /* StartTiaoZha(); FaultProcess(); SetFaultStart(); CheckFaultEnd(); */ CheckRmote(); //SoeRcordDecision(); ChaDongProtect(); //差动保护 atbh_check_u(); //检有压 switch(IntCount) { case 0: //SoeRcordDecision(); //ChaDongProtect(); //差动保护 CheckDLQHW(); //检测断路器位置 UIProtectUnit1(&ATBH_SYYJ,ATBH_HW_BIT); //失压保护 //UIProtectUnit(&ATBH_JDIYJ,1,1); //碰壳保护 #ifdef TEMPERATURE_ENABLE UIAlarmUnit(&ATBH_CWWD1YJ,0,2); //温度1告警元件 UIAlarmUnit(&ATBH_CWWD2YJ,0,2); //温度2告警元件 #endif ATBH_FLDProtect(); //非电量保护 ATBH_FLDAlarm(); //非电量告警 IntCount=1; break; case 1: //UIAlarmUnit(&ATBH_CLYXYJ,0,2); //差流越限告警 //过负荷告警 if(ISOLATOR_TYPE == ATBH_ATMode) { UIAlarmUnit(&ATBH_FIYJ,!(TempQiDongIP & ATBH_HW_BIT),2); } else { UIAlarmUnit(&ATBH_FIYJ,0,2); //过负荷告警 } Check_PTDX(&ATBH_TPTDXYJ,0); //T线PT断线检测 Check_PTDX(&ATBH_FPTDXYJ,1); //F线PT断线检测 IntCount=0; break; default: IntCount=0; break; } //endcase } TimerManage(); //定时器管理 if(isprtcopen) { SaveFaultWave(); //故障录波 20220629 // 重合闸后加速启动时避免出现另外一次故障报告,如果出现任何故障重合闸程序就会完成跳闸 if(CHZValue.Status == CHZ_CLOSE) { StartTiaoZha_atbh(); } FaultProcess(); ChongHeZha(); record_reclose_soe(); SetFaultStart(); CheckFaultEnd(); } if((BaoHuQiDongIP_OLD==0)&&(BaoHuQiDongIP!=0)&&(QiDongTime==0)) QiDongTime=1; }//end of if(Init_IP==TEST_START) //gse_handle(); intFlag = 0; } void CheckDLQHW(void) { //功能说明:检测断路器位置 if(YaoXinStatus[ATBH_rmtsignal_run]!=OFF) { TempQiDongIP|=ATBH_HW_BIT; } else { TempQiDongIP&=~ATBH_HW_BIT; } } void computedlldiff(unsigned int startbit) { tagDLL_Rated_Frq *pDiffBuffer,*pResBuffer; if(BH_RUN != ATBH_DLLDIFFTouRu) { return; } pDiffBuffer = &ATBH_DLLDIFFBUF; pResBuffer = &ATBH_DLLRESBUF; if(BaoHuQiDongIP & startbit) { //增量启动 DLLDiffValue.CDI.Value = ChaDongValue.CDI.Value - pDiffBuffer->basevalue; DLLDiffValue.ZDI.Value = ChaDongValue.ZDI.Value - pResBuffer->basevalue; } else { //增量未启动 DLLDiffValue.CDI.Value = ChaDongValue.CDI.Value - pDiffBuffer->buffer[pDiffBuffer->recordip]; pDiffBuffer->basevalue = pDiffBuffer->buffer[pDiffBuffer->recordip]; DLLDiffValue.ZDI.Value = ChaDongValue.ZDI.Value - pResBuffer->buffer[pResBuffer->recordip]; pResBuffer->basevalue = pResBuffer->buffer[pResBuffer->recordip]; } pDiffBuffer->buffer[pDiffBuffer->recordip] = ChaDongValue.CDI.Value; //保存当前保护绕组电流 pResBuffer->buffer[pResBuffer->recordip] = ChaDongValue.ZDI.Value; //保存当前保护绕组电流 //pDiffBuffer->recordip = (pDiffBuffer->recordip + 1) % (DDL_BUFFFER_RATED_FRQ_LEN_HALF); //修改指针 pDiffBuffer->recordip++; if(pDiffBuffer->recordip >= DDL_BUFFFER_RATED_FRQ_LEN) { pDiffBuffer->recordip -= DDL_BUFFFER_RATED_FRQ_LEN; } //pResBuffer->recordip = (pResBuffer->recordip + 1) % (DDL_BUFFFER_RATED_FRQ_LEN_HALF); //修改指针 pResBuffer->recordip++; if(pResBuffer->recordip >= DDL_BUFFFER_RATED_FRQ_LEN) { pResBuffer->recordip -= DDL_BUFFFER_RATED_FRQ_LEN; } } /************************************************************ * void JiSuanUI(void) * 描述:有效值、谐波含量、差动电流、制动电流 * 历史:创建日期不详 * ***********************************************************/ void JiSuanUI(void) { float FS_temp,FC_temp; float FS_temp_TCD,FC_temp_TCD,FS_temp_FCD,FC_temp_FCD,val,currentflag; unsigned char Switch_status; //计算基波有效值 //T线电压 FS_temp=ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //printf("fs = %f,fc = %f,val = %f\n",FS_temp,FC_temp,ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].Analog.Value); //F线电压 FS_temp=ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //T线保护绕组电流 FS_temp=ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //T线测量绕组电流 FS_temp=ChannelValue[CH_ATBH_CL_I].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_CL_I].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_CL_I].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //T线差动绕组电流 FS_temp=ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //F线保护绕组电流 FS_temp=ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //F线测量绕组电流 FS_temp=ChannelValue[CH_ATBH_CL_IF].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_CL_IF].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_CL_IF].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //T线差动绕组电流 FS_temp=ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].FS; FC_temp=ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].FC; ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //接地电流 //FS_temp=ChannelValue[CH_ATBH_JDI].YouXiaoZhi[JiBo].FS; //FC_temp=ChannelValue[CH_ATBH_JDI].YouXiaoZhi[JiBo].FC; //ChannelValue[CH_ATBH_JDI].YouXiaoZhi[JiBo].Analog.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //计算保护电流 //保护电流=T线电流I+F线电流IF //基波电流 //FS_temp=((float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FS+(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FS); //FC_temp=((float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FC+(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FC); //ATBH_BaoHu_I.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //计算差动电流 //断路器连接方式或隔开连接方式下GK0位置不为合位 //if(BREAKER_TYPE == ATBH_ATMode || (ISOLATOR_TYPE == ATBH_ATMode && ON != YaoXinStatus[ATBH_YAOXIN_GK0])) if(BREAKER_TYPE == ATBH_ATMode || (ISOLATOR_TYPE == ATBH_ATMode && OFF == YaoXinStatus[ATBH_YAOXIN_GK0])) //modi by 20240520 LW { //AT是采用断路器接入 //T线保护电流 ATBH_BaoHu_IT.Value = ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].Analog.Value; //差动电流 FS_temp=(float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FS-(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FS; FC_temp=(float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FC-(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FC; ChaDongValue.CDI.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //制动电流 FS_temp=((float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FS+(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FS)/2; FC_temp=((float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FC+(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FC)/2; ChaDongValue.ZDI.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //差动二次谐波电流含量 FS_temp=(float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[XieBo2].FS-(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[XieBo2].FS; FC_temp=(float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[XieBo2].FC-(float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[XieBo2].FC; ATBH_ChaDong_I2.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); if(ChaDongValue.CDI.Value>ATBH_JD_I) { ATBH_ChaDong_I2.Value=ATBH_ChaDong_I2.Value/ChaDongValue.CDI.Value; #ifdef IH_PERCENT_UNIT ATBH_ChaDong_I2.Value *= PERCENT_UNIT_COEFFI; #endif } else { ATBH_ChaDong_I2.Value=0; } } else { //差动电流 FS_temp_TCD = (float)ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].FS + (float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FS; FC_temp_TCD = (float)ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].FC + (float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].FC; //T线保护电流 ATBH_BaoHu_IT.Value = sqrt(FS_temp_TCD * FS_temp_TCD + FC_temp_TCD * FC_temp_TCD); FS_temp_FCD = (float)ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].FS + (float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FS; FC_temp_FCD = (float)ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].FC + (float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].FC; FS_temp = FS_temp_TCD - FS_temp_FCD; FC_temp = FC_temp_TCD - FC_temp_FCD; ChaDongValue.CDI.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //制动电流 FS_temp = (FS_temp_TCD + FS_temp_FCD ) / 2; FC_temp = (FC_temp_TCD + FC_temp_FCD ) / 2; ChaDongValue.ZDI.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); //差动二次谐波电流含量 FS_temp_TCD = (float)ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[XieBo2].FS + (float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[XieBo2].FS; FC_temp_TCD = (float)ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[XieBo2].FC + (float)ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[XieBo2].FC; FS_temp_FCD = (float)ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[XieBo2].FS + (float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[XieBo2].FS; FC_temp_FCD = (float)ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[XieBo2].FC + (float)ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[XieBo2].FC; FS_temp = FS_temp_TCD - FS_temp_FCD; FC_temp = FC_temp_TCD - FC_temp_FCD; ATBH_ChaDong_I2.Value=sqrt(FS_temp*FS_temp+FC_temp*FC_temp); if(ChaDongValue.CDI.Value>ATBH_JD_I) { ATBH_ChaDong_I2.Value=ATBH_ChaDong_I2.Value/ChaDongValue.CDI.Value; #ifdef IH_PERCENT_UNIT ATBH_ChaDong_I2.Value *= PERCENT_UNIT_COEFFI; #endif } else { ATBH_ChaDong_I2.Value=0; } } //之前没有差流 //识别空投 currentflag = ATBH_JD_I < ChaDongValue.CDI.Value || ATBH_JD_I < ChaDongValue.ZDI.Value ; #if 0 if(OFF == YaoXinStatus[ATBH_YAOXIN_QF] && currentflag) { if(0 == ATBH_I_Flag) { //从无流到有流 ATBH_I_Flag = 1; ATBH_I_Timer = 1; } } else { //无流 ATBH_I_Flag = 0; } #else Switch_status = ON; if(BREAKER_TYPE == ATBH_ATMode) {//断路器接入方式 if(OFF == YaoXinStatus[ATBH_YAOXIN_QF]) { Switch_status = OFF; } } else {//隔开接入接入方式 if(OFF == YaoXinStatus[ATBH_YAOXIN_1QSDD_1QF]) { Switch_status = OFF; } else if(OFF != YaoXinStatus[ATBH_YAOXIN_GK0] && OFF == YaoXinStatus[ATBH_YAOXIN_2QSDD_2QF]) { Switch_status = OFF; } } if(OFF == Switch_status && currentflag) { if(0 == ATBH_I_Flag) { //从无流到有流 ATBH_I_Flag = 1; ATBH_I_Timer = 1; } } else { //无流 ATBH_I_Flag = 0; } #endif //电压最大值,用于失压 if(ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].Analog.Value >= ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].Analog.Value) { ATBH_Baohu_UMax = ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].Analog; } else { ATBH_Baohu_UMax = ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].Analog; } //计算增量差动、制动电流 computedlldiff(ATBH_DLLDIFF_BIT); /* if(SaveFaultDataIP!=0) { SaveFaultDataIP++; if(SaveFaultDataIP>= 3) {//延时10ms记录 SaveFaultDataIP=0; SaveFaultData(); } } */ #ifdef TEMPERATURE_ENABLE //温度1 digital_getTemperature(CH_ATBH_WD1); //温度2 digital_getTemperature(CH_ATBH_WD2); #endif } /************************************************************ * void ComputeTemperature() * 描述:计算温度 * 历史: ************************************************************/ void ComputeTemperature() { #ifdef AD_TEMPERATURE_ENABLE float I1,T1,K1; //温度1 温度基准 电流基准 曲线斜率 float I2,T2,K2; //温度2 温度基准 电流基准 曲线斜率 float Itemp1,Itemp2; I1=ATBH_WD1ISet; T1=ATBH_WD1TSet; K1=ATBH_WD1KSet; I2=ATBH_WD2ISet; T2=ATBH_WD2TSet; K2=ATBH_WD2KSet; //20150416 luoyang modi 温度采样点取40点平均值 //Itemp1=(float)ChannelValue[CH_ATBH_WD1].SampleValue_Digit[ChannelValue[CH_ATBH_WD1].FSCount]; //Itemp2=(float)ChannelValue[CH_ATBH_WD2].SampleValue_Digit[ChannelValue[CH_ATBH_WD2].FSCount]; if(WD_SOURCE_GSE != ChannelValue[CH_ATBH_WD1].source) { Itemp1 = SmpValueSet[CH_ATBH_WD1].averageValue; ChannelValue[CH_ATBH_WD1].YouXiaoZhi[JiBo].Analog.Value=K1*(Itemp1-I1)+T1;//温度1 } if(WD_SOURCE_GSE != ChannelValue[CH_ATBH_WD2].source) { Itemp2 = SmpValueSet[CH_ATBH_WD2].averageValue; ChannelValue[CH_ATBH_WD2].YouXiaoZhi[JiBo].Analog.Value=K2*(Itemp2-I2)+T2;//温度2 } #endif } //检有压功能,用于重合闸及自投 void atbh_check_u() { float setval; if(ATBH_YY_BIT & TempQiDongIP) { setval = ATBH_JYYSet.SetValue * COEFFI_RETURN_OVER; } else { setval = ATBH_JYYSet.SetValue; } if(ATBH_Baohu_UMax.Value >= setval) { if(ATBH_checku_timer >= ATBH_JYYSet.Time) { TempQiDongIP |= ATBH_YY_BIT; } else { ATBH_checku_timer++; } } else { ATBH_checku_timer = 0; TempQiDongIP &= ~ATBH_YY_BIT; } } //检并联隔开位置变化,用于单开关并联的检有压自投 void atbh_check_position_change() //检测位置变化 { CanShuType canshu; canshu.Number=0; static unsigned char RecordDlstatus = OFF; if(RecordDlstatus != YaoXinStatus[ATBH_YAOXIN_GK0]) { if(RecordDlstatus == ON) {//变位前为合位 kcDelayTimer_11 = 1; } else {//变位前为分位 if(ON == YaoXinStatus[ATBH_YAOXIN_GK0]) { //kcDelayTimer_9 = 1; kcDelayTimer_11 = 0; } } RecordDlstatus = YaoXinStatus[ATBH_YAOXIN_GK0]; } } /******************************************************************** * void Check_PTDX(void) * 描述: PT断线检测 * 历史: 创建日期不详 * luoyang 修改启动判据,增加对截断电流的判断 ********************************************************************/ void Check_PTDX(NoDirectProtectItemType *pPrtcUnit,char tvtype) { CanShuType CanShuValue; DataType *DataValue; float U_setval,U_setval_l; float uvalue; float ut,uf; DataValue = pPrtcUnit->MeasureValue; CanShuValue.Number = 1; CanShuValue.CSValue[0] = DataValue; //闭锁或者元件退出时,元件返回 if(pPrtcUnit->ClsDwnIP != 0 || pPrtcUnit->TouRuIP != BH_RUN) { //PT断线未投入 *((unsigned int *)(pPrtcUnit->IPAddress)) &= (~pPrtcUnit->QiDongBit); //清除启动标志 AlarmUnitActIP &= ~pPrtcUnit->QiDongBit; pPrtcUnit->TimeValue = 0; //清除计时器 if(ON == YaoXinStatus[pPrtcUnit->YaoXinNumber] || TEST_END == pPrtcUnit->SoeRecordIP) { //PT断线解除SOE事件记录 RecordSOE(pPrtcUnit->FanHuiCode,CanShuValue); //RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,OFF); //软遥信记录 pPrtcUnit->SoeRecordIP=TEST_START; //RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,OFF); //软遥信记录 //printf("val3 = %f,val4 = %f,cls = %d\n",DataValue->Value,CanShuValue.CSValue[0]->Value,pPrtcUnit->ClsDwnIP); } if(OFF != YaoXinStatus[pPrtcUnit->YaoXinNumber]) { RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,OFF); //软遥信记录 } return; } if(0 == tvtype) { uvalue = ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].Analog.Value; } else { uvalue = ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].Analog.Value; } if((*((unsigned int *)(pPrtcUnit->IPAddress))&pPrtcUnit->QiDongBit) != 0) { U_setval = ATBH_PTDXSet * COEFFI_RETURN_UNDER; U_setval_l = ATBH_PTDXSet * COEFFI_RETURN_OVER; } else { U_setval = ATBH_PTDXSet; U_setval_l = ATBH_PTDXSet; } if(uvalue > U_setval_l && DataValue->Value <= U_setval) { //PT断线 *((unsigned int *)(pPrtcUnit->IPAddress))|=pPrtcUnit->QiDongBit; //设置启动标志 if(pPrtcUnit->TimeValue > pPrtcUnit->SetTime) { AlarmUnitActIP |= pPrtcUnit->QiDongBit; if(pPrtcUnit->SoeRecordIP==TEST_START) {//PT断线SOE事件记录 RecordSOE(pPrtcUnit->QiDongCode,CanShuValue); //RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,ON); //软遥信记录 pPrtcUnit->SoeRecordIP=TEST_END; //printf("val1 = %f,val2 = %f\n",DataValue->Value,CanShuValue.CSValue[0]->Value); } if(ON != YaoXinStatus[pPrtcUnit->YaoXinNumber]) { RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,ON); //软遥信记录 } } else pPrtcUnit->TimeValue+=2; //计时器加2 } else { *((unsigned int *)(pPrtcUnit->IPAddress))&=(~pPrtcUnit->QiDongBit); //清除启动标志 AlarmUnitActIP &= ~pPrtcUnit->QiDongBit; pPrtcUnit->TimeValue=0; //清除计时器 if(pPrtcUnit->SoeRecordIP==TEST_END || ON == YaoXinStatus[pPrtcUnit->YaoXinNumber]) { //PT断线解除SOE事件记录 RecordSOE(pPrtcUnit->FanHuiCode,CanShuValue); //RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,OFF); //软遥信记录 pPrtcUnit->SoeRecordIP=TEST_START; //printf("val1 = %f,val2 = %f\n",DataValue->Value,CanShuValue.CSValue[0]->Value); } if(OFF != YaoXinStatus[pPrtcUnit->YaoXinNumber]) { RecordSoftYaoXin(pPrtcUnit->YaoXinNumber,OFF); //软遥信记录 } } } /*********************************************************** * void Check_QDZT (void) * 描述: 检测启动自投信号 * 历史: 启动自投信号为分的时候才能响应复归, * 复归时收回软遥信 ***********************************************************/ void Check_QDZT (void) { static unsigned char ATBH_QDZT_KR_OLD_status = ON ; if(ON == drv_GetInputStatus(ATBH_ZTTR_KR)&& BH_RUN == ATBH_SoftStrap_AtSwitch) { //ATBH_ZT_ENABLE = BH_RUN; if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH,ON); } } else { //ATBH_ZT_ENABLE = BH_STOP; if(OFF != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH,OFF); } } //1.自投处于未动作状态 //2.硬压板及软压板已投入 //3.并联隔开处于合位 //4.AT处于退出态 //5.有压 //6.无本体故障标志(本体未动作或动作后已复归)20220331增加 /*if(TEST_CLOSE == ZTDongZuoIP && ON == YaoXinStatus[ATBH_YAOXIN_AT_SWITCH] && (OFF != YaoXinStatus[ATBH_YAOXIN_GK0]) && 0 == BaoHuQiDongIP && (ATBH_YY_BIT & TempQiDongIP) && 0 == CheckPrtcFlag(ATBH_BTGZ_KC,0,0,ON))*/ //modi by 20240521 LW 修改自投就绪判据 由不在分位判断改为(本侧线路有压且并联开关分位)或并联开关不在分位 //1.自投处于未动作状态或动作成功 //2.硬压板及软压板已投入 //3.(本侧线路有压且并联开关分位)或并联开关不在分位 //4.AT处于退出态 //5.无本体故障标志(本体未动作或动作后已复归)20220331增加 if(TEST_CLOSE == ZTDongZuoIP && ON == YaoXinStatus[ATBH_YAOXIN_AT_SWITCH] && (BH_RUN != ATBH_SYYJ.TouRuIP || (BH_RUN == ATBH_SYYJ.TouRuIP && (ATBH_YY_BIT & TempQiDongIP))) && (OFF == YaoXinStatus[ATBH_rmtsignal_run]) && 0 == BaoHuQiDongIP && 0 == CheckPrtcFlag(ATBH_BTGZ_KC,0,0,ON)) { //自投就绪 if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_RESET]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_RESET,ON); D_OUT(ATBH_ZTJX_LED_KC,ON); } //20210414 统一硬件时修改为自投均检有压 //if(ON == drv_GetInputStatus(ATBH_QDZT_KR) && OFF == YaoXinStatus[ATBH_rmtsignal_run] ) if(ON == drv_GetInputStatus(ATBH_QDZT_KR) && (ATBH_QDZT_KR_OLD_status !=drv_GetInputStatus(ATBH_QDZT_KR)) ) { //有压 //if(ATBH_Baohu_UMax.Value >= ATBH_JYYSet.SetValue) //{ ZTDongZuoIP = TEST_START; //启动自投 //} } } else { //自投就绪 if(OFF != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_RESET]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_RESET,OFF); D_OUT(ATBH_ZTJX_LED_KC,OFF); } } ATBH_QDZT_KR_OLD_status = drv_GetInputStatus(ATBH_QDZT_KR); #if 0 switch(ZTDongZuoIP) { case TEST_CLOSE: //可以进行自投 if(BH_RUN == ATBH_ZT_ENABLE) { //自投就绪 if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_RESET]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_RESET,ON); } //20210414 统一硬件时修改为自投均检有压 if(ON == drv_GetInputStatus(ATBH_QDZT_KR)) { //ZTDongZuoIP = TEST_START; //启动自投 //有压 if(ATBH_Baohu_UMax.Value >= ATBH_JYYSet.SetValue) { ZTDongZuoIP = TEST_START; //启动自投 } } /* else if(ON == YaoXinStatus[ATBH_YAOXIN_JYYZT]) { //有压 if(BREAKER_TYPE == ATBH_ATMode && ATBH_Baohu_UMax.Value >= ATBH_JYYSet.SetValue) { ZTDongZuoIP = TEST_START; //启动自投 } } */ } break; case TEST_START: //处于自投状态 break; case TEST_END: //自投结束,等待复归 break; default: break; }//endcase #endif } /*********************************************************** * void Send_QDZT (void) * 描述: 向对侧发启动自投信号 * 历史: ***********************************************************/ void Send_QDZT(int start) { //if(TEST_CLOSE != ZTDongZuoIP ) if( TEST_CLOSE != ZTDongZuoIP || ZB_fristFaultIndex >= 2 ) { return; } if(kcDelayTimer_1==0) { if(!start) { if((BaoHuDongZuoIP & ATBH_QDZT_Mask) != 0) { //modi by 20240521 LW 并联开关不定态当成合位判断 不在分位情况下方能发出自投信号 if(YaoXinStatus[ATBH_YAOXIN_GK0]!=OFF) { D_OUT(ATBH_CDJQ_KC,ON); kcDelayTimer_1 = 1; } } } else { D_OUT(ATBH_CDJQ_KC,ON); kcDelayTimer_1 = 1; } } /*if(((BaoHuDongZuoIP & ATBH_QDZT_Mask) != 0 || 0 != start)&&(kcDelayTimer_1==0)) { //modi by 20240520 LW 并联开关不定态当成合位判断 不在分位情况下方能发出自投信号 if(YaoXinStatus[ATBH_YAOXIN_GK0]!=OFF) { D_OUT(ATBH_CDJQ_KC,ON); kcDelayTimer_1 = 1; } }*/ } /***************************************************** * void ChaDongProtect(void) * 描述:差动保护功能实现,差动保护的实现方式与AT的接入方式有关 * 历史:创建日期不详 * *****************************************************/ void ChaDongProtect(void) { unsigned int blockbit = 0; ATBH_CD_StartIP = 0; static int chenckIP=0; CanShuType canshu; canshu.Number=0; if(ATBH_ATMode==BREAKER_TYPE) { //AT是采用断路器接入方式 //DiffXieBo2Unit(&ATBH_XieBo2CDIYJ,1,BaoHuQiDongIP & (ATBH_CD_BIT | ATBH_DLLDIFF_BIT)); //比率差动二次谐波闭锁元件(差动) DiffXieBo2UnitPlus(&ATBH_XieBo2CDIYJ,1,BaoHuQiDongIP & (ATBH_CD_BIT | ATBH_DLLDIFF_BIT),ATBH_I_Timer); //比率差动二次谐波闭锁元件(差动) //DiffXieBo2Unit(&ATBH_XieBo2CDIYJ,1,1); //比率差动二次谐波闭锁元件(差动) UIProtectUnit(&ATBH_CDSDYJ,1,1); //差动速断 //blockbit = DiffProtectUnit(&ATBH_CDYJ,ATBH_XieBoCDI2_BIT,NULL); //比率差动 blockbit = DiffProtectUnit(&ATBH_CDYJ,ATBH_XieBoCDI2_BIT,&ATBH_CD_StartIP); //比率差动 if(BH_RUN == ih_diff_alram_block) { blockbit |= DiffAlarmUnit(&ATBH_CLYXYJ,ATBH_XieBoCDI2_BIT,1); //差流越限告警 } else { DiffAlarmUnit(&ATBH_CLYXYJ,0,1); //差流越限告警 } blockbit |= DeltaDiffProtectUnitplus(&ATBH_DLLDIFFAYJ,ATBH_XieBoCDI2_BIT,&ATBH_CD_StartIP); //增量差动 } else { //隔离开关接入方式 //若AT投入运行,才有差动保护 //if((YaoXinStatus[ATBH_rmtsignal_run]!=OFF)|| (BaoHuQiDongIP&(ATBH_CDSD_BIT|ATBH_CD_BIT | ATBH_DLLDIFF_BIT)) || ( TempQiDongIP & ATBH_CLYX_BIT ))// if((YaoXinStatus[ATBH_rmtsignal_run]!=OFF)|| (BaoHuQiDongIP&(ATBH_CDSD_BIT|ATBH_CD_BIT | ATBH_DLLDIFF_BIT)) || (ATBH_CLYX_BIT & TempQiDongIP ))// { //DiffXieBo2Unit(&ATBH_XieBo2CDIYJ,1,BaoHuQiDongIP & (ATBH_CD_BIT | ATBH_DLLDIFF_BIT)); //差动二次谐波闭锁元件(差动) DiffXieBo2UnitPlus(&ATBH_XieBo2CDIYJ,1,BaoHuQiDongIP & (ATBH_CD_BIT | ATBH_DLLDIFF_BIT),ATBH_I_Timer); //比率差动二次谐波闭锁元件(差动) UIProtectUnit(&ATBH_CDSDYJ,1,1); //差动速断 //blockbit = DiffProtectUnit(&ATBH_CDYJ,ATBH_XieBoCDI2_BIT,NULL); //比率差动 blockbit = DiffProtectUnit(&ATBH_CDYJ,ATBH_XieBoCDI2_BIT,&ATBH_CD_StartIP); //比率差动 if(BH_RUN == ih_diff_alram_block) { blockbit |= DiffAlarmUnit(&ATBH_CLYXYJ,ATBH_XieBoCDI2_BIT,1); //差流越限告警 } else { DiffAlarmUnit(&ATBH_CLYXYJ,0,1); //差流越限告警 } blockbit |= DeltaDiffProtectUnitplus(&ATBH_DLLDIFFAYJ,ATBH_XieBoCDI2_BIT,&ATBH_CD_StartIP); //增量差动 } } //endelse hi_blcok_soe_record(&ATBH_XieBo2CDIYJ,blockbit); } /********************************************************** * void IProtectUnit(void) * 描述:过流保护元件功能的实现 * 历史:创建日期不详 * **********************************************************/ /* void IProtectUnit(void) { float SetValue; CanShuType CanShuValue; DataType *DataValue; float TempValue; unsigned char QiDongValue; DataValue=ATBH_IYJ.MeasureValue; //取测量值 //设置参数 CanShuValue.Number = 1; CanShuValue.CSValue[0]=DataValue; if(ATBH_IYJ.ClsDwnIP != 0 || (ATBH_IYJ.TouRuIP!=BH_RUN && ATBH_IYJ.TouRuIP != BH_TEST)) { //保护元件未投入 //清除启动标志 *((unsigned int *)(ATBH_IYJ.IPAddress))&=~ATBH_IYJ.QiDongBit; //清除计时器 ATBH_IYJ.TimeValue=0; if(ATBH_IYJ.SoeRecordIP==TEST_END) { RecordSOE(ATBH_IYJ.FanHuiCode,CanShuValue); ATBH_IYJ.SoeRecordIP=TEST_START; } return; } //检测综合谐波抑制元件是否启动 if((TempQiDongIP&ATBH_XieBoSum_BIT)!=0){ //综合谐波抑制 if(DataValue->Value>=2*ATBH_IYJ.SetValue) TempValue=DataValue->Value; //超过定值两倍则不抑制 else TempValue=DataValue->Value*(1-ATBH_BaoHu_IE.Value*ATBH_XieBo_XiShu); } else TempValue=DataValue->Value; //不抑制 //检测元件是否已启动 if(((*((unsigned int *)ATBH_IYJ.IPAddress))&ATBH_IYJ.QiDongBit)!=0) SetValue=0.97*ATBH_IYJ.SetValue; //保护元件已启动,整定值*返回系数 else SetValue=ATBH_IYJ.SetValue; if(TempValue>=SetValue) QiDongValue=1; //启动 else QiDongValue=0; //返回 //检查二次谐波是否启动 if((TempQiDongIP&ATBH_XieBoI2_BIT)!=0) QiDongValue=0; //二次谐波启动,闭锁保护 if(((ATBH_DYYJ.TouRuIP==BH_RUN)||(ATBH_DYYJ.TouRuIP==BH_TEST))&&((TempQiDongIP&ATBH_LU_BIT)==0)) QiDongValue=0; //低压启动元件未启动,闭锁保护 if(QiDongValue==1){ //启动 *((unsigned int *)(ATBH_IYJ.IPAddress))|=ATBH_IYJ.QiDongBit; //启动计时器 if(ATBH_IYJ.TimeValue==0) ATBH_IYJ.TimeValue=1; //启动事件记录 if(ATBH_IYJ.SoeRecordIP==TEST_START){ RecordSOE(ATBH_IYJ.QiDongCode,CanShuValue); ATBH_IYJ.SoeRecordIP=TEST_END; } } else{ //返回 //清除启动标志 *((unsigned int *)(ATBH_IYJ.IPAddress))&=(~ATBH_IYJ.QiDongBit); //清除计时器 ATBH_IYJ.TimeValue=0; //返回事件记录 if(ATBH_IYJ.SoeRecordIP==TEST_END){ RecordSOE(ATBH_IYJ.FanHuiCode,CanShuValue); ATBH_IYJ.SoeRecordIP=TEST_START; } } } */ /********************************************************* * void ATBH_FLDProtect(void) * 描述:非电量保护功能实现 * 历史:创建日期不详 **********************************************************/ void ATBH_FLDProtect(void) { //unsigned int Status; FDLProtectUnit_SWTRELA(&ATBH_ZWSYJ,ATBH_rmtsignal_run); //重瓦斯元件 FDLProtectUnit_SWTRELA(&ATBH_WD2YJ,ATBH_rmtsignal_run); //温度Ⅱ段元件 FDLProtectUnit_SWTRELA(&ATBH_YLSFYJ,ATBH_rmtsignal_run); //压力释放元件 z FDLProtectUnit_SWTRELA(&ATBH_BYXHYJ,ATBH_rmtsignal_run); //备用信号元件 z //Status=0; //if(!(BaoHuQiDongIP & (ATBH_ZWS_BIT | ATBH_WD1_BIT | ATBH_YLSF_BIT | ATBH_BAK_BIT))) //{ // BaoHuQiDongIP &= ~ATBH_FDL_BIT; //} if (TZValue.IP != SUCCESS) { return; //在跳闸失灵时,保护元件动作时限判断不执行 } //检测非电量保护是否启动 if(((*((unsigned int *)(ATBH_ZWSYJ.IPAddress)))&(ATBH_ZWSYJ.QiDongBit))!=0) {//启动 if(ATBH_ZWSYJ.YaoXinRecordIP==TEST_START) { //if(RecordSoftYaoXin(ATBH_YAOXIN_ZWS,ON)==SUCCESS) ATBH_ZWSYJ.YaoXinRecordIP=TEST_END; TempBaoHuDongZuoIP |= ATBH_ZWS_BIT; //记录保护辅助动作标志字 BaoHuDongZuoIP |= ATBH_ZWS_BIT; if(BH_RUN == ATBH_nonui_prtc_trip) { BaoHuChuKouIP |= ATBH_ZWS_BIT; } } //Status=1; } else { if(ATBH_ZWSYJ.YaoXinRecordIP==TEST_END) { ATBH_ZWSYJ.YaoXinRecordIP=TEST_START; //RecordSoftYaoXin(ATBH_YAOXIN_ZWS,OFF); } //TempBaoHuDongZuoIP &= ~ATBH_ZWS_BIT; //记录保护辅助动作标志字 } if(((*((unsigned int *)(ATBH_WD2YJ.IPAddress)))&(ATBH_WD2YJ.QiDongBit))!=0) { //启动 if(ATBH_WD2YJ.YaoXinRecordIP==TEST_START) { //if(RecordSoftYaoXin(ATBH_YAOXIN_WD2,ON)==SUCCESS) ATBH_WD2YJ.YaoXinRecordIP=TEST_END; TempBaoHuDongZuoIP|=ATBH_WD2_BIT; //记录保护辅助动作标志字 BaoHuDongZuoIP|=ATBH_WD2_BIT; //BaoHuQiDongIP|=ATBH_FDL_BIT; if(BH_RUN == ATBH_nonui_prtc_trip) { BaoHuChuKouIP |= ATBH_WD2_BIT; } } //Status=1; } else { if(ATBH_WD2YJ.YaoXinRecordIP==TEST_END) { ATBH_WD2YJ.YaoXinRecordIP=TEST_START; //RecordSoftYaoXin(ATBH_YAOXIN_WD2,OFF); } //TempBaoHuDongZuoIP &= ~ATBH_WD2_BIT; } if(((*((unsigned int *)(ATBH_YLSFYJ.IPAddress)))&(ATBH_YLSFYJ.QiDongBit))!=0) { //启动 if(ATBH_YLSFYJ.YaoXinRecordIP==TEST_START) { //if(RecordSoftYaoXin(ATBH_YAOXIN_YLSF,ON)==SUCCESS) ATBH_YLSFYJ.YaoXinRecordIP=TEST_END; TempBaoHuDongZuoIP|=ATBH_YLSF_BIT; //记录保护辅助动作标志字 BaoHuDongZuoIP |= ATBH_YLSF_BIT; //BaoHuQiDongIP|=ATBH_FDL_BIT; if(BH_RUN == ATBH_nonui_prtc_trip) { BaoHuChuKouIP|=ATBH_YLSF_BIT; } } //Status=1; } else { if(ATBH_YLSFYJ.YaoXinRecordIP==TEST_END) { ATBH_YLSFYJ.YaoXinRecordIP=TEST_START; //RecordSoftYaoXin(ATBH_YAOXIN_YLSF,OFF); } //TempBaoHuDongZuoIP &= ~ATBH_YLSF_BIT; } if(((*((unsigned int *)(ATBH_BYXHYJ.IPAddress)))&(ATBH_BYXHYJ.QiDongBit))!=0) { //启动 if(ATBH_BYXHYJ.YaoXinRecordIP==TEST_START) { //if(RecordSoftYaoXin(ATBH_YAOXIN_YLSF,ON)==SUCCESS) ATBH_BYXHYJ.YaoXinRecordIP=TEST_END; TempBaoHuDongZuoIP|=ATBH_BAK_BIT; //记录保护辅助动作标志字 BaoHuDongZuoIP|=ATBH_BAK_BIT; //BaoHuQiDongIP|=ATBH_FDL_BIT; if(BH_RUN == ATBH_nonui_prtc_trip) { BaoHuChuKouIP|=ATBH_BAK_BIT; } } //Status=1; } else { if(ATBH_BYXHYJ.YaoXinRecordIP==TEST_END) { ATBH_BYXHYJ.YaoXinRecordIP=TEST_START; //RecordSoftYaoXin(ATBH_YAOXIN_YLSF,OFF); } //TempBaoHuDongZuoIP &= ATBH_BAK_BIT; } //if(Status==0) BaoHuQiDongIP&=~ATBH_FDL_BIT; } /* void ATBH_FIAlarm() { if(BREAKER_TYPE == ATBH_ATMode) { UIAlarmUnit(&ATBH_FIYJ,0,2); } else { UIAlarmUnit(&ATBH_FIYJ,ON != YaoXinStatus[ATBH_rmtsignal_run],2); } } */ //非电量告警 //20220705 取消判断位置信号 modi by L.Y. void ATBH_FLDAlarm(void) { CanShuType param; param.Number = 0; //unsigned int isrun = 0; unsigned char fzjs; int start; //static int cls_reset_ip = 0;//重合闸充电标志 //if(ON == YaoXinStatus[ATBH_rmtsignal_run]) //{ // isrun = 1; //} //轻瓦斯 if(ON == drv_GetInputStatus(ATBH_QWS_KR)) { if(!(TempQiDongIP & ATBH_QWS_BIT)) { TempQiDongIP |= ATBH_QWS_BIT; AlarmUnitActIP |= ATBH_QWS_BIT; RecordSOE(ATBH_QWS_GJ,param); } } else if(TempQiDongIP & ATBH_QWS_BIT) { TempQiDongIP &= ~ATBH_QWS_BIT; AlarmUnitActIP &= ~ATBH_QWS_BIT; //RecordSOE(ATBH_QWS_GJ,param); } //温度1段 if(ON == drv_GetInputStatus(ATBH_WD1_KR)) { if(!(TempQiDongIP & ATBH_WD1_BIT)) { TempQiDongIP |= ATBH_WD1_BIT; AlarmUnitActIP |= ATBH_WD1_BIT; RecordSOE(ATBH_WD1_GJ,param); } } else if(TempQiDongIP & ATBH_WD1_BIT) { TempQiDongIP &= ~ATBH_WD1_BIT; AlarmUnitActIP &= ~ATBH_WD1_BIT; //RecordSOE(ATBH_QWS_GJ,param); } //油位低 if(ON == drv_GetInputStatus(ATBH_YWD_KR)) { if(!(TempQiDongIP & ATBH_YWD_BIT)) { TempQiDongIP |= ATBH_YWD_BIT; AlarmUnitActIP |= ATBH_YWD_BIT; RecordSOE(ATBH_YWD_GJ,param); } } else if(TempQiDongIP & ATBH_YWD_BIT) { TempQiDongIP &= ~ATBH_YWD_BIT; AlarmUnitActIP &= ~ATBH_YWD_BIT; //RecordSOE(ATBH_QWS_GJ,param); } //油位高 if(ON == drv_GetInputStatus(ATBH_YWG_KR)) { if(!(TempQiDongIP & ATBH_YWG_BIT)) { TempQiDongIP |= ATBH_YWG_BIT; AlarmUnitActIP |= ATBH_YWG_BIT; RecordSOE(ATBH_YWG_GJ,param); } } else if(TempQiDongIP & ATBH_YWG_BIT) { TempQiDongIP &= ~ATBH_YWG_BIT; AlarmUnitActIP &= ~ATBH_YWG_BIT; //RecordSOE(ATBH_QWS_GJ,param); } if(BREAKER_TYPE == ATBH_ATMode) { start = check_dl_open_innormal(&ATBH_dl_open_innormal_param,2); if(ON == YaoXinStatus[ATBH_YAOXIN_DL_YCFZ]) { //起动重合闸 if(BH_RUN == ATBH_YCFZ_CHZ_TuoRu && 0 == BaoHuQiDongIP && TZ_CLOSE == TZValue.Status && CHZ_CLOSE == CHZValue.Status && !(ATBH_YCFZ_BIT & AlarmUnitActIP)) { CHZValue.CHZTime = ATBH_CHZ_Time - 500; //启动重合闸延时计时器 500ms CHZValue.Status = CHZ_START; //启动重合闸 fristFaultIndex = FaultRecord.RecordIP; } AlarmUnitActIP |= ATBH_YCFZ_BIT; } else { AlarmUnitActIP &= ~ATBH_YCFZ_BIT; } fzjs = drv_GetInputStatus(ATBH_DL_FZJS_KR); if(fzjs != YaoXinStatus[ATBH_YAOXIN_DL_FZJS]) { RecordSoftYaoXin(ATBH_YAOXIN_DL_FZJS,fzjs); } //异常分闸起动重合闸 if(BH_RUN == ATBH_YCFZ_CHZ_TuoRu && 1 == start) { if(SUCCESS == CHZValue.ChongDianOK) { TempQiDongIP |= ATBH_CHZ_CDOK_BIT; } else { TempQiDongIP &= ~ATBH_CHZ_CDOK_BIT; } } } else { if(ON == YaoXinStatus[ATBH_YAOXIN_DL_YCFZ]) { AlarmUnitActIP |= ATBH_YCFZ_BIT; } else { AlarmUnitActIP &= ~ATBH_YCFZ_BIT; } } } /**************************************************** * void TimerManage() * 描述:定时器管理 * 历史:创建日期不详 *****************************************************/ void TimerManage(void) { static int temp = 0; CanShuType CanShu; CanShu.Number = 0; int cls_do,open_do; //BHCount++; MeasureSendDelay++; if(DelayTime!=0) DelayTime++; //延时计数器 if(RemoteValue.DelayTime!=0) RemoteValue.DelayTime++; //遥控计时器 if(TZValue.DelayCount!=0) TZValue.DelayCount++; //跳闸延时计数器 if(QiDongTime!=0) QiDongTime++; if(ChuanDongTest.TestDelay!=0) ChuanDongTest.TestDelay++; //开出计时 if(kcDelayTimer_0!=0) kcDelayTimer_0++; if(kcDelayTimer_1!=0) kcDelayTimer_1++; if(kcDelayTimer_2!=0) kcDelayTimer_2++; if(kcDelayTimer_3!=0) kcDelayTimer_3++; if(kcDelayTimer_4!=0) kcDelayTimer_4++; if(kcDelayTimer_5!=0) kcDelayTimer_5++; if(kcDelayTimer_6!=0) kcDelayTimer_6++; if(kcDelayTimer_7!=0) kcDelayTimer_7++; //if(kcDelayTimer_9!=0 && kcDelayTimer_9<=10000) kcDelayTimer_9++;//10以内 if(kcDelayTimer_10!=0) kcDelayTimer_10++; if(kcDelayTimer_11!=0 && kcDelayTimer_11<=10000) kcDelayTimer_11++; if(kcDelayTimer_12!=0) kcDelayTimer_12++; //自投开关控制定时器 if(ATZT_TIMER != 0) ATZT_TIMER ++; if(ATBH_I_Timer != 0) { ATBH_I_Timer++; //防止涌流衰减时间过长 if(ATBH_I_Timer > 2000 && 0 == ATBH_CD_StartIP) { ATBH_I_Timer = 0; } } //重合闸延时 if(CHZValue.CHZTime != 0) CHZValue.CHZTime++; //重合闸时间 if(CHZValue.DelayCount != 0) CHZValue.DelayCount++; //合闸延时计数器 //接口记录动作状态 WritePrtcFlagToInf(); //检测重合闸动作 CheckPrtcFlag(ATBH_CHZDZ_LED_KC,1,1,ON); //CheckAnLedRecord(&CHZDZLEDObject,RECORD_ST_KEEP_TIME); //检测跳闸动作 CheckPrtcFlag(ATBH_TZ_LED_KC,1,1,ON); //CheckAnLedRecord(&TZLEDObjdect,RECORD_ST_KEEP_TIME); //检测自投动作 //temp = CheckAnLedRecord(&ZTDZLEDObject,RECORD_ST_KEEP_TIME); if(0 == temp) { temp = 1; //初始化时检测到自投动作,动作过,未复归 if(1 == CheckPrtcFlag(ATBH_ZTDZ_LED_KC,1,1,ON)) { /*if(TEST_CLOSE == ZTDongZuoIP) { ZTDongZuoIP = TEST_END; }*/ //if(YaoXinStatus[ATBH_YAOXIN_ZT]!= ON) //{ //YaoXinStatus[ATBH_YAOXIN_ZT] = ON; // RecordSoftYaoXin(ATBH_YAOXIN_ZT,ON); //} } if(1 == CheckPrtcFlag(ATBH_BTGZ_KC,0,0,ON)) { ZB_fristFaultIndex++; } } if(kcDelayTimer_6 >= 1000) { if(OFF != YaoXinStatus[ATBH_YAOXIN_CHZDZ]) { RecordSoftYaoXin(ATBH_YAOXIN_CHZDZ,OFF); } kcDelayTimer_6 = 0; } if(ChuanDongTest.TestIP==TEST_CLOSE) //传动实验未完成不操作继电器 { //开出保护跳闸,测试端子 if(0 != BaoHuChuKouIP && 0 == ATBH_triptest_timer) { D_OUT(ATBH_TRIP_TEST_KC,ON); ATBH_triptest_timer = 1; } if(ATBH_triptest_timer > 0) { if(ATBH_triptest_timer > 100) { if(0 == BaoHuChuKouIP) { ATBH_triptest_timer = 0; } D_OUT(ATBH_TRIP_TEST_KC,OFF); } else { ATBH_triptest_timer++; } } if(kcDelayTimer_0>=SLKC_DELAY_TIME) { kcDelayTimer_0=0; D_OUT(ATBH_SL_KC,OFF); //收回断路器失灵开出 } if(kcDelayTimer_5>=SLKC_DELAY_TIME) { kcDelayTimer_5=0; D_OUT(ATBH_SL2_KC,OFF); //收回断路器2失灵开出 } if(kcDelayTimer_1>=500) { D_OUT(ATBH_CDJQ_KC,OFF); kcDelayTimer_1=0; } if(kcDelayTimer_7>=BHQDKC_DELAY_TIME) { D_OUT(ATBH_BHQD_KC,OFF); kcDelayTimer_7=0; } if(kcDelayTimer_2>=WITHDRAW_QFCTRL_MINTIME) { if(BCJ_OFF_IP == 1) { BCJ_OFF_IP = 0; kcDelayTimer_2 = 0; D_OUT(ATBH_BCJQ_KC,OFF); } } if(kcDelayTimer_3>=WITHDRAW_QFCTRL_MINTIME) { if(BCJ1_OFF_IP == 1) { BCJ1_OFF_IP = 0; kcDelayTimer_3 = 0; D_OUT(ATBH_1QS_DD_1QF_TZ_KC,OFF); } } if(kcDelayTimer_4>=WITHDRAW_QFCTRL_MINTIME) {// if(BCJ2_OFF_IP == 1) { BCJ2_OFF_IP = 0; kcDelayTimer_4 = 0; D_OUT(ATBH_2QS_DD_2QF_TZ_KC,OFF); } } //分位、合位灯 #ifdef DEVICE_TYPE_CONVENTIONAL if(BREAKER_TYPE == ATBH_ATMode) { cls_do = ATBH_QF_HW_KR; open_do = ATBH_QF_FW_KR; } else { cls_do = ATBH_QS1_HW_KR; open_do = ATBH_QS1_FW_KR; } if(ON == drv_GetInputStatus(cls_do)) { D_OUT(ATBH_QF_CLS_LED_DO,ON);//断路器合位 } else { D_OUT(ATBH_QF_CLS_LED_DO,OFF);//断路器合位 } if(ON == drv_GetInputStatus(open_do)) { D_OUT(ATBH_QF_OPEN_LED_DO,ON);//断路器分位 } else { D_OUT(ATBH_QF_OPEN_LED_DO,OFF);//断路器分位 } #else if(ON == YaoXinStatus[ATBH_rmtsignal_run]) { D_OUT(KX_QF_CLS_LED_DO,ON);//断路器合位 D_OUT(KX_QF_OPEN_LED_DO,OFF);//断路器分位 } else { D_OUT(KX_QF_CLS_LED_DO,OFF);//断路器合位 D_OUT(KX_QF_OPEN_LED_DO,ON);//断路器分位 } #endif } //保护元件计时器管理 if(TZValue.IP!=SUCCESS) return; //在跳闸失灵时,保护元件动作时限判断不执行 RecordChuKouSoe1(&ATBH_CDSDYJ,1); //差动速断 RecordChuKouSoe_CD(&ATBH_CDYJ); //比率差动 RecordChuKouSoe1Plus(&ATBH_SYYJ,1); //失压元件 RecordChuKouSoe_CD(&ATBH_DLLDIFFAYJ); } void CheckChongDianTime(void) { //重合闸软压板投入 //20190610 L.Y. modi if(BH_RUN == ATBH_SoftStrap_Reclse && ON == drv_GetInputStatus(ATBH_CHZTR_KR)) { ATBH_RECLS_ENABLE = BH_RUN; if(ON != YaoXinStatus[ATBH_YAOXIN_RECLS]) { RecordSoftYaoXin(ATBH_YAOXIN_RECLS,ON); } } else { ATBH_RECLS_ENABLE = BH_STOP; if(OFF != YaoXinStatus[ATBH_YAOXIN_RECLS]) { RecordSoftYaoXin(ATBH_YAOXIN_RECLS,OFF); } } //功能说明:重合闸充电时间检测。 if((YaoXinStatus[ATBH_YAOXIN_QF] == ON) && BH_RUN == ATBH_RECLS_ENABLE) { //开关在合位且重合闸投入 if(CHZValue.ChongDianTime < ATBH_CHZ_ChongDianTime) { CHZValue.ChongDianTime++; if(CHZValue.ChongDianTime >= ATBH_CHZ_ChongDianTime) { CHZValue.ChongDianOK = SUCCESS; if(ON != YaoXinStatus[ATBH_YAOXIN_CHZRSET]) { RecordSoftYaoXin(ATBH_YAOXIN_CHZRSET,ON); } //重合闸充电灯 if(ChuanDongTest.TestIP == TEST_CLOSE) { D_OUT(ATBH_CHZCD_LED_KC, ON); //亮重合闸充电指示灯 } } else if(ChuanDongTest.TestIP == TEST_CLOSE) { if(((CHZValue.ChongDianTime / 1000) % 2) == 0) { D_OUT(ATBH_CHZCD_LED_KC, ON); //亮重合闸充电指示灯 } else { D_OUT(ATBH_CHZCD_LED_KC, OFF); //灭重合闸充电指示灯 } } } } else { if(SUCCESS == CHZValue.ChongDianOK) { CHZValue.ChongDianTime++; //延时10ms if(CHZValue.ChongDianTime >= (ATBH_CHZ_ChongDianTime + 10)) { CHZValue.ChongDianTime = 0; //开关不在合位 CHZValue.ChongDianOK = FAIL; if(OFF != YaoXinStatus[ATBH_YAOXIN_CHZRSET]) { RecordSoftYaoXin(ATBH_YAOXIN_CHZRSET,OFF); } if(ChuanDongTest.TestIP == TEST_CLOSE) { D_OUT(ATBH_CHZCD_LED_KC, OFF); //灭重合闸充电指示灯 } } } else { CHZValue.ChongDianTime = 0; //开关不在合位 CHZValue.ChongDianOK = FAIL; if(OFF != YaoXinStatus[ATBH_YAOXIN_CHZRSET]) { RecordSoftYaoXin(ATBH_YAOXIN_CHZRSET,OFF); } if(ChuanDongTest.TestIP == TEST_CLOSE) { D_OUT(ATBH_CHZCD_LED_KC, OFF); //灭重合闸充电指示灯 } } } } void ClearTiaoZhaIP(void) { //功能说明:清除跳闸相关标志 QiDongTime=0; //清除保护元件启动时间 BaoHuDongZuoIP=0; //清除保护元件动作标志 //TempBaoHuDongZuoIP=0; //清除保护元件辅助动作标志 BaoHuChuKouIP=0; //清除保护元件出口标志 ATBH_RecloseFlag = 0; ATBH_CDSDYJ.ChuKouRecordIP=TEST_START; //差动速断 ATBH_CDYJ.ChuKouRecordIP=TEST_START; //比率差动 ATBH_DLLDIFFAYJ.ChuKouRecordIP = TEST_START; //增量差动 //ATBH_SDIYJ.ChuKouRecordIP=TEST_START; //电流速断 //ATBH_IYJ.ChuKouRecordIP=TEST_START; //过电流 //ATBH_JDIYJ.ChuKouRecordIP=TEST_START; //碰壳保护 ATBH_SYYJ.ChuKouRecordIP=TEST_START; //失压元件 //ATBH_FI2YJ.ChuKouRecordIP=TEST_START; //过负荷Ⅱ段元件 } void RecordYaoXin(void) { //功能说明:记录保护元件动作软遥信 if((BaoHuDongZuoIP&ATBH_CDSD_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_CDSD,OFF); //差动速断 if((BaoHuDongZuoIP&ATBH_CD_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_CD,OFF); //差动 if((BaoHuDongZuoIP&ATBH_DLLDIFF_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_DLLDIFF,OFF); //增量差动 //if((BaoHuDongZuoIP&ATBH_SDI_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_SDI,OFF); //电流速断 //if((BaoHuDongZuoIP&ATBH_I_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_I,OFF); //过电流 //if((BaoHuDongZuoIP&ATBH_FI_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_FI2,OFF); //过负荷 //if((BaoHuDongZuoIP&ATBH_JDI_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_JDI,OFF); //碰壳 if((BaoHuDongZuoIP&ATBH_SY_BIT)!=0) RecordSoftYaoXin(ATBH_YAOXIN_SY,OFF); //失压 } /*********************************************************** * void SaveFault(void) * 描述:保存故障报告数据 * 历史:创建日期不详 * ***********************************************************/ void SaveFault(int isFaultEnd) { unsigned char i,k; FaultReportType *FaultReport = MemPtrSet.pFaultReport; RecordYaoXin(); //记录保护元件动作软遥信 i=FaultRecord.RecordIP; if(FaultRecord.Buffer[i].StatusIP!=TEST_START){ //故障报告缓冲区已满,返回 ClearTiaoZhaIP(); //清除跳闸相关标志 TZValue.FaultProcessEndIP=FAULT_END; //置故障跳闸完成标志 TZValue.DelayCount=0; //清除跳闸延时计数器 return; } //故障报告记录 //故障发生时间 //FaultReport->Buffer[i].FaultDate.Msecond=ATBH_Fault_Time.Msecond; //毫秒,2字节,范围:0~59999 //FaultReport->Buffer[i].FaultDate.Minute=ATBH_Fault_Time.Minute; //分,1字节,范围:0~59 //FaultReport->Buffer[i].FaultDate.Hour=ATBH_Fault_Time.Hour; //小时,1字节,范围:0~23 //FaultReport->Buffer[i].FaultDate.Date=ATBH_Fault_Time.Date; //日期,1字节,范围:1~31 //FaultReport->Buffer[i].FaultDate.Month=ATBH_Fault_Time.Month; //月,1字节,范围:1~12 //FaultReport->Buffer[i].FaultDate.Year=ATBH_Fault_Time.Year; //年,2字节,范围:2000~2099 FaultReport->Buffer[i].FaultDate = FaultRecord.Buffer[i].FaultDate; //故障时间 FaultReport->Buffer[i].WaveValue.LBTime = FaultReport->Buffer[i].FaultDate;//录波结束,记录录波时间,与故障时间相同 //断路器号 FaultReport->Buffer[i].DLQNo=ATBH_DLQNo; //动作标志,2字节 FaultReport->Buffer[i].DongZuoIP=BaoHuDongZuoIP; //重合闸标志 FaultReport->Buffer[i].ChongZha = ATBH_RecloseFlag; //故障参数 k = 0; //参数1:T线电压 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_UT.Value; //参数2:F线电压 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_UF.Value; //参数3:T线保护绕组 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_IT.Value; //参数4:F线保护绕组 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_IF.Value; if(ISOLATOR_TYPE == ATBH_ATMode) { //参数5:T线差动绕组 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_CDIT.Value; //参数6:F线差动绕组 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_CDIF.Value; } //参数7:接地电流 //FaultReport->Buffer[i].DataBuffer[6].Value=ATBH_Fault_IJD.Value; //参数8:差动电流 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_ICD.Value; //参数9:制动电流 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_IZD.Value; //参数10:保护电流二次谐波含量 //FaultReport->Buffer[i].DataBuffer[9].Value=ATBH_Fault_XB2I.Value; //参数11:差动电流二次谐波含量 FaultReport->Buffer[i].DataBuffer[k++].Value=ATBH_Fault_XB2ICD.Value; FaultReport->Buffer[i].HasWave=1;// TZValue.FaultProcessEndIP = FAULT_END; //置故障跳闸完成标志 //清除保护跳闸相关标志 ClearTiaoZhaIP(); TZValue.DelayCount=0; //清除跳闸延时计数器 SetFaultEnd(); //设置故障记录结束标志 //FaultRecord.Buffer[i].StatusIP=TEST_END; //设置故障报告记录结束标志 //SetFaultEnd(); //设置故障记录结束标志 if(0 == isFaultEnd) { FaultRecord.Buffer[i].StatusIP = TEST_DELAY; //设置故障报告记录还未处理结束标志 } else { FaultRecord.Buffer[i].StatusIP = TEST_END; //设置故障报告记录结束标志 } } /***************************************** * void SaveFaultTime(void) * 描述:记录故障发生的时间 * 历史: *****************************************/ void SaveFaultTime(void) { //故障发生时间 ATBH_Fault_Time.Msecond=Clock.Msecond; //毫秒,2字节,范围:0~59999 ATBH_Fault_Time.Minute=Clock.Minute; //分,1字节,范围:0~59 ATBH_Fault_Time.Hour=Clock.Hour; //小时,1字节,范围:0~23 ATBH_Fault_Time.Date=Clock.Date; //日期,1字节,范围:1~31 ATBH_Fault_Time.Month=Clock.Month; //月,1字节,范围:1~12 ATBH_Fault_Time.Year=Clock.Year; //年,2字节,范围:2000~2099 } /************************************************* * void SaveFaultData(void) * 描述:记录保护故障数据 * 历史: ***********************************************/ void SaveFaultData(void) { //故障电压(T线电压) ATBH_Fault_UT.Value=ChannelValue[CH_ATBH_UT].YouXiaoZhi[JiBo].Analog.Value; //故障电压(F线电压) ATBH_Fault_UF.Value=ChannelValue[CH_ATBH_UF].YouXiaoZhi[JiBo].Analog.Value; if(BREAKER_TYPE == ATBH_ATMode) { //故障电流(T线保护绕组) ATBH_Fault_IT.Value=ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].Analog.Value; //故障电流(F线保护绕组) ATBH_Fault_IF.Value=ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].Analog.Value; } else { //故障电流(T线保护绕组) ATBH_Fault_IT.Value=ChannelValue[CH_ATBH_BH_I].YouXiaoZhi[JiBo].Analog.Value; //故障电流(F线保护绕组) ATBH_Fault_IF.Value=ChannelValue[CH_ATBH_BH_IF].YouXiaoZhi[JiBo].Analog.Value; //故障电流(对侧T线保护绕组) ATBH_Fault_CDIT.Value=ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].Analog.Value; //故障电流(对侧F线保护绕组) ATBH_Fault_CDIF.Value=ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].Analog.Value; } //故障电流(T线差动绕组) //ATBH_Fault_CDIT.Value=ChannelValue[CH_ATBH_CD_IT].YouXiaoZhi[JiBo].Analog.Value; //故障电流(F线差动绕组) //ATBH_Fault_CDIF.Value=ChannelValue[CH_ATBH_CD_IF].YouXiaoZhi[JiBo].Analog.Value; //故障电流(接地电流) //ATBH_Fault_IJD.Value=ChannelValue[CH_ATBH_JDI].YouXiaoZhi[JiBo].Analog.Value; //故障电流(差动电流) ATBH_Fault_ICD.Value=ChaDongValue.CDI.Value; //故障电流(制动电流) ATBH_Fault_IZD.Value=ChaDongValue.ZDI.Value; //故障电流(保护二次谐波含量) //ATBH_Fault_XB2I.Value=ATBH_BaoHu_I2.Value; //故障电流(差动二次谐波含量) ATBH_Fault_XB2ICD.Value=ATBH_ChaDong_I2.Value; } /**************************************************** * void SetTiaoZha(void) * 描述:发保护跳闸命令 * 历史:创建日期不详 * ****************************************************/ void SetTiaoZha(void) { unsigned int IP; IP = ATBH_FDL_BIT| ATBH_CDSD_BIT | ATBH_CD_BIT | ATBH_DLLDIFF_BIT; //判断AT接入方式 if(ATBH_ATMode==BREAKER_TYPE) { //断路器接入方式 if(0 != BaoHuChuKouIP) { Outlet_trip(ATBH_BCJQ_KC,ON); //发跳闸命令 } kcDelayTimer_2 = 1; D_OUT(ATBH_TZ_LED_KC,ON); //驱动跳闸灯 //AT本身故障才发启动信号 if(BaoHuQiDongIP & IP) { D_OUT(ATBH_BHQD_KC,ON); kcDelayTimer_7 = 1; } } else if((ATBH_ATMode==ISOLATOR_TYPE)&&(ATBH_LianJieMode==D_BREAKER_CONNECT)) { //AT是隔离开关接入方式,且为双断路器并联 //先跳并联断路器 if(0 != BaoHuChuKouIP) { Outlet_trip(ATBH_1QS_DD_1QF_TZ_KC,ON); } //D_OUT(ATBH_1QS_TZ_KC,ON); //发并联断路器1跳闸命令 D_OUT(ATBH_TZ_LED_KC,ON); //驱动跳闸灯 kcDelayTimer_3 = 1; //AT本身故障才发启动信号 if(BaoHuQiDongIP & IP) { D_OUT(ATBH_BHQD_KC,ON); kcDelayTimer_7 = 1; } //if(YaoXinStatus[ATBH_YAOXIN_GK0]==ON) //modi by 20240618 LW 并联开关不定态当成合位判断 if(YaoXinStatus[ATBH_YAOXIN_GK0]!=OFF) { //D_OUT(ATBH_2QS_TZ_KC,ON); //发并联断路器2跳闸命令 if(0 != BaoHuChuKouIP) { Outlet_trip(ATBH_2QS_DD_2QF_TZ_KC,ON); } kcDelayTimer_4 = 1; } TiaoZhaIP=TEST_START; } if(IP & BaoHuDongZuoIP) { //记录本体故障 RecordPrtcFlag(ATBH_BTGZ_KC,1,0,0,ON); } } /*************************************************************************************** * unsigned int CheckFW(unsigned int FaultIP) * 描述: * 历史:创建时间不详 * ***************************************************************************************/ unsigned int CheckFW(unsigned int FaultIP,unsigned char *FzQFFailIP) { unsigned int Key,ip = 0; CanShuType CanShuValue; DataType Data; CanShuValue.Number = 0; if(ATBH_ATMode==BREAKER_TYPE) { //断路器接入方式 if((YaoXinStatus[ATBH_YAOXIN_QF]==OFF)&&(FaultIP == 0) && 0 == check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_1])) return SUCCESS; return FAIL; } if((ATBH_ATMode==ISOLATOR_TYPE)&&(ATBH_LianJieMode==D_BREAKER_CONNECT)) { //AT是隔离开关接入方式,且为双断路器并联 switch(TiaoZhaIP) { case TEST_START: ip = check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_1]); //检测并联断路器是否处于分位 //if(YaoXinStatus[ATBH_YAOXIN_GK0]==ON) //modi by 20240618 LW 并联开关不定态当成合位判断 if(YaoXinStatus[ATBH_YAOXIN_GK0]!=OFF) { ip += check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_2]); if((YaoXinStatus[ATBH_YAOXIN_1QSDD_1QF]==OFF)&&(YaoXinStatus[ATBH_YAOXIN_2QSDD_2QF]==OFF)) Key=1; else Key=0; } else { if(YaoXinStatus[ATBH_YAOXIN_1QSDD_1QF]==OFF) Key=1; else Key=0; } if((Key==1)&&(FaultIP == 0) && 0 == ip) { //并联断路器处于分位,分AT隔离开关 if(0 != BaoHuChuKouIP) { Outlet_trip(ATBH_1QS_BHTZ_KC,ON); //发跳闸命令 } //#ifdef DEVICE_TYPE_DIGITAL //D_OUT(ATBH_QF_TZ_KC,ON); //发跳闸命令20140227 luoyang 修改为通过控制跳闸 //#endif if((kcDelayTimer_3 != 0)&&(kcDelayTimer_3 < WITHDRAW_QFCTRL_MINTIME)) BCJ1_OFF_IP = 1; else { kcDelayTimer_3 = 0; Outlet_trip(ATBH_1QS_DD_1QF_TZ_KC,OFF); //收回并联断路器1跳闸命令 } //if(YaoXinStatus[ATBH_YAOXIN_GK0]==ON) //modi by 20240618 LW 并联开关不定态当成合位判断 if(YaoXinStatus[ATBH_YAOXIN_GK0]!=OFF) { if((kcDelayTimer_4 != 0)&&(kcDelayTimer_4 < WITHDRAW_QFCTRL_MINTIME)) BCJ2_OFF_IP = 1; else { kcDelayTimer_4 = 0; Outlet_trip(ATBH_2QS_DD_2QF_TZ_KC,OFF); //收回并联断路器1跳闸命令 } } TiaoZhaIP=TEST_END; TZValue.DelayCount=1; //启动跳闸延时计时器 return FAIL; } //跳断路器失败 if(TZValue.DelayCount>=ATBH_OperationTime) { //超时判断 //收回跳闸命令 /* if((kcDelayTimer_3 != 0)&&(kcDelayTimer_3 < (WITHDRAW_QFCTRL_MINTIME*timeFrac[RatedFreq][0]/timeFrac[RatedFreq][1]))) BCJ1_OFF_IP = 1;// modi 110110/ modi 110129 else { kcDelayTimer_3 = 0; D_OUT(ATBH_1QS_TZ_KC,OFF); //收回并联断路器1跳闸命令 } if(InPort.Status[ATBH_GK0_KR]==ON) {// if((kcDelayTimer_4 != 0)&&(kcDelayTimer_4 < (WITHDRAW_QFCTRL_MINTIME*timeFrac[RatedFreq][0]/timeFrac[RatedFreq][1]))) BCJ2_OFF_IP = 1;// modi 110129 else { kcDelayTimer_4 = 0; D_OUT(ATBH_2QS_TZ_KC,OFF); //收回并联断路器1跳闸命令 } } */ TiaoZhaIP = TEST_CLOSE; //开关未到位 if(1 != Key) { if(OFF != YaoXinStatus[ATBH_YAOXIN_1QSDD_1QF]) { RecordSOE(ATBH_TRIP1_ERROR,CanShuValue);//跳闸回路异常记录 } //modi by 20240618 LW 并联开关不定态当成合位判断 //if(ON == YaoXinStatus[ATBH_YAOXIN_GK0] && OFF != YaoXinStatus[ATBH_YAOXIN_2QSDD_2QF]) if(OFF != YaoXinStatus[ATBH_YAOXIN_GK0] && OFF != YaoXinStatus[ATBH_YAOXIN_2QSDD_2QF]) { RecordSOE(ATBH_TRIP2_ERROR,CanShuValue);//跳闸回路异常记录 } } //检测失灵 if(0 != check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_1])) { D_OUT(ATBH_SL_KC,ON); //断路器失灵开出 RecordSOE(ATBH_DLQ1_ERROR,CanShuValue);//断路器失灵 if(kcDelayTimer_0==0) kcDelayTimer_0=1; } //if(ON == YaoXinStatus[ATBH_YAOXIN_GK0] && 0 != check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_2])) //modi by 20240618 LW 并联开关不定态当成合位判断 if(OFF != YaoXinStatus[ATBH_YAOXIN_GK0] && 0 != check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_2])) { D_OUT(ATBH_SL2_KC,ON); //断路器失灵开出 RecordSOE(ATBH_DLQ2_ERROR,CanShuValue);//断路器失灵 if(kcDelayTimer_5==0) kcDelayTimer_5=1; } if(NULL != FzQFFailIP) { *FzQFFailIP = TEST_START; } return SUCCESS; } break; case TEST_END: //检测AT隔离开关是否处于分位 if(YaoXinStatus[ATBH_YAOXIN_1QS]==OFF) { //分闸成功 Outlet_trip(ATBH_1QS_BHTZ_KC,OFF); //收回AT隔离开关跳闸命令 //#ifdef DEVICE_TYPE_DIGITAL //D_OUT(ATBH_QF_TZ_KC,OFF); //发跳闸命令20140227 luoyang 修改为通过控制跳闸 //#endif TiaoZhaIP=TEST_CLOSE; //printf("here3"); return SUCCESS; } if(TZValue.DelayCount>=ATBH_QSOperationTime) { //超时判断 //收回跳闸命令 RecordSOE(ATBH_QS_TRIP_FAIL,CanShuValue); Outlet_trip(ATBH_1QS_BHTZ_KC,OFF); //收回AT隔离开关跳闸命令 if(NULL != FzQFFailIP) { *FzQFFailIP = TEST_START; } //#ifdef DEVICE_TYPE_DIGITAL //D_OUT(ATBH_QF_TZ_KC,OFF); //发跳闸命令20140227 luoyang 修改为通过控制跳闸 //#endif TiaoZhaIP=TEST_CLOSE; //printf("here4"); return SUCCESS; } break; case TEST_CLOSE: if(YaoXinStatus[ATBH_YAOXIN_1QS]==OFF) return SUCCESS; else return FAIL; default: TiaoZhaIP=TEST_CLOSE; return FAIL; }//endcase return FAIL; } return FAIL; } /****************************************************************************** * Function: record_firstfault_end_soe * Description:记录第一次故障报告结束事件 * Calls: none * Called By: * Input: * Ouput: * Return: * others: * History: * 1.luoyang created 20210220 * *******************************************************************************/ static void record_firstfault_end_soe() { if(0 == BaoHuQiDongIP) { //FaultRecord.Buffer[fristFaultIndex].SOE_EndIP = MemPtrSet.pSoeBuf->WriteIP; FaultRecord.Buffer[fristFaultIndex].SOE_EndIP = get_protect_soe_write_ip(); } } void record_reclose_soe(void) { if(TZ_CLOSE != TZValue.Status || CHZ_CLOSE == CHZValue.Status) { return; //跳闸未完成,不进行重合闸 } switch(CHZValue.Status) { //重合闸状态 case CHZ_START: case CHZ_CHECK_DELAY: //检测重合闸延时 case CHZ_SEND_COMMAND: //发合闸命令 case CHZ_CHECK_HW: //检测合位 case CHZ_RESET: //一次重合闸结束 record_firstfault_end_soe(); break; }//endcase } /***************************************************************************** * void SetRecloseEnd(void) * 描述: 设置重合闸结束 * 历史: 20180806 ******************************************************************************/ void SetRecloseEnd(void) { FaultReportType *pFaultReport = MemPtrSet.pFaultReport; //第一次报告还未送接口记录 if(TEST_DELAY == FaultRecord.Buffer[fristFaultIndex].StatusIP) { //拷贝重合闸标志 if(0 != ATBH_RecloseFlag) { pFaultReport->Buffer[fristFaultIndex].ChongZha = ATBH_RecloseFlag; } record_firstfault_end_soe(); FaultRecord.Buffer[fristFaultIndex].StatusIP = TEST_END; //QiDongZiTou(pFaultReport->Buffer[fristFaultIndex].DongZuoIP | BaoHuDongZuoIP); } //只有后加速出口才记录第二次报告 //if(ATBH_ACC_BIT & BaoHuDongZuoIP) //{ //重合闸失败,记录第二次故障报告 // SaveFault(1); //} //再次清动作标志 //BaoHuDongZuoIP = 0; } /*********************************************************** * void FaultProcess(void) * 描述:检测元件出口,解决非电量跟电量保护同时产生的情况 * 历史:20220114 L.Y.创建 ***********************************************************/ void check_prtc_outlet() { CanShuType Value; if(TZ_CHECK_FW != TZValue.Status) { return; } if(0 == TempBaoHuChuKouIP && 0 != BaoHuChuKouIP) { SetTiaoZha(); //发跳闸命令 Value.Number = 0; RecordSOE(BH_CK,Value); //保护出口事件记录 //重新记录故障参数 SaveFaultData(); //保存故障数据 TZValue.DelayCount=1; //启动跳闸延时计时器 TZValue.Status=TZ_CHECK_FW; CHZValue.CHZTime = 1; //启动重合闸延时计时器 TempBaoHuChuKouIP = BaoHuChuKouIP; } } /*********************************************************** * void FaultProcess(void) * 描述:完成故障跳闸功能 * 历史:创建时间不详 ***********************************************************/ void FaultProcess(void) { CanShuType Value; int IP; unsigned char FZQFFailIP = TEST_CLOSE; unsigned int operationTimeOut; static int ZB_fault_QDIP = 0; static int ZB_first_faultIP = ON; ZB_fault_QDIP = BaoHuQiDongIP & (ATBH_FDL_BIT|ATBH_CDSD_BIT|ATBH_CD_BIT|ATBH_DLLDIFF_BIT); if(0==ZB_fault_QDIP && ZB_first_faultIP == OFF) { ZB_first_faultIP = ON; } if(CHZValue.Status != CHZ_CLOSE) return; //在重合闸过程中,返回 Value.Number=0; switch(TZValue.Status) { case TZ_START: //开始跳闸,发跳闸命令 //检测保护元件是否动作 if(BaoHuDongZuoIP!=0) { //printf("分位延时 %d,跳闸前变成合位时间%d\n",kcDelayTimer_11,kcDelayTimer_9); if( ((BaoHuDongZuoIP & ATBH_SY_BIT)==ATBH_SY_BIT) && ( kcDelayTimer_11<2000 )) {//失压跳闸前2s并联开关处于合位,允许发出检有压重合闸失败后的备自投 2024618 add by L.W. ZB_SYZT_able=ON; } else { ZB_SYZT_able=OFF; } if(CHZValue.ChongDianOK == SUCCESS) { TempQiDongIP |= ATBH_CHZ_CDOK_BIT; //重合闸充电成功 } else { TempQiDongIP &= (~ATBH_CHZ_CDOK_BIT); //重合闸充电失败 } //有保护元件动作 //if(QiDongTime < 10) //{ // SaveFaultDataIP=1; //SaveFaultTime(); //SaveFaultData(); //} //else //{ //SaveFaultTime(); SaveFaultData(); //保存故障数据 //} SetTiaoZha(); //发跳闸命令 if(BaoHuChuKouIP != 0) { RecordSOE(BH_CK,Value); //保护出口事件记录 } TZValue.DelayCount=1; //启动跳闸延时计时器 TZValue.Status=TZ_CHECK_FW; CHZValue.CHZTime = 1; //启动重合闸延时计时器 TempBaoHuChuKouIP = BaoHuChuKouIP; } break; case TZ_CHECK_FW: //检测分位 check_prtc_outlet(); //检测出口 20220114 added by L.Y. IP = ~ATBH_FDL_BIT; if(CheckFW(BaoHuQiDongIP&IP,&FZQFFailIP)==SUCCESS && TEST_CLOSE == FZQFFailIP) { //断路器处于分位,并且故障消失 TZValue.IP=SUCCESS; //跳闸成功 TZValue.Status=TZ_RESET; //跳闸结束 if(ATBH_ATMode==BREAKER_TYPE) { if((kcDelayTimer_2 != 0)&&(kcDelayTimer_2 < WITHDRAW_QFCTRL_MINTIME)) BCJ_OFF_IP = 1; else { kcDelayTimer_2 = 0; Outlet_trip(ATBH_BCJQ_KC,OFF); //断路器接入方式,收回跳闸命令 } } if(ON == ZB_first_faultIP) { Send_QDZT(0); ZB_first_faultIP = OFF; } BaoHuDongZuoFailIP = BaoHuDongZuoIP; //记录最后的动作标志,为重合闸前的判断 return; } if(ATBH_ATMode == BREAKER_TYPE) operationTimeOut=ATBH_OperationTime; else operationTimeOut = ATBH_QSOperationTime+ATBH_OperationTime; if(TZValue.DelayCount > operationTimeOut || TEST_START == FZQFFailIP) { //跳闸超时 TZValue.IP=FAIL; //跳闸失败 #if 0 if((ATBH_ATMode==ISOLATOR_TYPE)&&(ATBH_LianJieMode==D_BREAKER_CONNECT)) { D_OUT(ATBH_1QS_TZ_KC,ON); //发并联断路器1跳闸命令 kcDelayTimer_3 = 1; BCJ1_OFF_IP = 0; if(InPort.Status[ATBH_GK0_KR]==ON) { D_OUT(ATBH_2QS_TZ_KC,ON); //发并联断路器2跳闸命令 kcDelayTimer_4 = 1; BCJ2_OFF_IP = 0; } } #endif /*if(ATBH_ATMode==BREAKER_TYPE) { if((kcDelayTimer_2 != 0)&&(kcDelayTimer_2 < (WITHDRAW_QFCTRL_MINTIME*timeFrac[RatedFreq][0]/timeFrac[RatedFreq][1]))) BCJ_OFF_IP = 1;// modi 110129 else { kcDelayTimer_2 = 0; D_OUT(ATBH_BCJQ_KC,OFF); //断路器接入方式,收回跳闸命令 } }*/ /*20140605 luoyang modi D_OUT(ATBH_SL_KC,ON); //断路器失灵开出 RecordSOE(ATBH_DLQ_ERROR,Value);//断路器失灵 if(kcDelayTimer_0==0) kcDelayTimer_0=1; //RecordSOE(TZ_ERROR,Value); //跳闸回路异常记录 */ if(ATBH_ATMode==BREAKER_TYPE) { if(0 != check_breaker_err(&ATBH_Breaker_err_param[ATBH_BREAKER_1])) { D_OUT(ATBH_SL_KC,ON); //断路器失灵开出 RecordSOE(ATBH_DLQ_ERROR,Value);//断路器失灵 if(kcDelayTimer_0==0) kcDelayTimer_0=1; } if(OFF != YaoXinStatus[ATBH_YAOXIN_QF]) { RecordSOE(ATBH_TRIP_ERROR,Value); //跳闸回路异常记录 } } TZValue.DelayCount=0; //清除跳闸延时计时器 TZValue.Status=TZ_CLOSE; //关闭跳闸命令 //printf("here1"); ATBH_RecloseFlag = RECLS_STATUS_UNSTART; ZB_SYZT_able = OFF ; SaveFault(1); //故障报告记录结束,保存故障报告 return; } break; case TZ_RESET: //跳闸结束 TZValue.Status=TZ_CLOSE; //关闭跳闸命令 TZValue.DelayCount=0; //清除跳闸延时计时器 if(BREAKER_TYPE == ATBH_ATMode && ATBH_SY_BIT == BaoHuDongZuoFailIP) { BaoHuDongZuoFailIP = 0; CHZValue.Status = CHZ_START; //启动重合闸 //CHZValue.CHZTime = 1; //启动重合闸延时计时器 fristFaultIndex = FaultRecord.RecordIP; //保存第一次故障索引20180806 SaveFault(0); } else { //隔开接入或不是失压跳闸,无重合闸 ATBH_RecloseFlag = RECLS_STATUS_UNSTART; SaveFault(1); //故障报告记录结束,保存故障报告 } /* TZValue.Status = TZ_CLOSE; //关闭跳闸命令 //仅失压跳闸,启动重合闸 if(ATBH_SY_BIT == (BaoHuDongZuoFailIP & ATBH_SY_BIT)) { //非电量保护没启动的前提下才会启动重合闸 BaoHuDongZuoFailIP = 0; CHZValue.Status = CHZ_START; //启动重合闸 fristFaultIndex = FaultRecord.RecordIP; //保存第一次故障索引20180806 SaveFault(0); } else { //BaoHuDongZuoIP |= KX_NO_CHZ_BIT; //20180806 置无重合闸标志 KX_RecloseFlag = RECLS_STATUS_UNSTART; QiDongZiTou(BaoHuDongZuoIP); SaveFault(1); //故障报告记录结束,保存故障报告 } */ break; }//end of switch } /***************************************************************************** * void ChongHeZha(void) * 描述: 实现重合闸功能 * 历史: 创建日期不详 ******************************************************************************/ void ChongHeZha(void) { CanShuType Value; if(TZValue.Status != TZ_CLOSE) return; //跳闸未完成,不进行重合闸 /* if(CHZValue.ClsDwnIP != 0) { //发生模拟量通道不良 switch(CHZValue.Status) { case CHZ_START: CHZValue.Status = CHZ_RESET; break; case CHZ_CHECK_DELAY: CHZValue.CHZTime = 0; //清除重合闸延时 CHZValue.Status = CHZ_RESET; break; case CHZ_SEND_COMMAND: D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 CHZValue.Status = CHZ_RESET; break; case CHZ_CHECK_HW: if(YaoXinStatus[ATBH_YAOXIN_QF] != OFF) { //如果已经合闸 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 D_OUT(ATBH_BCJQ_KC, ON); //发跳闸命令 kcDelayTimer_2 = 1; BCJ_OFF_IP = 1; } else { //如果尚未合闸 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 } CHZValue.Status = CHZ_RESET; break; case CHZ_FAULT_CHECK: D_OUT(ATBH_BCJQ_KC, ON); //发跳闸命令 kcDelayTimer_2 = 1; BCJ_OFF_IP = 1; CHZValue.Status = CHZ_RESET; break; case CHZ_CHECK_FW: BCJ_OFF_IP = 1; CHZValue.Status = CHZ_RESET; break; default: break; }//end of switch }//end of if(CHZValue.ClsDwnIP!=0) */ Value.Number = 0; switch(CHZValue.Status) { //重合闸状态 case CHZ_START: //检测重合闸是否投入 if(ATBH_RECLS_ENABLE != BH_RUN) { //重合闸未投入 ATBH_RecloseFlag = RECLS_STATUS_UNENABLE; //重合闸未投入 CHZValue.Status = CHZ_RESET; //重合闸结束 RecordSOE(ATBH_RCLSUNENABLE,Value); return; } //检测重合闸充电时间 if((TempQiDongIP & ATBH_CHZ_CDOK_BIT) == 0) { //设置无重合闸标志 //无重合闸 ATBH_RecloseFlag = RECLS_STATUS_UNSTART; //重合闸未起动 CHZValue.Status = CHZ_RESET; //重合闸结束 RecordSOE(ATBH_CHZ_NOTCHARGE, Value); //重合闸未充电 return; } CHZValue.Status = CHZ_CHECK_DELAY; break; case CHZ_CHECK_DELAY: //检测重合闸延时 if(CHZValue.CHZTime < ATBH_CHZ_Time) { return; //重合闸时间未到,返回 } //重合闸时间到 CHZValue.CHZTime = 0; //清除重合闸延时 //检有压 if(!(ATBH_YY_BIT & TempQiDongIP)) { //无压,闭锁重合闸 //无重合闸 //失压动作引起的保护跳闸,且跳闸前2s并联开关为合位,才允许有压自投 if(ON == ZB_SYZT_able) { ZB_SYZT_able =OFF; Send_QDZT(1); } RecordSOE(ATBH_WY_BSCHZ, Value); //无压闭锁重合闸事件 ATBH_RecloseFlag = RECLS_STATUS_UNSTART; //重合闸未起动 CHZValue.Status = CHZ_RESET; //重合闸结束 return; } CHZValue.Status = CHZ_SEND_COMMAND; break; case CHZ_SEND_COMMAND: //发合闸命令 D_OUT(ATBH_HCJ_KC, ON); //驱动HCJ D_OUT(ATBH_CHZDZ_LED_KC, ON); //驱动CHZ动作灯 // #if TESTSHOW //logMsg("\n\n ******* KX Send CHZ cmd ***********\n\n"); //ShowTime(0); #endif RecordSOE(ATBH_CHZCK, Value); //重合闸出口事件记录 if(ON != YaoXinStatus[ATBH_YAOXIN_CHZDZ]) { RecordSoftYaoXin(ATBH_YAOXIN_CHZDZ,ON); kcDelayTimer_6 = 1; } CHZValue.DelayCount = 1; CHZValue.Status = CHZ_CHECK_HW; kcDelayTimer_10 = 0; break; case CHZ_CHECK_HW: //检测合位 if(YaoXinStatus[ATBH_YAOXIN_QF] == ON) { //断路器处于合位 CHZValue.Status = CHZ_RESET; //故障检测 CHZValue.DelayCount = 0; //启动延时计时器 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 ATBH_RecloseFlag = RECLS_STATUS_SUCCESS; //重合闸成功 #if TESTSHOW //logMsg("\n\n ******* CHZ: success ,KX_HCJQ_KC Kc OFF ***********\n\n"); //ShowTime(0); #endif return; } if(CHZValue.DelayCount >= ATBH_OperationTime) { //合闸超时 ATBH_RecloseFlag = RECLS_STATUS_FAIL; //重合闸失败 CHZValue.Status = CHZ_RESET; //重合闸结束 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 RecordSOE(ATBH_RCLS_ERROR, Value); //合闸回路异常记录 #if TESTSHOW //logMsg("\n\n ******* CHZ: timeout ,chz error ***********\n\n"); //ShowTime(0); #endif return; } //有保护启动,重合闸失败 if(BaoHuQiDongIP != 0) { ATBH_RecloseFlag = RECLS_STATUS_FAIL; //重合闸失败 CHZValue.Status = CHZ_RESET; //重合闸结束 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 } break; /* case CHZ_FAULT_CHECK: //故障检测 if(BaoHuQiDongIP != 0) { //加30ms延时 20160310 合闸时有干扰导致保护元件启动,合闸成功后后加速出口,在沪昆线发现该问题 if(kcDelayTimer_10 < 30) { if(kcDelayTimer_10 == 0) { kcDelayTimer_10 = 1; } return; } kcDelayTimer_10 = 0; //有故障,发跳闸命令,重合闸失败 ATBH_RecloseFlag = RECLS_STATUS_FAIL; //重合闸失败 BaoHuDongZuoIP |= ATBH_ACC_BIT; //后加速动作标志 SaveFaultData(); //记录第二次故障参数 20180807 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 D_OUT(ATBH_BCJQ_KC, ON); //发跳闸命令 kcDelayTimer_2 = 1; //后加速出口事件记录 #if TESTSHOW //logMsg("\n\n ******* CHZ: HJS KC ***********\n\n"); ShowTime(0); #endif RecordSOE(ATBH_HJSCK, Value); //后加速出口事件记录 CHZValue.DelayCount = 1; //启动延时计时器 CHZValue.Status = CHZ_CHECK_FW; //检测分位 return; } kcDelayTimer_10 = 0; if(CHZValue.DelayCount >= 3000 ) { //3000ms无故障,重合闸成功 D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 ATBH_RecloseFlag = RECLS_STATUS_SUCCESS; //重合闸成功 CHZValue.DelayCount = 0; //合闸延时计时器 CHZValue.Status = CHZ_RESET; //重合闸结束 return; } break; case CHZ_CHECK_FW: //检测 if((YaoXinStatus[ATBH_YAOXIN_QF] == OFF) && (BaoHuQiDongIP == 0)) { //断路器处于分位且故障消失 //在20ms内不收回跳闸命令 if((kcDelayTimer_2 != 0) && (kcDelayTimer_2 < WITHDRAW_QFCTRL_MINTIME )) BCJ_OFF_IP = 1; else { kcDelayTimer_2 = 0; D_OUT(ATBH_BCJQ_KC, OFF); //收回跳闸命令 } CHZValue.Status = CHZ_RESET; //故障检测 return; } if(CHZValue.DelayCount >= ATBH_OperationTime) { //分闸超时 //在20ms内不收回跳闸命令 if((kcDelayTimer_2 != 0) && (kcDelayTimer_2 < WITHDRAW_QFCTRL_MINTIME)) BCJ_OFF_IP = 1; else { kcDelayTimer_2 = 0; D_OUT(ATBH_BCJQ_KC, OFF); //收回跳闸命令 } //故障量未消失 if(BaoHuQiDongIP != 0) { D_OUT(ATBH_SL_KC, ON); //断路器失灵开出 RecordSOE(ATBH_DLQ_ERROR, Value); //断路器失灵 if(kcDelayTimer_0 == 0) kcDelayTimer_0 = 1; } //开关未跳开 if(OFF != YaoXinStatus[ATBH_YAOXIN_QF]) { RecordSOE(ATBH_TRIP_ERROR,Value); //跳闸回路异常记录 } TZValue.IP = FAIL; //跳闸失败 ,避免再次跳闸 20181022 CHZValue.Status = CHZ_RESET; //重合闸结束 return; } break; */ case CHZ_RESET: //一次重合闸结束 CHZValue.Status = CHZ_CLOSE; //重合闸状态 CHZValue.CHZTime = 0; //重合闸时间 CHZValue.DelayCount = 0; //合闸延时计时器 kcDelayTimer_10 = 0; D_OUT(ATBH_HCJ_KC, OFF); //收回合闸命令 //SaveFault(); //故障报告记录结束,保存故障报告 SetRecloseEnd(); //设置重合闸结束 //SaveFault(1); //故障报告记录结束,保存故障报告 break; }//endcase } void JiSuanMeasureValue(void) { //功能说明:测量值处理 unsigned int i,j; int temp,number,basechannel; float fre,angle_adjust = 0,angle_adjust_curr; //计算原始采样通道有效值 genera_computemeasure(); if((TempQiDongIP & ATBH_TPTDX_BIT) && !(TempQiDongIP & ATBH_FPTDX_BIT)) { basechannel = CH_ATBH_UF; //KX_u_transform.channel_curr; } else { basechannel = CH_ATBH_UT; //KX_u_transform.channel_curr; } angle_adjust_curr = angle_amend_value; if(CH_ATBH_UF == basechannel) { angle_adjust = 180; angle_adjust_curr += 180; } //计算角度 genera_computemeasure_angle(basechannel,angle_adjust_curr,angle_adjust); //计算量 number = MeasureValue.Number / 2; //频率 temp = basechannel - 7; ComputeFrequency(&ZcpSet.zcpset[temp],&fre); MeasureValue.Buffer[ATBH_MX_Fre].Value = fre; MeasureValue.Buffer[ATBH_MX_Fre].Quality = ChannelValue[basechannel].Quality; //二次值 temp = number + ATBH_MX_Fre; MeasureValue.Buffer[temp].Value = fre; MeasureValue.Buffer[temp].Quality = MeasureValue.Buffer[ATBH_MX_Fre].Quality; //差动二次谐波含量 MeasureValue.Buffer[ATBH_MX_Id2].Value = ATBH_ChaDong_I2.Value; MeasureValue.Buffer[ATBH_MX_Id2].Quality = ChannelValue[CH_ATBH_BH_I].Quality; temp = number + ATBH_MX_Id2; //二次值 MeasureValue.Buffer[temp].Value = MeasureValue.Buffer[ATBH_MX_Id2].Value; MeasureValue.Buffer[temp].Quality = MeasureValue.Buffer[ATBH_MX_Id2].Quality; if(SETVALUE_MODE_1 == DisplayMode) { //差动电流 MeasureValue.Buffer[ATBH_MX_IDIFF].Value = ChaDongValue.CDI.Value; MeasureValue.Buffer[ATBH_MX_IDIFF].Quality = ChannelValue[CH_ATBH_BH_I].Quality; //二次差动电流 temp = number + ATBH_MX_IDIFF; MeasureValue.Buffer[temp].Value = MeasureValue.Buffer[ATBH_MX_IDIFF].Value / ChannelValue[CH_ATBH_BH_I].BianBi; MeasureValue.Buffer[temp].Quality = MeasureValue.Buffer[ATBH_MX_IDIFF].Quality; //制动电流 MeasureValue.Buffer[ATBH_MX_IREST].Value = ChaDongValue.ZDI.Value; MeasureValue.Buffer[ATBH_MX_IREST].Quality = ChannelValue[CH_ATBH_BH_I].Quality; //二次制动电流 temp = number + ATBH_MX_IREST; MeasureValue.Buffer[temp].Value = MeasureValue.Buffer[ATBH_MX_IREST].Value / ChannelValue[CH_ATBH_BH_I].BianBi; MeasureValue.Buffer[temp].Quality = MeasureValue.Buffer[ATBH_MX_IREST].Quality; } else { //差动电流 temp = number + ATBH_MX_IDIFF; MeasureValue.Buffer[temp].Value = ChaDongValue.CDI.Value; MeasureValue.Buffer[temp].Quality = ChannelValue[CH_ATBH_BH_I].Quality; //一次差动电流 MeasureValue.Buffer[ATBH_MX_IDIFF].Value = MeasureValue.Buffer[temp].Value * ChannelValue[CH_ATBH_BH_I].BianBi; MeasureValue.Buffer[ATBH_MX_IDIFF].Quality = MeasureValue.Buffer[temp].Quality; //制动电流 temp = number + ATBH_MX_IREST; MeasureValue.Buffer[temp].Value = ChaDongValue.ZDI.Value; MeasureValue.Buffer[temp].Quality = ChannelValue[CH_ATBH_BH_I].Quality; //一次差动电流 MeasureValue.Buffer[ATBH_MX_IREST].Value = MeasureValue.Buffer[temp].Value * ChannelValue[CH_ATBH_BH_I].BianBi; MeasureValue.Buffer[ATBH_MX_IREST].Quality = MeasureValue.Buffer[temp].Quality; } //装置时间 MeasureValue.Time.Msecond=Clock.Msecond; //毫秒,2字节,范围:0~59999 MeasureValue.Time.Minute=Clock.Minute; //分,1字节,范围:0~59 MeasureValue.Time.Hour=Clock.Hour; //小时,1字节,范围:0~23 MeasureValue.Time.Date=Clock.Date; //日期,1字节,范围:1~31 MeasureValue.Time.Month=Clock.Month; //月,1字节,范围:1~12 MeasureValue.Time.Year=Clock.Year; //年,2字节,范围:2000~2099 } /********************************************************** * void atbh_main(void) * 描述: 保护与接口交互任务入口函数 * 历史: 创建日期不详 * ***********************************************************/ void maintask(void) { ProcessFaultReport(); //处理故障报告 SysResetSoeRecord(); //系统复位事件记录 CopyYaoXinBianWei(); //拷贝遥信 digit_mainTask(); ComputeAnalogTrueRms(&ZcpSet); if(MeasureSendDelay >= MEASURE_SEND_DELAY_TIME) { JiSuanMeasureValue(); //计算测量值 SendMeasureValue(); //发送测量值 测量值改为队列,就不需要给接口发命令,这个函数就没必要使用了 } SendGetTimeCommand(); ReceiveData(); //接收数据 ProcessASDU(); //处理接收数据 //SendData(); //往实时库发送数据 //AT_ZT_TaskCreate(); setValueSelfCheck(); #ifdef DEVICE_TYPE_DIGITAL //CheckIOYaoXin(IO_TYPE_IN20_OUT6,0); //检测记录IO自检软遥信 luoyang add //CheckIOYaoXin(IO_TYPE_IN20_OUT6,1); //检测记录IO自检软遥信 lw add #else //CheckIOYaoXinEx(IO_TYPE_IN30_OUT0,0); //检测记录IO自检软遥信 //CheckIOYaoXinEx(IO_TYPE_IN30_OUT0,1); //检测记录IO自检软遥信 //CheckIOYaoXinEx(IO_TYPE_IN0_OUT16,2); //检测记录IO自检软遥信 #endif //检测遥控控制字 CheckRemote_ryb(); //检测软压板控制 CheckSoftStrapCtrl(); //公共轮询 main_polling(); if(LS_TR == ATBH_LS) { block_CalcStatus(); } } /****************************************************************************** * Function: ATZTDongZuo * Description:投退处理 * Calls: none * Called By: * Input: * Ouput: * Return: * others: * History: * 1.luoyang created * *******************************************************************************/ void ATZTDongZuo(void) { static int ZTStep = 0; CanShuType CanShuValue; int ZTRst; CanShuValue.Number = 0; //printf("ZTDongZuoIP = %d,ZTStep = %d",ZTDongZuoIP,ZTStep); if(ZTDongZuoIP==TEST_START) { //检测AT是否处于退出状态 //if(YaoXinStatus[ATBH_rmtsignal_run] != OFF || 0 != BaoHuQiDongIP) //{ // ZTDongZuoIP = TEST_CLOSE; //自投结束 // return; //AT不处于退出状态,返回 //} //if(YaoXinStatus[ATBH_YAOXIN_GK0] != ON) //{ // ZTDongZuoIP = TEST_CLOSE; //自投结束 // return; //} D_OUT(ATBH_ZTDZ_LED_KC,ON); //驱动自投动作灯 RecordSOE(ATBH_ZT_START,CanShuValue); //RecordSoftYaoXin(ATBH_YAOXIN_ZT,ON); //记录自投软遥信 ZTDongZuoIP = TEST_DELAY; //标明自投状态 ATZT_TIMER = 0; ZTStep = 1; } if(TEST_DELAY != ZTDongZuoIP) { return; } if(BREAKER_TYPE == ATBH_ATMode) { switch(ZTStep) { case 0: if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_FAIL]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_FAIL,ON); } RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败事件记录 ZTDongZuoIP = TEST_END; //自投结束 break; case 1: ZTRst = SwitchContrl(ATBH_ZT_QS,ON,&ATZT_TIMER,ISOLATOR_TYPE); //自投过程中发生故障,直接退出 if(0 != BaoHuQiDongIP) { D_OUT(RemoteObject.Object[ATBH_ZT_QS].Out_On_No,OFF); //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; return; } //失败 if(TEST_CLOSE == ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } //成功 else if(TEST_END == ZTRst) { ZTStep = 2; } break; case 2: ZTRst = SwitchContrl(ATBH_ZT_QF,ON,&ATZT_TIMER,BREAKER_TYPE); //自投过程中发生故障,直接退出 if(0 != BaoHuQiDongIP) { D_OUT(RemoteObject.Object[ATBH_ZT_QF].Out_On_No,OFF); //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; return; } //失败 if(TEST_CLOSE == ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } //成功 else if(TEST_END == ZTRst) { ZTStep = 3; } break; //自投成功 case 3: RecordSOE(ATBH_ZT_OK,CanShuValue); //AT自投成功 if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_SUCCESS]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_SUCCESS,ON); } ZTDongZuoIP = TEST_END; //自投结束 break; } } else if(ISOLATOR_TYPE == ATBH_ATMode) { if(D_BREAKER_CONNECT != ATBH_LianJieMode) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败事件记录 ZTStep = 0; //自投结束 } switch(ZTStep) { case 0: if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_FAIL]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_FAIL,ON); } RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败事件记录 ZTDongZuoIP = TEST_END; //自投结束 break; //分1QS case 1: ZTRst = SwitchContrl(ATBH_ZT_1QF,OFF,&ATZT_TIMER,BREAKER_TYPE); //失败 if(TEST_CLOSE == ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } //成功 else if(TEST_END == ZTRst) { ZTStep = 2; } break; //分2QS case 2: ZTRst = SwitchContrl(ATBH_ZT_2QF,OFF,&ATZT_TIMER,BREAKER_TYPE); //失败 if(TEST_CLOSE == ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } //成功 else if(TEST_END == ZTRst) { ZTStep = 3; } break; //并联断路器处于分位,合AT隔离开关 case 3: ZTRst = SwitchContrl(ATBH_ZT_QS,ON,&ATZT_TIMER,ISOLATOR_TYPE); //自投过程中发生故障,直接退出 if(0 != BaoHuQiDongIP) { D_OUT(RemoteObject.Object[ATBH_ZT_QS].Out_On_No,OFF); //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; return; } //失败 if(TEST_CLOSE == ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } //成功 else if(TEST_END == ZTRst) { ZTStep = 4; } break; //合并联断路器 case 4: ZTRst = SwitchContrl(ATBH_ZT_1QF,ON,&ATZT_TIMER,BREAKER_TYPE); //自投过程中发生故障,直接退出 if(0 != BaoHuQiDongIP) { D_OUT(RemoteObject.Object[ATBH_ZT_1QF].Out_On_No,OFF); //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; return; } //失败 if(TEST_CLOSE == ZTRst) { ZTStep = 5; } //成功 else if(TEST_END == ZTRst) { ZTStep = 6; } break; //合并联断路器失败 //分AT隔离开关 case 5: ZTRst = SwitchContrl(ATBH_ZT_QS,OFF,&ATZT_TIMER,ISOLATOR_TYPE); if(TEST_DELAY != ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } break; //合2QS case 6: ZTRst = SwitchContrl(ATBH_ZT_2QF,ON,&ATZT_TIMER,BREAKER_TYPE); //自投过程中发生故障,直接退出 if(0 != BaoHuQiDongIP) { D_OUT(RemoteObject.Object[ATBH_ZT_2QF].Out_On_No,OFF); //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; return; } //失败 if(TEST_CLOSE == ZTRst) { //分1QS ZTStep = 7; } //自投成功 else if(TEST_END == ZTRst) { //RecordSOE(ATBH_ZT_OK,CanShuValue); //AT自投成功 ZTStep = 9; } break; //合2QS失败 //分1QS case 7: ZTRst = SwitchContrl(ATBH_ZT_1QF,OFF,&ATZT_TIMER,BREAKER_TYPE); //失败 if(TEST_CLOSE == ZTRst) { ZTStep = 0; //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 } //成功 else if(TEST_END == ZTRst) { ZTStep = 8; } break; //分AT隔离开关 case 8: ZTRst = SwitchContrl(ATBH_ZT_QS,OFF,&ATZT_TIMER,ISOLATOR_TYPE); if(TEST_DELAY != ZTRst) { //RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败 ZTStep = 0; } break; case 9: if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_SUCCESS]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_SUCCESS,ON); } RecordSOE(ATBH_ZT_OK,CanShuValue); //AT自投成功 ZTDongZuoIP = TEST_END; //自投结束 break; default: ZTStep = 0; break; } } else { if(ON != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_FAIL]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_FAIL,ON); } RecordSOE(ATBH_ZT_FAIL,CanShuValue); //AT自投失败事件记录 ZTDongZuoIP=TEST_END; //自投结束 } if(ZTDongZuoIP == TEST_END) //自投结束 ZTDongZuoIP = TEST_CLOSE ; } /****************************************************************************** * Function: SoftReset * Description:软件复归,遥控、复归按钮等 * Calls: none * Called By: * Input: RstMode复归方式 FG_MODE_YK-遥控复归 FG_MODE_AN-按钮复归 * Ouput: * Return: * others: * History: * 1.luoyang created * *******************************************************************************/ void SoftReset(unsigned char RstMode) { CanShuType CanShuValue; CanShuValue.Number = 0; //遥控复归 if(FG_MODE_YK == RstMode) { RecordSOE(FG_YK, CanShuValue); } //手动复归 else if(FG_MODE_SD == RstMode) { RecordSOE(FG_AN, CanShuValue); } //复位跳闸灯、重合闸动作灯 //复位跳闸灯 D_OUT(ATBH_TZ_LED_KC,OFF); D_OUT(ATBH_CHZDZ_LED_KC,OFF); //复位偷跳遥信 dl_open_innormal_reset(&ATBH_dl_open_innormal_param); RecordPrtcFlag(ATBH_BTGZ_KC,1,0,0,OFF); ZB_fristFaultIndex = 0; //复位自投动作灯 //printf("ZTDongZuoIP = %d,InPort.Status[ATBH_QDZT_KR] = %d",ZTDongZuoIP,InPort.Status[ATBH_QDZT_KR]); if(TEST_END == ZTDongZuoIP || TEST_CLOSE == ZTDongZuoIP) { //if(OFF != YaoXinStatus[ATBH_YAOXIN_ZT]) //{ // RecordSoftYaoXin(ATBH_YAOXIN_ZT,OFF);//记录自投软遥信 //} if(OFF != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_SUCCESS]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_SUCCESS,OFF); } if(OFF != YaoXinStatus[ATBH_YAOXIN_AT_SWITCH_FAIL]) { RecordSoftYaoXin(ATBH_YAOXIN_AT_SWITCH_FAIL,OFF); } D_OUT(ATBH_ZTDZ_LED_KC,OFF);//自投复归熄灭自投动作灯 ZTDongZuoIP=TEST_CLOSE; //自投复归 } } void StartTiaoZha_atbh(void) { unsigned int IP,mask = 0; CanShuType CanShu; CanShu.Number = 0; //功能说明:启动跳闸程序 //IP = 0xffffffff; /* if(BH_RUN == ATBH_nonui_prtc_trip) { mask = 0; } else { mask = ATBH_FDL_BIT; } */ //IP = recover_failure_trip(ATBH_FDL_BIT,ATBH_nonui_prtc_trip); if(FAIL == TZValue.IP && 0 != recover_failure_trip(ATBH_FDL_BIT,ATBH_nonui_prtc_trip)) { //在跳闸失灵的情况下,保护已返回,清除动作标志 if(kcDelayTimer_2 != 0) { if(kcDelayTimer_2 < WITHDRAW_QFCTRL_MINTIME ) BCJ_OFF_IP = 1; else { kcDelayTimer_2 = 0; Outlet_trip(ATBH_BCJQ_KC, OFF); //收回跳闸命令 } } if(kcDelayTimer_3 != 0) { if(kcDelayTimer_3 < WITHDRAW_QFCTRL_MINTIME ) BCJ1_OFF_IP = 1; else { kcDelayTimer_3 = 0; Outlet_trip(ATBH_1QS_DD_1QF_TZ_KC, OFF); //收回跳闸命令 } } if(kcDelayTimer_4 != 0) { if(kcDelayTimer_4 < WITHDRAW_QFCTRL_MINTIME ) BCJ2_OFF_IP = 1; else { kcDelayTimer_4 = 0; Outlet_trip(ATBH_2QS_DD_2QF_TZ_KC, OFF); //收回跳闸命令 } } TZValue.IP = SUCCESS; QiDongTime = 0; } if((TZValue.Status == TZ_CLOSE) && (TZValue.IP == SUCCESS) && (BaoHuDongZuoIP != 0) && (TZValue.DelayCount == 0)) { //跳闸未启动,上次跳闸已成功 TZValue.Status = TZ_START; TZValue.FaultProcessEndIP = FAULT_START; //置故障开始标志 } } /****************************************************************************** * Function: HSV_PhaseToLine * Description:将高压侧相电压转化为线电压 * Calls: none * Called By: * Input: * Ouput: * Return: * others: * History: * 1.luoyang created 2017-05-08 * ******************************************************************************/ void SaveWave_Id() { int i,readIP; int smpval_t,smpval_f,smpval_d; for(i = 0; i < LoadWave.LengthOfNewData;i++) { readIP = (LoadWave.IP_last + i + REALWAVE_LEN - 1) % (REALWAVE_LEN); //if(BREAKER_TYPE == ATBH_ATMode || (ISOLATOR_TYPE == ATBH_ATMode && ON != YaoXinStatus[ATBH_YAOXIN_GK0])) //modi by 20240618 LW 并联开关不定态当成合位判断 if(BREAKER_TYPE == ATBH_ATMode || (ISOLATOR_TYPE == ATBH_ATMode && OFF == YaoXinStatus[ATBH_YAOXIN_GK0])) { smpval_d = LoadWave.Buffer[ATBH_BH_I_WAVE][readIP] - LoadWave.Buffer[ATBH_BH_IF_WAVE][readIP]; LoadWave.Buffer[ATBH_IDIFF_WAVE][readIP] = (short int)smpval_d; } else { smpval_t = LoadWave.Buffer[ATBH_BH_I_WAVE][readIP] + LoadWave.Buffer[ATBH_DC_IT_WAVE][readIP]; smpval_f = LoadWave.Buffer[ATBH_BH_IF_WAVE][readIP] + LoadWave.Buffer[ATBH_DC_IF_WAVE][readIP]; LoadWave.Buffer[ATBH_IDIFF_WAVE][readIP] = (short int)(smpval_t - smpval_f); } } } void SaveFaultWave_Id(FaultItemType *pBuffer) { int i; int smpval_t,smpval_f,smpval_d; for(i = 0; i < pBuffer->WaveValue.ChannelData[ATBH_BH_I_WAVE].Length;i++) { //if(BREAKER_TYPE == ATBH_ATMode || (ISOLATOR_TYPE == ATBH_ATMode && ON != YaoXinStatus[ATBH_YAOXIN_GK0])) //modi by 20240618 LW 并联开关不定态当成合位判断 if(BREAKER_TYPE == ATBH_ATMode || (ISOLATOR_TYPE == ATBH_ATMode && OFF == YaoXinStatus[ATBH_YAOXIN_GK0])) { smpval_d = pBuffer->WaveValue.ChannelData[ATBH_BH_I_WAVE].Data[i] - pBuffer->WaveValue.ChannelData[ATBH_BH_IF_WAVE].Data[i]; pBuffer->WaveValue.ChannelData[ATBH_IDIFF_WAVE].Data[i] = (short int)smpval_d; } else { smpval_t = pBuffer->WaveValue.ChannelData[ATBH_BH_I_WAVE].Data[i] + pBuffer->WaveValue.ChannelData[ATBH_DC_IT_WAVE].Data[i]; smpval_f = pBuffer->WaveValue.ChannelData[ATBH_BH_IF_WAVE].Data[i] + pBuffer->WaveValue.ChannelData[ATBH_DC_IF_WAVE].Data[i]; pBuffer->WaveValue.ChannelData[ATBH_IDIFF_WAVE].Data[i] = (short int)(smpval_t - smpval_f); } } } #endif