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

📄 wdp.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     (lpStaP+lpChP->StaNo)->DownCmd[rp].Cmd[0]=0;
	}

 return 18;
}

BYTE Psj(WORD rdp)
{
 if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen <18 ) return 0;

 COMMAND cmdrcd;

 BYTE FAR *rxb = lpChP->RecBuff;
 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]==DCMDSJ0) && (lpChP->StaNo == rtuno))
    {
     cmdrcd.CmdContent[0] = 0x44;  //遥调返校
     cmdrcd.CmdContent[1] = lpStaP->DownCmd[rp].Cmd[1];
     cmdrcd.CmdContent[2] = lpStaP->DownCmd[rp].Cmd[2];
     cmdrcd.CmdContent[3] = *(rxb+(rdp+3)%rxbuflen);
     cmdrcd.CmdContent[4] = *(rxb+(rdp+4)%rxbuflen);
     cmdrcd.CmdContent[5] = *(rxb+(rdp+1)%rxbuflen);
     cmdrcd.CmdContent[6] = 0xAA;  //遥调返校错:0x55  遥调返校正确:0xAA
     cmdrcd.SubCmdType = TCZYTCMD;
     cmdrcd.DataLen = 0;
     cmdrcd.DataPt = 0;
     WriteACommand(COMMANDDB, SENDCMDBUF, &cmdrcd, NULL);
     lpStaP->DownCmd[rp].Cmd[0]=0;
    }

 return 18;
}

