rtdbm.cpp

来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C++ 代码 · 共 1,342 行 · 第 1/3 页

CPP
1,342
字号
                     BYTE v = calc.GetSymbol(stano, ord);
					 lpMsg->MsgDataLen = sizeof(DWORD);
                     *(DWORD *)lpMsg->MsgData = v;
                     lpMsg->RetFlag = TRUE;
                    }



            else lpMsg->RetFlag = FALSE;
         }
         break;
    case GETBATCHVALUE:
         {
          stano = *(WORD *)(lpMsg->MsgData);
          ord = *((WORD *)lpMsg->MsgData+1);
          WORD num = *((WORD *)lpMsg->MsgData+2);
          if (dbno==YXDB)
             {
              BYTE v;
              for (int i=0; i<num; i++)
                  {
                   v = yx.GetYxValue(stano, ord+i);
                   *((BYTE huge *)lpMsg->ptr1+i) = v;
                  }
              lpMsg->MsgDataLen = 6+sizeof(v)*num;
              lpMsg->RetFlag = TRUE;
             }
            else if (dbno==YCDB)
                    {
                     WORD v;
                     for (int i=0; i<num; i++)
                         {
                          v = yc.GetYcValue(stano, ord+i);
                          *((WORD huge *)lpMsg->ptr1+i) = v;
                         }
                     lpMsg->MsgDataLen = 6+sizeof(v)*num;
                     lpMsg->RetFlag = TRUE;
                    }
            else if (dbno==KWHDB)
                    {
                     DWORD v;
                     for (int i=0; i<num; i++)
                         {
                          v = kwh.GetKwhValue(stano, ord+i);
                          *((DWORD huge *)lpMsg->ptr1+i) = v;
                         }
                     lpMsg->MsgDataLen = 6+sizeof(v)*num;
                     lpMsg->RetFlag = TRUE;
                    }
            else lpMsg->RetFlag = FALSE;
         }
         break;
    case GETPOINT:
         {
          stano = *(WORD *)(lpMsg->MsgData);
          ord = *((WORD *)lpMsg->MsgData+1);
          BYTE pt=0;
          if (dbno==YCDB)
              pt = yc.GetYcPoint(stano, ord);
            else if (dbno==KWHDB)  pt = kwh.GetKwhPoint(stano, ord);
          lpMsg->MsgDataLen = sizeof(pt);
          *(BYTE *)lpMsg->MsgData = pt;
          lpMsg->RetFlag = TRUE;
         }
         break;
    case GETCOE:
         break;
    case GETLINECOE:
         {
          stano = *(WORD *)(lpMsg->MsgData);
          ord = *((WORD *)lpMsg->MsgData+1);
          YCLINECOE ycl;
          if (dbno==YCDB)
             {
//tzc
              DWORD  ycattr;
              ycattr = yc.GetYcAttr(stano, ord);
                    if (ycattr & YCLINEAR)
                      yc.GetYcLineCoe(stano, ord, &ycl);
                    else {ycl.y2=1;ycl.y1=0;ycl.x2=1;ycl.x1=0;}
//tzc
              lpMsg->MsgDataLen = sizeof(ycl);
              *(YCLINECOE *)lpMsg->MsgData = ycl;
              lpMsg->RetFlag = TRUE;
             }
            else lpMsg->RetFlag = FALSE;
         }
         break;
    case GETTYPE:
         {
          stano = *(WORD *)lpMsg->MsgData;
          ord = *((WORD *)lpMsg->MsgData+1);
          BYTE tp;
          if (dbno==YXDB)
              tp = yx.GetYxType(stano, ord);
            else
              tp = 0;
          lpMsg->MsgDataLen = sizeof(tp);
          *(BYTE *)lpMsg->MsgData = tp;
          lpMsg->RetFlag = TRUE;
         }
         break;
    case GETTIMER:
         {
          stano = *(WORD *)lpMsg->MsgData;
          ord = *((WORD *)lpMsg->MsgData+1);
          BYTE tp = *(BYTE *)(lpMsg->MsgData+4);
          WORD timer;
          switch (dbno)
            {
             case RTUDB:
                 // if (tp==0)
                      timer = rtu.GetEvidentTimer(stano);
				 //   else timer = 0;
                  break;
             default:
                  timer = 0;
                  break;
            }
          lpMsg->MsgDataLen = sizeof(timer);
          *(WORD *)lpMsg->MsgData = timer;
          lpMsg->RetFlag = TRUE;
		 }
         break;
    case READEVENT:
         {
          WORD hdl = *(WORD *)lpMsg->MsgData;
          if (dbno==EVENTDB)
             {
              EVENT evercd;
              if (eve.ReadAEvent(hdl, &evercd))
                 {
                  *(EVENT *)lpMsg->MsgData = evercd;
                  lpMsg->MsgDataLen = sizeof(EVENT);
                  lpMsg->RetFlag = TRUE;
                 }
                else lpMsg->RetFlag = FALSE;
             }
         }
         break;
    case READCOMMAND:
         {
//          lpMsg->RetFlag = TRUE;
//          break;
          WORD hdl = *(WORD *)lpMsg->MsgData;
          BYTE tp = *(lpMsg->MsgData+2);
          COMMAND cmdrcd;
          char cmddata[1024];
		  if (tp==RECCMDBUF)
             {
              if (cmd.ReadACmdFromRec(hdl, &cmdrcd, cmddata))
                 {
                  *(COMMAND *)lpMsg->MsgData = cmdrcd;
                  for (int i=0; i<cmdrcd.DataLen; i++)
                       *(lpMsg->MsgData+sizeof(COMMAND)+i) = cmddata[i];
                  lpMsg->MsgDataLen = sizeof(COMMAND) + cmdrcd.DataLen;
                  lpMsg->RetFlag = TRUE;
                 }
             }
            else if (tp==SENDCMDBUF)
					{
					 if (cmd.ReadACmdFromSend(hdl, &cmdrcd, cmddata))
						{
                         *(COMMAND *)lpMsg->MsgData = cmdrcd;
                         for (int i=0; i<cmdrcd.DataLen; i++)
                              *(lpMsg->MsgData+sizeof(COMMAND)+i) = cmddata[i];
                         lpMsg->MsgDataLen = sizeof(COMMAND) + cmdrcd.DataLen;
                         lpMsg->RetFlag = TRUE;
                        }
                    }
         }
         break;
    case GETREADHANDLE:
         {
          WORD hdl;
          if (dbno==EVENTDB) hdl = eve.GetReadHandle();
            else if (dbno==COMMANDDB) hdl = cmd.GetReadHandle();
            else hdl = 0xffff;
          lpMsg->MsgDataLen = sizeof(hdl);
          *(WORD *)lpMsg->MsgData = hdl;
          lpMsg->RetFlag = TRUE;
         }
         break;
    case GETBUFFER:
         {
          char huge *ptr = NULL;
          BYTE tp = *lpMsg->MsgData; 
          switch(dbno)
            {
             case EVENTDB:
                  ptr = (char huge *)eve.GetEventBuf();
                  break;
             case COMMANDDB:
                  if (tp==RECCMDBUF) ptr = (char huge *)cmd.GetRecCmdBuf();
                    else if (tp==SENDCMDBUF) ptr = (char huge *)cmd.GetSendCmdBuf();
                    else if (tp==RECCMDDATABUF) ptr = (char huge *)cmd.GetRecDataBuf();
                    else if (tp==SENDCMDDATABUF) ptr = (char huge *)cmd.GetSendDataBuf();
//tzc

                    else if (tp==RECCMDBUF) ptr = (char huge *)cmd.GetSendDataBuf();
                    else if (tp==RECCMDDATABUF) ptr = (char huge *)cmd.GetSendDataBuf();
                    else if (tp==SENDCMDBUF) ptr = (char huge *)cmd.GetSendDataBuf();
                    else if (tp==SENDCMDDATABUF) ptr = (char huge *)cmd.GetSendDataBuf();

                  break; 
            }
          lpMsg->MsgDataLen = sizeof(char huge *);
          lpMsg->ptr1 = ptr;
          lpMsg->RetFlag = TRUE;
         }
         break;        
    case GETWRITEPTR:
         {
          char tp = *(BYTE *)lpMsg->MsgData;
          WORD wp;
          switch(dbno)
            {
             case EVENTDB:
                  wp = eve.GetEventWP();
                  break;
             case COMMANDDB:
                  if (tp==RECCMDBUF) wp = cmd.GetRecCmdWP();
                    else if (tp==SENDCMDBUF) wp = cmd.GetSendCmdWP();
                    else wp = 0;
                  break; 
            }
          lpMsg->MsgDataLen = sizeof(wp);
          *(WORD *)lpMsg->MsgData = wp;
          lpMsg->RetFlag = TRUE;
         }
         break;
   }
}

