⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9311fa.c-old

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C-OLD
📖 第 1 页 / 共 3 页
字号:
				FDRunInfo[i].Timer[0]++;
				if (type)
				{
					if (++FDRunInfo[i].Timer[1] >= FDRunInfo[i].ShortIConfTimeLimit)
					{
						StateChange(i, RS_IOVERLIMIT);
					}
				}
				else if (FDRunInfo[i].Timer[0] >= FDRunInfo[i].OverIConfTimeLimit)
					StateChange(i, RS_IOVERLIMIT);
			}
			else
				StateChange(i, RS_NORMAL);
			break;
			
		case RS_IOVERLIMIT:		//超限值态
			if (!DetectOverI(i, Feeder[i].FACfg, TRUE, &type))
			{
				if (DetectLow(i, FDRunInfo[i].FDetectU, TRUE))
					StateChange(i, RS_QBREAKER);
				else
					StateChange(i, RS_QRECOVERY);
			}
			break;
			
		case RS_QRECOVERY:		//检测系统恢复态
			if (DetectLow(i, FDRunInfo[i].FDetectU, TRUE))
				StateChange(i, RS_QBREAKER);
			else if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
				StateChange(i, RS_IOVERLIMIT);
			else if (DetectUOK(i, FDRunInfo[i].FDetectPT))
			{
				if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].OverLimitResConfTimeLimit)
					StateChange(i, RS_NORMAL);
			}
			else
				FDRunInfo[i].Timer[0] = 0;
			break;
			
		case RS_QBREAKER:		//检测开关跳开态
			if (DetectLow(i, FDRunInfo[i].FDetectU, TRUE))
			{
				if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].SwitchDoConfTimeLimit)
					StateChange(i, RS_BREAKEROP);
			}
			else
				StateChange(i, RS_QRECOVERY);
			break;
		
		case RS_BREAKEROP:		//开关跳开态
			if ((Feeder[i].FACfg & FAC_RECLOSE) && ((Feeder[i].FACfg & FAC_OVER_TRIP) || (Feeder[i].FACfg & FAC_KG_PROTECT)) && (!FDRunInfo[i].HaveReclose))
			{
//				if (DetectUOK(i, FDRunInfo[i].FDetectPT))	//dingding
					if (++FDRunInfo[i].Timer[1] >= FDRunInfo[i].HaveUReCloseTimeLimit)
						Reclose(i);
			}
			
			if (DetectLow(i, FDRunInfo[i].FDetectU, TRUE))
			{
				if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].ReCloseLockConfTimeLimit)
					StateChange(i, RS_LOCKOUT);
			}
			else
				StateChange(i, RS_QBREAKERREC);			
			break;
		
		case RS_QBREAKERREC:	//检测开关恢复态
			if (DetectLow(i, FDRunInfo[i].FDetectU, TRUE))
				StateChange(i, RS_BREAKEROP);
			else if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
			{
				if (++ FDRunInfo[i].Timer[0] >= CONFDELAYTIME)
					StateChange(i, RS_IOVERLIMIT);
			}
			else if (DetectUOK(i, FDRunInfo[i].FDetectPT))
			{
				if (++FDRunInfo[i].Timer[1] >= FDRunInfo[i].ReCloseSuccConfTimeLimit)
					StateChange(i, RS_NORMAL);
			}
			else
			{
				FDRunInfo[i].Timer[0] = 0;
				FDRunInfo[i].Timer[1] = 0;
			}
			break;
		
		case RS_LOCKOUT:		//重合闸闭锁态
			StateChange(i, RS_NOUI);
			break;
			
		case RS_MAGRESTRAINT:	//励磁涌流屏蔽态
			if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].MagneticTimeLimit)
			{
				if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
					StateChange(i, RS_IOVERLIMIT);
			}

			if (DetectLow(i, FDRunInfo[i].FDetectPT, !FDRunInfo[i].FDetectPT))
				StateChange(i, RS_NOUI);
			else if (DetectUOK(i, FDRunInfo[i].FDetectPT))
				StateChange(i, RS_NORMAL);

			break;
			
		}//switch
	}//for
}