BYTE Psoe(WORD rdp)
{
 if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen <12 ) return 0;

 char bchdata[6];
 struct dosdate_t d;
 struct dostime_t t;
 int temp=0;
 BYTE FAR *rxb = lpChP->RecBuff;
 BYTE yxord, ret;
 DWORD yxattr;
 if ((*(rxb+rdp%rxbuflen)>=0x80) && (*(rxb+rdp%rxbuflen)<0x90)
     && (*(rxb+(rdp+6)%rxbuflen)>=0x90) && (*(rxb+(rdp+6)%rxbuflen)<0xa0))
    {
     for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i+6)%rxbuflen);
     if (CDT_BCH(bchdata)==bchdata[5])
        {
		 if (*(rxb+(rdp+9)%rxbuflen)==0xff)
			 yxord = *(rxb+(rdp+10)%rxbuflen);
		 else yxord = *(rxb+(rdp+10)%rxbuflen)/16*10+*(rxb+(rdp+10)%rxbuflen)%16;
		 yxattr = GetAttr(YXDB, lpChP->StaNo+temp, yxord);
		 if ((yxattr&YXCREATESOE) && (yxattr&RECRTUSOE) )
			{
             EVENT evercd;
			 BYTE yxtype = GetType(YXDB, lpChP->StaNo+temp, yxord);
			 if (yxtype&YXSWITCH) evercd.EventType = KGEVENT;
             else if (yxtype&YXLINKER) evercd.EventType = DZEVENT;
			 else if (yxtype&YXPROTECT) evercd.EventType = BHEVENT;
			 evercd.EventType =1;
			 evercd.Station = lpChP->StaNo;
             evercd.Order = yxord;
			 evercd.Status = *(rxb+(rdp+1)%rxbuflen);
			 evercd.Hour=*(rxb+(rdp+2)%rxbuflen)/16*10+*(rxb+(rdp+2)%rxbuflen)%16;
			 evercd.Min=*(rxb+(rdp+3)%rxbuflen)/16*10+*(rxb+(rdp+3)%rxbuflen)%16;
			 evercd.Sec=*(rxb+(rdp+4)%rxbuflen)/16*10+*(rxb+(rdp+4)%rxbuflen)%16;
			 evercd.Ms=*(rxb+(rdp+7)%rxbuflen)%16*100+*(rxb+(rdp+8)%rxbuflen)/16*10+*(rxb+(rdp+8)%rxbuflen)%16;;
			 if (yxattr&YXXOR) evercd.Status ^= 0xff;
             evercd.EventAttr &= ~SGFLAG;
             if (GetTimerValue(RTUDB, evercd.Station))
                {
				 if (evercd.Status==0x33)
                    {
                     if ((yxtype==YXSWITCH) || (yxtype==YXLINKER))
						 evercd.EventType|=0x80;//evercd.EventAttr |= SGFLAG;
                    }
				   else if (yxtype==YXPROTECT) evercd.EventType|=0x80;//evercd.EventAttr |= SGFLAG;
                }
			  _dos_getdate(&d);
              _dos_gettime(&t);
//              evercd.Year = d.year;
//              evercd.Mon = d.month;
//              evercd.Day = d.day;
/*
              evercd.Hour = t.hour;
              evercd.Min = t.minute;
              evercd.Sec = t.second;
			  evercd.Ms = 0;
*/
			  evercd.data[0]=evercd.Status;

			  if (
				   ((lpStaP+lpChP->StaNo)->Soe[0].ORDER!=yxord)||
				   ((lpStaP+lpChP->StaNo)->Soe[0].TIME!=evercd.Hour)||
				   ((lpStaP+lpChP->StaNo)->Soe[0].MINUTE!=evercd.Min)||
				   ((lpStaP+lpChP->StaNo)->Soe[0].SECOND!=evercd.Sec)||
				   ((lpStaP+lpChP->StaNo)->Soe[0].MSH!=evercd.Ms/100)||
				   ((lpStaP+lpChP->StaNo)->Soe[0].MSL!=evercd.Ms%100)||
				   ((lpStaP+lpChP->StaNo)->Soe[0].STATUS!=evercd.Status)
				  )


				{
				   (lpStaP+lpChP->StaNo)->Soe[0].ORDER=yxord;
				   (lpStaP+lpChP->StaNo)->Soe[0].TIME=evercd.Hour;
				   (lpStaP+lpChP->StaNo)->Soe[0].MINUTE=evercd.Min;
				   (lpStaP+lpChP->StaNo)->Soe[0].SECOND=evercd.Sec;
				   (lpStaP+lpChP->StaNo)->Soe[0].MSH=evercd.Ms/100;
				   (lpStaP+lpChP->StaNo)->Soe[0].MSL=evercd.Ms%100;
				   (lpStaP+lpChP->StaNo)->Soe[0].STATUS=evercd.Status;
		
					 WriteAEvent(EVENTDB, &evercd);
				}
            }
         ret=12;
        }
       else ret=6;
    }
   else ret=6;
 return ret;
}


//-----------------------------------------------------------------------------
WORD iTime(WORD wrp)
{
 struct time Time;
 BYTE bchdata[6]={0x70, 0xd9, 1, 1, 0, 0};
 BYTE FAR *txb = lpChP->SendBuff;

 bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
 bchdata[5] = CDT_BCH(bchdata);
 for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 gettime (&Time);
 bchdata[0]=(Time.ti_hour/10*16)+Time.ti_hour%10;
 bchdata[1]=(Time.ti_min/10*16)+Time.ti_min%10;
 bchdata[2]=(Time.ti_sec/10*16)+Time.ti_sec%10;
 bchdata[3]=((Time.ti_hund*10)/256/10*16)+(Time.ti_hund*10)/256%10;
 bchdata[4]=((Time.ti_hund*10)%256/10*16+Time.ti_hund*10)%256%10;
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 return wrp;
}