void RtdbmWindow::WMSetRdbItem(RTMessage Msg)
{
 RDBMESSAGE FAR *lpMsg = (RDBMESSAGE FAR *)Msg.LParam;
 TRtuDB rtu;
 TYxDB  yx;
 TYcDB  yc;
 TKwhDB kwh;
 TEventDB eve;
 TCommandDB cmd;
 WORD msglen, dbno, stano, ord;
 
 msglen = lpMsg->MsgDataLen;
 dbno = lpMsg->DbNo;
 switch (lpMsg->MsgType)
   {
    case WRITEEVENT:
         {
          if (dbno==EVENTDB)
			  eve.WriteAEvent((EVENT *)lpMsg->MsgData);
		  if (dbno==0x200)
			  eve.InitRWPointer();
         }
         break;
    case WRITECOMMAND:
		 {
         if (dbno!=COMMANDDB) break;
		  BYTE tp = *lpMsg->MsgData;
//		  char cmddata[1024];
		  char cmddata[2048];
          COMMAND far *cmdptr = (COMMAND far *)(lpMsg->MsgData+1);
          for (int i=0; i<cmdptr->DataLen; i++)
               cmddata[i] = *(lpMsg->MsgData+1+sizeof(COMMAND)+i);
		  if (tp==RECCMDBUF)
			  cmd.WriteACmdToRec(cmdptr, cmddata);
			else if (tp==SENDCMDBUF)
					 cmd.WriteACmdToSend(cmdptr, cmddata);
         }
         break;
    case SETATTR:
         {
          stano = *(WORD *)lpMsg->MsgData;
          ord = *((WORD *)lpMsg->MsgData+1);
          DWORD attr = *((DWORD *)lpMsg->MsgData+1);
          if (dbno==YXDB)
              yx.SetYxAttr(stano, ord, attr);
			else if (dbno==YCDB) yc.SetYcAttr(stano, ord, attr);
            else if (dbno==KWHDB) kwh.SetKwhAttr(stano, ord, attr);
         }
         break;
    case SETVALUE:
         {
          stano = *(WORD *)lpMsg->MsgData;
          ord = *((WORD *)lpMsg->MsgData+1);
          DWORD val = *((DWORD *)lpMsg->MsgData+1);
          if (dbno==YXDB)
              yx.SetYxValue(stano, ord, (BYTE)val);
            else if (dbno==YCDB) yc.SetYcValue(stano, ord, (WORD)val);
            else if (dbno==KWHDB) kwh.SetKwhValue(stano, ord, val);
         }
         break;
    case SETBATCHVALUE:
         {
          int i;
          stano = *(WORD *)lpMsg->MsgData;
          ord = *((WORD *)lpMsg->MsgData+1);
          WORD num = *((WORD *)lpMsg->MsgData+2);
          if (dbno==YXDB)
             {
              for (i=0; i<num; i++)
				   yx.SetYxValue(stano, ord+i, *((BYTE huge *)lpMsg->ptr1+i));
             }
            else if (dbno==YCDB)
                    {
                     for (i=0; i<num; i++)
                          yc.SetYcValue(stano, ord+i, *((WORD huge *)lpMsg->ptr1+i));
                    }
            else if (dbno==KWHDB)
                    {
                     for (i=0; i<num; i++)
                          kwh.SetKwhValue(stano, ord+i, *((DWORD huge *)lpMsg->ptr1+i));
                    }
         }
         break;
    case SETPOINT:
         {
          stano = *(WORD *)lpMsg->MsgData;
          ord = *((WORD *)lpMsg->MsgData+1);
          BYTE pnt = *((BYTE *)lpMsg->MsgData+4);
          if (dbno==YCDB)
              yc.SetYcPoint(stano, ord, pnt);
            else if (dbno==KWHDB) kwh.SetKwhPoint(stano, ord, pnt);
         }
         break;
    case SETTIMER:
         {
          stano = *(WORD *)lpMsg->MsgData;
          WORD timer = *((WORD *)lpMsg->MsgData+1);
          if (dbno==RTUDB)
              rtu.SetEvidentTimer(stano, timer);
         }
         break;      
    default: break;
   }
}

