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

📄 9311fa.c-old

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C-OLD
📖 第 1 页 / 共 3 页
字号:
/*------------------------------------------------------------------*/
/*模块名称:fatest.cpp                                            	*/
/*模块功能:馈线故障检测	                               			*/
/*编写日期:2004年8月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/

#include "includes.h"
#include "9311fa.h"



//函数声明
#ifdef	DF9311_FDRTASK
extern void FdrTask(struct SysPort *Info);
#endif

//全局变量
extern INT8U			TGSH;
extern BOOL				ACTING;
extern SOEtmp_t			*SOEtmp;
extern struct MyConfig	MyCfg;
extern struct SysConfig	SysCfg;
extern struct YCPara_t	YCPara;
extern struct LB_t		Lb[MAXYCFD];
extern INT16U			YKOnCounter;

extern OS_EVENT		*SemFA;
extern OS_EVENT		*SemFAOneS;
extern struct YCTempData	YCTemp[MAXYCFD];

//变量定义
#ifdef CHINESEINFO
char *FDInfo[] = \
{"正常","检失电(失压且失流)...","失电(失压且失流)","检过流...","空闲","短路(过流)","检电压(流)恢复正常...",
"检变电站断路器跳闸...","变电站断路器故障跳闸","变电站断路器重合成功","变电站断路器跳闸闭锁","检励磁涌流..."};
#else
char *FDInfo[] = \
{"Normal","Qualify NoUI...","NoUI","Qualify OverI...","Idle","I Over Limit","Qualify Recovery...",
"Qualify Breaker...","Breaker Operation","Qualify Breaker Recovery","Lock Out","Magnet Restraint..."};
#endif

extern INT16U	FDNum;
INT16U	FDOTHERYXNUM;				//FTU所含馈线数
struct YKDelayMem	YKMem;
struct Feeder_t		*Feeder;
struct FDRunInfo_t	*FDRunInfo;
struct LimitValue_t *LimitValue;
INT32U	*TempYc;
INT16U	TestCounter, ReCounter;
BOOL	FTest;

#ifdef FUNCTION_CN
	struct CNInfo CnInfo[2];
#endif	

//ceshi
INT32U  pFAAbsMsecond, pFAAbsMsecond1, dingfiq;
char    dingerr[60];
struct SysTime_t pSystemTime;
extern struct AbsTime_t	pAbsTime;

/*------------------------------------------------------------------*/
/*函数名称:FATask(void *pdata)										*/
/*函数功能:故障检测任务											*/
/*------------------------------------------------------------------*/
void FATask(struct SysPort *Info)
{
	BOOL	dd = FALSE, rc = FALSE;
	INT8U	err, i;
	INT16U	events;

	memset (&YKMem, 0, sizeof (struct YKDelayMem));
	//读入馈线数量
	if (TGSH)
	{
		FDOTHERYXNUM = DEFBINUM * 2 + OTHERSOFTBINUM;
	}
	else
	{
		FDOTHERYXNUM = DEFBINUM + OTHERSOFTBINUM;
	}
	
	//判断进入何种故障检测
	for (i=0; i<FDNum; i++)
	{
		if (MyCfg.Fd[i].Control & FDR_ENABLE)
			dd = TRUE;
	}
	for (i=0; i<FDNum; i++)
	{
		if (dd && (MyCfg.Fd[i].Control & FAULTD_ENABLE))
		{
			#ifdef CHINESEINFO
				ErrorInfo(FAID, "故障检测配置冲突,任务终止...");
			#else
				ErrorInfo(FAID, "FA Task failed...");
			#endif
			
			OSTaskDel(FAID);
		}
	}


	OSTimeDlyHMSM(0, 0, 0, 20);

	//进入电压型故障检测
	if (dd)
	{
		#ifdef	DF9311_FDRTASK
		FdrTask(Info);
		#endif
		OSTaskDel(FAID);
	}

	//参数初始化
	rc = InitFAPara();
	
	#ifdef FUNCTION_CN
		memset (&CnInfo[0], 0, FDNum * sizeof (struct CNInfo));
	#endif
	
	pFAAbsMsecond = pAbsTime.Msecond;	
	while (1)
	{
		events = OSFlagPend(Info->Event, FYCRDY+TIME100MS+FCOS,
			OS_FLAG_WAIT_SET_ANY+OS_FLAG_CONSUME, 0, &err);	

		if (events & FYCRDY)
		{
		    //ceshi
			if (pFAAbsMsecond <= pAbsTime.Msecond)
			    pFAAbsMsecond = pAbsTime.Msecond - pFAAbsMsecond;
			else
			    pFAAbsMsecond = pAbsTime.Msecond + 60000 - pFAAbsMsecond;
			    
			if (pFAAbsMsecond >= 20)
			{
			    GetTime((void *)&pSystemTime, SYSTIME);
           		sprintf(dingerr, "%04d-%02d-%02d %02d:%02d:%02d:%03d time=%d", pSystemTime.Year, pSystemTime.Month, pSystemTime.Day, pSystemTime.Hour,pSystemTime.Minute, pSystemTime.Second, pSystemTime.MSecond, pFAAbsMsecond);
            	ErrorInfo(FAID, dingerr);
			}
			pFAAbsMsecond = pAbsTime.Msecond;
			
			//FA
			if (rc)
			{
				ReadYc();			
				FaultDetect();
				CheckReClose();
			}
			
			//延时遥控
			if (YKMem.Flag)
			{
				SwitchDo(YKMem.FDIndex, YKMem.ON_OFF);
			}
			
			//CN
			#ifdef FUNCTION_CN
				CNTask();
			#endif
		}
		
		if (events & FCOS)
		{
			dd = TRUE;
		}

		if (events & TIME100MS)
		{
			if (pFAAbsMsecond <= pAbsTime.Msecond)
			    pFAAbsMsecond1 = pAbsTime.Msecond - pFAAbsMsecond;
			else
			    pFAAbsMsecond1 = pAbsTime.Msecond + 60000 - pFAAbsMsecond;

			//ceshi
			if (pFAAbsMsecond1 >= 20)
			{
			    GetTime((void *)&pSystemTime, SYSTIME);
           		dingfiq = *(volatile INT32U*)0xFFFFF110;     //AIC_IMR
           		sprintf(dingerr, "%04d-%02d-%02d %02d:%02d:%02d:%03d time=%d, fif=%d", pSystemTime.Year, pSystemTime.Month, pSystemTime.Day, pSystemTime.Hour,pSystemTime.Minute, pSystemTime.Second, pSystemTime.MSecond, pFAAbsMsecond1,dingfiq);
            	ErrorInfo(FAID, dingerr);
			}
			
			
			
			
			//复位故障信息
			for (i=0; i<FDNum; i++)		
			{
				if (!(Feeder[i].Control & FAULTD_ENABLE))
					continue;
				if (FDRunInfo[i].FaultInfo.ResetCounter)
				{
					FDRunInfo[i].FaultInfo.ResetCounter--;
					if (FDRunInfo[i].FaultInfo.ResetCounter == 0)
						ResetFaultInfo(i);
				}
			}
		}
	}//while
}