WORD msYk(WORD wrp)
{
 BYTE bchdata[6]={0x70, 0x61, 3, 1, 0, 0};
 BYTE FAR *txb = lpChP->SendBuff;

 BYTE yktype = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0];
 if (yktype==DCMDYK0) bchdata[1] = 0x61;
   else if (yktype==DCMDYK1) bchdata[1] = 0xc2;
   else bchdata[1] = 0xb3;
 bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1]+1;	//tzc IN ZUOYUN because stationo must plus 1
 bchdata[5] = CDT_BCH(bchdata);
 for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xe0;
 bchdata[1]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
 bchdata[2]=0;
 bchdata[4]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
 bchdata[3]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[4];
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xe1;
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xe2;
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
/*
 EVENT evercd;
 struct date Date;
 struct time Time;

 evercd.EventType = YKEVENT;
 evercd.EventAttr = 0;
 if (yktype==DCMDYK0) evercd.EventAttr |= YKSET;
   else if (yktype==DCMDYK1) evercd.EventAttr |= YKEXEC;
   else evercd.EventAttr |= YKERASE;
 evercd.Station = (WORD)lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
 evercd.Order = (WORD)lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
 evercd.Status = (WORD)lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
 getdate (&Date);
 evercd.Year = Date.da_year;
 evercd.Mon = Date.da_mon;
 evercd.Day = Date.da_day;
 gettime (&Time);
 evercd.Hour = Time.ti_hour;
 evercd.Min = Time.ti_min;
 evercd.Sec = Time.ti_sec;
 evercd.Ms = Time.ti_hund*10;
 WriteAEvent(EVENTDB, &evercd);
*/
 return wrp;
}

WORD msSj(WORD wrp)
{
 BYTE bchdata[6]={0x70, 0x61, 3, 1, 0, 0};
 BYTE FAR *txb = lpChP->SendBuff;

 BYTE yktype = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0];
 if (yktype==DCMDSJ0) bchdata[1] = 0x61;
   else if (yktype==DCMDSJ1) bchdata[1] = 0xc2;
   else bchdata[1] = 0xb3;
 bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
 bchdata[5] = CDT_BCH(bchdata);
 for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xe9;
 if (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5]==0xcc) bchdata[1]=0xaa;
   else if (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5]==0x33) bchdata[1]=0x55;
   else bchdata[1]=0xff;
 bchdata[2]=0;
 bchdata[3]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
 bchdata[4]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[4];
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xea;
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xeb;
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 return wrp;
}

WORD msGb(WORD wrp)
{
 BYTE bchdata[6]={0x70, 0xb, 0, 1, 0, 0};
 BYTE FAR *txb = lpChP->SendBuff;

 bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
 bchdata[5] = CDT_BCH(bchdata);
 for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 return wrp;
}

