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

📄 9311fa.c-old

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C-OLD
📖 第 1 页 / 共 3 页
字号:
			{
				Bound = TRUE;			
				*FAType = TRUE;
			}		
		
		if (SetFlag && Bound)
			FDRunInfo[FDIndex].FaultInfo.Type |= FAT_ZERO;
	}

	return (Over || Bound);	
}

/*------------------------------------------------------------------*/
/*函数名称:Reclose()												*/
/*函数功能:完成重合闸功能,并处理相关信息							*/
/*------------------------------------------------------------------*/
void Reclose(INT16U FDIndex)
{
	#ifdef FUNCTION_CN
		ReclosePL(FDIndex);
		return ;
	#endif
	
	SwitchDo(FDIndex, TRUE);
	
	FDRunInfo[FDIndex].HaveReclose = TRUE;
	FDRunInfo[FDIndex].NeedReclose = FALSE;
	FDRunInfo[FDIndex].FaultInfo.TmpType = FDRunInfo[FDIndex].FaultInfo.Type;
	ReCounter = FDRunInfo[FDIndex].OverLimitResConfTimeLimit;
	FDRunInfo[FDIndex].Timer[1] = 0;
}

/*------------------------------------------------------------------*/
/*函数名称:CheckReClose()											*/
/*函数功能:检查重合是否成功										*/
/*------------------------------------------------------------------*/
void CheckReClose(void)
{
	INT16U	i;
	BOOL	type = FALSE;
	
	for (i=0; i<FDNum; i++)
	{
		if (!(Feeder[i].Control & FAULTD_ENABLE))
			continue;
		
		if (ReCounter)
		{
			ReCounter--;
			if (!ReCounter)
			{
				if (FDRunInfo[i].RunState == RS_NORMAL)
					type = TRUE;
				if ((FDRunInfo[i].RunState == RS_QRECOVERY) && (FDRunInfo[i].Timer[0] > (100/FACYC)))
					type = TRUE;
				if (type)
				{
					FDRunInfo[i].FaultInfo.Type = FDRunInfo[i].FaultInfo.TmpType;
					WriteFaultInfo(i, FALSE);
				}
			}
		}
	}

}

/*------------------------------------------------------------------*/
/*函数名称:SwitchDo()												*/
/*函数功能:完成开关动作,合/分,延时保证命令的执行					*/
/*------------------------------------------------------------------*/
void SwitchDo(INT16U FDIndex, BOOL ON_OFF)
{
	INT8U	YKNumber;
	BOOL	bSuccess;
	char	errbuf[60];
	struct SysTime_t SystemTime;
	
	if (YKOnCounter || ACTING)
	{
		YKMem.FDIndex = FDIndex;
		YKMem.ON_OFF = ON_OFF;
		YKMem.Flag = TRUE;
		return ;
	}
	else
		memset (&YKMem, 0, sizeof (struct YKDelayMem));

	if (ON_OFF)
		YKNumber = Feeder[FDIndex].YkH;
	else
		YKNumber = Feeder[FDIndex].YkF;	

	//开关动作
	bSuccess = YKSet(YKNumber, ON_OFF, 0);
	if(bSuccess)
		bSuccess = YKExe(YKNumber, ON_OFF, 0);
			
	memset (errbuf, 0, 60);
	GetTime((void *)&SystemTime, SYSTIME);
	
	if (ON_OFF)
	{
		#ifdef CHINESEINFO
			if (bSuccess)
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 重合成功...(遥控号 = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);
			else
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 重合失败...(遥控号 = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);
		#else
			if (bSuccess)
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d Reclose Success...(YKNO = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);	
			else
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d Reclose Fail...(YKNO = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);	
		#endif
	}
	else
	{
		#ifdef CHINESEINFO
			if (bSuccess)
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 跳开成功...(遥控号 = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);
			else
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 跳开失败...(遥控号 = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);
		#else
			if (bSuccess)
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d Trip Success...(YKNO = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);	
			else
				sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d Trip Fail...(YKNO = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1, YKNumber);
		#endif
	}
	ErrorInfo(FAID, errbuf);

}