/*------------------------------------------------------------------*/
/*函数名称:StateChange()											*/
/*函数功能:状态转换,完成相关状态下操作,打印系统信息				*/
/*------------------------------------------------------------------*/
void StateChange(WORD FDIndex, WORD State)
{
	INT8U	j;
	char	errbuf[60];
	struct SysTime_t SystemTime;
	
	memset (errbuf, 0, 60);
	
	if (FDRunInfo[FDIndex].RunState == State)
		return;	
	
	GetTime((void *)&SystemTime, SYSTIME);

	#ifdef CHINESEINFO
		sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d %s", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, FDInfo[State-1]);
	#else
		sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d %s", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, FDInfo[State-1]);	
	#endif

	ErrorInfo(FAID, errbuf);
	
			
	switch (State)
	{
	case RS_NORMAL:
		if (FDRunInfo[FDIndex].FTransient)
		{
			if ((Feeder[FDIndex].FACfg & FAC_RECLOSE) && (Feeder[FDIndex].FACfg & FAC_NOU_TRIP) && (!FDRunInfo[FDIndex].HaveReclose))
				FDRunInfo[FDIndex].NeedReclose = TRUE;
			else
			{
				FDRunInfo[FDIndex].FTransient = FALSE;
				WriteFaultInfo(FDIndex, FALSE);
			}
		}
		else
		{
			FDRunInfo[FDIndex].FaultInfo.Type = FALSE;		
			FDRunInfo[FDIndex].FTransient = FALSE;
		}
		break;
			
	case RS_NOUI:
		FDRunInfo[FDIndex].FTransient = FALSE;
		FDRunInfo[FDIndex].HaveReclose = FALSE;
		FDRunInfo[FDIndex].NeedReclose = FALSE;
		FDRunInfo[FDIndex].FaultInfo.Type = FALSE;
		break;
			
	case RS_IOVERLIMIT:
		if ((FDRunInfo[FDIndex].RunState == RS_QOVERI) || (FDRunInfo[FDIndex].RunState == RS_MAGRESTRAINT))
			GetTime((void *)&FDRunInfo[FDIndex].FaultInfo.Time, ABSTIME);
			
		if (Feeder[FDIndex].FACfg & FAC_OVER_TRIP)
			SwitchDo(FDIndex, FALSE);
			
		break;
			
	case RS_BREAKEROP:

		if (Feeder[FDIndex].FACfg & FAC_NOU_TRIP)
			SwitchDo(FDIndex, FALSE);
		break;
			
	case RS_QBREAKERREC:
		FDRunInfo[FDIndex].FTransient = TRUE;
		break;
	
	case RS_LOCKOUT:
		if (Feeder[FDIndex].FACfg & FAC_TWONOU_TRIP)
			SwitchDo(FDIndex, FALSE);

		WriteFaultInfo(FDIndex, TRUE);
		break;
	}
	
	//故障录波
	if ((State == RS_QOVERI) || (State == RS_MAGRESTRAINT))
	{
		if (!Lb[FDIndex].State)
		{
			Lb[FDIndex].Flag = LBFault;
			Lb[FDIndex].State = LBSTART;
		}
	}
	
	FDRunInfo[FDIndex].RunState = State; 
	for(j=0; j<4; j++)
		FDRunInfo[FDIndex].Timer[j] = 0;

}