/*********************************************************************/
//  HWND      HNet, HRealDB, HDispatching, HDBMS, HPaint, HTable, HFHKZ;
/*void init_HWND ()
{
    Addr->HNet = NULL;
    Addr->HRealDB = NULL;
    Addr->HDispatching = NULL;
    Addr->HDBMS = NULL;
    Addr->HPaint = NULL;
    Addr->HTable = NULL;
    Addr->HFHKZ = NULL;
    Addr->HPrintEvent = NULL;
    Addr->HMNP = NULL;
    Addr->HPAS = NULL;
}
*/
void RtdbmWindow::SetupWindow ()
{
    TWindow::SetupWindow ();
    HWin = HWindow;
    int     i;
    pStaticThis = this;
	//set the timer - get called every seconds
/*	lpfnCallBack[0] = MakeProcInstance ((FARPROC)DDESrvWindow::CallBack0, GetApplication ()->hInstance);
	lpfnCallBack[1] = MakeProcInstance ((FARPROC)DDESrvWindow::CallBack1, GetApplication ()->hInstance);
	lpfnCallBack[2] = MakeProcInstance ((FARPROC)DDESrvWindow::CallBack2, GetApplication ()->hInstance);
    for (i=0; i<DDENUM; i++)  StartDDE (i);*/
	CallBack = MakeProcInstance ((FARPROC)RtdbmWindow::TczCallBack, GetApplication ()->hInstance);
    StartDDEForRtdbm ();

	char msg[80];
    BOOL ret = LoadAllDBFile();
	if (!ret)   {
	   wsprintf (msg,"实时数据库装入错误!");
	   MessageBox (HWindow, msg, " ", MB_OK);
	   SendMessage (HWindow,WM_DESTROY,0,0l);
       return;
	}
//	init_HWND ();
    ShowWindow (HWindow,SW_MINIMIZE);

	if (!SetTimer (HWindow,1,4000U,NULL))
	     MessageBox (HWindow,"申请不到定时器!","",MB_OK);
}

