⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdk.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     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 + -