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

📄 fdk.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*本程序是FDK规约的收发程序*/
/*FDK*/
#include <owl.h>
#include <windows.h>
#include <time.h>
#include	<stdio.h>
#include "def.h"

#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"
#define		KWHCOUNT	0x80	//电度采集间隔
#define     YCDATA              0
#define     YXDATA              1
#define     KWHDATA             2
#define     SOEDATA             3
//FDK Function Code
#define     SOH               0x01
#define     FILESEND          0x01
#define     YCSEARCH          0x02
#define     YXSEARCH          0x03
#define     KWHSEARCH         0x04
#define     SOESEARCH         0x05
#define     ACKNOANS          0x06
#define     SYSTEMSTATUS      0x07
#define     YKOPTION          0x08
#define     NEWPARADATAMODEL  0x09
#define     HIGHSPEEDTOUCH    0x0a
#define     SYSTEMRESET       0x0b
#define     ONETASK           0x0c
#define     MULTITASK         0x0d
#define     HOSPITOLDATA      0x0e
#define     CLASSDATASEND     0x0f
#define     TIMECOMMAND       0x10
#define     PARASEARCH        0x11
#define     BADLUBO           0x12
#define     PROTOMESSAGE      0x1e
//File Send extern Command Code
#define     OPEN_WRITE        0x00
#define     OPEN_READ         0x01
#define     TEXT_SEND         0x02
#define     TEXT_SEND_OVER    0x04
#define     SEND_CATLOG       0x05
#define     FILE_RENAME       0x07
#define     FILE_DELETE       0x08
#define     CHANGE_CATLOG     0x09
#define     DOS_COMMAND       0x0a
#define     ABORT_SEND        0x18
//Yc extern Command Code
#define     CALL_YC           0x01
#define     ANS_YC            0x02
#define     CALL_DEAP_YC      0x03
#define     ANS_DEAP_YC       0x04
#define     CALL_GROUP_YC     0x05
#define     ANS_GROUP_YC      0x06
#define     CALL_TABLE_YC     0x07
#define     ANS_TABLE_YC      0x08
//Yx extern Command Code
#define     CALL_YX           0x01
#define     ANS_YX            0x02
#define     CALL_GROUP_YX     0x03
#define     ANS_GROUP_YX      0x04
#define     CALL_CHANGE_YX    0x05
#define     ANS_CHANGE_YX     0x06
//Kwh extern Command Code
#define     CALL_KWH          0x01
#define     ANS_KWH           0x02
#define     CALL_GROUP_KWH    0x03
#define     ANS_GROUP_KWH     0x04
#define     CALL_TABLE_KWH    0x05
#define     ANS_TABLE_KWH     0x06
//Soe extern Command Code
#define     CALL_NEW_SOE      0x01
#define     NAS_NEW_SOE       0x02
#define     CALL_GROUP_SOE    0x03
#define     ANS_GROUP_SOE     0x04
//o'clock extern Command Code
#define     REQUST            0x01
#define     SETTIME           0x02
//Yk extern Command Code
#define     YK_SELECT         0x01
#define     YK_BACK_OK        0x02
#define     YK_BACK_FALSH     0x03
#define     YK_EXEC           0x04
#define     YK_ABORT          0x05
//HightSpeed Model extern Command Codeo
#define     CALL_HSPEED_DATA  0x01
#define     ANS_HSPEED_DATA   0x02

//FDK Function 
typedef struct {
  RUNFLAG rf;
  WORD    RecWPBak;
} CHFLAG;
typedef struct {
WORD    year;
WORD    month;
WORD    day;
WORD    hour;
WORD    min;
WORD    sec;
}Group;
//---------------------------------------------------------------------------------
int sss;
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
BYTE Retry[64],RepTimes[64],RANDOM0[64],RANDOM1[64],RANDOM2[64],Poll[64],PAFFLAG[64],TIME[64],SDBB[64];
WORD PollOver[64]={
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
                   };
DWORD KwhCount[64];
BYTE  RequestTime[64]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static HINSTANCE hLib;

int FAR PASCAL _export RxProc(HWND, WORD, CHANNELPARAM FAR *, STATIONPARAM FAR *);
int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *, STATIONPARAM FAR *,int);

