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

📄 cdt.cpp

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

#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"
typedef struct {
  RUNFLAG rf;
  WORD    RecWPBak;
} CHFLAG;
//---------------------------------------------------------------------------------
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
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);

WORD ProcCtrlW(WORD);
BYTE ProcInfoW(WORD);
BYTE Pyc(WORD);
BYTE Pyx(WORD);
BYTE Pkwh(WORD);
BYTE Pyk(WORD);
BYTE Psj(WORD);
BYTE Psoe(WORD);
WORD xbfxstart(WORD);
WORD xbfxcalldata(WORD);
WORD iTime(WORD);
WORD msYk(WORD);
WORD msSj(WORD);
WORD msGb(WORD);
WORD msFg(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);
         }
     }
  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;// jgx 98.8
				 lpChP->CHStatus &=~NoSyncFlag;
				 chf->rf.NoSyncNum = 0;
                 chf->rf.OnlySyncNum = 0;
                 lpChP->CHStatus &= ~(CtrlW+InforW);
                 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 (!(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]))
                {
                 // 有同步字 又收到同步字
                 lpChP->CHStatus &= ~(CtrlW+InforW);

// jgx 98.8                 lpChP->RxReadP = (rdp+6)%rxbuflen;
				 lpChP->CHStatus &=~SyncR;// jgx 98.8

                 chf->rf.OnlySyncNum++;
				  if (chf->rf.OnlySyncNum>800)
                     {
                      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);
                         lpChP->RxReadP = (rdp + ProcCtrlW(rdp))%rxbuflen;
					}
				 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                          //rdp=信息字启始位置
                         lpChP->RxReadP = (rdp+6)%rxbuflen;
                     break;
                    }
                   else
                    {
					 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--;
//                     lpChP->RxReadP = (rdp+6)%rxbuflen;
                     break;
                    }
                } //end else if 
            } //end else
        } // end while
  return 1;
}

int FAR PASCAL _export TxProc(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 29:  //xbfx
               if (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1]==1)
                  {
                    wrp = xbfxstart(wrp);
                    break;
                  }
               if (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1]==2)
                  {
                    wrp = xbfxcalldata(wrp);
                    break;
                  }
               break;
          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:  //复归命令
               wrp = msFg(wrp);
               break;
         }
       lpStaP->DownCmdRP = (lpStaP->DownCmdRP+1)&3;
      }

   lpChP->TxWriteP = wrp%txbuflen;

   return 1;
}

WORD ProcCtrlW(WORD rdp)
{
  STATIONPARAM FAR *lpStaPf;
  lpStaPf = lpStaP+lpChP->StaNo;
  BYTE FAR *rxb = lpChP->RecBuff;

  BYTE StaNo = *(rxb+(rdp+3)%rxbuflen);
  WORD temp=0;
  switch (*(rxb+(rdp+1)%rxbuflen))
    {
     case 0x7a:
          COMMAND cmdrcd;
		  BYTE rp = (lpStaPf->DownCmdRP-1) & 3;
		  WORD rtuno = lpStaPf->DownCmd[rp].Cmd[1]+lpStaPf->DownCmd[rp].Cmd[2]*256;
		  if ((lpStaPf->DownCmd[rp].Cmd[0]==DCMDYK0)&& (StaNo == rtuno))
             {
              cmdrcd.CmdContent[0] = 0x44;  //遥控返校
              for (int i=1; i<6; i++)
				   cmdrcd.CmdContent[i] = lpStaPf->DownCmd[rp].Cmd[i];
              cmdrcd.CmdContent[6] = 0x55;  //遥控返校错:0x55  遥控返校正确:0xAA
              cmdrcd.SubCmdType = TCZYKCMD;
              cmdrcd.DataLen = 0;
              cmdrcd.DataPt = 0;
              WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
			  lpStaPf->DownCmd[rp].Cmd[0]=0;
             }
          temp=6;
          break;
     case 0xe9:
		  if ((lpChP->RxWriteP + rxbuflen - lpChP->RxReadP)%rxbuflen >=128)
               {
               COMMAND cmdrcd;
               cmdrcd.SubCmdType = 29;
               cmdrcd.DataLen = 0;
               cmdrcd.DataPt = 0;
               for (int i=0;i<128;i++)
                   cmdrcd.XBFXDATA[i]=*(rxb+i%rxbuflen);
               WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
			   lpStaPf->DownCmd[rp].Cmd[0]=0;
               temp=128;
               break;
               }
          else break;
     default:
			 temp=6;
             break;
    }
	return   temp;  
// jgx 98.8 return rdp;
}

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)  //升降

⌨️ 快捷键说明

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