/*------------------------------------------------------------------*/
/*函数名称:SetFaLimitT()											*/
/*函数功能:设置馈线信息											*/
/*------------------------------------------------------------------*/
BOOL SetFaFeeder(INT8U i)
{
	INT8U	j;
	char	errbuf[60];
	
	memset (errbuf, 0, 60);
	
	Feeder[i].Control = MyCfg.Fd[i].Control;
	Feeder[i].FACfg = MyCfg.Fd[i].FACfg;
	Feeder[i].Yxzt = MyCfg.Fd[i].Yxzt;
	Feeder[i].Yxzt2 = MyCfg.Fd[i].Yxzt2;
	Feeder[i].FaultBI = MyCfg.Fd[i].FaultBI;
	Feeder[i].YkH = MyCfg.Fd[i].YkH;
	Feeder[i].YkF = MyCfg.Fd[i].YkF;

	if (!(Feeder[i].Control & FAULTD_ENABLE))
		return (FALSE);

	//检查功能配置(目前已有维护软件识别)
	j = 0;
	if (Feeder[i].FACfg & FAC_NOU_TRIP)
		j++;
	if (Feeder[i].FACfg & FAC_TWONOU_TRIP)
	{
		j++;
		if (Feeder[i].FACfg & FAC_RECLOSE)
			j++;
	}
	if (Feeder[i].FACfg & FAC_OVER_TRIP)
		j++;
	if (Feeder[i].FACfg & FAC_KG_PROTECT)
		j++;
	
	if (j > 1)
	{
		#ifdef CHINESEINFO
			sprintf (errbuf, "ERR: 线路%d 功能配置冲突...", i+1);
		#else
			sprintf (errbuf, "ERR: Feeder %d conflict of action", i+1);
		#endif
		
		ErrorInfo(FAID, errbuf);
		return (FALSE);
	}
	
	//采集故障实遥信(目前已有维护软件识别)
	if (Feeder[i].Control & FAULTBI_ENABLE)
	{
		if (Feeder[i].Control & FAULTD_ENABLE)
		{
			Feeder[i].Control &= (~FAULTD_ENABLE);
			
			#ifdef CHINESEINFO
				sprintf (errbuf, "线路 %d 检测故障实遥信...", i+1);
			#else
				sprintf (errbuf, "Feeder %d fault BI enable,so FA disable", i+1);
			#endif
			
			ErrorInfo(FAID, errbuf);
		}
		if (Feeder[i].FaultBI >= (FDOTHERYXNUM - OTHERSOFTBINUM))
		{
			Feeder[i].Control &= (~FAULTBI_ENABLE);
			#ifdef CHINESEINFO
				sprintf (errbuf, "线路 %d 故障实遥信无效...", i+1);
			#else
				sprintf (errbuf, "Feeder %d fault BI invalid", i+1);
			#endif
			
			ErrorInfo(FAID, errbuf);
		}
	}
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:SetFaLimitT()											*/
/*函数功能:设置故障检测各时间的限值								*/
/*------------------------------------------------------------------*/
BOOL SetFaLimitT(INT8U i)
{
	
	FDRunInfo[i].OverIConfTimeLimit = MyCfg.Fd[i].OverIConfTimeLimit / FACYC;
	FDRunInfo[i].ShortIConfTimeLimit = MyCfg.Fd[i].ShortIConfTimeLimit / FACYC;
	FDRunInfo[i].ZeroOverIConfTimeLimit = MyCfg.Fd[i].ZeroOverIConfTimeLimit / FACYC;
	FDRunInfo[i].ZeroShortIConfTimeLimit = MyCfg.Fd[i].ZeroShortIConfTimeLimit / FACYC;
	FDRunInfo[i].OverLimitResConfTimeLimit = MyCfg.Fd[i].OverLimitResConfTimeLimit / FACYC;
	FDRunInfo[i].SwitchDoConfTimeLimit = MyCfg.Fd[i].SwitchDoConfTimeLimit / FACYC;
	FDRunInfo[i].LowUIConfTimeLimit = MyCfg.Fd[i].LowUIConfTimeLimit / FACYC;
	FDRunInfo[i].MagneticTimeLimit = MyCfg.Fd[i].MagneticTimeLimit / FACYC;
	FDRunInfo[i].HaveUReCloseTimeLimit = MyCfg.Fd[i].HaveUReCloseTimeLimit / FACYC;
	FDRunInfo[i].ReCloseSuccConfTimeLimit = 100 * MyCfg.Fd[i].ReCloseSuccConfTimeLimit / FACYC;
	FDRunInfo[i].ReCloseLockConfTimeLimit = 100 * MyCfg.Fd[i].ReCloseLockConfTimeLimit / FACYC;
	FDRunInfo[i].LowUIResConfTimeLimit = 100 * MyCfg.Fd[i].LowUIResConfTimeLimit / FACYC;
	FDRunInfo[i].FAInfoResetTimeLimit = MyCfg.Fd[i].FAInfoResetTimeLimit;
	
	return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:SetFaLimitV()											*/
/*函数功能:设置故障检测各遥测的限值								*/
/*------------------------------------------------------------------*/
BOOL SetFaLimitV(INT8U i)
{
	INT16U	j;
	INT32U	tmp, tt;
		
	//参数没有整定
	if (!SysCfg.ParaValid)
	{
		for (j=0; j<FDNum; j++)
			Feeder[j].Control &= (~FAULTD_ENABLE);
		#ifdef CHINESEINFO
			ErrorInfo(FAID, "遥测没有整定,故障检测失效");	
		#else
			ErrorInfo(FAID, "Yc para invalid, FA disable");
		#endif
		return (FALSE);
	}	
	tmp = (YCPara.Value[i*10+2] * MyCfg.Ai[i*13+2].Xs2) / (MyCfg.Ai[i*13+2].Xs1);	//Ia
	tt = (tmp * MyCfg.Fd[i].OverILimit) / 1000;
	LimitValue[i].OverLimit = MyPow(tt, 2);
	tt = (tmp * MyCfg.Fd[i].ShortILimit) / 1000;
	LimitValue[i].ShortLimit = MyPow(tt, 2);
	tt = (tmp * MyCfg.Fd[i].LowILimit) / 1000;
	LimitValue[i].LowILimit = MyPow(tt, 2);
	
	tmp = (YCPara.Value[i*10+5] * MyCfg.Ai[i*13+5].Xs2) / (MyCfg.Ai[i*13+5].Xs1);	//Io	
	tt = (tmp * MyCfg.Fd[i].ZeroOverILimit) / 1000;
	LimitValue[i].ZeroOverLimit = MyPow(tt, 2);
	tt = (tmp * MyCfg.Fd[i].ZeroShortILimit) / 1000;
	LimitValue[i].ZeroShortLimit = MyPow(tt, 2);
	
	tmp = (YCPara.Value[i*10+0] * MyCfg.Ai[i*13+0].Xs2) / (MyCfg.Ai[i*13+0].Xs1);	//Uab
	tt = (tmp * MyCfg.Fd[i].OverULimit) / 2200;
	LimitValue[i].ReturnULimit = MyPow(tt, 2);
	tt = (tmp * MyCfg.Fd[i].LowULimit) / 2200;
	LimitValue[i].LowULimit = MyPow(tt, 2);
	

	return (TRUE);
}


/*------------------------------------------------------------------*/
/*函数名称:DetectLow()												*/
/*函数功能:检测失压失流											*/
/*输入说明:TypeU:检测电压时为TRUE;TypeI:检测电流时为TRUE			*/
/*输出说明:满足返回TRUE											*/
/*------------------------------------------------------------------*/
BOOL DetectLow(INT16U FDIndex, BOOL TypeU, BOOL TypeI)
{
	INT8U	i;
	
	if (FDIndex == -1)
		return FALSE;
	
	if (TypeU)
	{
		for (i=0; i<FDRunInfo[FDIndex].FaultBound; i++)
			if (TempYc[FDRunInfo[FDIndex].UStartNo + i] >= LimitValue[FDIndex].LowULimit)
				return FALSE;
	}
	if (TypeI)
	{
		for (i=0; i<FDRunInfo[FDIndex].FaultBound; i++)
			if (TempYc[FDRunInfo[FDIndex].IStartNo + i] >= LimitValue[FDIndex].LowILimit)
				return FALSE;
		if (Feeder[FDIndex].FACfg & FAC_DXJD)
			if (TempYc[FDRunInfo[FDIndex].IStartNo + FDRunInfo[FDIndex].FaultBound] >= LimitValue[FDIndex].LowILimit)
				return FALSE;
	}
			
	return TRUE;	
}

/*------------------------------------------------------------------*/
/*函数名称:DetectUOK()												*/
/*函数功能:检测电压恢复											*/
/*输入说明:Type:能检测电压时为TRUE									*/
/*输出说明:满足返回TRUE											*/
/*------------------------------------------------------------------*/
BOOL DetectUOK(INT16U FDIndex, BOOL Type)
{
	INT8U	i;
	
	if (Type)
	{
		for (i=0; i<FDRunInfo[FDIndex].FaultBound; i++)
			if (TempYc[FDRunInfo[FDIndex].UStartNo + i] >= LimitValue[FDIndex].ReturnULimit)
				return TRUE;
	}
	else
	{
		for (i=0; i<FDRunInfo[FDIndex].FaultBound; i++)
			if (TempYc[FDRunInfo[FDIndex].IStartNo + i] >= LimitValue[FDIndex].LowILimit)
				return TRUE;	
	}
	
	return FALSE;
}
	

/*------------------------------------------------------------------*/
/*函数名称:DetectOverI()											*/
/*函数功能:检测电流过限值并判断类型								*/
/*输入说明:IType:检测的电流类型; SetFlag:纪录故障					*/
/*输出说明:满足返回TRUE; FAType--TRUE:超短路;FALSE:超过流			*/
/*------------------------------------------------------------------*/
BOOL DetectOverI(INT16U FDIndex, INT16U IType, BOOL SetFlag, BOOL *FAType)
{
	BOOL	Over, Bound;
	INT8U	i;
	INT16U	k = 0;
	
	*FAType = FALSE;
	
	if (FDIndex == -1)
		return FALSE;
			
	Over = FALSE;
	for (i=0; i<FDRunInfo[FDIndex].FaultBound; i++)
	{
		Bound = FALSE;
		if (IType & FAC_OVERD)
			if (TempYc[FDRunInfo[FDIndex].IStartNo+i] >= LimitValue[FDIndex].OverLimit)
			{
				Bound = TRUE;
				Over = TRUE;
			}
		
		if (IType & FAC_SHORTD)
			if (TempYc[FDRunInfo[FDIndex].IStartNo+i] >= LimitValue[FDIndex].ShortLimit)
			{
				Bound = TRUE;
				Over = TRUE;			
				*FAType = TRUE;
			}
					
		if (SetFlag)
		{
			k= ((INT16U)0x0001) << i;
			if (Bound)
				FDRunInfo[FDIndex].FaultInfo.Type |= k;
		}
	}
	
	if (IType & FAC_DXJD)
	{
		Bound = FALSE;
		if (IType & FAC_ZEROOVERD)
			if (TempYc[FDRunInfo[FDIndex].IStartNo+FDRunInfo[FDIndex].FaultBound] >= LimitValue[FDIndex].ZeroOverLimit)
				Bound = TRUE;
		
		if (IType & FAC_ZEROSHORTD)
			if (TempYc[FDRunInfo[FDIndex].IStartNo+FDRunInfo[FDIndex].FaultBound] >= LimitValue[FDIndex].ZeroShortLimit)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -