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

📄 zfdcf5.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 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);
WORD	YcProc(BYTE,WORD,int);
WORD	YxProc(WORD,int);
WORD	KwhProc(BYTE,WORD,int);

//========================================================================================
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;
  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)
		{

   //	if ((lpStaP+lpChP->StaNo)->CurrUsedCh!=ChNo)
	  { lpChP->RxReadP=(lpChP->RxReadP+1)%rxbuflen;return 1;}


		 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;
                 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>800)
                    {
					 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;
	  }
		lpStaP->SoeNum++;lpStaP->SoeNum%=20;
	  switch (lpStaP->SoeNum)
		{
			case	0: case	8:case	20:
				wrp=YcProc(0,wrp,Station);
				break;
			case	1:case	9:
				wrp=YcProc(1,wrp,Station);
                break;
			case	2:case	10:
				wrp=YcProc(2,wrp,Station);
                break;
			case	3:case	11:
				wrp=YcProc(3,wrp,Station);
                break;
			case	4:case	12:
				wrp=YcProc(4,wrp,Station);
                break;
			case	5:case	13:
				wrp=YcProc(5,wrp,Station);
                break;
			case	6:case	14:
				wrp=YcProc(6,wrp,Station);
                break;
			case	7:case	15:
				wrp=YcProc(7,wrp,Station);
                break;

			case    16:case	18:case	19:
				wrp=YxProc(wrp,Station);
                break;
			case	17:
				wrp=KwhProc(0,wrp,Station);
				break;
            default: break;
		}

 lpChP->TxWriteP=(wrp)%txbuflen;
 return 1;
}

void ProcCtrlW(WORD rdp)
{return;
  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);


  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);     }
    else if (func<0xd9)  //批次信息
     { Add = 6;     }
    else if (func<0xdf)  //备用
     { Add = 6;     }
    else if (func<0xe0)  //RTU运行状态
     { Add = 6;     }
    else if (func<0xe3)  //遥控
     { Add = Pyk(rdp);     }
    else if (func<0xe6)  //备用
     { Add = 6;     }
    else if (func<0xe9)  //设点
     { Add = 6;     }
    else if (func<0xec)  //升/降命令
     { Add = Psj(rdp);     }
    else if (func<0xf8)  //备用
     { Add = 6;     }
    else                //遥信
	 { Add = Pyx(rdp);   }
  return(Add);
}

BYTE Pyc(WORD rdp)
{
BYTE bchdata[6];
BYTE FAR *rxb = lpChP->RecBuff;
for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i)%rxbuflen);
   if (CDT_BCH(bchdata)!=bchdata[5]) return 6;

 int ycOrd = (*(rxb+rdp)-1)*2;
 int ycValue = *(rxb+(rdp+2)%rxbuflen) + (*(rxb+(rdp+1)%rxbuflen))*256;
 SetValue(YCDB, lpChP->StaNo, ycOrd, ycValue);
 ycValue = *(rxb+(rdp+4)%rxbuflen) + (*(rxb+(rdp+3)%rxbuflen))*256;
 ycOrd++;
 SetValue(YCDB, lpChP->StaNo, ycOrd, ycValue);
 return 6;
}

BYTE Pyx(WORD rdp)
{
 BYTE FAR *rxb = lpChP->RecBuff;
 int yxbOrd = *(rxb+rdp) - 0xF8;
 int i, j;
 BYTE flag = (lpStaP+lpChP->StaNo)->RotateFlag;
 BYTE yxbv, yxtb, yxv[8];
 for (i=0; i<4; i++)

⌨️ 快捷键说明

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