/*------------------------------------------------------------------*/
/*函数名称:WriteFaultInfo()										*/
/*函数功能:写故障遥信												*/
/*输入说明:Forever--TRUE:永久性故障								*/
/*------------------------------------------------------------------*/
void WriteFaultInfo(INT16U FDIndex, BOOL Forever)
{
	BOOL	rc = FALSE;
	INT16U	SoftBINo;
	
	if (FDRunInfo[FDIndex].FaultInfo.Type == 0)
		return;
	
	if (Forever)
		FDRunInfo[FDIndex].FaultInfo.Type |= FAT_FOREVER;
	else
		FDRunInfo[FDIndex].FaultInfo.Type &= (~FAT_FOREVER);
	
	ResetFaultInfo(FDIndex);
	FDRunInfo[FDIndex].FaultInfo.BakType = FDRunInfo[FDIndex].FaultInfo.Type;
	FDRunInfo[FDIndex].FaultInfo.ResetCounter = FDRunInfo[FDIndex].FAInfoResetTimeLimit;
	
	SoftBINo = GetSoftBINo((INT16U*)&FDRunInfo[FDIndex].FaultInfo.Type);
	while (SoftBINo)
	{
		SOE[HEAD].No = FDOTHERYXNUM + (FDIndex * FASOFTBINUM) + SoftBINo;
		SOE[HEAD].Status =  YX_H;
		SOE[HEAD].Time = FDRunInfo[FDIndex].FaultInfo.Time;
		HEAD++;
		if (HEAD >= SOE_NUM_TMP)
			HEAD = 0;
		rc = TRUE;
				
		SoftBINo = GetSoftBINo((INT16U*)&FDRunInfo[FDIndex].FaultInfo.Type);
	}
	
	if (rc)
	{
		if (Feeder[FDIndex].FACfg & FAC_SOE)
			SOETask(ROOTID, TRUE);
		else
			SOETask(ROOTID, FALSE);
	}
}

/*------------------------------------------------------------------*/
/*函数名称:ResetFaultInfo()										*/
/*函数功能:复位故障遥信											*/
/*------------------------------------------------------------------*/
void ResetFaultInfo(INT16U FDIndex)
{
	BOOL	rc = FALSE;
	INT16U	SoftBINo;
	struct AbsTime_t Time;
	
	if (FDRunInfo[FDIndex].FaultInfo.BakType == 0)
		return;
	FDRunInfo[FDIndex].FaultInfo.ResetCounter = 0;
	
	SoftBINo = GetSoftBINo((INT16U*)&FDRunInfo[FDIndex].FaultInfo.BakType);
	while (SoftBINo)
	{
		SOE[HEAD].No = FDOTHERYXNUM + (FDIndex * FASOFTBINUM) + SoftBINo;
		SOE[HEAD].Status =  YX_F;
		GetTime((void *)&Time, ABSTIME);
		SOE[HEAD].Time = Time;
		HEAD++;
		if (HEAD >= SOE_NUM_TMP)
			HEAD = 0;
		rc = TRUE;
		
		SoftBINo = GetSoftBINo((INT16U*)&FDRunInfo[FDIndex].FaultInfo.BakType);
	}
	
	if (rc)
		SOETask(ROOTID, TRUE);		

}

/*------------------------------------------------------------------*/
/*函数名称:GetSoftBINo(INT16U *FaultType)							*/
/*函数功能:获得故障遥信号											*/
/*------------------------------------------------------------------*/
INT16U GetSoftBINo(INT16U *FaultType)
{
			
	if ((*FaultType) & FAT_FOREVER)
	{
		if ((*FaultType) & FAT_A)
		{
			(*FaultType) &= (~FAT_A);
			return (FAAFOREVER);
		}
		if ((*FaultType) & FAT_B)
		{
			(*FaultType) &= (~FAT_B);
			return (FABFOREVER);
		}
		if ((*FaultType) & FAT_C)
		{
			(*FaultType) &= (~FAT_C);
			return (FACFOREVER);
		}
		if ((*FaultType) & FAT_ZERO)
		{
			(*FaultType) &= (~FAT_ZERO);
			return (FAOFOREVER);
		}
		
		(*FaultType) &= (~FAT_FOREVER);
		return (FAFAULTD);
	}
	else
	{
		if ((*FaultType) & FAT_A)
		{
			(*FaultType) &= (~FAT_A);
			return (FAAINSTANT);
		}
		if ((*FaultType) & FAT_B)
		{
			(*FaultType) &= (~FAT_B);
			return (FABINSTANT);
		}
		if ((*FaultType) & FAT_C)
		{
			(*FaultType) &= (~FAT_C);
			return (FACINSTANT);
		}
		if ((*FaultType) & FAT_ZERO)
		{
			(*FaultType) &= (~FAT_ZERO);
			return (FAOINSTANT);
		}
	}
	
	return (0);	
}



/*------------------------------------------------------------------*/
/*函数名称:ReadYc(void)											*/
/*函数功能:读取相应的中间遥测值									*/
/*------------------------------------------------------------------*/
void ReadYc(void)
{
	INT8U	i, j, k;
	
	for (i=0; i<FDNum; i++)
	{
		for (j=0, k=0; j<8; j++)
		{
			if ((j == 1) || (j == 3))
				continue;
			
			TempYc[i*8 + j] = YCTemp[i].FData[k].Rms2;
			k++;
		}
	}
}

