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

📄 wtspoll.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
字号:
//WTS Polling dyh 98.11
#include <owl.h>
#include <windows.h>
#include <time.h>
#include	<stdio.h>
#include "def.h"

#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"
typedef struct {
  RUNFLAG rf;
  WORD    RecWPBak;
} CHFLAG;

int sss;
static  BYTE RecSyab;
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;

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);

BYTE CallLPC(BYTE FAR *,WORD,WORD,WORD);
WORD CallSST(BYTE FAR *,WORD);
//----------------------------------------------------------------//
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];

  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 > 40000)
             {
              	lpChP->CHStatus |= CommBreakFlag;
              	lpChP->CHStatus |= ChInit;
			  	lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
             }
         }
     }
  else
     {
      chf->RecWPBak = lpChP->RxWriteP%rxbuflen;

	  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);
		 }
     }

if(RecSyab==0)
  {
	WORD reclen;
	reclen=(lpChP->RxWriteP+rxbuflen-lpChP->RxReadP)%rxbuflen;
	if(reclen>0)
	{
     WORD i;
	 for(i=0;i<reclen;i++)
          if (*(rxb+(lpChP->RxReadP+i)%rxbuflen)==0x01)
           break;
              
	 if(i<reclen)
        {
		RecSyab=1;
		lpChP->RxReadP+=i+1;
        lpChP->RxReadP%=rxbuflen;
        }
      else
        {
	    lpChP->RxReadP+=i;	 
        lpChP->RxReadP%=rxbuflen;
        }
	 if((RecSyab==1)&&((reclen-i-1)>=10))
	   {
        if(CallLPC(rxb,lpChP->RxReadP,8,rxbuflen)==*(rxb+(lpChP->RxReadP+8)%rxbuflen))
		   {
			struct time tm;
            struct date da;
			tm.ti_hour=*(rxb+lpChP->RxReadP)/16*10+*(rxb+lpChP->RxReadP)%16;
			tm.ti_min=*(rxb+(lpChP->RxReadP+1)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+1)%rxbuflen)%16;
			tm.ti_sec=*(rxb+(lpChP->RxReadP+2)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+2)%rxbuflen)%16;
			unsigned char msh,msl;
            WORD ms;
			msh=*(rxb+(lpChP->RxReadP+3)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+3)%rxbuflen)%16;
			msl=(*(rxb+(lpChP->RxReadP+4)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+4)%rxbuflen)%16)/10;
			ms=msh;
			ms*=10;
			ms+=msl;
            tm.ti_hund=ms/10;
			settime(&tm);
			da.da_year=*(rxb+(lpChP->RxReadP+5)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+5)%rxbuflen)%16;
			if(da.da_year<50)
              da.da_year+=2000;
			 else
             da.da_year+=1900;
			da.da_mon=*(rxb+(lpChP->RxReadP+6)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+6)%rxbuflen)%16;
			da.da_day=*(rxb+(lpChP->RxReadP+7)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+7)%rxbuflen)%16;
			setdate(&da);
           }
			lpChP->RxReadP+=10;
            lpChP->RxReadP%=rxbuflen;
			RecSyab=0;
       }
     }
    }
	else
	{
	 WORD reclen;
	 reclen=(lpChP->RxWriteP+rxbuflen-lpChP->RxReadP)%rxbuflen;
      if((reclen>=10))
		   {
			if(CallLPC(rxb,lpChP->RxReadP,8,rxbuflen)==*(rxb+(lpChP->RxReadP+8)%rxbuflen))
            {
			struct time tm;
            struct date da;
			tm.ti_hour=*(rxb+lpChP->RxReadP)/16*10+*(rxb+lpChP->RxReadP)%16;
			tm.ti_min=*(rxb+(lpChP->RxReadP+1)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+1)%rxbuflen)%16;
			tm.ti_sec=*(rxb+(lpChP->RxReadP+2)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+2)%rxbuflen)%16;
			unsigned char msh,msl;
            WORD ms;
			msh=*(rxb+(lpChP->RxReadP+3)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+3)%rxbuflen)%16;
			msl=(*(rxb+(lpChP->RxReadP+4)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+4)%rxbuflen)%16)/10;
			ms=msh;
			ms*=10;
			ms+=msl;
            tm.ti_hund=ms/10;
			settime(&tm);
			da.da_year=*(rxb+(lpChP->RxReadP+5)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+5)%rxbuflen)%16;
			if(da.da_year<50)
              da.da_year+=2000;
			 else
             da.da_year+=1900;
			da.da_mon=*(rxb+(lpChP->RxReadP+6)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+6)%rxbuflen)%16;
			da.da_day=*(rxb+(lpChP->RxReadP+7)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+7)%rxbuflen)%16;
			setdate(&da);
            }
            lpChP->RxReadP+=10;
            lpChP->RxReadP%=rxbuflen;
			RecSyab=0;
	      }   
      }
   return 1;
}

int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP,int Station)
{
 int 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)
	  {
	   if(lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0]==DCMDSST)
	   wrp=CallSST(txb,wrp);
	   
	   lpStaP->DownCmdRP = ((lpStaP->DownCmdRP+1)&3);
	  
	   lpChP->TxWriteP = wrp%txbuflen;
      }                              
		else
        lpChP->TxReadP=lpChP->TxWriteP;
	 return 1;
}


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 CallSST(BYTE FAR *txb,WORD wrp)
{
	*(txb+(wrp+0)%txbuflen)=0x01;
	*(txb+(wrp+1)%txbuflen)='A';
	*(txb+(wrp+2)%txbuflen)='N';
	*(txb+(wrp+3)%txbuflen)=0x0d;
	return (wrp+4);
}

⌨️ 快捷键说明

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