extern BYTE FAR PASCAL _export CDT_BCH(BYTE *);
extern BYTE FAR PASCAL _export ByteRotate(BYTE srcbyte);
WORD  crc16(BYTE FAR *xb,WORD ptr, WORD count,WORD Mode);
WORD  RecProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKYcProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKYxProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKKwhProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKSoeProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKYkProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKWave(BYTE FAR *rxb,WORD rdp,WORD Len);
void  FDKRequestTime(BYTE FAR *rxb,WORD rdp,WORD Len);

WORD  PollingTx(WORD wrp,BYTE PPoll);
WORD  FDKSendTime(BYTE FAR *txb,WORD wrp);
WORD  FDKMakeYk(BYTE FAR *txb,WORD wrp,WORD Type);
WORD  CallData(BYTE FAR *txb,WORD wrp,WORD Type);
WORD  CallSoe(BYTE FAR *txb,WORD wrp);
WORD  FDKWaveProc(BYTE FAR *txb,WORD wrp);
/*----------------------------------------------------------------*/
int FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpszCmdLine)
{
  if (wHeapSize >0 ) UnlockData(0);
  return 1;
}
 
int FAR PASCAL WEP (int nParameter)
{
  FreeLibrary (hLib);
  return 1;                                  
}

//=============================================================================================================
int FAR PASCAL _export RxProc(HWND hWnd, WORD chno, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP)
{
  WORD rdp;
  char FAR *rxb;
  BYTE bchdata[6];
  WORD CRC;
  lpChP = lpChannelP;
  if (!lpChP) return 0;
  ChNo = chno;
  lpChP += ChNo;
  lpStaP = lpStationP+lpChP->StaNo;
  if (!lpStaP) return 0;  
  rxb = lpChP->RecBuff;
  if (!rxb) return 0;
  rxbuflen = lpChP->RxBuffLen;

  CHFLAG *chf = (CHFLAG *)lpChP->Reserved;

  if ((chf->RecWPBak%rxbuflen)==(lpChP->RxWriteP%rxbuflen))  //如果接收写指针没变化
     {
      if (!(lpChP->CHStatus & CommBreakFlag))
         {
          if (++chf->rf.CommBreakNum > 400)
             {
              	lpChP->CHStatus |= CommBreakFlag;
              	lpChP->CHStatus |= ChInit;
				RANDOM0[lpChP->StaNo]=RANDOM1[lpChP->StaNo]=RANDOM2[lpChP->StaNo]=0;
			  	lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
             }
         }
     }
  else
     {
      chf->RecWPBak = lpChP->RxWriteP%rxbuflen;
//      chf->rf.CommBreakNum = 0;
/*
	  if (lpChP->CHStatus & CommBreakFlag && chf->rf.CommBreakNum--==0)
          {
			  lpChP->CHStatus &= ~CommBreakFlag;
		  }
*/
	  if (lpChP->CHStatus & CommBreakFlag)
         {
          if (chf->rf.CommBreakNum==0)
              lpChP->CHStatus &= ~CommBreakFlag;
            else
             chf->rf.CommBreakNum--;
         }
        else
		 chf->rf.CommBreakNum = 0;

	  }

  if (chf->rf.InvalidCharNum>0x1e0)
     {
      lpChP->CHStatus |= ChInit;
      chf->rf.InvalidCharNum = 0;
      if ((++chf->rf.CHErr)>0x580)
         {
          chf->rf.CHErr = 0;
          lpChP->CHStatus |= CharInvFlag;
          lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
         }
     }
while ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen >=6)
      {
         rdp = lpChP->RxReadP;
        if (*(rxb+rdp)==SOH)
           {
             WORD Len=*(rxb+(rdp+2)%rxbuflen)*(WORD)256+*(rxb+(rdp+1)%rxbuflen);
             if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen<Len+8) return 1;
             CRC=crc16(rxb,rdp+1,Len+5,rxbuflen);
             if (LOBYTE(CRC)!=*(rxb+(rdp+3)%rxbuflen) || HIBYTE(CRC)!=*(rxb+(rdp+4)%rxbuflen))  // || *(rxb+(rdp+5)%rxbuflen)!=lpStaP->STATIONNO)
                {
                    lpChP->RxReadP=lpChP->RxWriteP=0;
                    lpChP->ErrDataNum++;
                    return 1;
                }
	             lpStaP->RTUSTATUS=*(rxb+(rdp+5)%rxbuflen);
                 lpChP->RxReadP=(rdp+RecProc(rxb,rdp,Len))%rxbuflen;
           }
        else rdp+=1;
        lpChP->RxReadP=rdp%rxbuflen;      
      }
