📄 secapp.c
字号:
ComApp[i]->AppCommand=APP_APPCON;
}
}
//OK
void S101ProcClock(INT8U Port, BOOL Conf) //处理对钟
{
struct IEC101Time_t Time;
struct AbsTime_t AbsTime;
INT8U i;
i=Port-1;
GetTime((void*)(&ComApp[i]->OldSysTime),ABSTIME);//记录对钟前的系统时间
if (ComApp[i]->Sec101Pad.PBase.CmdControl&SETSECTIME)
{
Time.MSecond = MAKEWORD(ComApp[i]->pRxData[0],ComApp[i]->pRxData[1]);
Time.Minute = ComApp[i]->pRxData[2]&0x3f;
Time.Hour = ComApp[i]->pRxData[3]&0x1f;
Time.Day = ComApp[i]->pRxData[4]&0x1f;
Time.Month = ComApp[i]->pRxData[5]&0x0f;
Time.Year = ComApp[i]->pRxData[6]&0x7f;
if (Conf) //非广播对钟,要加延迟时间
{
if (ComApp[i]->Sec101Pad.Control&USESTANDARDCLOCKFORMAT)
TimeChange((void*)&AbsTime, ABSTIME, (void*)&Time, IEC101TIME);
else
TimeChange((void*)&AbsTime, ABSTIME, (void*)&Time, IEC101EXTTIME);
if(((long)AbsTime.Msecond+ComApp[i]->TimeDelay)<60000)
AbsTime.Msecond+=ComApp[i]->TimeDelay;
else
{
AbsTime.Msecond=(long)AbsTime.Msecond+ComApp[i]->TimeDelay-60000;
AbsTime.Minute++;
}
SetTime((void*)&AbsTime, ABSTIME);
}
else//广播对钟
{
if (ComApp[i]->Sec101Pad.Control&USESTANDARDCLOCKFORMAT)
SetTime((void*)&Time,IEC101TIME);
else
SetTime((void*)&Time,IEC101EXTTIME);
}
}
if (Conf)
{
ComApp[i]->Data1.Flag|=CallClock;//为了设置一级数据标志
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
}
void S101ProcReset(INT8U Port)
{
INT8U i;
i=Port-1;
ComApp[i]->Data1.Flag|=CallReset;
ComApp[i]->ResetPubAddr=ComApp[i]->RxPubAddr;
ComApp[i]->ResetInfoAddr=ComApp[i]->RxInfoAddr;
ComApp[i]->ResetGRP=ComApp[i]->RxMsg[ComApp[i]->AsduHeadLength];
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
void S101ProcTest(INT8U Port)
{
INT8U i;
i=Port-1;
ComApp[i]->Data1.Flag|=CallTest;
ComApp[i]->TestPubAddr=ComApp[i]->RxPubAddr;
ComApp[i]->TestInfoAddr=ComApp[i]->RxInfoAddr;
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_APPCON;
ComApp[i]->AppCommand|=APP_HAVEDATA1;
}
//OK
void EnCodeInitEnd(INT8U Port)
{
INT32U Addr;
INT8U i,jj;
i=Port-1;
ComApp[i]->TxMsg[0]=M_EI_NA;
//pTxVSQ->Num=1;
//pTxVSQ->SQ=0;
*(ComApp[i]->pTxVSQ) = 1;
(*(ComApp[i]->pTxVSQ)) &= ~VSQ_SQ;
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=INIT_101;
Addr=S101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=Addr>>(8*jj); //???wjr
*(ComApp[i]->pTxInfoAddr)=0;
*(ComApp[i]->pTxInfoAddr+1)=0;
//初始化原因
*(ComApp[i]->pTxData)=0;
ComApp[i]->AppCommand=APP_SENDDATA;
ComApp[i]->LengthOut=ComApp[i]->AsduHeadLength+1;
if(ComApp[i]->BalanMode)
ComApp[i]->AppCommand=APP_SENDCON;
}
void SetUMsgFlag(INT8U Port)
{
INT8U i;
i = Port - 1;
ComApp[i]->Data1.Flag|=HaveYK;
}
//OK
void ProcTaskMsg(INT8U Port)//处理遥控返校信息
{
INT8U i, err;
void *msg;
i=Port-1;
msg = OSQPend(ComDb[i]->CommQ, 0, &err);
if (err == OS_NO_ERR)
{
EnCodeCtrlRet(Port, (struct DBBOOPInfo*)msg);
}
}
//OK
BOOL EnCodeCtrlRet(INT8U Port, struct DBBOOPInfo* Info) //遥控返校
{
INT8U i, jj;
INT8U sco=0;
INT8U dco=0;
INT32U Addr;
i=Port-1;
if (!(ComApp[i]->Sec101Pad.PBase.CmdControl&YKPERMIT)) //遥控不允许
{
ComApp[i]->LengthOut=0;
ComApp[i]->AppCommand=APP_NODATA;
return(FALSE);
}
ComApp[i]->TxMsg[0]=C_DC_NA;
switch(ComApp[i]->YKTypeID)
{
case C_SC_NA:
ComApp[i]->TxMsg[0]=C_SC_NA;
break;
case C_DC_NA:
ComApp[i]->TxMsg[0]=C_DC_NA;
break;
case C_RC_NA:
ComApp[i]->TxMsg[0]=C_RC_NA;
break;
}
*(ComApp[i]->pTxVSQ) = 1;
if (Info->Flag & BOOPSELECT)
{
if (Info->Status & BODEL) //遥控撤消
{
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=DEACTCON;
ComApp[i]->YKStatus=YKTERM;
}
else
{
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=ACTCON;
}
if(ComApp[i]->YKTypeID==C_SC_NA)
//pSCO->SE=1; //select
sco |= SCO_SE;
else
//pDCO->SE=1; //select
dco |= DCO_SE;
}
else
{
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=ACTCON;
if(ComApp[i]->YKTypeID==C_SC_NA)
sco &= ~SCO_SE;
else
dco &= ~DCO_SE;
ComApp[i]->YKStatus=YKTERM;
}
if(Info->Flag & BOOPERROR)//错误
ComApp[i]->TxMsg[ComApp[i]->CotLocation]|=0x40;
else
ComApp[i]->TxMsg[ComApp[i]->CotLocation]&=(~0x40);
Addr=S101GetAddrByDevIndex(Port, ComApp[i]->BODevIndex);
for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=Addr>>(8*jj);
*(ComApp[i]->pTxInfoAddr)=LOBYTE((Info->SID+LBO-1));
*(ComApp[i]->pTxInfoAddr+1)=HIBYTE((Info->SID+LBO-1));
if(ComApp[i]->YKTypeID==C_SC_NA)
{
if (Info->Status & BOCLOSE) //he
sco |=1;
else //fen
sco &=0xfe;
ComApp[i]->ScoTemp = sco;
*(ComApp[i]->pTxData) = sco;
}
else
{
if (Info->Status & BOCLOSE) //he
dco |= 2;
else //fen
dco |= 1;
ComApp[i]->DcoTemp = dco;
*(ComApp[i]->pTxData) = dco;
}
ComApp[i]->LengthOut=ComApp[i]->AsduHeadLength+1;
ComApp[i]->AppCommand=APP_SENDDATA;
if(ComApp[i]->YKStatus==YKTERM)
{
ComApp[i]->AppCommand|=APP_HAVEDATA1;
(ComApp[i]->Data1.Flag)|=HaveYK;
}
if(ComApp[i]->BalanMode)
ComApp[i]->AppCommand=APP_SENDCON;
return(TRUE);
}
//OK
void EditYKTerm(INT8U Port)//遥控结束
{
INT8U i;
INT16U jj;
INT32U Addr;
i=Port-1;
ComApp[i]->TxMsg[0]=C_DC_NA;
switch(ComApp[i]->YKTypeID)
{
case C_SC_NA:
ComApp[i]->TxMsg[0]=C_SC_NA;
*(ComApp[i]->pTxData) = ComApp[i]->ScoTemp;
break;
case C_DC_NA:
ComApp[i]->TxMsg[0]=C_DC_NA;
*(ComApp[i]->pTxData) = ComApp[i]->DcoTemp;
break;
case C_RC_NA:
ComApp[i]->TxMsg[0]=C_RC_NA;
*(ComApp[i]->pTxData) = ComApp[i]->DcoTemp;
break;
}
(*(ComApp[i]->pTxVSQ)) = 1;
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=ACTTERM;
Addr=S101GetAddrByDevIndex(Port, ComApp[i]->BODevIndex);
for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=Addr>>(8*jj);
*(ComApp[i]->pTxInfoAddr)=LOBYTE(ComApp[i]->YKIDTemp);
*(ComApp[i]->pTxInfoAddr+1)=HIBYTE(ComApp[i]->YKIDTemp); //???wjr
ComApp[i]->LengthOut=ComApp[i]->AsduHeadLength+1;
ComApp[i]->AppCommand=APP_SENDDATA;
if(ComApp[i]->BalanMode)
ComApp[i]->AppCommand=APP_SENDCON;
}
//OK
BOOL S101GetActDevIndexByAddr(INT8U Port, INT16U Addr)
{
INT8U i, j;
INT16U dev;
i = Port - 1;
if (Addr == ComApp[i]->BroadCastAddr)
{
ComApp[i]->ActDevIndex = ComDb[i]->DBCfgs->Info.Logic.pOld[0].DevID;
return (TRUE);
}
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
dev = ComDb[i]->DBCfgs->Info.Logic.pOld[j].DevID;
if (Addr == DBCfgs[dev].Address)
{
ComApp[i]->ActDevIndex = dev;
return (TRUE);
}
}
return (FALSE);
}
//OK
void EnCodeBIENT(INT8U Port) //编辑COS 将来这里要区分单点双点yx
{
BOOL rc;
INT8U i, j, Len, jj;
struct DBInfo info;
INT16U addr;
i = Port - 1;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.Type = COSDATA;
info.Start = STARTTYPE;
info.Num = 0x20; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
info.DevID = ComApp[i]->ActDevIndex;
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
rc = S101GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX);
if (rc)
continue;
else
break;
}
ComApp[i]->TxMsg[0]=M_SP_NA;//1,不带时标的单点信息
*(ComApp[i]->pTxVSQ) &= ~VSQ_SQ;
if(ComApp[i]->BalanMode==TRUE)//zzw
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=SPONT;
else
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=REQ;
addr=S101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=addr>>(8*jj);
Len=SetMsg(Port,ComApp[i]->Tmpbuf,info.Num);
ComApp[i]->LastFrame=BI;
ComApp[i]->LastDevIndex = ComApp[i]->ActDevIndex;
ComApp[i]->LastDevType = COSDATA;
ComApp[i]->LastDevNum = info.Num;
ComApp[i]->BIFrame|=BIENTFRAME;
ComApp[i]->LengthOut=Len;
if(ComApp[i]->BalanMode)
ComApp[i]->AppCommand=APP_SENDCON;
else
ComApp[i]->AppCommand=APP_SENDDATA;
if(info.Num<0x20) //读完数据
ComApp[i]->Data1.Flag &= (~HaveCOS);
// sprintf(errbuf, "发出COS %d", info.Num);
//ErrorInfo(OSPrioCur, errbuf);
return;
}
ComApp[i]->Data1.Flag&=(~HaveCOS);
ComApp[i]->AppCommand = APP_NODATA;
}
//OK
void S101EnCodeSOE(INT8U Port) //编辑SOE //暂时不考虑双点遥信
{
INT8U Len,jj;
INT16U i,j;
BOOL rc;
struct DBInfo info;
INT32U addr;
i = Port - 1;
info.SuperID = ComDb[i]->DBCfgs->DevID;
info.Type = SOEDATA;
info.Start = STARTTYPE;
info.Num = 0x10; //dingding?
for (j=0; j<ComDb[i]->DBCfgs->Info.Logic.DevNum; j++)
{
info.DevID = ComApp[i]->ActDevIndex;
rc = DBRead(ComApp[i]->Tmpbuf, &info);
if ((!rc) || (info.Num == 0))
{
rc = S101GetNextActDevIndex(Port, ComApp[i]->ActDevIndex, ACTDEVINDEX);
if (rc)
continue;
else
break;
}
ComApp[i]->TxMsg[0]=M_SP_TA; //带时标的单点信息
if(ComApp[i]->Sec101Pad.Control&USECP56TIME2A)
ComApp[i]->TxMsg[0]=M_SP_TB; //带长时标的单点信息
addr=S101GetAddrByDevIndex(Port, ComApp[i]->ActDevIndex);
for(jj=0;jj<ComApp[i]->PubAddrSize;jj++)
ComApp[i]->TxMsg[ComApp[i]->PubAddrLocation+jj]=addr>>(8*jj);
*(ComApp[i]->pTxVSQ) &= ~VSQ_SQ;
if(ComApp[i]->BalanMode==TRUE)//zzw
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=SPONT;
else
ComApp[i]->TxMsg[ComApp[i]->CotLocation]=REQ;
Len=SetMsg(Port,ComApp[i]->Tmpbuf,info.Num);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -