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

📄 zfsc1801.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*本程序是 转发POLLING规约的收发程序*/
/*SC1801*/
#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		ProcCount	5000
#define		KWHCOUNT	8000	//电度采集间隔
#define		NAK		0x00
#define	 	RRC		0x01
#define	 	DRF 	0x02
#define	 	XRF		0x03
#define		SOE 	0x04
#define		PAR		0x05
#define		PAZ		0x06
#define		PAF		0x07
#define		PAT		0x08
#define		SDB		0x09
#define		SST		0x19
#define		RST		0x1a
#define		COA		0x0d
#define		COE		0x11
typedef struct {
  RUNFLAG rf;
  WORD    RecWPBak;
} CHFLAG;
//---------------------------------------------------------------------------------
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
typedef struct
{
BYTE SSTFlag,Retry,RepTimes,RANDOM0,RANDOM1,RANDOM2,Poll,PAFFLAG,TIME,SDBB,DRFTIME;
WORD PollOver;
}Flag;
//BYTE SSTFlag[64],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,
                   };
*/
typedef struct {
WORD    year;
WORD    month;
WORD    day;
WORD    hour;
WORD    min;
WORD    sec;
}Group;

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

void CreateSoeForSCI(WORD,WORD,BYTE);
DWORD calsec(struct date,struct time);
DWORD    DayPeYear(DWORD);
DWORD    DayPeMonth(DWORD,DWORD);
Group Current(DWORD);
void ProcCtrlW(WORD);
BYTE ProcInfoW(WORD);
BYTE Pyc(WORD);
BYTE Pyx(WORD);
BYTE Pkwh(WORD);
BYTE Pyk(WORD);
BYTE Psj(WORD);
BYTE Psoe(WORD);

WORD iTime(WORD);
WORD msYk(WORD);
WORD msSj(WORD);
WORD msGb(WORD);
WORD msFg(WORD);
BYTE CallLPC(BYTE FAR *,WORD,WORD,WORD);
WORD PollRecProc(BYTE FAR *,WORD,WORD);
void ProcRRC(BYTE FAR *,WORD);
void ProcDRF(BYTE FAR *,WORD);
void ProcXRF(BYTE FAR *,WORD);
void ProcSOE(BYTE FAR *,WORD);
void ProcPAR(BYTE FAR *,WORD);
void ProcRST(BYTE FAR *,WORD);
void ProcCOA(BYTE FAR *,WORD);
WORD CallSST(BYTE FAR *,WORD);
WORD CallData(BYTE FAR *,WORD,BYTE);
WORD CallYk(BYTE FAR *,WORD);
WORD ZfProcRRC(BYTE FAR *,WORD);
WORD ZfProcDRF(BYTE FAR *,WORD);
WORD ZfProcXRF(BYTE FAR *,WORD);
WORD ZfProcPAR(BYTE FAR *,WORD);
WORD ZfProcNAK(BYTE,BYTE FAR *,WORD);
WORD ZfProcSOE(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];

  lpStaP = lpStationP;
  if (!lpStaP) return 0;  
  lpChP = lpChannelP;
  if (!lpChP) return 0;
  ChNo = chno;
  lpChP += ChNo;
  rxb = lpChP->RecBuff;
  if (!rxb) return 0;
  lpStaP+=lpChP->StaNo;
  rxbuflen = lpChP->RxBuffLen;

  CHFLAG *chf = (CHFLAG *)lpChP->Reserved;
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);

  if ((chf->RecWPBak%rxbuflen)==(lpChP->RxWriteP%rxbuflen))  //如果接收写指针没变化
     {
      if (!(lpChP->CHStatus & CommBreakFlag))
         {
		  if (++chf->rf.CommBreakNum > 6000)
             {
              lpChP->CHStatus |= CommBreakFlag;
              lpChP->CHStatus |= ChInit;
              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);
         }
     }


if ((lpChP->RxReadP + rxbuflen - lpChP->RxWriteP)%rxbuflen ==1)
	{
		lpChP->RxReadP=lpChP->RxWriteP=0;
		MessageBeep(0);
    }