void RtdbmWindow::GetWindowClass (WNDCLASS _FAR & AWndClass)
{
    TWindow::GetWindowClass (AWndClass);
	AWndClass.hIcon=LoadIcon (GetApplication ()->hInstance, "RTDBM");
	AWndClass.style |= CS_DBLCLKS;
}

BYTE ScadaCount=10;
BOOL ScaBoxExist=FALSE;
void RtdbmWindow::WMTimer (RTMessage msg)
{
  HWND ww;
  WORD ret;
  char buf[80];

  switch (msg.WParam)
    {
     case 1:
          ww=FindWindow ("MainWC", NULL);
          if (ww==NULL)
             {
              if ( !((ScadaCount+1)%11) )
                 {
        	      ret=WinExec ("c:\\tcz\\wincomm.exe",SW_SHOWNORMAL);
		          if (ret<32 && !ScaBoxExist)
                     {
                      switch (ret)
                      {
                      case 0:
			          sprintf (buf,"系统内存不足,不能运行通信处理系统!");
                      break;
                      case 2:
			          sprintf (buf,"不能运行通信处理系统,C:\\TCZ\WINCOMM.EXE不存在!");
                      break;
                      case 3:
					  sprintf (buf,"不能运行通信处理系统,C:\\TCZ\\路径不存在!");
                      break;
					  case 16:
					  sprintf (buf,"不能运行通信处理系统,不能运行 WINCIMM.EXE 的多个副本!");
					  break;
                      default:
			          sprintf (buf,"不能运行通信处理系统 (ret=%d)!",ret);
                      break;
                      }

                      ScaBoxExist = TRUE;
    			      MessageBox (HWindow,buf,"提示!!!",MB_OK);
                      ScadaCount=0;
                      ScaBoxExist = FALSE;
		             }
	             }
                else ScadaCount++;
             }
            else
             {
              ScadaCount=0;
              ScaBoxExist = FALSE;
             }
	      break;
	 default:
	      break;
    } 
}
/*

⌨️ 快捷键说明

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