WORD TxWdp(WORD wrp,WORD StationNo)
{
WORD i,Len=0;
//Len+=WdpSendSoe(wrp,StationNo);
if (Task[StationNo]%5==0)
   Len+=WdpSendYx(wrp,StationNo);
else if (Task[StationNo]%20==0)
   Len+=WdpSendKwh(wrp,StationNo);
else
   Len+=WdpSendYc(wrp,StationNo);
return (wrp+Len);
}
WORD WdpSendYx(WORD wrp,WORD StationNo)
{
BYTE FAR *txb = lpChP->SendBuff;
BYTE TotalStationNum=GetRcdNum(RTUDB, 0);
WORD len,i,YxNum,ii,RETURN=0;
StationTemp[StationNo] %= TotalStationNum-1;
if (StationTemp[StationNo]==TotalStationNum-2) Task[StationNo]++;
if (StationTemp[StationNo]!=StationNo)
    {
    *(txb+(wrp+0)%txbuflen)=0xEB;
    *(txb+(wrp+1)%txbuflen)=0x08;
    *(txb+(wrp+2)%txbuflen)=0xF0;
    *(txb+(wrp+3)%txbuflen)=StationTemp[StationNo];
    YxNum=GetRcdNum(YXDB,StationTemp[StationNo]);
    YxNum=(YxNum+7)/8;
    *(txb+(wrp+4)%txbuflen)=(BYTE)YxNum;
    *(txb+(wrp+5)%txbuflen)=CallLPC(txb,wrp,5,txbuflen);
    for (i=0;i<YxNum;i++)
        {
            BYTE Yxv=0;
            for (ii=0;ii<8;ii++)
                {
                    WORD YXV=GetValue(YXDB,StationTemp[StationNo],i*8+ii);
                    Yxv>>=1;
                    if (YXV&1) Yxv|=0x80;
                }
            *(txb+(wrp+6+i)%txbuflen)=Yxv;
        }
    *(txb+(wrp+6+YxNum)%txbuflen)=CallLPC(txb,wrp+6,YxNum,txbuflen);
    RETURN=5+YxNum+2;
    }
/*
if (StationTemp[StationNo]==TotalStationNum-2)
   {
    *(txb+(wrp+RETURN+0)%txbuflen)=0xEB;
    *(txb+(wrp+RETURN+1)%txbuflen)=0x4F;
    *(txb+(wrp+RETURN+2)%txbuflen)=0xF0;
    *(txb+(wrp+RETURN+3)%txbuflen)=0;
    *(txb+(wrp+RETURN+4)%txbuflen)=0;
    *(txb+(wrp+RETURN+5)%txbuflen)=CallLPC(txb,wrp+RETURN,5,txbuflen);
    StationTemp[StationNo]=-1;
    RETURN+=6;
   }
*/
StationTemp[StationNo]++;
return (RETURN);
}
WORD WdpSendYc(WORD wrp,WORD StationNo)
{
BYTE FAR *txb = lpChP->SendBuff;
WORD TotalStationNum=GetRcdNum(RTUDB, 0);
WORD YcNum,i,RETURN=0;
StationTemp[StationNo] %= TotalStationNum-1;
if (StationTemp[StationNo]==TotalStationNum-2) Task[StationNo]++;
if (StationTemp[StationNo]!=StationNo)
   {
    *(txb+(wrp+0)%txbuflen)=0xEB;
    *(txb+(wrp+1)%txbuflen)=0x09;
    *(txb+(wrp+2)%txbuflen)=0xF0;
    *(txb+(wrp+3)%txbuflen)=StationTemp[StationNo];
    YcNum=GetRcdNum(YCDB,StationTemp[StationNo]);
    if (YcNum>248) YcNum=248;
    *(txb+(wrp+4)%txbuflen)=(BYTE)YcNum;
    *(txb+(wrp+5)%txbuflen)=CallLPC(txb,wrp,5,txbuflen);
    for (i=0;i<YcNum;i++)
        {
            WORD Value=GetValue(YCDB,StationTemp[StationNo],i);
//            Value=CalBCD(Value);
            *(txb+(wrp+6+i*2)%txbuflen)=LOBYTE(Value);
            *(txb+(wrp+7+i*2)%txbuflen)=HIBYTE(Value);
        }
    *(txb+(wrp+6+YcNum*2)%txbuflen)=CallLPC(txb,wrp+6,YcNum*2,txbuflen);
    RETURN=5+YcNum*2+2;
    }
/*
if (StationTemp[StationNo]==TotalStationNum-2)
   {
    *(txb+(wrp+RETURN+0)%txbuflen)=0xEB;
    *(txb+(wrp+RETURN+1)%txbuflen)=0x4F;
    *(txb+(wrp+RETURN+2)%txbuflen)=0xF0;
    *(txb+(wrp+RETURN+3)%txbuflen)=0;
    *(txb+(wrp+RETURN+4)%txbuflen)=0;
    *(txb+(wrp+RETURN+5)%txbuflen)=CallLPC(txb,wrp+RETURN,5,txbuflen);
    StationTemp[StationNo]=-1;
    RETURN+=6;
   }
*/
StationTemp[StationNo]++;
return (RETURN);
}

