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

📄 sc1801.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*本程序是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		KWHCOUNT	0x8000l	//电度采集间隔
#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;
typedef struct {
WORD    year;
WORD    month;
WORD    day;
WORD    hour;
WORD    min;
WORD    sec;
}Group;
typedef struct
{
BYTE SSTFlag,Retry,RepTimes,RANDOM0,RANDOM1,RANDOM2,Poll,PAFFLAG,TIME,SDBB,DRFTIME;
WORD PollOver;
}Flag;
//---------------------------------------------------------------------------------
int sss;
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;// jgx 256;
WORD txbuflen = 256;// jgx 256;
WORD ChNo;
//BYTE SSTFlag[64],Retry[64],RepTimes[64],RANDOM0[64],RANDOM1[64],RANDOM2[64],Poll[64],PAFFLAG[64],TIME[64],SDBB[64],DRFTIME[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];
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);
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 ProcPAF(BYTE FAR *,WORD);
void ProcPAT(BYTE FAR *,WORD);
void ProcRST(BYTE FAR *,WORD);
void ProcCOA(BYTE FAR *,WORD);
WORD CallSST(BYTE FAR *,WORD);
void ProcSDB(BYTE FAR *,WORD);
WORD CallData(BYTE FAR *,WORD,BYTE);
WORD CallYk(BYTE FAR *,WORD);
WORD ExecYk(BYTE FAR *,WORD);
void CreateSoeForSCI(WORD,WORD,BYTE);
DWORD calsec(struct date,struct time);
DWORD    DayPeYear(DWORD);
DWORD    DayPeMonth(DWORD,DWORD);
Group Current(DWORD);

//----------------------------------------------------------------//
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;
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
  if ((chf->RecWPBak%rxbuflen)==(lpChP->RxWriteP%rxbuflen))  //如果接收写指针没变化
     {
      if (!(lpChP->CHStatus & CommBreakFlag))
         {
		  if (++chf->rf.CommBreakNum > 400)//jgx 98.8 4000
             {
              	lpChP->CHStatus |= CommBreakFlag;
              	lpChP->CHStatus |= ChInit;
				FLAG->RANDOM0=FLAG->RANDOM1=FLAG->RANDOM2=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)//jgx 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) > 0)//jgx 98.8 >0
	  && (*(rxb+lpChP->RxReadP)!=lpStaP->STATIONNO))
	  {lpChP->RxReadP++;
	  lpChP->RxReadP %=rxbuflen;
      return 1;
	  }
if((((lpChP->RxWriteP + rxbuflen - lpChP->RxReadP)%rxbuflen) > 1)//jgx >0
      && (*(rxb+lpChP->RxReadP)==lpStaP->STATIONNO)
      && (*(rxb+(lpChP->RxReadP+1)%rxbuflen)==lpStaP->STATIONNO))
	  {lpChP->RxReadP++;
	  lpChP->RxReadP %=rxbuflen;
      return 1;
	  }

if (((lpChP->RxWriteP + rxbuflen - lpChP->RxReadP)%rxbuflen)>4) //>4 jgx
	{
		 rdp = lpChP->RxReadP;
		 if (*(rxb+rdp)!=lpStaP->STATIONNO)
			{
				lpChP->RxReadP=(rdp+1)%rxbuflen;
				return 1;
			}
		 WORD Len;
		 Len=(BYTE)*(rxb+(rdp+2)%rxbuflen)*(WORD)256+(BYTE)*(rxb+(rdp+3)%rxbuflen);
		 if (Len>rxbuflen-7)// jgx Len>rxbuflen-1
		    {lpChP->RxReadP++;
			lpChP->RxReadP %=rxbuflen;
			return 1;
			}
//		 if ((Len+5)>((lpChP->RxWriteP+rxbuflen-lpChP->RxReadP)%rxbuflen))//jgx 98.8
//		        return 1;//jgx 98.8

		 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))%rxbuflen;
					FLAG->PollOver=lpStaP->ProcCount*2;           //jgx 98.8
			 		chf->rf.CommBreakNum=0;
					}
			   	else
					{
                    lpChP->RxReadP=(rdp+Len+5)%rxbuflen;//jgx 98.8
//					lpChP->RxReadP++;//jgx
//					lpChP->RxReadP %=rxbuflen;//jgx
					lpChP->ErrDataNum+=1;// jgx 98.8
					if (lpChP->ErrDataNum==400)
						{
							lpChP->CHStatus |= ChInit;
							FLAG->RANDOM0=FLAG->RANDOM1=FLAG->RANDOM2=0;
//                            PollOver[lpChP->StaNo]=0;
                            FLAG->PollOver=0;
                            return 1;
						}
					FLAG->Poll--;
					FLAG->Retry=1;
					FLAG->RepTimes++;
					if (FLAG->RepTimes>=lpStaP->RepeatTimes)
						{
							FLAG->RANDOM0=FLAG->RANDOM1=FLAG->RANDOM2=FLAG->Retry=0;
						}
					}
//			    PollOver[lpChP->StaNo]=lpStaP->ProcCount*2;
//			    PollOver[ChNo]=lpStaP->ProcCount*2;
			}
    }
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->PollCdt) return 0;
   Flag *FLAG=(Flag *)(lpChP->Reserved+80);
   if (lpStaP->DownCmdRP != lpStaP->DownCmdWP)
      {
	   switch (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0])
         {
          case DCMDSST: //对钟
			   //wrp = iTime(wrp);
			   wrp=CallSST(txb,wrp);
               break;
          case DCMDYK1: //遥控执行
               wrp=ExecYk(txb,wrp);
               break;
          case DCMDYK0: //遥控预置
          case DCMDYK2: //遥控撤消
//               wrp = msYk(wrp);
               wrp=CallYk(txb,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
		{
//            PollOver[lpChP->StaNo]++;
			FLAG->PollOver++;
//			if (PollOver[lpChP->StaNo]>lpStaP->ProcCount)// || RANDOM0[lpChP->StaNo]!=0xcc)
			if (FLAG->PollOver>lpStaP->ProcCount)// || RANDOM0[lpChP->StaNo]!=0xcc)
            	{
//					if (PollOver[lpChP->StaNo]<lpStaP->ProcCount*2)
					if (FLAG->PollOver<lpStaP->ProcCount*2)
						{
					        if (FLAG->RepTimes++>=lpStaP->RepeatTimes)
						       {
							        FLAG->RANDOM0=FLAG->RANDOM1=FLAG->RANDOM2=0;
							        FLAG->RepTimes=FLAG->Retry=0;
							        FLAG->Poll=FLAG->TIME=FLAG->PAFFLAG=FLAG->SDBB=0;

						       }
                            else
                                {
                                    FLAG->Retry=1;
                                    FLAG->Poll--;
                                }
                        }
					wrp=PollingTx(wrp,(FLAG->Poll++)%0x1f);
// jgx 98.8                    lpChP->RxReadP=lpChP->RxWriteP;
					lpChP->TxReadP=lpChP->TxWriteP;//jgx 98.8
				}
 //			else if (SSTFlag[lpChP->StaNo]==0) wrp=CallSST(txb,wrp);
        }
   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);     }

⌨️ 快捷键说明

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