/*------------------------------------------------------------------*/
/*函数名称:InitFAPara()											*/
/*函数功能:初始化任务,将参数付值和相关标志复位					*/
/*相关函数:SetFaLimit();											*/
/*------------------------------------------------------------------*/
BOOL InitFAPara(void)
{
	INT8U	i, j;
	INT8U	yxval[FASOFTBINUM];
	struct DBInfo	info;
	
	//开辟内存
	Feeder = malloc (FDNum * sizeof(struct Feeder_t));
	FDRunInfo = malloc (FDNum *  sizeof(struct FDRunInfo_t));
	LimitValue = malloc (FDNum *  sizeof(struct LimitValue_t));
	TempYc = malloc (FDNum *  sizeof(INT32U) * 8);		
	if (!(FDRunInfo && LimitValue && Feeder && TempYc))
	{
		#ifdef CHINESEINFO
			ErrorInfo(FAID, "初始化故障检测任务失败...");
		#else
			ErrorInfo(FAID, "FA Task init failed");
		#endif
		
		return (FALSE);
	}
	else
	{
		memset ((INT8U*)Feeder, 0, (FDNum * sizeof(struct Feeder_t)));
		memset ((INT8U*)FDRunInfo, 0 , (FDNum * sizeof(struct FDRunInfo_t)));
		memset ((INT8U*)LimitValue, 0, (FDNum * sizeof(struct LimitValue_t)));
		memset ((INT8U*)TempYc, 0 , (FDNum * sizeof(INT32U) * 8));
	}
	
	
	//读入参数
	for (i=0; i<FDNum; i++)
	{
		if (!SetFaFeeder(i))
			return (FALSE);
		if (!SetFaLimitV(i))
			return (FALSE);
		if (!SetFaLimitT(i))
			return (FALSE);			
	}



	for (i=0; i<FDNum; i++)
	{
		//初始化电压电流起始号
		FDRunInfo[i].UStartNo = 8 * i + 0;
		FDRunInfo[i].IStartNo = 8 * i + 4;
	}

	//初始化运行中的各量		
	for (i=0; i<FDNum; i++)
	{
		//默认为三相,需要时可从这里加以判断
		FDRunInfo[i].FaultBound = BOUND;
			
		FDRunInfo[i].FDetectPT = TRUE;
		if (Feeder[i].FACfg & FAC_NOPT)
			FDRunInfo[i].FDetectPT = FALSE;
		
		FDRunInfo[i].FDetectU = FALSE;
		if (FDRunInfo[i].FDetectPT)
		{
			FDRunInfo[i].FDetectU = TRUE;
			if ((Feeder[i].FACfg & FAC_OVER_TRIP) || (Feeder[i].FACfg & FAC_KG_PROTECT))
				FDRunInfo[i].FDetectU = FALSE;
		}
		
		FDRunInfo[i].RunState = 0;
		StateChange(i, RS_NORMAL);
		FDRunInfo[i].FTransient = FALSE;
		FDRunInfo[i].NeedReclose = FALSE;
		FDRunInfo[i].HaveReclose = FALSE;
		
		for (j=0; j<4; j++)
			FDRunInfo[i].Timer[j] = 0;
	}
	
	//初始化输出的故障遥信
	for (i=0; i<FDNum; i++)
	{
		if (Feeder[i].Control & FAULTD_ENABLE)
			yxval[FAENBLE] = YX_H;
		else
			yxval[FAENBLE] = YX_F;
		
		if (Feeder[i].FACfg & (FAC_NOU_TRIP | FAC_TWONOU_TRIP | FAC_OVER_TRIP))
			yxval[FATRIP] = YX_H;
		else
			yxval[FATRIP] = YX_F;
		
		if (Feeder[i].FACfg & FAC_RECLOSE)
			yxval[FARECLOSE] = YX_H;
		else
			yxval[FARECLOSE] = YX_F;
				
		for (j=FARECLOSE+1; j<FASOFTBINUM; j++)
			yxval[j] = YX_F;

		info.DevID = ROOTID;
		info.Type = YXDATA;
		info.Start = FDOTHERYXNUM + FASOFTBINUM * i;
		info.Num = FASOFTBINUM;
		DBWrite(yxval, &info);
	}

	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:FaultDetect()											*/
/*函数功能:故障检测,主函数完成对数据的判断,进行状态转换			*/
/*------------------------------------------------------------------*/
void FaultDetect(void)
{
	INT16U	i;
	BOOL	type;
	
	for (i=0; i<FDNum; i++)
	{
		if (!(Feeder[i].Control & FAULTD_ENABLE))
			continue;
		
		#ifdef FUNCTION_CN
			if (CheckKGZT(i))	//fen
			{
				switch (FDRunInfo[i].RunState)
				{
					case RS_IOVERLIMIT:
					case RS_QRECOVERY:
						StateChange(i, RS_QBREAKER);
						break;
					case RS_QBREAKER:
						if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].SwitchDoConfTimeLimit)
							StateChange(i, RS_BREAKEROP);
						break;
				}
				
				if (FDRunInfo[i].RunState == RS_QBREAKER)
					continue;
			}
			else	//he
			{
				switch (FDRunInfo[i].RunState)
				{
					case RS_QBREAKER:
						StateChange(i, RS_QRECOVERY);
						break;
					case RS_BREAKEROP:
						StateChange(i, RS_QBREAKERREC);	
						break;
					case RS_QRECOVERY:
						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_QBREAKERREC:
						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;
				}
				
				if ((FDRunInfo[i].RunState == RS_QRECOVERY) || (FDRunInfo[i].RunState == RS_QBREAKERREC))
					continue;		
			}
			
			
		
		#endif

				
		switch (FDRunInfo[i].RunState)
		{
		case RS_NORMAL:			//正常态
			if (FDRunInfo[i].HaveReclose)
			{
				if (++FDRunInfo[i].Timer[0] >= CLRRECLOSETIME)
				{
					FDRunInfo[i].Timer[0] = 0;
					FDRunInfo[i].HaveReclose = FALSE;
					FDRunInfo[i].NeedReclose = FALSE;
				}
			}
			else if ((Feeder[i].FACfg & FAC_RECLOSE) && (Feeder[i].FACfg & FAC_NOU_TRIP) && FDRunInfo[i].NeedReclose)
			{
				if (DetectUOK(i, FDRunInfo[i].FDetectPT))
					if (++FDRunInfo[i].Timer[1] >= FDRunInfo[i].HaveUReCloseTimeLimit)
						Reclose(i);
			}
						
			if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
				StateChange(i, RS_QOVERI);
			else if (DetectLow(i, FDRunInfo[i].FDetectPT, !FDRunInfo[i].FDetectPT))
				StateChange(i, RS_QNOUI);	
			break;
			
		case RS_QNOUI:			//检测无压或无流态
			if (DetectLow(i, FDRunInfo[i].FDetectPT, !FDRunInfo[i].FDetectPT))
			{
				if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].LowUIConfTimeLimit)
					StateChange(i, RS_NOUI);
			}
			else if (DetectUOK(i, FDRunInfo[i].FDetectPT))
				StateChange(i, RS_NORMAL);
			else
				FDRunInfo[i].Timer[0] = 0;
			break;
			
		case RS_NOUI:			//无压或无流态
			//if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
			if (DetectUOK(i, FDRunInfo[i].FDetectPT))	
				StateChange(i, RS_MAGRESTRAINT);
			else if (DetectLow(i, FDRunInfo[i].FDetectPT, !FDRunInfo[i].FDetectPT))
			{
				if (++FDRunInfo[i].Timer[0] >= IDLECONFTIME)
					StateChange(i, RS_IDLE);
			}
			else
				FDRunInfo[i].Timer[0] = 0;
			break;
			
		case RS_IDLE:			//空闲态
			if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
				StateChange(i, RS_QOVERI);
			else if (DetectUOK(i, FDRunInfo[i].FDetectPT))
			{
				if (++FDRunInfo[i].Timer[0] >= FDRunInfo[i].LowUIResConfTimeLimit)
					StateChange(i, RS_NORMAL);
			}
			else
				FDRunInfo[i].Timer[0] = 0;
			break;
			
		case RS_QOVERI:			//检测过流态
			if (DetectOverI(i, Feeder[i].FACfg, FALSE, &type))
			{

⌨️ 快捷键说明

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