📄 9311fa.c-old
字号:
{
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 + -