📄 9311fa.c-old
字号:
/*------------------------------------------------------------------*/
/*模块名称: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 + -