return 1;
}
int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP,int Station)
{
 sss=Station;
// Station &=0xf;
 WORD wrp,currch;
 BYTE FAR *txb;
   
   lpChP = lpChannelP;
   if (!lpChP) return 0;
   lpStaP = lpStationP;
   txb = lpChP->SendBuff;
   if (!txb) return 0;
   txbuflen=lpChP->TxBuffLen;
   wrp = lpChP->TxWriteP%txbuflen;
   if (wrp != lpChP->TxReadP%txbuflen) return 0;

   if (lpStaP->DownCmdRP != lpStaP->DownCmdWP)
      {
	   switch (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0])
         {
          case 29:  //xbfx
                    wrp = FDKWaveProc(txb,wrp);
                    break;
          case DCMDSST: //对钟
               wrp=FDKSendTime(txb,wrp);
               break;
          case DCMDYK1: //遥控执行
          case DCMDYK0: //遥控预置
          case DCMDYK2: //遥控撤消
               wrp=FDKMakeYk(txb,wrp,lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0]);
               break;
          case DCMDSJ0: //升降选择
          case DCMDSJ1: //升降执行
          case DCMDSJ2: //升降撤消
               break;
          case DCMDGB:  //广播命令
               break;
          case DCMDFG:  //复归命令
               break;
         }
       lpStaP->DownCmdRP = (lpStaP->DownCmdRP+1)&3;
      }                              
   else if (RequestTime[lpChP->StaNo]==0)  wrp=FDKSendTime(txb,wrp);
   else
		{
//            PollOver[lpChP->StaNo]++;
            PollOver[lpStaP->CurrUsedCh]++;
//			if (PollOver[lpChP->StaNo]>lpStaP->ProcCount)// || RANDOM0[lpChP->StaNo]!=0xcc)
			if (PollOver[lpStaP->CurrUsedCh]>lpStaP->ProcCount)// || RANDOM0[lpChP->StaNo]!=0xcc)
            	{
//					if (PollOver[lpChP->StaNo]<lpStaP->ProcCount*2)
					if (PollOver[lpStaP->CurrUsedCh]<lpStaP->ProcCount*2)
						{
					        if (RepTimes[lpChP->StaNo]++>=lpStaP->RepeatTimes)
						       {
							        RANDOM0[lpChP->StaNo]=RANDOM1[lpChP->StaNo]=RANDOM2[lpChP->StaNo]=0;
							        RepTimes[lpChP->StaNo]=Retry[lpChP->StaNo]=0;
							        Poll[lpChP->StaNo]=TIME[lpChP->StaNo]=PAFFLAG[lpChP->StaNo]=SDBB[lpChP->StaNo]=0;
						       }
                            else
                                {
                                    Retry[lpChP->StaNo]=1;
                                    Poll[lpChP->StaNo]--;
                                }
                        }
					wrp=PollingTx(wrp,(Poll[lpChP->StaNo]++)%0x1f);
//                    PollOver[lpChP->StaNo]=0;
                    PollOver[lpStaP->CurrUsedCh]=0;
                    lpChP->RxReadP=lpChP->RxWriteP;
				}
			else if (RequestTime[lpChP->StaNo]==0) wrp=FDKSendTime(txb,wrp);
        }
   lpChP->TxWriteP = wrp%txbuflen;
   return 1;
}


