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

📄 xjdcf5.cpp

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

#include "def.h"

#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"

typedef struct {
  RUNFLAG rf;
  WORD    RecWPBak;
} CHFLAG;

static HINSTANCE hinstLib=NULL;
static HINSTANCE hLib;
//---------------------------------------------------------------------------------
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
int		PROCOUNT=0;
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);
//typedef BYTE (*PROC1)(BYTE *);
//PROC1 CDT_BCH;

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);
//========================================================================================
int FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpszCmdLine)
{
  if (wHeapSize >0 ) UnlockData(0);
/*  if (!hinstLib)
     {
      hLib = LoadLibrary ("PUBPROC.DLL");
      if (hLib < (HINSTANCE)32)  return 0;
      CDT_BCH = (PROC1)GetProcAddress(hLib, "CDT_BCH");
      hinstLib = hInstance;
	 }  */
  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;

  if (PROCOUNT++>50)
  	{
	  WORD YXNO = GetRcdNum(YXDB, lpChP->StaNo);
	  WORD YXV=GetValue(YXDB,lpChP->StaNo,YXNO-1);
	  YXNO= GetRcdNum(YXDB, lpChP->StaNo+1);
	  SetValue(YXDB,lpChP->StaNo+1,YXNO-1,YXV);
      PROCOUNT=0;
    }


  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)
         {
          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)>=24)
		{
		 rdp = lpChP->RxReadP;
		 if (!(lpChP->CHStatus & SyncR))   //如果没有同步字
            {
			 if ((*(rxb+rdp)==lpChP->SyncWord[0]) && (*(rxb+(rdp+1)%rxbuflen)==lpChP->SyncWord[1]) &&
				 (*(rxb+(rdp+2)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+3)%rxbuflen)==lpChP->SyncWord[1]) &&
                 (*(rxb+(rdp+4)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+5)%rxbuflen)==lpChP->SyncWord[1]))
                {
chf->rf.CommBreakNum=0;
lpChP->CHStatus &=~CommBreakFlag;

				 lpChP->CHStatus |= SyncR;
				 lpChP->CHStatus &=~NoSyncFlag;
				 chf->rf.NoSyncNum = 0;
                 chf->rf.OnlySyncNum = 0;
                 lpChP->CHStatus &= ~(CtrlW+InforW+CharInvFlag+NoSyncFlag);
                 lpChP->RxReadP = (rdp+6)%rxbuflen;
                 break;
                }
               else
                {
                 lpChP->RxReadP = (rdp+1)%rxbuflen;
				 chf->rf.NoSyncNum++;
                 if (chf->rf.NoSyncNum>600)
                    {
                     lpChP->CHStatus |= ChInit;
					 lpChP->CHStatus |= NoSyncFlag;
					 chf->rf.NoSyncNum = 0;
                     if ((++chf->rf.CHErr)>0x180)
                        {
                         chf->rf.CHErr = 0;
                         lpChP->CHStatus |= NoSyncFlag;
						}
                    }
                 continue;
                }
            }
           else // 
            {
             if ((*(rxb+rdp)==lpChP->SyncWord[0]) && (*(rxb+(rdp+1)%rxbuflen)==lpChP->SyncWord[1]) &&
                 (*(rxb+(rdp+2)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+3)%rxbuflen)==lpChP->SyncWord[1]) &&
                 (*(rxb+(rdp+4)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+5)%rxbuflen)==lpChP->SyncWord[1]))
                {
                 // 有同步字 又收到同步字
                  lpChP->RxReadP = (rdp+6)%rxbuflen;
                  lpChP->CHStatus &= ~(CtrlW+InforW);
                  chf->rf.OnlySyncNum++;
                  if (chf->rf.OnlySyncNum>600)
                     {
                      lpChP->CHStatus |= ChInit;
                      chf->rf.OnlySyncNum = 0;
                      if ((++chf->rf.CHErr)>0x180)
                         {
                          chf->rf.CHErr = 0;
                          lpChP->CHStatus |= OnlySyncFlag;
                         }
                      }
                  break;
                }
               else if(!(lpChP->CHStatus & CtrlW))  //有同步字 没有控制字
                {
            	 lpChP->CHStatus |= CtrlW;
	             lpChP->CHStatus &= ~InforW;
                 for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i)%rxbuflen);
                 if (CDT_BCH(bchdata)==bchdata[5])
					{
                     //如果本通道是当前站正在使用的通道,则处理控制字
                     if ((lpStaP+lpChP->StaNo)->CurrUsedCh==ChNo)  
						 ProcCtrlW(rdp);
                         rdp+=5;
					}
				 else  lpChP->ErrDataNum++;
				 lpChP->RxReadP = (rdp+1)%rxbuflen;
                 break;
                }
               else //有同步字 有控制字
                {
                 for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i)%rxbuflen);
                 if (CDT_BCH(bchdata)==bchdata[5])
                    {
                     //如果本通道是当前站正在使用的通道,则处理信息字
                     if ((lpStaP+lpChP->StaNo)->CurrUsedCh==ChNo)  
                         lpChP->RxReadP = (rdp + ProcInfoW(rdp))%rxbuflen;
                       else
						 lpChP->RxReadP = (rdp+6)%rxbuflen;
					 break;
                    }
				   else if((lpStaP+lpChP->StaNo)->CurrUsedCh==ChNo)
					{
					 lpChP->ErrDataNum++;
					 for (int temp=1;temp<17;temp++)
						{
							for (i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i+temp)%rxbuflen);
							if  (CDT_BCH(bchdata)==bchdata[5]) break;
						}
					 lpChP->RxReadP = (rdp+temp)%rxbuflen;
					 if (temp==17)     lpChP->CHStatus &= ~ (SyncR+CtrlW);
					// if (temp<6) lpChP->ErrDataNum--;
					 break;
                    }
				} //end else if
            } //end else
        } // end while
  return 1;
}
int FAR PASCAL _export TxProc(HWND hWnd, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP,int Station)
{
 WORD wrp,currch;
 char 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)
      {
	   *(txb+wrp) = *(txb+(wrp+2)%txbuflen) = *(txb+(wrp+4)%txbuflen) = lpChP->SyncWord[0];
       *(txb+(wrp+1)%txbuflen) = *(txb+(wrp+3)%txbuflen) = *(txb+(wrp+5)%txbuflen) = lpChP->SyncWord[1];
       wrp = (wrp+6)%txbuflen;
       switch (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0])
         {
          case DCMDSST: //对钟
               wrp = iTime(wrp);
               break;
          case DCMDYK0: //遥控预置
          case DCMDYK1: //遥控执行
          case DCMDYK2: //遥控撤消
               wrp = msYk(wrp);
               break;
          case DCMDSJ0: //升降选择
          case DCMDSJ1: //升降执行
          case DCMDSJ2: //升降撤消
               wrp = msSj(wrp);
               break;
          case DCMDGB:  //广播命令
               wrp = msGb(wrp); 
               break;
//          case DCMDFG:
//               break;
         }
       lpStaP->DownCmdRP = (lpStaP->DownCmdRP+1)&3;
	  }