/*------------------------------------------------------------------*/
/*函数名称:FATest()												*/
/*函数功能:当"安装测试"按钮按下后,虚拟故障产生(仅事故总信号)	*/
/*------------------------------------------------------------------*/
void FATest(void)
{
	if ((at91_pio_read (&PIO_DESC) & SW1_Test) != SW1_Test)
		TestCounter++;
	else
	{
		FTest = FALSE;
		TestCounter = 0;
	}

	if ((TestCounter >= TESTCONFTIME) && (!FTest))
	{
		FTest = TRUE;
		GetTime((void *)&FDRunInfo[0].FaultInfo.Time, ABSTIME);
		FDRunInfo[0].FaultInfo.Type = FAT_FOREVER;
		WriteFaultInfo(0, TRUE);
	}
	
}

	
#ifdef FUNCTION_CN		//FUNCTION_CN

/*------------------------------------------------------------------*/
/*函数名称:CNTask()												*/
/*函数功能:储能动作任务,针对蓬莱用户现场							*/
/*------------------------------------------------------------------*/
void CNTask(void)
{
	BOOL	rc;
	INT8U	i, yxcn;
	char	errbuf[60];	
	struct DBInfo	info;
	struct SysTime_t SystemTime;
	
	info.SuperID = 0;
	info.DevID = 0;
	info.Type = YXDATA;
	info.Start = 0;
	info.Num = 1;
	
	for (i=0; i<FDNum; i++)
	{
		yxcn = YX_H;
		info.Start = MyCfg.Fd[i].Yxcn;
		rc = DBRead(&yxcn, &info);
		if (rc)
		{
			if (yxcn == YX_F)
			{
				if (CnInfo[i].Delay > CNDELAY)
				{
					CnInfo[i].Delay = 0;
					if (CnInfo[i].CNCount < CNCOUNT)
					{
						CnInfo[i].CNCount++;
						
						memset (errbuf, 0, 60);
						GetTime((void *)&SystemTime, SYSTIME);
						
						//开关动作
						rc = YKSet(3*i+2, FALSE, 0);
						if(rc)
							rc = YKExe(3*i+2, FALSE, 0);
						
						#ifdef CHINESEINFO
							if (rc)
								sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 储能成功...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, i+1);
							else
								sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 储能失败...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, i+1);
						#else
							if (rc)
								sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d CN Success...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, i+1);	
							else
								sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d CN Fail...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, i+1);	
						#endif	
						ErrorInfo(FAID, errbuf);
						
					}
				}
				else
				{
					if (!YKOnCounter)
						CnInfo[i].Delay++;
				}
			}
			else
			{
				memset (&CnInfo[i], 0, sizeof (struct CNInfo));
			}
		}
	}
		
}


/*------------------------------------------------------------------*/
/*函数名称:CheckKGZT()												*/
/*函数功能:检查开关状态,状态分时返回TRUE							*/
/*------------------------------------------------------------------*/
BOOL CheckKGZT(INT16U FDIndex)
{
	BOOL	rc;
	INT8U	yxcn;
	struct DBInfo	info;
	
	info.SuperID = 0;
	info.DevID = 0;
	info.Type = YXDATA;
	info.Start = MyCfg.Fd[FDIndex].Yxzt;
	info.Num = 1;
	
	yxcn = YX_H;
	rc = DBRead(&yxcn, &info);
	if (rc)
	{
		if (yxcn == YX_F)
			return (TRUE);
		else
			return (FALSE);
	}
	
	return (FALSE);
}

/*------------------------------------------------------------------*/
/*函数名称:ReclosePL()												*/
/*函数功能:完成重合闸功能,并处理相关信息,针对蓬莱,判断开关状态	*/
/*------------------------------------------------------------------*/
void ReclosePL(INT16U FDIndex)
{
	BOOL	rc;
	char	errbuf[60];	
	struct SysTime_t SystemTime;

	rc = CheckKGZT(FDIndex);
	if (rc)
	{
		SwitchDo(FDIndex, TRUE);
	}
	else
	{
		memset (errbuf, 0, 60);
		GetTime((void *)&SystemTime, SYSTIME);
		#ifdef CHINESEINFO
			sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 线路 %d 不需要重合...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1);
		#else
			sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d needn't reclose...", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, FDIndex+1);	
		#endif	
		ErrorInfo(FAID, errbuf);
	}

	FDRunInfo[FDIndex].HaveReclose = TRUE;
	FDRunInfo[FDIndex].NeedReclose = FALSE;
	FDRunInfo[FDIndex].FaultInfo.TmpType = FDRunInfo[FDIndex].FaultInfo.Type;
	ReCounter = FDRunInfo[FDIndex].OverLimitResConfTimeLimit;
	FDRunInfo[FDIndex].Timer[1] = 0;
	
}



#endif			//FUNCTION_CN

⌨️ 快捷键说明

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