if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen >=5)
	{
		 rdp = lpChP->RxReadP;
		 if (*(rxb+rdp)!=lpStaP->STATIONNO)
			{
				lpChP->RxReadP=(rdp+1)%rxbuflen;
				return 1;
			}
		 WORD Len=*(rxb+(rdp+2)%rxbuflen)*(WORD)256+*(rxb+(rdp+3)%rxbuflen);
		 if (Len>100)
			{
				lpChP->RxReadP=lpChP->RxWriteP=0;
				return 1;
			}
		 if (Len+5<=(lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen)
			{
			  if (*(rxb+(rdp+Len+4)%rxbuflen)==CallLPC(rxb,rdp,Len+4,rxbuflen))
				{
				lpChP->RxReadP=(rdp+PollRecProc(rxb,rdp,Len)+1)%rxbuflen;
				FLAG->PollOver=ProcCount*2;
				FLAG->RANDOM0=0xc6;
				chf->rf.CommBreakNum==0;
				}
			  else lpChP->RxReadP=lpChP->RxWriteP=0;
            }

    }       

return 1;
}

int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP,int Station)
{
 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;
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);

//   if (RANDOM0[lpChP->StaNo]==0xc6 && RANDOM1[lpChP->StaNo])
		{
            FLAG->RANDOM1++;
            FLAG->RANDOM1&=0xf;
			switch (FLAG->RANDOM1)
				{
					case	RRC:
						wrp=ZfProcRRC(txb,wrp);
						break;
					case	DRF:
						wrp=ZfProcDRF(txb,wrp);
						break;
					case	XRF:
						wrp=ZfProcXRF(txb,wrp);
						break;
					case	PAR:
						wrp=ZfProcPAR(txb,wrp);
						break;
					case	SOE:
						wrp=ZfProcSOE(txb,wrp);
                        break;
					default:
						wrp=ZfProcNAK(FLAG->RANDOM1,txb,wrp);
						break;
				}
//			RANDOM0[lpChP->StaNo]=RANDOM1[lpChP->StaNo]=0;
		}   	
   lpChP->TxWriteP = wrp%txbuflen;
   return 1;
}

void ProcCtrlW(WORD rdp)
{
//  if (!lpChP) return;
  BYTE FAR *rxb = lpChP->RecBuff;

//  lpChP->StaNo = *(rxb+(rdp+3)%rxbuflen);
  BYTE StaNo = *(rxb+(rdp+3)%rxbuflen);

  switch (*(rxb+(rdp+1)%rxbuflen))
    {
     case 0x7a:
          COMMAND cmdrcd;

          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) && (StaNo == rtuno))
             {
              cmdrcd.CmdContent[0] = 0x44;  //遥控返校
              for (int i=1; i<6; i++)
                   cmdrcd.CmdContent[i] = lpStaP->DownCmd[rp].Cmd[i];
              cmdrcd.CmdContent[6] = 0x55;  //遥控返校错:0x55  遥控返校正确:0xAA
              cmdrcd.SubCmdType = TCZYKCMD;
              cmdrcd.DataLen = 0;
              cmdrcd.DataPt = 0;
              WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
              lpStaP->DownCmd[rp].Cmd[0]=0;
             }
          break;
     default:
          break;
    }
}

BYTE ProcInfoW(WORD rdp)
{
  BYTE FAR *rxb = lpChP->RecBuff;
  BYTE func = *(rxb+rdp);
  BYTE Add;

//  if (func==0)     //时间
//     { Add = 6;     }
  if (func<0x80)         //遥测
     { Add = Pyc(rdp);      }
    else if (func<0x82)  //SOE
     { Add = Psoe(rdp);     }
    else if (func<0x84)  //备用
     { Add = 6;     }
    else if (func<0x86)  //子站时钟
     { Add = 6;     }
    else if (func<0x8a)  //总加遥测
     { Add = 6;     }
    else if (func<0x8b)  //频率
     { Add = 6;     }
    else if (func<0x8d)  //
     { Add = 6;     }
    else if (func<0x93)  //水位
     { Add = 6;     }
    else if (func<0xa0)  //
     { Add = 6;     }
    else if (func<0xe0)  //电度
     { Add = Pkwh(rdp);     }
    else if (func<0xe2)  //遥控
     { Add = Pyk(rdp);     }
    else if (func<0xe6)  //升降
     { Add = Psj(rdp);     }
    else if (func<0xec)  //备用
     { Add = 6;     }
    else if (func<0xed)  //子站状态
     { Add = 6;     }
    else if (func<0xf0)  //备用
     { Add = 6;     }
    else                //遥信
     { Add = Pyx(rdp);      }
  return(Add); 
}

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;
     WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
     lpStaP->DownCmd[rp].Cmd[0]=0;
    }

 return 18;
}

BYTE Psj(WORD rdp)
{
 if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen <18 ) return 0;

 COMMAND cmdrcd;
 char bchdata[6],i;
 BYTE FAR *rxb = lpChP->RecBuff;
 BYTE rp = (lpStaP->DownCmdRP-1) & 3;
 WORD rtuno = lpStaP->DownCmd[rp].Cmd[0]+lpStaP->DownCmd[rp].Cmd[1]*256;
 //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

 if ((lpStaP->DownCmd[rp].Cmd[0]==DCMDSJ0) && (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 = TCZYTCMD;
     cmdrcd.DataLen = 0;
     cmdrcd.DataPt = 0;
     WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
     lpStaP->DownCmd[rp].Cmd[0]=0;
    }

 return 18;
}

BYTE Psoe(WORD rdp)
{
 if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen <12 ) return 0;

 char bchdata[6];
 BYTE FAR *rxb = lpChP->RecBuff;
 BYTE ret;
 WORD yxord;
 DWORD yxattr;
 if ((*(rxb+rdp%rxbuflen)==0x80) && (*(rxb+(rdp+6)%rxbuflen)==0x81))
    {
     for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i+6)%rxbuflen);
     if (CDT_BCH(bchdata)==bchdata[5])
        {
		 yxord = *(rxb+(rdp+9)%rxbuflen) + (*(rxb+(rdp+10)%rxbuflen)&0xf)*256;
         yxattr = GetAttr(YXDB, lpChP->StaNo, yxord);
		 if ((yxattr&YXCREATESOE) && (yxattr&RECRTUSOE) )
            {
             EVENT evercd;
			 BYTE yxtype = GetType(YXDB, lpChP->StaNo, yxord);
             if (yxtype&YXSWITCH) evercd.EventType = KGEVENT;
             else if (yxtype&YXLINKER) evercd.EventType = DZEVENT;
             else if (yxtype&YXPROTECT) evercd.EventType = BHEVENT;
			 evercd.EventType =1;
             evercd.Station = lpChP->StaNo;
             evercd.Order = yxord;
			 evercd.Hour=(BYTE)*(rxb+(rdp+7)%rxbuflen);
			 evercd.Min=(BYTE)*(rxb+(rdp+4)%rxbuflen);
			 evercd.Sec=(BYTE)*(rxb+(rdp+3)%rxbuflen);
			 evercd.Ms=*(rxb+(rdp+2)%rxbuflen)*256+*(rxb+(rdp+1)%rxbuflen);
			 evercd.Status = *(rxb+(rdp+10)%rxbuflen)&0x80;
			 if (evercd.Status) evercd.Status = 0xCC;
               else evercd.Status = 0x33;
             if (yxattr&YXXOR) evercd.Status ^= 0xff;
             evercd.EventAttr &= ~SGFLAG;
             if (GetTimerValue(RTUDB, evercd.Station))
                {
                 if (evercd.Status==0x33)
                    {
                     if ((yxtype==YXSWITCH) || (yxtype==YXLINKER))
                         evercd.EventType|=0x80;//evercd.EventAttr |= SGFLAG;
					}
                   else if (yxtype==YXPROTECT) evercd.EventType|=0x80;//evercd.EventAttr |= SGFLAG;
                }

⌨️ 快捷键说明

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