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

📄 n4f.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*本程序是POLLING规约的收发程序*/
/*u4f*/
#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	  YC0			1
#define	  YC1			2
#define	  YC2			3
#define	  YC3			4
#define	  YC4			5
#define	  YC5			6
#define	  YC6			7
#define	  YC7			8
#define  YxType      9
#define  KWHType      10
#define  SOEType     11
#define  YxChange    0xfe
#define  Soe1stBoard 12
#define  Soe2stBoard 13
#define  YcModuleType   0x01
#define   FILTER_COEFFICIENT_0       0x00
#define   FILTER_COEFFICIENT_1       0x01
#define   FILTER_COEFFICIENT_2       0x02
#define   FILTER_COEFFICIENT_3       0x03
#define   FILTER_COEFFICIENT_4       0x04
#define   FILTER_COEFFICIENT_5       0x05
#define   FILTER_COEFFICIENT_6       0x06
#define   FILTER_COEFFICIENT_7       0x07
#define   REDACTION_FACTOR_0          0x00
#define   REDACTION_FACTOR_1          0x01
#define   REDACTION_FACTOR_2          0x02
#define   REDACTION_FACTOR_3          0x03
#define   REDACTION_FACTOR_4          0x04
#define   REDACTION_FACTOR_5          0x05
#define   REDACTION_FACTOR_6          0x06
#define   REDACTION_FACTOR_7          0x07
#define   YxModuleType   0x03
#define   SCAN_FREQUENCE_0            0x01
#define   SCAN_FREQUENCE_1            0x02
#define   SCAN_FREQUENCE_2            0x05
#define   SCAN_FREQUENCE_3            0x0A
#define   SCAN_FREQUENCE_4            0x14
#define   SCAN_FREQUENCE_5            0x32
#define   SCAN_FREQUENCE_6            0x46
#define   SCAN_FREQUENCE_7            0x5A
#define  YxCategory  0x40    //bit7,6,5
#define  KwhCategory 0x60
#define  Yc0Category 0x60      //0
#define  Yc1Category 0x60      //1
#define  Yc2Category 0x60      //2
#define  Yc3Category 0x60      //3
#define  Yc4Category 0x60      //4
#define  Yc5Category 0x60      //5
#define  Yc6Category 0x60      //6
#define  Yc7Category 0x60      //7
#define  SoeCategory 0x60
#define  YXStartBoard   0x08
#define  YCStartBoard   0x0E
#define  KWHStartBoard  0x02
#define  YKStartBoard   0x0C
static WORD N4FCRC16[]={
                0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,
				0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,
                0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,
                0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,
                0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,
                0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,
                0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,
                0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,
                0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,
                0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,
                0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,
                0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,
                0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,
                0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,
                0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,
                0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,
                0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,
                0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,
                0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,
                0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,
                0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,
                0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,
                0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,
                0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,
                0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,
                0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,
                0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,
                0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,
                0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,
                0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,
                0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,
				0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040,
	      } ;

typedef struct {
  RUNFLAG rf;
  WORD    RecWPBak;
} CHFLAG;
//---------------------------------------------------------------------------------
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
BYTE RecSoeBoardAddress[64];
WORD YcNums;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
BYTE TBFlag[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);

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);
WORD PollingTx(WORD,BYTE);
WORD PollRecProc(BYTE FAR *,WORD,WORD);
int  CKCRC16(BYTE FAR *,WORD,BYTE,WORD);
BYTE change_h_to_l(BYTE);
WORD MKCRC16(BYTE FAR *,WORD,BYTE,WORD);
BYTE MKCRC8(BYTE FAR *,WORD,BYTE,WORD);
void ProcPAR(BYTE FAR *,WORD);
void ProcCOA(BYTE FAR *,WORD);
void ProcModeChange(BYTE FAR *,WORD);
void ProcChgData_1b(BYTE FAR *,WORD);
void ProcCallData_1c(BYTE FAR *,WORD);
void ProcBadCallData_1d(BYTE FAR *,WORD);
void ProcPowerOn(BYTE FAR *,WORD);
void ProcYk(BYTE FAR *,WORD);
void ProcCallEvent(BYTE FAR *,WORD);
void ProcCallData(BYTE FAR *,WORD);
WORD N4fYkSel(BYTE FAR *,WORD);
WORD N4fYkExe(BYTE FAR *,WORD);
WORD YSYZSend(BYTE FAR *,WORD);
WORD SendYxType(BYTE FAR *,WORD);
WORD FreqSend(BYTE FAR *,WORD);
WORD LBXSSend(BYTE FAR *,WORD);
WORD TBSend(BYTE FAR *,WORD);
WORD PowerOk(BYTE FAR *,WORD);
WORD ResetRtu(BYTE FAR *,WORD);
WORD GXType(BYTE FAR *,WORD);
WORD SendYcType(BYTE FAR *,WORD,BYTE);
WORD N4fSetTime(BYTE FAR *,WORD);
WORD CallKwhData(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;
  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;
              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->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen >=3)
	{
		 rdp = lpChP->RxReadP;
		 if (*(rxb+rdp)!=lpStaP->STATIONNO)
			{
				lpChP->RxReadP=(rdp+1)%rxbuflen;
				return 1;
			}
		 BYTE Command;
		 Command=*(rxb+(rdp+1)%rxbuflen)&0x3f;
		 if (Command==6 ||Command==0x15)
			{
				if (Command==6)
					{
                    	lpStaP->RANDOM[1]=0xff;
					}
				if (Command==6 && lpStaP->RANDOM[0]!=0xff)
					{
						lpStaP->RANDOM[0]++;
					}
				if (Command==0x15)
					{
						lpStaP->Poll--;
						lpStaP->RANDOM[1]=0x80;
					}
				if (Command==0x15 && lpStaP->RANDOM[0]!=0xff)
					{
                     	lpStaP->RANDOM[0]--;
					}
				lpChP->RxReadP=(rdp+3)%rxbuflen;
				return 1;
			}
		 else
         {
		 BYTE Len=*(rxb+(rdp+2)%rxbuflen);
		 if (Len+4<=(lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen)
			{
			  if (CKCRC16(rxb,rdp,Len,rxbuflen))
				{
					lpChP->RxReadP=(rdp+PollRecProc(rxb,rdp,Len))%rxbuflen;
					lpStaP->PollOver=ProcCount*2;
					lpStaP->RANDOM[1]=0xff;
				}
			  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;
   WORD wrptemp=wrp;
   if (lpStaP->DownCmdRP != lpStaP->DownCmdWP)
      {
	   switch (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0])
         {
          case DCMDSST: //对钟
			   //wrp = iTime(wrp);
			   wrp=N4fSetTime(txb,wrp);
               break;
          case DCMDYK0: //遥控预置
				wrp=N4fYkSel(txb,wrp);
                break;
		  case DCMDYK1: //遥控执行
				wrp=N4fYkExe(txb,wrp);
                break;
		  case DCMDYK2: //遥控撤消
//               wrp = msYk(wrp);
			   break;
          case DCMDSJ0: //升降选择
          case DCMDSJ1: //升降执行
          case DCMDSJ2: //升降撤消
//               wrp = msSj(wrp);
               break;
          case DCMDGB:  //广播命令
//               wrp = msGb(wrp); 
               break;
          case DCMDFG:  //复归命令
//               wrp = msFg(wrp);
               break;
         }
       lpStaP->DownCmdRP = (lpStaP->DownCmdRP+1)&3;
      }                              
   else
		{
			if (TBFlag[lpChP->StaNo]!=0)
            	wrp=TBSend(txb,wrp);
			else if (lpStaP->PollOver++>ProcCount)
            	{
					if (lpStaP->PollOver<ProcCount+2)
						{
							lpStaP->KwhCount=KWHCOUNT;
							lpStaP->RANDOM[0]=lpStaP->RANDOM[1]=lpStaP->RANDOM[2]=0;
                        }
					lpStaP->PollOver=0;
					wrp=PollingTx(wrp,(lpStaP->Poll++)%0x1f);
				}
        }

   lpChP->TxWriteP = wrp%txbuflen;
   if (wrptemp!=wrp) lpStaP->LastCode=*(txb+(wrp+1)%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;     }

⌨️ 快捷键说明

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