?? dlt645pri.c
字號:
}
void DLT645APP(INT8U Port)
{
struct LinkInfo* p = NULL;
struct LPDUFRAME* RXDBUF;
INT8U i = 0,cmd,length,DI1,DI0;
INT16U DI;
i = Port - 1;
p = ComLink[i];
RXDBUF = (struct LPDUFRAME*)p->RxdBuf;
cmd = RXDBUF->Control;
length = RXDBUF->FramLength;
// if(cmd < 0x80) return; //主站的數(shù)據(jù)
if((cmd&ERRACK) != 0) //從站異常應答幀
ComLink[i]->ERRORWORD = RXDBUF->LPDU[0];
else
ComLink[i]->ERRORWORD = 0;
if((cmd&NEXTFRAME) != 0)
ComLink[i]->SUBNEXTFRAME = TRUE;
else
ComLink[i]->SUBNEXTFRAME = FALSE;
switch(cmd&0x1f)
{
case READCOM:
DI0 = RXDBUF->LPDU[0] - 0x33;
DI1 = RXDBUF->LPDU[1] - 0x33;
DI = (DI1<<8) + DI0;
switch(DI)
{
case ALLRTUData:
RecAllData(Port,(INT8U *)RXDBUF);
break;
case PosiKWHDB:
case NegaKWHDB:
case PosiKVARDB:
case NegaKVARDB:
RecKWH(Port,(INT8U *)RXDBUF);
break;
default:
break;
}
break;
case READNEXTCOM:
break;
case RE_READCOM:
break;
case WRITECOM:
break;
case SETCLOCK:
break;
case WRITEADD:
break;
case SETBAND:
break;
case SETPASSINT16U:
break;
case CLEAR:
break;
default: break;
}
if(!ReadComYxStatus(Port))
SetComYxStatus(Port,1);
}
void READDATA(INT8U Port,INT16U FuntionCode)
{
INT8U i,DataLength;
i = Port - 1;
ComLink[i]->TxdBuf[0] = STARTCODE68;
ComLink[i]->TxdBuf[1] = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].Addr[0];
ComLink[i]->TxdBuf[2] = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].Addr[1];
ComLink[i]->TxdBuf[3] = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].Addr[2];
ComLink[i]->TxdBuf[4] = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].Addr[3];
ComLink[i]->TxdBuf[5] = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].Addr[4];
ComLink[i]->TxdBuf[6] = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].Addr[5];
ComLink[i]->TxdBuf[7] = STARTCODE68;
ComLink[i]->TxdBuf[8] = READCOM;
ComLink[i]->TxdBuf[9] = 0x02;
ComLink[i]->TxdBuf[10] = LOW(FuntionCode)+0x33;
ComLink[i]->TxdBuf[11] = HIGH(FuntionCode)+0x33;
ComLink[i]->TxdBuf[12] = DLT6465CheckSum(ComLink[i]->TxdBuf,12);
ComLink[i]->TxdBuf[13] = ENDCODE;
DataLength = 14;
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime = DELAYTIME(Port,DataLength);
ComLink[i]->BAKBUFLENGTH = DataLength;
memset(ComLink[i]->TxdBufBak,0,TXBUFLEN);
memcpy(ComLink[i]->TxdBufBak,ComLink[i]->TxdBuf,DataLength);
WriteX(ComLink[i]->TxdBuf,DataLength,Port);
}
void BROADCASTCLOCK(INT8U Port)
{
INT8U i,DataLength;
INT8U err;
struct SysTime_t SysTime;
i = Port - 1;
GetTime((void *)&SysTime, SYSTIME);
ComLink[i]->TxdBuf[0] = STARTCODE68;
ComLink[i]->TxdBuf[1] = 0x99;
ComLink[i]->TxdBuf[2] = 0x99;
ComLink[i]->TxdBuf[3] = 0x99;
ComLink[i]->TxdBuf[4] = 0x99;
ComLink[i]->TxdBuf[5] = 0x99;
ComLink[i]->TxdBuf[6] = 0x99;
ComLink[i]->TxdBuf[7] = STARTCODE68;
ComLink[i]->TxdBuf[8] = SETCLOCK;
ComLink[i]->TxdBuf[9] = 0x06;
ComLink[i]->TxdBuf[10] = BinToBcd(SysTime.Second) + 0x33;
ComLink[i]->TxdBuf[11] = BinToBcd(SysTime.Minute) + 0x33;
ComLink[i]->TxdBuf[12] = BinToBcd(SysTime.Hour) + 0x33;
ComLink[i]->TxdBuf[13] = BinToBcd(SysTime.Day) + 0x33;
ComLink[i]->TxdBuf[14] = BinToBcd(SysTime.Month) + 0x33;
ComLink[i]->TxdBuf[15] = BinToBcd(SysTime.Year%100) + 0x33;
ComLink[i]->TxdBuf[16] = DLT6465CheckSum(ComLink[i]->TxdBuf,16);
ComLink[i]->TxdBuf[17] = ENDCODE;
DataLength = 18;
ClrClockFlag(Port);
WriteX(ComLink[i]->TxdBuf,DataLength,Port);
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
INT16U DELAYTIME(INT8U Port,INT16U DataLength)
{
INT8U i;
i = Port - 1;
return((i*100)/ComLink[i]->Baudrate+(ComApp[i]->DelayVal + 9)/10);
}
BOOL PRI645SCHEDULE(INT8U Port)
{
INT8U i;
i = Port - 1;
if(!DevDispatch(Port))
return FALSE;
if(ComApp[i]->EnSetClock && ComApp[i]->BroadCastClock)
{
if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag & CLOCKFLAG)
{
BROADCASTCLOCK(Port);
return TRUE;
}
}
if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag & KWHFLAG)
{
switch(ComApp[i]->KWHStatus)
{
case PosiKWHDB:
READDATA(Port,PosiKWHDB);
ComApp[i]->KWHStatus = NegaKWHDB;
break;
case NegaKWHDB:
READDATA(Port,NegaKWHDB);
ComApp[i]->KWHStatus = PosiKVARDB;
break;
case PosiKVARDB:
READDATA(Port,PosiKVARDB);
ComApp[i]->KWHStatus = NegaKVARDB;
break;
case NegaKVARDB:
READDATA(Port,NegaKVARDB);
ComApp[i]->KWHStatus = PosiKWHDB;
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag &=(~KWHFLAG);
break;
}
return TRUE;
}
if((ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag & ALLDATAFLAG) &&
(ComDb[i]->DBCfgs[ComApp[i]->CurDevNo].YCNum != 0))
{
READDATA(Port,ALLRTUData);
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag &=(~ALLDATAFLAG);
return TRUE;
}
return TRUE;
}
void SetAllDataFlag(INT8U Port)
{
INT8U i,j;
i = Port - 1;
for(j = 0;j < ComApp[i]->DevNum; j++)
{
if(ComDb[i]->DBCfgs[j].YCNum)
ComApp[i]->AppDevs[j].ReadDataFlag |= ALLDATAFLAG;
}
}
void SetClockFlag(INT8U Port)
{
INT8U i,j;
i = Port - 1;
for(j = 0;j < ComApp[i]->DevNum; j++)
{
ComApp[i]->AppDevs[j].ReadDataFlag |= CLOCKFLAG;
}
}
void ClrClockFlag(INT8U Port)
{
INT8U i,j;
i = Port - 1;
for(j = 0;j < ComApp[i]->DevNum; j++)
{
ComApp[i]->AppDevs[j].ReadDataFlag &= (~CLOCKFLAG);
}
}
void SetKWHFlag(INT8U Port)
{
INT8U i,j;
i = Port - 1;
for(j = 0;j < ComApp[i]->DevNum; j++)
{
if(ComDb[i]->DBCfgs[j].DDNum)
ComApp[i]->AppDevs[j].ReadDataFlag |= KWHFLAG;
}
}
void SendBakData(INT8U Port)
{
INT8U i;
i = Port - 1;
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime = DELAYTIME(Port,ComLink[i]->BAKBUFLENGTH);
// ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError++;
WriteX(ComLink[i]->TxdBufBak,ComLink[i]->BAKBUFLENGTH,Port);
}
void SetComYxStatus(INT8U Port,BOOL Flag)
{
INT8U i,xuhao;
struct SOE_t soe;
struct DBInfo info;
i = Port - 1;
xuhao = GetActDevNoByDevID(i+1,ComApp[i]->AppDevs[ComApp[i]->CurDevNo].DevID);
if(!ComDb[i]->DBCfgs[ComApp[i]->CurDevNo].YXNum)
return;
soe.No = ComDb[i]->DBCfgs[ComApp[i]->CurDevNo].YXNum - 1;
if (Flag)
soe.Status = YX_H;
else
soe.Status = YX_F;
GetTime((void*)&soe.Time, ABSTIME);
info.SuperID = ComDb[i]->DBCfgs[xuhao].DevID;
info.DevID = ComDb[i]->DBCfgs[xuhao].DevID;
info.Type = YXDOTDATA;
info.Num = 1;
DBWrite((INT8U*)&soe, &info);
info.Type = SOEDATA;
DBWrite((INT8U*)&soe, &info);
}
BOOL ReadComYxStatus(INT8U Port)
{
INT8U i,xuhao;
INT8U YxStatus;
struct DBInfo info;
i = Port - 1;
xuhao = GetActDevNoByDevID(i+1,ComApp[i]->AppDevs[ComApp[i]->CurDevNo].DevID);
info.Start = ComDb[i]->DBCfgs[ComApp[i]->CurDevNo].YXNum - 1;
info.SuperID = ComDb[i]->DBCfgs[xuhao].DevID;
info.DevID = ComDb[i]->DBCfgs[xuhao].DevID;
info.Type = YXDATA;
info.Num = 1;
DBRead((INT8U*)&YxStatus, &info);
if(YxStatus == YX_F)
return FALSE;
else
return TRUE;
}
void RecAllData(INT8U Port,INT8U *Buf)
{
INT8U i,err;
INT16U ID,Tmp;
struct AllData MAllData;
struct AllData *p;
struct DBInfo info;
i = Port - 1;
ID = GetDevIDByAddr(Port,Buf+1);
if(ID == 0xffff)
{
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError++;
return;
}
memset(&MAllData, 0,sizeof(struct AllData));
p = &MAllData;
Tmp = (*(Buf+12))-0x33+((*(Buf+13)-0x33)<<8);
MAllData.Ua = BcdToBin(Tmp);
Tmp = (*(Buf+14))-0x33+((*(Buf+15)-0x33)<<8);
MAllData.Ub = BcdToBin(Tmp);
Tmp = (*(Buf+16))-0x33+((*(Buf+17)-0x33)<<8);
MAllData.Uc = BcdToBin(Tmp);
Tmp = (*(Buf+18))-0x33+((*(Buf+19)-0x33)<<8);
MAllData.Ia = BcdToBin(Tmp);
Tmp = (*(Buf+20))-0x33+((*(Buf+21)-0x33)<<8);
MAllData.Ib = BcdToBin(Tmp);
Tmp = (*(Buf+22))-0x33+((*(Buf+23)-0x33)<<8);
MAllData.Ic = BcdToBin(Tmp);
Tmp = (*(Buf+25))-0x33+((*(Buf+26)-0x33)<<8);
MAllData.Ptotal = BcdToBin(Tmp);
Tmp = (*(Buf+28))-0x33+((*(Buf+29)-0x33)<<8);
MAllData.Qa = BcdToBin(Tmp);
Tmp = (*(Buf+31))-0x33+((*(Buf+32)-0x33)<<8);
MAllData.Qb = BcdToBin(Tmp);
Tmp = (*(Buf+34))-0x33+((*(Buf+35)-0x33)<<8);
MAllData.Qc = BcdToBin(Tmp);
Tmp = (*(Buf+36))-0x33+((*(Buf+37)-0x33)<<8);
MAllData.Qtotal = BcdToBin(Tmp);
Tmp = (*(Buf+38))-0x33+((*(Buf+39)-0x33)<<8);
MAllData.Qa = BcdToBin(Tmp);
Tmp = (*(Buf+40))-0x33+((*(Buf+41)-0x33)<<8);
MAllData.Qb = BcdToBin(Tmp);
Tmp = (*(Buf+42))-0x33+((*(Buf+43)-0x33)<<8);
MAllData.Qc = BcdToBin(Tmp);
info.SuperID = ID;
info.DevID = ID;
info.Type = YCDATA;
info.Num = sizeof(struct AllData)/sizeof(INT16U);
if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].DevData.AINum <= info.Num)
info.Num = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].DevData.AINum;
info.Start = 0;
DBWrite((INT8U*)&MAllData, &info);
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag &= (~ALLDATAFLAG);
if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError)
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError--;
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime = 0;
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
void RecKWH(INT8U Port,INT8U *Buf)
{
INT8U i,err,j,m;
INT16U ID,DI,Tmp;
struct DDdata KDDdata;
INT32U *p,*a;
struct DBInfo info;
i = Port - 1;
memset((INT8U*)&KDDdata,0,sizeof(struct DDdata));
a = malloc(sizeof(struct DDdata));
p = a;
ID = GetDevIDByAddr(Port,Buf+1);
if(ID == 0xffff)
{
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError++;
return;
}
DI = (*(Buf+10))-0x33+((*(Buf+11)-0x33)<<8);
Buf = Buf+12;
for(m = 0;m < sizeof(struct DDdata)/sizeof(INT32U);m++)
{
for(j = 0;j < sizeof(INT32U);j++)
{
*(Buf+j) -= 0x33;
}
*a = BcdToBin8(Buf);
a++;
Buf += sizeof(INT32U);
}
info.SuperID = ID;
info.DevID = ID;
info.Type = DDDATA;
info.Num = sizeof(struct DDdata)/sizeof(INT32U);
switch(DI)
{
case PosiKWHDB:
info.Start = 0;
break;
case NegaKWHDB:
info.Start = 5;
break;
case PosiKVARDB:
info.Start = 10;
break;
case NegaKVARDB:
info.Start = 15;
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ReadDataFlag &= (~KWHFLAG);
break;
}
DBWrite((INT8U*)p, &info);
Tmp = ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError;
if(ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError)
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].ComError--;
ComApp[i]->AppDevs[ComApp[i]->CurDevNo].FactDelayTime = 0;
OSFlagPost(ComDb[i]->Event, FTXNEXT, OS_FLAG_SET, &err);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -