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 + -
显示快捷键?