BYTE Pyc(WORD rdp)
{
 BYTE FAR *rxb = lpChP->RecBuff;
 int ycOrd = (*(rxb+rdp%rxbuflen))*2;
 int ycValue = (*(rxb+(rdp+2)%rxbuflen)&0xf)*256 + (*(rxb+(rdp+1)%rxbuflen));
 if (*(rxb+(rdp+2)%rxbuflen)&8) ycValue=~ycValue&0x8fff;
 SetValue(YCDB, lpChP->StaNo, ycOrd, ycValue);
 ycOrd++;
 ycValue = (*(rxb+(rdp+4)%rxbuflen)&0xf)*256 + (*(rxb+(rdp+3)%rxbuflen));
 if (*(rxb+(rdp+4)%rxbuflen)&8) ycValue=~ycValue&0x8fff;
 SetValue(YCDB, lpChP->StaNo, ycOrd, ycValue);
 return 6;
}
BYTE Pyx(WORD rdp)
{
 BYTE FAR *rxb = lpChP->RecBuff;
 int yxbOrd = *(rxb+rdp) - 0xF0;
 int i, j;
 BYTE flag = (lpStaP+lpChP->StaNo)->RotateFlag;
 BYTE yxbv, yxtb, yxv[8];
 for (i=0; i<4; i++)
	 {
	  yxbv = *(rxb+(rdp+i+1)%rxbuflen);
	  if (flag) yxbv = ByteRotate(yxbv);
      for (j=0, yxtb=0x80; j<8; j++, yxtb>>=1)
          {
           yxv[j] = 0;
           if (yxbv&yxtb) yxv[j]=1;
          }
      SetBatchValue(YXDB, lpChP->StaNo, yxbOrd*32+i*8, 8, (char huge *)yxv);
     }
 return 6;
}

BYTE Pkwh(WORD rdp)
{
 BYTE FAR *rxb = lpChP->RecBuff;
 int kwhOrd = *(rxb+rdp) - 0xA0;
 DWORD kwhValue = (DWORD)*(rxb+(rdp+4)%rxbuflen)+(DWORD)*(rxb+(rdp+3)%rxbuflen)*256l
                 + (DWORD)*(rxb+(rdp+2)%rxbuflen)*256l*256l;
 SetValue(KWHDB, lpChP->StaNo, kwhOrd, kwhValue);
 return 6;
}

BYTE Pyk(WORD rdp)
{
 if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen <18 ) return 0;
BYTE bchdata[6],i;
BYTE FAR *rxb = lpChP->RecBuff;

//tzc
for (i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+6+i)%rxbuflen);
if (CDT_BCH(bchdata)!=bchdata[5]) return 12;
for (i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+12+i)%rxbuflen);
if (CDT_BCH(bchdata)!=bchdata[5]) return 18;
BYTE FJFLAG=0xaa;
for (i=0;i<6;i++) if (*(rxb+(rdp+i)%rxbuflen)!=lpChP->yktemp[i]) {FJFLAG=0x55;break;}
//tzc
COMMAND cmdrcd;

// BYTE FAR *rxb = lpChP->RecBuff;
 BYTE rp = (lpStaP->DownCmdRP-1) & 3;
 WORD rtuno = lpStaP->DownCmd[rp].Cmd[0]+lpStaP->DownCmd[rp].Cmd[1]*256;
 if ((lpStaP->DownCmd[rp].Cmd[0]==DCMDYK0) && (lpChP->StaNo == rtuno))
    {
     cmdrcd.CmdContent[0] = 0x44;  //遥控返校
     cmdrcd.CmdContent[1] = lpStaP->DownCmd[rp].Cmd[1];
     cmdrcd.CmdContent[2] = lpStaP->DownCmd[rp].Cmd[2];
     cmdrcd.CmdContent[3] = *(rxb+(rdp+3)%rxbuflen);
     cmdrcd.CmdContent[4] = *(rxb+(rdp+4)%rxbuflen);
     cmdrcd.CmdContent[5] = *(rxb+(rdp+1)%rxbuflen);
     cmdrcd.CmdContent[6] = FJFLAG;//0xAA;  //遥控返校错:0x55  遥控返校正确:0xAA
     cmdrcd.SubCmdType = TCZYKCMD;
     cmdrcd.DataLen = 0;
     cmdrcd.DataPt = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -