📄 fdk.cpp
字号:
WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
lpStaP->DownCmd[rp].Cmd[0]=0;
}
return 18;
}
//-----------------------------------------------------------------------------
WORD PollingTx(WORD wrp,BYTE PPoll)
{
BYTE FAR *txb = lpChP->SendBuff;
WORD CRC;
if (RANDOM0[lpChP->StaNo]==0 || RANDOM1[lpChP->StaNo]==0 || RANDOM2[lpChP->StaNo]==0)
{
*(txb+(wrp+0)%txbuflen)=SOH;
*(txb+(wrp+1)%txbuflen)=4;
*(txb+(wrp+2)%txbuflen)=0;
if (RANDOM0[lpChP->StaNo]==0)
{
*(txb+(wrp+3)%txbuflen)=YCSEARCH;
*(txb+(wrp+4)%txbuflen)=CALL_TABLE_YC;
}
else if (RANDOM1[lpChP->StaNo]==0)
{
*(txb+(wrp+3)%txbuflen)=YXSEARCH;
*(txb+(wrp+4)%txbuflen)=CALL_YX;
}
else if (RANDOM2[lpChP->StaNo]==0)
{
*(txb+(wrp+3)%txbuflen)=KWHSEARCH;
*(txb+(wrp+4)%txbuflen)=CALL_TABLE_KWH;
}
*(txb+(wrp+5)%txbuflen)=0;//lpStaP->STATIONNO;
*(txb+(wrp+6)%txbuflen)=0;
*(txb+(wrp+7)%txbuflen)=0;
*(txb+(wrp+8)%txbuflen)=0xff;
*(txb+(wrp+9)%txbuflen)=0;
CRC=crc16(txb,wrp+1,9,txbuflen);
*(txb+(wrp+10)%txbuflen)=LOBYTE(CRC);
*(txb+(wrp+11)%txbuflen)=HIBYTE(CRC);
return (wrp+12);
}
else
{
if (PPoll==30 || PPoll==62) wrp=CallData(txb,wrp,YXDATA);
else if (PPoll==63) wrp=CallData(txb,wrp,KWHDATA);
else if (PPoll%2==0) wrp=CallSoe(txb,wrp);
else wrp=CallData(txb,wrp,YCDATA);
}
return wrp;
}
BYTE CallLPC(BYTE FAR *xb,WORD rp,WORD Len,WORD Mode)
{
BYTE result=0;
for (int i=0;i<Len;i++)
{
result^=*(xb+(rp+i)%Mode);
}
return ~result;
}
WORD RecProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
switch (*(rxb+(rdp+3)%rxbuflen))
{
case YCSEARCH:
FDKYcProc(rxb,rdp,Len);
break;
case YXSEARCH:
FDKYxProc(rxb,rdp,Len);
break;
case KWHSEARCH:
FDKKwhProc(rxb,rdp,Len);
break;
case SOESEARCH:
FDKSoeProc(rxb,rdp,Len);
break;
case YKOPTION:
FDKYkProc(rxb,rdp,Len);
break;
case HIGHSPEEDTOUCH:
FDKWave(rxb,rdp,Len);
break;
case TIMECOMMAND:
FDKRequestTime(rxb,rdp,Len);
break;
default:
break;
}
//PollOver[lpChP->StaNo]=lpStaP->ProcCount*2;
PollOver[lpStaP->CurrUsedCh]=lpStaP->ProcCount*2;
return (Len+5);
}
//遥测数据处理
void FDKYcProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
WORD YcNum,YcStart,i,YcValue;
if (*(rxb+(rdp+4)%rxbuflen)==ANS_YC ||*(rxb+(rdp+4)%rxbuflen)==ANS_DEAP_YC)
{
YcStart=*(rxb+(rdp+7)%rxbuflen)*(WORD) 256+*(rxb+(rdp+6)%rxbuflen);
YcNum=*(rxb+(rdp+9)%rxbuflen)*(WORD) 256+*(rxb+(rdp+8)%rxbuflen);
for (i=0;i<YcNum;i++)
{
YcValue=*(rxb+(rdp+10+i*2)%rxbuflen)*(WORD)256+*(rxb+(rdp+11+i*2)%rxbuflen);
SetValue(YCDB,lpChP->StaNo,YcStart+i,YcValue);
}
}
if (*(rxb+(rdp+4)%rxbuflen)==ANS_GROUP_YC)
{
YcStart=*(rxb+(rdp+8)%rxbuflen)*(WORD) 256+*(rxb+(rdp+7)%rxbuflen);
YcNum=*(rxb+(rdp+10)%rxbuflen)*(WORD) 256+*(rxb+(rdp+9)%rxbuflen);
for (i=0;i<YcNum;i++)
{
YcValue=*(rxb+(rdp+6+i*2)%rxbuflen)*(WORD)256+*(rxb+(rdp+7+i*2)%rxbuflen);
SetValue(YCDB,lpChP->StaNo,i,YcValue);
}
}
if (*(rxb+(rdp+4)%rxbuflen)==ANS_TABLE_YC)
{
YcStart=0;
YcNum=(Len-3)/2;
for (i=0;i<YcNum;i++)
{
YcValue=*(rxb+(rdp+6+i*2)%rxbuflen)*(WORD)256+*(rxb+(rdp+7+i*2)%rxbuflen);
SetValue(YCDB,lpChP->StaNo,i,YcValue);
}
}
RANDOM0[lpChP->StaNo]=0xff;
}
//遥信数据处理
void FDKYxProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
WORD YxStart,YxNum,i,j;
BYTE YxValue;
if (*(rxb+(rdp+4)%rxbuflen)==ANS_YX)
{
YxStart=*(rxb+(rdp+7)%rxbuflen)*(WORD) 256+*(rxb+(rdp+6)%rxbuflen);
YxNum=*(rxb+(rdp+9)%rxbuflen)*(WORD) 256+*(rxb+(rdp+8)%rxbuflen);
BYTE flag = (lpStaP)->RotateFlag;
for (i=0;i<(YxNum+1)/8;i++)
{
YxValue=*(rxb+(rdp+10+i)%rxbuflen);
if (flag) YxValue = ByteRotate(YxValue);
for (j=0;j<8;j++,YxValue>>1)
{
SetValue(YXDB,lpChP->StaNo,YxStart+i*8+j,YxValue&1);
}
}
}
if (*(rxb+(rdp+4)%rxbuflen)==ANS_GROUP_YX)
{
YxStart=*(rxb+(rdp+8)%rxbuflen)*(WORD) 256+*(rxb+(rdp+7)%rxbuflen);
YxNum=*(rxb+(rdp+10)%rxbuflen)*(WORD) 256+*(rxb+(rdp+9)%rxbuflen);
BYTE flag = (lpStaP)->RotateFlag;
for (i=0;i<(YxNum+1)/8;i++)
{
YxValue=*(rxb+(rdp+11+i)%rxbuflen);
if (flag) YxValue = ByteRotate(YxValue);
for (j=0;j<8;j++,YxValue>>1)
{
SetValue(YXDB,lpChP->StaNo,YxStart+i*8+j,YxValue&1);
}
}
}
RANDOM1[lpChP->StaNo]=0xff;
}
//电度数据处理
void FDKKwhProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
WORD KwhStart,KwhNum,i,j;
DWORD KwhValue;
if (*(rxb+(rdp+4)%rxbuflen)==ANS_KWH)
{
KwhStart=*(rxb+(rdp+7)%rxbuflen)*(WORD) 256+*(rxb+(rdp+6)%rxbuflen);
KwhNum=*(rxb+(rdp+9)%rxbuflen)*(WORD) 256+*(rxb+(rdp+8)%rxbuflen);
for (i=0;i<KwhNum;i++)
{
KwhValue=*(rxb+(rdp+10+i*4)%rxbuflen)*(DWORD)65536*256+
*(rxb+(rdp+11+i*4)%rxbuflen)*(DWORD)65536+
*(rxb+(rdp+12+i*4)%rxbuflen)*(DWORD)256+
*(rxb+(rdp+13+i*4)%rxbuflen);
;
SetValue(KWHDB,lpChP->StaNo,KwhStart+i,KwhValue);
}
}
if (*(rxb+(rdp+4)%rxbuflen)==ANS_GROUP_KWH)
{
KwhStart=*(rxb+(rdp+8)%rxbuflen)*(WORD) 256+*(rxb+(rdp+7)%rxbuflen);
KwhNum=*(rxb+(rdp+10)%rxbuflen)*(WORD) 256+*(rxb+(rdp+9)%rxbuflen);
for (i=0;i<KwhNum;i++)
{
KwhValue=*(rxb+(rdp+11+i*4)%rxbuflen)*(DWORD)65536*256+
*(rxb+(rdp+12+i*4)%rxbuflen)*(DWORD)65536+
*(rxb+(rdp+13+i*4)%rxbuflen)*(DWORD)256+
*(rxb+(rdp+14+i*4)%rxbuflen);
;
SetValue(KWHDB,lpChP->StaNo,KwhStart+i,KwhValue);
}
}
if (*(rxb+(rdp+4)%rxbuflen)==ANS_TABLE_KWH)
{
KwhStart=0;
KwhNum=(Len-3)/4;
for (i=0;i<KwhNum;i++)
{
KwhValue=*(rxb+(rdp+6+i*4)%rxbuflen)*(DWORD)65536*256+
*(rxb+(rdp+7+i*4)%rxbuflen)*(DWORD)65536+
*(rxb+(rdp+8+i*4)%rxbuflen)*(DWORD)256+
*(rxb+(rdp+9+i*4)%rxbuflen);
;
SetValue(KWHDB,lpChP->StaNo,KwhStart+i,KwhValue);
}
}
RANDOM2[lpChP->StaNo]=0xff;
RANDOM0[lpChP->StaNo]=0xcc;
}
//SOE数据处理
void FDKSoeProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
}
//遥控处理
void FDKYkProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
COMMAND cmdrcd;
BYTE rp = (lpStaP->DownCmdRP-1) & 3;
BYTE FJFLAG=0xAA;
if (*(rxb+(rdp+4)%rxbuflen)==3) FJFLAG=0x55;
cmdrcd.CmdContent[0] = 0x44; //遥控返校
cmdrcd.CmdContent[1] = lpStaP->DownCmd[rp].Cmd[1];
cmdrcd.CmdContent[2] = lpStaP->DownCmd[rp].Cmd[2];
cmdrcd.CmdContent[3] = 0;
cmdrcd.CmdContent[4] = 0;
cmdrcd.CmdContent[5] = 0;
cmdrcd.CmdContent[6] = FJFLAG;//0xAA; //遥控返校错:0x55 遥控返校正确:0xAA
cmdrcd.SubCmdType = TCZYKCMD;
cmdrcd.DataLen = 0;
cmdrcd.DataPt = 0;
WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
lpStaP->DownCmd[rp].Cmd[0]=0;
}
//谐波数据处理
void FDKWave(BYTE FAR *rxb,WORD rdp,WORD Len)
{
COMMAND cmdrcd;
BYTE rp = (lpStaP->DownCmdRP-1) & 3;
cmdrcd.SubCmdType = 29;
cmdrcd.DataLen = 0;
cmdrcd.DataPt = 0;
for (int i=0;i<128;i++)
cmdrcd.XBFXDATA[i]=*(rxb+(i*2+8)%rxbuflen)*(WORD)256+*(rxb+(i*2+9)%rxbuflen);
WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
lpStaP->DownCmd[rp].Cmd[0]=0;
}
//请求时间处理
void FDKRequestTime(BYTE FAR *rxb,WORD rdp,WORD Len)
{
RequestTime[lpChP->StaNo]=0;
}
//FDK下发对钟
WORD FDKSendTime(BYTE FAR *txb,WORD wrp)
{
WORD CRC;
struct date Date;
struct time Time;
gettime (&Time);
getdate (&Date);
*(txb+wrp)=SOH;
*(txb+(wrp+1)%txbuflen)=12;
*(txb+(wrp+2)%txbuflen)=0;
*(txb+(wrp+3)%txbuflen)=TIMECOMMAND;
*(txb+(wrp+4)%txbuflen)=SETTIME;
*(txb+(wrp+5)%txbuflen)=0;//lpStaP->STATIONNO;
*(txb+(wrp+6)%txbuflen)=LOBYTE(Date.da_year);
*(txb+(wrp+7)%txbuflen)=HIBYTE(Date.da_year);
*(txb+(wrp+8)%txbuflen)=Date.da_mon;
*(txb+(wrp+9)%txbuflen)=Date.da_day;
*(txb+(wrp+10)%txbuflen)=Time.ti_hour;
*(txb+(wrp+11)%txbuflen)=Time.ti_min;
*(txb+(wrp+12)%txbuflen)=Time.ti_sec;
*(txb+(wrp+13)%txbuflen)=HIBYTE(Time.ti_hund);
*(txb+(wrp+14)%txbuflen)=LOBYTE(Time.ti_hund);
CRC=crc16(txb,wrp+1,14,txbuflen);
*(txb+(wrp+15)%txbuflen)=LOBYTE(CRC);
*(txb+(wrp+16)%txbuflen)=HIBYTE(CRC);
RequestTime[lpChP->StaNo]=0xff;
return (wrp+17);
}
//FDK数据请求
WORD CallData(BYTE FAR *txb,WORD wrp,WORD Type)
{
WORD CRC;
*(txb+(wrp+0)%txbuflen)=SOH;
*(txb+(wrp+1)%txbuflen)=4;
*(txb+(wrp+2)%txbuflen)=0;
if (Type==YCDATA)
{
*(txb+(wrp+3)%txbuflen)=YCSEARCH;
*(txb+(wrp+4)%txbuflen)=CALL_TABLE_YC;
}
else if (Type==YXDATA)
{
*(txb+(wrp+3)%txbuflen)=YXSEARCH;
*(txb+(wrp+4)%txbuflen)=CALL_YX;
}
else if (Type==KWHDATA)
{
*(txb+(wrp+3)%txbuflen)=KWHSEARCH;
*(txb+(wrp+4)%txbuflen)=CALL_TABLE_KWH;
}
*(txb+(wrp+5)%txbuflen)=0;
*(txb+(wrp+6)%txbuflen)=0;
*(txb+(wrp+7)%txbuflen)=0;
*(txb+(wrp+8)%txbuflen)=0xff;
*(txb+(wrp+9)%txbuflen)=0;
CRC=crc16(txb,wrp+1,9,txbuflen);
*(txb+(wrp+10)%txbuflen)=LOBYTE(CRC);
*(txb+(wrp+11)%txbuflen)=HIBYTE(CRC);
return (wrp+12);
}
WORD CallSoe(BYTE FAR *txb,WORD wrp)
{
return (wrp);
}
//FDK规约遥控发送处理
WORD FDKMakeYk(BYTE FAR *txb,WORD wrp,WORD Type)
{
WORD CRC;
*(txb+(wrp+0)%txbuflen)=SOH;
if (Type==YK_SELECT)
{
*(txb+(wrp+1)%txbuflen)=3;
*(txb+(wrp+2)%txbuflen)=0;
*(txb+(wrp+3)%txbuflen)=YKOPTION;
*(txb+(wrp+4)%txbuflen)=YK_SELECT;
*(txb+(wrp+5)%txbuflen)=0;
*(txb+(wrp+6)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
*(txb+(wrp+7)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[4];
*(txb+(wrp+8)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
CRC=crc16(txb,wrp+1,8,txbuflen);
*(txb+(wrp+9)%txbuflen)=LOBYTE(CRC);
*(txb+(wrp+10)%txbuflen)=HIBYTE(CRC);
return (wrp+11);
}
else
{
*(txb+(wrp+1)%txbuflen)=0;
*(txb+(wrp+2)%txbuflen)=0;
*(txb+(wrp+3)%txbuflen)=YKOPTION;
if (Type==DCMDYK1) *(txb+(wrp+4)%txbuflen)=YK_EXEC;
else *(txb+(wrp+4)%txbuflen)=YK_ABORT;
*(txb+(wrp+5)%txbuflen)=0;
CRC=crc16(txb,wrp+1,5,txbuflen);
*(txb+(wrp+6)%txbuflen)=LOBYTE(CRC);
*(txb+(wrp+7)%txbuflen)=HIBYTE(CRC);
return (wrp+8);
}
}
WORD FDKWaveProc(BYTE FAR *txb,WORD wrp)
{
WORD CRC;
*(txb+(wrp+0)%txbuflen)=SOH;
*(txb+(wrp+1)%txbuflen)=0;
*(txb+(wrp+2)%txbuflen)=0;
*(txb+(wrp+3)%txbuflen)=HIGHSPEEDTOUCH;
*(txb+(wrp+4)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
*(txb+(wrp+5)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
*(txb+(wrp+6)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[4];
*(txb+(wrp+7)%txbuflen)=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
CRC=crc16(txb,wrp+1,7,txbuflen);
*(txb+(wrp+8)%txbuflen)=LOBYTE(CRC);
*(txb+(wrp+9)%txbuflen)=HIBYTE(CRC);
return (wrp+10);
}
//校验码计算
WORD crc16(BYTE FAR *xb,WORD ptr, WORD count,WORD Mode)
{
WORD crc, i;
crc=0;
while(count-->=1)
{
crc = (crc^(((int)*(xb+(ptr++)%Mode)<<8)));
for(i=0; i<8; ++i)
if(crc & 0x8000)
crc = ((crc<<1)^0x1021);
else
crc = crc << 1;
}
return (crc&0xffff);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -