?? 9311fdr.c
字號:
FdrInfo[i].Timer[0]++;
if ((!yc.FIn) && (!yc.FOut))
FdrInfo[i].Timer[1]++;
if (FdrInfo[i].Timer[0] > Fd[i].YTime)
{
if (FdrInfo[i].Timer[1] >= Fd[i].YTime * 9 / 10)
{
FdrSwitchDo(Fd[i].YKLocNo, FALSE);
FdrInfo[i].FlagLoc = FALSE;
FDRStateChange(i+1, RS_NORMAL);
}
else
{
FdrInfo[i].Temp = 0;
for(j=0; j<5; j++)
FdrInfo[i].Timer[j] = 0;
}
}
}
break;
case FDRTCOMM:
default:
break;
}
}
break;
}
}
}
/*------------------------------------------------------------------*/
/*函數名稱:FdrDetectYX() */
/*函數功能:處理遙信變化 */
/*------------------------------------------------------------------*/
void FdrDetectYX(void)
{
INT8U i, j, rc;
for (i=0; i<FDNum; i++)
{
if (!(Fd[i].Flag & FDRENABLE))
continue;
for (j=0; j<3; j++)
{
rc = 0x01<<j;
if (FdrInfo[i].COSFlag & rc)
{
FdrInfo[i].COSFlag ^= rc;
rc = FDRTestValid(i+1, FdrInfo[i].State);
FDRStateChange(i+1, rc);
}
}
}
}
/*------------------------------------------------------------------*/
/*函數名稱:StateChange() */
/*函數功能:狀態轉換,完成相關狀態下操作,打印系統信息 */
/*------------------------------------------------------------------*/
void FDRStateChange(WORD FDIndex, WORD State)
{
INT8U j;
char errbuf[60];
struct SysTime_t SystemTime;
struct DBInfo info;
memset (errbuf, 0, 60);
if (FdrInfo[FDIndex-1].State == State)
return;
info.DevID = ROOTID;
info.Type = FDRLOC;
info.Num = FDIndex-1;
if (FdrInfo[FDIndex-1].FlagLoc)
j = RESET_RETAIN;
else
j = RESET_CLR;
DBWrite(&j, &info);
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, FDRInfo[State]);
#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, FDRInfo[State]);
#endif
ErrorInfo(FAID, errbuf);
//寫故障信息
GetTime((void *)&FdrInfo[FDIndex-1].FaultInfo.Time, ABSTIME);
FDRWriteInfo(FDIndex);
switch (State)
{
case RS_NORMAL:
break;
case RS_CRITICAL:
break;
case RS_XTIME:
break;
case RS_YTIME:
break;
case RS_LOC:
if (FdrInfo[FDIndex-1].SwLocVal == YX_F)
{
if (FdrInfo[FDIndex-1].SwRelayVal == YX_H)
FdrSwitchDo(Fd[FDIndex-1].SwYKNo, FALSE);
FdrSwitchDo(Fd[FDIndex-1].YKLocNo, TRUE);
}
break;
}
if (FdrInfo[FDIndex-1].State == RS_LOC)
FdrInfo[FDIndex-1].FlagLoc = FALSE;
FdrInfo[FDIndex-1].State = State;
FdrInfo[FDIndex-1].PreState = State;
FdrInfo[FDIndex-1].Temp = FALSE;
for(j=0; j<5; j++)
FdrInfo[FDIndex-1].Timer[j] = 0;
}
/*------------------------------------------------------------------*/
/*函數名稱:FdrRenewYx() */
/*函數功能:讀取數據庫遙信,更新實時遙信值 */
/*輸入說明: */
/*輸出說明: */
/*------------------------------------------------------------------*/
BOOL FdrRenewYx(void)
{
BOOL rc;
INT8U i, dd[16];
struct DBInfo info;
info.DevID = ROOTID;
info.Type = YXDATA;
info.Start = 0;
info.Num = MyCfg.BINum;
rc =DBRead(dd, &info);
if (!rc)
return (FALSE);
for (i=0; i<FDNum; i++)
{
if (FdrInfo[i].SwYXVal != dd[DEFBINUM * i + 0])
{
FdrInfo[i].COSFlag |= 0x01;
FdrInfo[i].SwYXVal = dd[DEFBINUM * i + 0];
}
if (FdrInfo[i].SwRelayVal != dd[DEFBINUM * i + YXRELAYNO])
{
// FdrInfo[i].COSFlag |= 0x02;
FdrInfo[i].SwRelayVal = dd[DEFBINUM * i + YXRELAYNO];
}
if (FdrInfo[i].SwLocVal != dd[DEFBINUM * i + YXLOCNO])
{
FdrInfo[i].COSFlag |= 0x04;
FdrInfo[i].SwLocVal = dd[DEFBINUM * i + YXLOCNO];
}
}
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函數名稱:FdrDetectU() */
/*函數功能:檢測是否失壓 */
/*輸入說明:FDIndex--饋線號 */
/*輸出說明:兩相電壓判斷值,得壓FALSE,失壓TRUE */
/*------------------------------------------------------------------*/
BOOL FdrDetectLow(INT16U FDIndex, struct YcResult *Rc)
{
INT8U i;
if ((FDIndex > FDNum) || (FDIndex == 0))
return FALSE;
i = FDIndex - 1;
if (TempYc[i*FDRYCNUM + 0] >= Fd[i].LowULimit)
Rc->FIn = FALSE;
else
Rc->FIn = TRUE;
if (TempYc[i*FDRYCNUM + 1] >= Fd[i].LowULimit)
Rc->FOut = FALSE;
else
Rc->FOut = TRUE;
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函數名稱:FdrSwitchDo() */
/*函數功能:完成開關動作,合/分,延時保證命令的執行 */
/*------------------------------------------------------------------*/
void FdrSwitchDo(INT8U No, BOOL ON_OFF)
{
BOOL bSuccess;
INT8U i;
char errbuf[60];
struct SysTime_t SystemTime;
if (YKOnCounter || ACTING)
{
YKMem.No = No;
YKMem.ON_OFF = ON_OFF;
YKMem.Flag = TRUE;
return ;
}
else
memset (&YKMem, 0, sizeof (struct YKDelayMem));
//開關動作
bSuccess = YKSet(No, ON_OFF, 0);
if(bSuccess)
bSuccess = YKExe(No, ON_OFF, 0);
memset (errbuf, 0, 60);
GetTime((void *)&SystemTime, SYSTIME);
if ((No % DEFYKNUM) == SWLOCNO)
{
if (ON_OFF)
i = 2;
else
i = 3;
}
else
{
if (ON_OFF)
i = 0;
else
i = 1;
}
#ifdef CHINESEINFO
if (bSuccess)
{
sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 線路 %d %s成功(遙控號 = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, No/DEFYKNUM+1, FDRSwDo[i], No);
}
else
{
sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d 線路 %d %s失敗(遙控號 = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, No/DEFYKNUM+1, FDRSwDo[i], No);
}
#else
if (bSuccess)
{
sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d %s Success(YKNO = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, No/DEFYKNUM+1, FDRSwDo[i], No);
}
else
{
sprintf(errbuf, "%04d-%02d-%02d %02d:%02d:%02d:%03d FD %d %s Fail(YKNO = %d)", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond, No/DEFYKNUM+1, FDRSwDo[i], No);
}
#endif
ErrorInfo(FAID, errbuf);
}
/*------------------------------------------------------------------*/
/*函數名稱:FdrReadYc(void) */
/*函數功能:讀取相應的中間遙測值 */
/*------------------------------------------------------------------*/
void FdrReadYc(void)
{
INT8U i, j;
for (i=0; i<FDNum; i++)
{
if (Fd[i].Flag & FFDRDIRACT)
{
TempYc[i*FDRYCNUM + 0] = YCTemp[i].FData[1].Rms2;
TempYc[i*FDRYCNUM + 1] = YCTemp[i].FData[0].Rms2;
}
else
{
for (j=0; j<2; j++)
{
TempYc[i*FDRYCNUM + j] = YCTemp[i].FData[j].Rms2;
}
}
}
}
/*------------------------------------------------------------------*/
/*函數名稱:FDRTestValid(void) */
/*函數功能:判斷開關邏輯有效型(輔助功能) */
/*------------------------------------------------------------------*/
INT8U FDRTestValid(INT16U FDIndex, INT8U Status)
{
INT8U i;
INT8U type, rc;
struct YcResult yc;
i = FDIndex - 1;
rc = 0xFF;
FdrReadYc();
FdrDetectLow(FDIndex, &yc);
type = Fd[i].Flag & FFDRSWTYPE;
if (FdrInfo[i].SwLocVal == YX_H)
{
FdrInfo[i].FaultInfo.Type = FDR_A;
rc = RS_LOC;
}
else
{
switch (FdrInfo[i].State)
{
case RS_NORMAL:
case RS_CRITICAL:
case RS_XTIME:
switch (type)
{
case FDRTCONCT:
if ((!yc.FIn) && (!yc.FOut))
{
rc = RS_NORMAL;
}
else if (yc.FIn && yc.FOut)
{
rc = RS_CRITICAL;
}
else
{
FdrInfo[i].FaultInfo.Type = FDR_A;
FdrInfo[i].FlagLoc = TRUE;
rc = RS_LOC;
}
break;
case FDRTCOMM:
default:
if ((!yc.FIn) && (!yc.FOut))
{
if (FdrInfo[i].SwYXVal == YX_H)
{
rc = RS_NORMAL;
}
else
{
FdrInfo[i].FaultInfo.Type = FDR_D;
rc = RS_LOC;
}
}
else if (yc.FIn && yc.FOut)
{
rc = RS_CRITICAL;
}
else
{
if (FdrInfo[i].SwYXVal == YX_H)
{
//err
}
else
{
rc = RS_XTIME;
}
}
break;
}
break;
case RS_YTIME:
rc = Status;
break;
case RS_LOC:
if ((!yc.FIn) && (!yc.FOut))
{
rc = RS_NORMAL;
}
else if (yc.FIn && yc.FOut)
{
rc = RS_CRITICAL;
}
else
{
rc = RS_XTIME;
}
break;
default:
rc = Status;
break;
}
}
/*
else if (FdrInfo[i].SwYXVal == YX_H)
{
if (FdrInfo[i].SwRelayVal == YX_H)
{
rc = RS_YTIME;
}
else
{
//err
}
}
else
{
switch (type)
{
case FDRTCONCT:
if ((!yc.FIn) && (!yc.FOut))
{
rc = RS_NORMAL;
}
else if (yc.FIn && yc.FOut)
{
rc = RS_CRITICAL;
}
else
{
if (Status == RS_LOC)
{
rc = RS_XTIME;
}
else
{
FdrInfo[i].FaultInfo.Type = FDR_A;
FdrInfo[i].FlagLoc = TRUE;
rc = RS_LOC;
}
}
break;
case FDRTCOMM:
default:
if ((!yc.FIn) && (!yc.FOut))
{
if (FdrInfo[i].SwYXVal == YX_H)
{
rc = RS_NORMAL;
}
else
{
if (Status == RS_LOC)
rc = RS_NORMAL;
else
{
FdrInfo[i].FaultInfo.Type = FDR_E;
rc = RS_LOC;
}
}
}
else if ((!yc.FIn) || (!yc.FOut))
{
if (FdrInfo[i].SwYXVal == YX_H)
{
//err
}
else
{
rc = RS_XTIME;
}
}
else
{
rc = RS_CRITICAL;
}
break;
}
}
*/
//err
if (rc == 0xFF)
{
if (FdrInfo[i].PreState != rc)
{
ErrorInfo(FAID, "BUG:邏輯錯誤!請立即處理...");
FdrInfo[i].FaultInfo.Type = FDR_E;
FdrInfo[i].PreState = rc;
}
rc = Status;
}
else if (rc != Status)
{
ErrorInfo(FAID, "BUG:時序轉換...");
FdrInfo[i].PreState = rc;
}
return (rc);
}
/*------------------------------------------------------------------*/
/*函數名稱:FDRWriteInfo() */
/*函數功能:寫故障遙信 */
/*------------------------------------------------------------------*/
void FDRWriteInfo(INT16U FDIndex)
{
BOOL rc = FALSE;
INT8U i;
INT16U SoftBINo;
i = FDIndex-1;
if (FdrInfo[i].FaultInfo.Type == 0)
return;
FDRResetInfo(FDIndex);
FdrInfo[i].FaultInfo.BakType = FdrInfo[i].FaultInfo.Type;
FdrInfo[i].FaultInfo.ResetCounter = FDRRESETTIME;
SoftBINo = FDRGetSoftBINo((INT16U*)&FdrInfo[i].FaultInfo.Type);
while (SoftBINo)
{
SOE[HEAD].No = FDOTHERYXNUM + (i * FASOFTBINUM) + SoftBINo;
SOE[HEAD].Status = YX_H;
SOE[HEAD].Time = FdrInfo[i].FaultInfo.Time;
HEAD++;
if (HEAD >= SOE_NUM_TMP)
HEAD = 0;
rc = TRUE;
SoftBINo = FDRGetSoftBINo((INT16U*)&FdrInfo[i].FaultInfo.Type);
}
if (rc)
SOETask(ROOTID, TRUE);
}
/*------------------------------------------------------------------*/
/*函數名稱:FDRResetInfo() */
/*函數功能:復位故障遙信 */
/*------------------------------------------------------------------*/
void FDRResetInfo(INT16U FDIndex)
{
BOOL rc = FALSE;
INT8U i;
INT16U SoftBINo;
struct AbsTime_t Time;
i = FDIndex - 1;
if (FdrInfo[i].FaultInfo.BakType == 0)
return;
FdrInfo[i].FaultInfo.ResetCounter = 0;
SoftBINo = FDRGetSoftBINo((INT16U*)&FdrInfo[i].FaultInfo.BakType);
while (SoftBINo)
{
SOE[HEAD].No = FDOTHERYXNUM + (i * 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 = FDRGetSoftBINo((INT16U*)&FdrInfo[i].FaultInfo.BakType);
}
if (rc)
SOETask(ROOTID, TRUE);
}
/*------------------------------------------------------------------*/
/*函數名稱:GetSoftBINo(INT16U *FaultType) */
/*函數功能:獲得故障遙信號 */
/*------------------------------------------------------------------*/
INT16U FDRGetSoftBINo(INT16U *FaultType)
{
if ((*FaultType) & FDR_F)
{
(*FaultType) &= (~FDR_F);
return (FAFAULTD);
}
if ((*FaultType) & FDR_Y)
{
(*FaultType) &= (~FDR_Y);
return (FAAFOREVER);
}
if ((*FaultType) & FDR_X)
{
(*FaultType) &= (~FDR_X);
return (FABFOREVER);
}
if ((*FaultType) & FDR_D)
{
(*FaultType) &= (~FDR_D);
return (FACFOREVER);
}
if ((*FaultType) & FDR_A)
{
(*FaultType) &= (~FDR_A);
return (FAOFOREVER);
}
if ((*FaultType) & FDR_E)
{
(*FaultType) &= (~FDR_E);
return (FAAINSTANT);
}
if ((*FaultType) & FDR_H)
{
(*FaultType) &= (~FDR_H);
return (FABINSTANT);
}
return (0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -