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

📄 zfsc1801.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			  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 date Date;
 struct time Time;
 BYTE bchdata[6]={0x71, 0x7a, 2, 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;

 getdate (&Date);
 gettime (&Time);

 bchdata[0]=0xee;
 bchdata[1]=50;
 bchdata[2]=0;
 bchdata[3]=Time.ti_sec;
 bchdata[4]=Time.ti_min;
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 bchdata[0]=0xef;
 bchdata[1]=Time.ti_hour;
 bchdata[2]=Date.da_day;
 bchdata[3]=Date.da_mon;
 bchdata[4]=Date.da_year%256;
 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]={0x71, 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];
 bchdata[5] = CDT_BCH(bchdata);
 for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;

 if (yktype==DCMDYK0)
    {
     bchdata[0] = 0xe0;
     bchdata[1]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
    }
   else if (yktype==DCMDYK1) { bchdata[0] = 0xe2;  bchdata[1] = 0xaa; }
   else                      { bchdata[0] = 0xe3;  bchdata[1] = 0x55; }
 bchdata[2]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
 bchdata[3]=bchdata[1];
 bchdata[4]=bchdata[2];
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 //tzc
 for (i=0; i<6; i++) lpChP->yktemp[i]=bchdata[i];
 //tzc
 return wrp;
}

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

 BYTE sjtype = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0];
 if (sjtype==DCMDSJ0) bchdata[1] = 0xf4;
   else if (sjtype==DCMDSJ1) bchdata[1] = 0x85;
   else bchdata[1] = 0x26;
 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;

 if (sjtype==DCMDSJ0)
    {
     bchdata[0] = 0xe4;
     bchdata[1]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
    }
   else if (sjtype==DCMDSJ1) { bchdata[0] = 0xe6;  bchdata[1] = 0xaa; }
   else                      { bchdata[0] = 0xe7;  bchdata[1] = 0x55; }
 bchdata[2]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
 bchdata[3]=bchdata[1];
 bchdata[4]=bchdata[2];
 bchdata[5] = CDT_BCH(bchdata);
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
 wrp = (wrp+6)%txbuflen;
 //tzc
 for (i=0; i<6; i++) lpChP->yktemp[i]=bchdata[i];
 //tzc

 return wrp;
}

WORD msGb(WORD wrp)
{
 BYTE bchdata[6]={0x21, 0x9e, 0, 1, 0xff, 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 msFg(WORD wrp)
{
 BYTE bchdata[6]={0x31, 0x3d, 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;
}

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 PollRecProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
    lpStaP->RTUSTATUS=*(rxb+(rdp+4)%rxbuflen);
	FLAG->Retry=0;
	FLAG->RANDOM1=*(rxb+(rdp+1)%rxbuflen)&0x3f;
return (Len+4);
}
//转发配置
WORD ZfProcRRC(BYTE FAR *txb,WORD wrp)
{
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
		FLAG->RANDOM2=0;
		*(txb+wrp)=lpStaP->STATIONNO;
		*(txb+(wrp+1)%txbuflen)=RRC|0x40;
		*(txb+(wrp+2)%txbuflen)=0;
		*(txb+(wrp+3)%txbuflen)=18;
		*(txb+(wrp+4)%txbuflen)=0;
		BYTE YcNum=GetRcdNum(YCDB,lpChP->StaNo);
		BYTE KwhNum=GetRcdNum(KWHDB,lpChP->StaNo);
		BYTE YxNum=GetRcdNum(YXDB,lpChP->StaNo);
		YxNum=(YxNum+23)/24;
		KwhNum=(KwhNum+7)/8;
		YcNum=(YcNum+11)/12;
//		lpStaP->YXB[0]=0;
//		lpStaP->YCB[0]=YxNum;
//		lpStaP->KWHB[0]=YxNum+KwhNum;
		YxNum=lpStaP->KWHB[0]-lpStaP->YXB[0];
		KwhNum=lpStaP->YCB[0]-lpStaP->KWHB[0];
		YcNum=16-lpStaP->KWHB[0];
		int i;
		for (i=0;i<YxNum;i++)
			{
				*(txb+(wrp+5+i)%txbuflen)=0x11;
			}
		for (i=0;i<KwhNum;i++)
			{
				*(txb+(wrp+5+i+YxNum)%txbuflen)=0x3b;
			}
		for (i=0;i<YcNum;i++)
			{
				*(txb+(wrp+5+i+KwhNum+YxNum)%txbuflen)=0x32;
			}
		*(txb+(wrp+21)%txbuflen)=CallLPC(txb,wrp,22,txbuflen);
		wrp+=23;
        return wrp;
}
//转发全数据
WORD ZfProcDRF(BYTE FAR *txb,WORD wrp)
{
		BYTE LEN,len,i;
		*(txb+wrp)=lpStaP->STATIONNO;
		*(txb+(wrp+1)%txbuflen)=DRF|0x40;
		*(txb+(wrp+2)%txbuflen)=0;
		len=GetRcdNum(YXDB,lpChP->StaNo);
		len=(len+5)/6;
		for (i=0;i<len;i++)
			{
            	BYTE yxv,YXV=0;
				for (int j=0;j<6;j++)
					{
						yxv=GetValue(YXDB,lpChP->StaNo,i*6+j);
                        YXV<<=1;
						if (yxv&1) YXV |=1;
					}
				YXV |=0x80;
				*(txb+(wrp+5+i)%txbuflen)=YXV;
			}
		LEN=GetRcdNum(YCDB,lpChP->StaNo)&0xff;
		*(txb+(wrp+4)%txbuflen)=0;
		for (i=0;i<LEN;i++)
			{
				WORD YcValue=GetValue(YCDB,lpChP->StaNo,i)&0xfff;
				if (YcValue&0x8000)
                	{
						YcValue &=0x7ff;
						int ycvalue= YcValue*(-1);
						YcValue=ycvalue;
						YcValue&=0x7ff;
					}
				else YcValue |=0x800;
				YcValue=YcValue&0xfff|0x4000;
				*(txb+(wrp+5+i*2+len)%txbuflen)=HIBYTE (YcValue);
				*(txb+(wrp+6+i*2+len)%txbuflen)=LOBYTE (YcValue);
			}
		*(txb+(wrp+2)%txbuflen)=HIBYTE (LEN*2+len+2);
		*(txb+(wrp+3)%txbuflen)=LOBYTE (LEN*2+len+2);

		*(txb+(wrp+LEN*2+len+5)%txbuflen)=0;
		*(txb+(wrp+LEN*2+len+6)%txbuflen)=CallLPC(txb,wrp,LEN*2+len+5,txbuflen);
	wrp+=LEN*2+len+7;
    return wrp;
}
//转发异常变化数据
//暂时不包括YX
WORD ZfProcXRF(BYTE FAR *txb,WORD wrp)
{
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
	BYTE Item,LEN,i,temp,LPC;
	WORD YcValue,YcNum,YxNum;
	Item=(FLAG->RANDOM2++)%6;
	YcNum=GetRcdNum(YCDB,lpChP->StaNo);
	*(txb+(wrp+4)%txbuflen)=0;
	DWORD yxa = GetAttr(YXDB,0,0);
//    if (yxa&YXCHANGE)
//	*(txb+(wrp+4)%txbuflen)=0x1c;
	*(txb+wrp)=lpStaP->STATIONNO;
	*(txb+(wrp+1)%txbuflen)=XRF|0x40;
	*(txb+(wrp+2)%txbuflen)=0;
//	*(txb+(wrp+3)%txbuflen)=12*3+1;
	for (i=0;i<12;i++)
		{
			if (Item*12+i>YcNum) break;
			YcValue=GetValue(YCDB,lpChP->StaNo,Item*12+i);
				if (YcValue&0x8000)
					{
						YcValue &=0x7ff;
						int ycvalue= YcValue*(-1);
						YcValue=ycvalue;
						YcValue &=0x7ff;
					}
				else YcValue |=0x800;

            YcValue=YcValue&0xfff|0x4000;
			temp=(Item+lpStaP->YCB[0])*16;
			temp+=i&0xf;
			*(txb+(wrp+5+i*3)%txbuflen)=temp;
			*(txb+(wrp+6+i*3)%txbuflen)=HIBYTE (YcValue);
			*(txb+(wrp+7+i*3)%txbuflen)=LOBYTE (YcValue);
		}

	*(txb+(wrp+3)%txbuflen)=i*3+1;
	*(txb+(wrp+5+i*3)%txbuflen)=CallLPC(txb,wrp,5+i*3,txbuflen);
	wrp+=i*3+6;
    return wrp;
}
//无效命令回答
WORD ZfProcNAK(BYTE Command,BYTE FAR *txb,WORD wrp)
{
	*(txb+wrp)=lpStaP->STATIONNO;
	*(txb+(wrp+1)%txbuflen)=NAK|0x40;
	*(txb+(wrp+2)%txbuflen)=0;
	*(txb+(wrp+3)%txbuflen)=3;
	*(txb+(wrp+4)%txbuflen)=0;
	*(txb+(wrp+5)%txbuflen)=Command;
	*(txb+(wrp+6)%txbuflen)=0xff;
	*(txb+(wrp+7)%txbuflen)=CallLPC(txb,wrp,7,txbuflen);
	wrp+=8;
    return wrp;
}


//转发电度
WORD ZfProcPAR(BYTE FAR *txb,WORD wrp)
{
	WORD 	KwhNum,i,Value;
	KwhNum=GetRcdNum(KWHDB,lpChP->StaNo);
	*(txb+wrp)=lpStaP->STATIONNO;
	*(txb+(wrp+1)%txbuflen)=PAR|0x40;
	*(txb+(wrp+2)%txbuflen)=HIBYTE(KwhNum*2+1);
	*(txb+(wrp+3)%txbuflen)=LOBYTE(KwhNum*2+1);
	*(txb+(wrp+4)%txbuflen)=0;
	for (i=0;i<KwhNum;i++)
		{
			Value=GetValue(KWHDB,lpChP->StaNo,i);
			*(txb+(wrp+5+i*2)%txbuflen)=HIBYTE (Value);
			*(txb+(wrp+6+i*2)%txbuflen)=LOBYTE (Value);
		}
	*(txb+(wrp+5+KwhNum*2)%txbuflen)=CallLPC(txb,wrp,5+KwhNum*2,txbuflen);
	wrp+=KwhNum*2+6;
    return wrp;
}

WORD	ZfProcSOE(BYTE FAR *txb,WORD wrp)
{
	*(txb+(wrp+0)%txbuflen)=lpStaP->STATIONNO;
	*(txb+(wrp+1)%txbuflen)=SOE|0x40;

    return wrp;
}

DWORD calsec(struct date Date,struct time Time)
{
DWORD  total=0,temp=0;
DWORD    year,month,day,hour,min,sec,i;
DWORD    Days;
year=Date.da_year;
month=Date.da_mon;
day=Date.da_day;
hour=Time.ti_hour;
min=Time.ti_min;
sec=Time.ti_sec;
if (year<2000)
{
for (i=1997;i<year;i++)
    {
        Days=DayPeYear(i);
        temp+=(DWORD)Days*(DWORD)86400;          
    }
for (i=1;i<month;i++)
    {
        Days=DayPeMonth(year,i);
        temp+=(DWORD)Days*(DWORD)86400;
    }
        temp+=(DWORD)(day-1)*(DWORD)86400;
        temp+=(DWORD)hour*(DWORD)3600;
        temp+=(DWORD)min*(DWORD)60;
temp+=sec;
total=94608000-temp;
//total=946684800-temp;
return total;
}
else
{
if (year!=2000)
for (i=2000;i<year;i++)
    {
        Days=DayPeYear(i);
        temp+=Days*86400;          
    }
if (month!=1)
for (i=1;i<month;i++)
    {
        Days=DayPeMonth(year,i);
        temp+=Days*86400;
    }
        temp+=(DWORD)(day-1)*(DWORD)86400;
        temp+=(DWORD)hour*(DWORD)3600;
        temp+=(DWORD)min*(DWORD)60;
temp+=sec;
total=temp;
return total;

}
}

DWORD    DayPeYear(DWORD year)
{
    if (year%4!=0 || (year%4==0 && year%100==0)) return 365;
    if (year%4==0) return 366; 
}
DWORD    DayPeMonth(DWORD  year,DWORD month)
{
    if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
       return    31;
    if (month==4 || month==6 || month==9 || month==11)
       return    30;
    if (month==2 && (year%4!=0 || (year%4==0 && year%100==0))) return 28;
    if (year%4==0 && month==2) return 29;
}

Group Current(DWORD seconds)
{
DWORD month=1,day,hour,min,sec,flag;
Group total;
DWORD   Ddays,Secs,i,j,year;
struct  date D;
getdate (&D);
if (D.da_year<2000)
{
seconds=94608000-seconds;
//seconds=946686800-seconds;
Ddays=seconds/86400;
Secs=seconds%86400;
hour=Secs/3600;
min=(Secs%3600)/60;
sec=Secs%60;
year=1997+Ddays/365;
Ddays=Ddays%365;
for (j=1;j<13;j++)
    {
        if ((Ddays<DayPeMonth(year,j)))
           {
            day=Ddays+1;
            break;
           }
        else
            {
                Ddays-=DayPeMonth(year,j);
            }
        month=j+1;
    }
if (day==0) day=1;
total.year=year;
total.month=month;
total.day=day;
total.hour=hour;
total.min=min;
total.sec=sec;
return total;
}
else
{
Ddays=seconds/86400;
Secs=seconds%86400;
hour=Secs/3600;
min=(Secs%3600)/60;
sec=Secs%60;
for (year=2000;year<3000;year++)
{
    if (Ddays>DayPeYear(year))
       {
              Ddays-=DayPeYear(year);
       }
    else    break; 
}
//Ddays=Ddays%365;
for (j=1;j<13;j++)
    {
        if ((Ddays<DayPeMonth(year,j)))
           {
            day=Ddays+1;
            break;
           }
        else
            {
                Ddays-=DayPeMonth(year,j);
            }
        month=j+1;
    }
if (day==0) day=1;
total.year=year;
total.month=month;
total.day=day;
total.hour=hour;
total.min=min;
total.sec=sec;
return total;
}
}

⌨️ 快捷键说明

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