/*
 {
  *(txb+(wrp+0)%txbuflen)=0xeb;  *(txb+(wrp+1)%txbuflen)=0x90;  *(txb+(wrp+2)%txbuflen)=0xeb;  *(txb+(wrp+3)%txbuflen)=0x90;  *(txb+(wrp+4)%txbuflen)=0xeb;  *(txb+(wrp+5)%txbuflen)=0x90;
  *(txb+(wrp+6)%txbuflen)=0x70;  *(txb+(wrp+7)%txbuflen)=0x26;  *(txb+(wrp+8)%txbuflen)=0x6;  *(txb+(wrp+9)%txbuflen)=0x1;  *(txb+(wrp+10)%txbuflen)=0x1;  *(txb+(wrp+11)%txbuflen)=0xb4;
  *(txb+(wrp+12)%txbuflen)=0x80;  *(txb+(wrp+13)%txbuflen)=0x33;  *(txb+(wrp+14)%txbuflen)=0x11;  *(txb+(wrp+15)%txbuflen)=0x53;  *(txb+(wrp+16)%txbuflen)=0x9;  *(txb+(wrp+17)%txbuflen)=0x3e;
  *(txb+(wrp+18)%txbuflen)=0x90;  *(txb+(wrp+19)%txbuflen)=0x9;  *(txb+(wrp+20)%txbuflen)=0x43;  *(txb+(wrp+21)%txbuflen)=0xff;  *(txb+(wrp+22)%txbuflen)=0x11;  *(txb+(wrp+23)%txbuflen)=0x67;
wrp+=24;
 }
*/
 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);
  //如果本通道不是当前站正在使用的通道,则退出
//  if ((lpStaP+lpChP->StaNo)->CurrUsedCh!=ChNo) return; 

  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;
  
  WORD yxno = GetRcdNum(YXDB, lpChP->StaNo);
  WORD yxno1 = GetRcdNum(YXDB, lpChP->StaNo+1);
  SetValue(YXDB,lpChP->StaNo+1,yxno1,(GetValue(YXDB,lpChP->StaNo,yxno-1)));


  if (func==0)     //时间
     { Add = 6;     }
    else if (func<0x80)  //遥测
     { Add = Pyc(rdp);      }
    else if (func<0xa0)  //SOE
     { Add = Psoe(rdp);     }
    else if (func<0xa1)  //频率
     { Add = 6;     }
    else if (func<0xa3)  //水位
     { Add = 6;     }
    else if (func<0xd0)  //电度
     { Add = Pkwh(rdp);     }

⌨️ 快捷键说明

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