WORD WdpSendKwh(WORD wrp,WORD StationNo)
{
BYTE FAR *txb = lpChP->SendBuff;
WORD TotalStationNum=GetRcdNum(RTUDB, 0);
WORD KwhNum,i,RETURN=0;
StationTemp[StationNo] %= TotalStationNum-1;
if (StationTemp[StationNo]==TotalStationNum-2) Task[StationNo]++;
if (StationTemp[StationNo]!=StationNo)
   {
    *(txb+(wrp+0)%txbuflen)=0xEB;
    *(txb+(wrp+1)%txbuflen)=0x0A;
    *(txb+(wrp+2)%txbuflen)=0xF0;
    *(txb+(wrp+3)%txbuflen)=StationTemp[StationNo];
    KwhNum=GetRcdNum(KWHDB,StationTemp[StationNo]);
    *(txb+(wrp+4)%txbuflen)=(BYTE)KwhNum;
    *(txb+(wrp+5)%txbuflen)=CallLPC(txb,wrp,5,txbuflen);
    for (i=0;i<KwhNum;i++)
        {
            DWORD Value=GetValue(KWHDB,StationTemp[StationNo],i);
            *(txb+(wrp+6+i*4)%txbuflen)=LOBYTE((WORD)Value&0xffff);
            *(txb+(wrp+7+i*4)%txbuflen)=HIBYTE((WORD)Value&0xffff);
            *(txb+(wrp+8+i*4)%txbuflen)=LOBYTE((WORD)Value/(DWORD)65536);
            *(txb+(wrp+9+i*4)%txbuflen)=HIBYTE((WORD)Value/(DWORD)65536);
        }
    *(txb+(wrp+6+KwhNum*4)%txbuflen)=CallLPC(txb,wrp+6,KwhNum*4,txbuflen);
    RETURN=5+KwhNum*4+2;
    }
/*
if (StationTemp[StationNo]==TotalStationNum-2)
   {
    *(txb+(wrp+RETURN+0)%txbuflen)=0xEB;
    *(txb+(wrp+RETURN+1)%txbuflen)=0x4F;
    *(txb+(wrp+RETURN+2)%txbuflen)=0xF0;
    *(txb+(wrp+RETURN+3)%txbuflen)=0;
    *(txb+(wrp+RETURN+4)%txbuflen)=0;
    *(txb+(wrp+RETURN+5)%txbuflen)=CallLPC(txb,wrp+RETURN,5,txbuflen);
    StationTemp[StationNo]=-1;
    RETURN+=6;
   }
*/
StationTemp[StationNo]++;
return (RETURN);
}
/*
WORD WdpSendSoe(WORD wrp,WORD StationNo)
{
BYTE FAR *txb = lpChP->SendBuff;
WORD  RETURN=0;
if (WdpEventHandel[StationNo]==0xffff || WdpEventHandel[StationNo]==0x100) return 0;
EVENT *eve;
        if (ReadAEvent(EVENTDB,WdpEventHandel[StationNo],eve))
           {
                *(txb+(wrp+0)%txbuflen)=0xEB;
                *(txb+(wrp+1)%txbuflen)=0x0B;
                *(txb+(wrp+2)%txbuflen)=0xF0;
           RETURN=0;
           }
return (RETURN);
}
*/
BYTE CallLPC(BYTE FAR *xb,WORD rp,WORD Len,WORD Mode)
{
BYTE result=0;
	for (int i=0;i<Len;i++)
		{
			 result^=*(xb+(rp+i)%Mode);
        }
	return ~result;
}
WORD CalBCD(WORD Value)
{
WORD Temp;
BYTE a1,a2,a3,a4;
Temp=Value&0x3fff;
a1=Temp/1000;
a2=Temp%1000/100;
a3=Temp%100/10;
a4=Temp%10;
Temp=(WORD)a1*16*256+(WORD)a2*256+(WORD)a3*16+a4;
if (Value&0x8000) Temp|=0x8000;
return Temp;
}

⌨️ 快捷键说明

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