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