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

📄 n4f.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
					case	13:
						if (YcNums>112)
						wrp=SendYcType(txb,wrp,YC7);
                        break;
					case	14:
						wrp=TBSend(txb,wrp);		//14
						break;
					case	15:
						wrp=GXType(txb,wrp);		//0b
                        break;
					case	16:
						lpStaP->RANDOM[0]=0xff;
                    default:break;
                }
         return wrp;
        }
	 else//进入正常
		{
			BYTE CRC;
			if (lpStaP->RANDOM[1]==0x80)		//=80接受到分站发来的否定回答
					{
						switch (lpStaP->LastCode)
							{
								case	0xc:
									wrp=N4fSetTime(txb,wrp);
									break;
								case	0x5:
								case	0xb:
                                case	0x1a:
									*(txb+wrp)=lpStaP->STATIONNO;
									*(txb+(wrp+1)%txbuflen)=0x1a;
									*(txb+(wrp+2)%txbuflen)=lpStaP->LastCodeType;
									CRC=MKCRC8(txb,wrp,3,txbuflen);
									*(txb+(wrp+3)%txbuflen)=CRC;
                        			wrp+=4;
									break;
								default:
									break;	
							}
						lpStaP->RANDOM[1]=0;
                        return wrp;
                    }
			switch (Poll&3)
				{
					case	0:
						*(txb+wrp)=lpStaP->STATIONNO;
						*(txb+(wrp+1)%txbuflen)=5;
						*(txb+(wrp+2)%txbuflen)=0xff;
                        lpStaP->LastCodeType=0xff;
						CRC=MKCRC8(txb,wrp,3,txbuflen);
						*(txb+(wrp+3)%txbuflen)=CRC;
                        wrp+=4;
						break;
					case	1:
						if (lpStaP->LastDataType==SOEType)
                        {
							*(txb+wrp)=lpStaP->STATIONNO;
							*(txb+(wrp+1)%txbuflen)=5;
							*(txb+(wrp+2)%txbuflen)=0;
							lpStaP->LastCodeType=0;
							CRC=MKCRC8(txb,wrp,3,txbuflen);
							*(txb+(wrp+3)%txbuflen)=CRC;
							wrp+=4;
                        }
						break;
					case	2:
						*(txb+wrp)=lpStaP->STATIONNO;
						*(txb+(wrp+1)%txbuflen)=0xb;
						*(txb+(wrp+2)%txbuflen)=0xff;
                        lpStaP->LastCodeType=0xff;
						CRC=MKCRC8(txb,wrp,3,txbuflen);
						*(txb+(wrp+3)%txbuflen)=CRC;
                        wrp+=4;
						break;
					case	3:
						if (lpStaP->KwhCount++>KWHCOUNT)
							{
								wrp=CallKwhData(txb,wrp);
                                lpStaP->Poll--;
                            }
                    	break;
					default:
                    	break;


                }

        }
 return wrp;
}


//分站数据处理
WORD PollRecProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{
	switch(*(rxb+(rdp+1)%rxbuflen)&0x3f)
		{
		 case 0x16:
         	ProcPowerOn(rxb,rdp);
			break;
		 case 0x17:
			lpStaP->LastDataType=Soe1stBoard;
			RecSoeBoardAddress[lpChP->StaNo]=*(rxb+(rdp+3)%rxbuflen)>>3;
			break;
		 case 0x18:
			lpStaP->LastDataType=KWHType;
         	//ProcModeChange(rxb,rdp);
			break;
		 case 0x1b:
            ProcChgData_1b(rxb,rdp);
			break;
		 case 0x1c:
            ProcCallData_1c(rxb,rdp);
			break;
		 case 0x1d:
			ProcBadCallData_1d(rxb,rdp);
			break;
		 default :
			break;
		}

return (Len+5);
}

WORD  MKCRC16(BYTE FAR *rxb,WORD rdp,BYTE Len,WORD Mode)
{
  WORD   CRCData;
  BYTE   bVal;

  Len++;

  bVal=*(rxb+rdp);   
  rdp++;

  CRCData=*(rxb+rdp%Mode)+*(rxb+(rdp+1)%Mode)*256;
  rdp+=2;
  while (Len)
	{
	 CRCData^=N4FCRC16[bVal];

	 if (Len==1)  break;

	 bVal=LOBYTE(CRCData);     
         CRCData=HIBYTE(CRCData)+*(rxb+rdp%Mode)*256;
 	 Len--;
	 rdp++;
	}

 bVal=LOBYTE(CRCData);  
 CRCData=HIBYTE(CRCData);
 CRCData^=N4FCRC16[bVal];

 bVal=LOBYTE(CRCData);  
 CRCData=HIBYTE(CRCData);
 CRCData^=N4FCRC16[bVal];

 return(CRCData);
}

/*---------------        MAKE  8-BIT CRC -----------------------*/
BYTE MKCRC8(BYTE FAR *Buf,WORD dp,BYTE Len,WORD Mode )
{
BYTE  buf[128],crc ;
BYTE  temp;
BYTE  k[128];
int   i ,l;
temp = 0;
memcpy(buf,Buf+dp%Mode,128 *sizeof(BYTE));
for (i=0;i<Len;i++) temp ^= buf[i];
temp &= 0x80;
for (i=0;i<Len;i++) { buf[i] <<=1; buf[i]=change_h_to_l(buf[i]);}
		  
for (i=0;i<128;i++) k[i]=0;
for (i=1;i<Len;i++)
{buf[i]<<=1;                                                            
for (l=0;l<7;l++)
  { if (buf[i] &0x80 ) k[(i-1)*7+l] =1;
    else               k[(i-1)*7+l] =0;
    buf[i] <<=1;
  }
  }
l=buf[0];
for (i=0;i<Len*7;i++)
 {   l<<=1;
      if (k[i]!=0) l ^= 0x01;
      if (l>=0x80)  l ^= 0x91;
 }
l=change_h_to_l(l);
 l >>=1;
 l^=temp;
 crc =l ;
 return (crc);
}


int CKCRC16(BYTE FAR *Buf,WORD dp,BYTE Len,WORD Mode)
{
 WORD  CRCData;
 BOOL  ChkResult=0;

 CRCData=MKCRC16(Buf,dp,Len,Mode);

 Buf+=3;
 Buf+=Len;

 if (CRCData==*(Buf+dp)+(*(Buf+(dp+1)%Mode))*256)
     ChkResult=1;
 else ChkResult=0;

 return (ChkResult) ;

}
BYTE change_h_to_l(BYTE temp)
{
 int i,k;
 BYTE t;
 k= temp;
 temp=0;
 for ( i=0; i<8; i++)
   {if(( k % 2 ) == 1)
      { t=1 ; t <<= 7-i ; temp |= t;}
    k >>= 1;
   }
return(temp);
}
void ProcModeChange(BYTE FAR *rxb,WORD rdp)
{

}

void ProcChgData_1b(BYTE FAR *rxb,WORD rdp)
{
BYTE ModeAdd=*(rxb+(rdp+4)%rxbuflen)&0x3f;
BYTE Type=*(rxb+(rdp+4)%rxbuflen)&0x60;
BYTE WordFlag=*(rxb+(rdp+5)%rxbuflen);
BYTE w=0,j=1,i;
BYTE Len=*(rxb+(rdp+2)%rxbuflen);

for(w=0;w<Len-1;)
{
if (ModeAdd>=YCStartBoard && Type==0)
	{
	 for (i=0;i<8;i++)
     	{
			if (WordFlag&j)
				{
					WORD YcValue=*(rxb+(rdp+6+w)%rxbuflen)+*(rxb+(rdp+6+w)%rxbuflen)*256;
					WORD YcOrd=(ModeAdd-YCStartBoard)*8+i;
                    SetValue(YCDB,lpChP->StaNo,YcOrd,YcValue);
					w+=2;
			    }
			   	j=j<<1;
	 	}
	 w++;
	 w++;
	 }
else if((ModeAdd>=YXStartBoard)&&(ModeAdd<KWHStartBoard)&&(Type==0x60))
   	{
	j=1;
   		for (i=0;i<8;i++)
             {
	   			if(WordFlag&j)
			    	{
                    BYTE yxv1,yxv2;
					yxv1=*(rxb+(rdp+6+w)%rxbuflen);
					yxv2=*(rxb+(rdp+7+w)%rxbuflen);
					WORD YxOrd=(ModeAdd-YXStartBoard)*128+i*16;
					SetBatchValue(YXDB, lpChP->StaNo, YxOrd*8, 8, (char huge *)yxv1);
					SetBatchValue(YXDB, lpChP->StaNo, (YxOrd+1)*8, 8, (char huge *)yxv2);
					w+=4;  //old 2
			     	}
			     	j=j<<1;
			 }
		     w++;
		     w++;
	}
else
	break;

}


    

}
void ProcCallData_1c(BYTE FAR *rxb,WORD rdp)
{
    BYTE Len=*(rxb+(rdp+2)%rxbuflen);
	if (lpStaP->LastCode==0x1e) {ProcYk(rxb,rdp);return;}
	if (lpStaP->LastDataType==Soe1stBoard ||lpStaP->LastDataType==Soe2stBoard)
	  {
		    BYTE        Minute,Second,bit_count,bit_temp,k;
            DWORD       MasterSyncTime,MasterSoeTime,TimeTemp;
			WORD        MinSec,SoeAddress;
            BYTE		Len=*(rxb+(rdp+2)%rxbuflen);
		    time_t	    timer;
            struct   	tm 	*t;
			EVENT 		eve;
			MasterSyncTime=*(rxb+(rdp+4)%rxbuflen)+*(rxb+(rdp+5)%rxbuflen)*256+*(rxb+(rdp+6)%rxbuflen)*256*256+*(rxb+(rdp+7)%rxbuflen)*256*256*256;
		    for (int i=0;i<Len-4-1;i+6)
                    {
			MasterSoeTime =*(rxb+(rdp+10+i)%rxbuflen)+*(rxb+(rdp+11+i)%rxbuflen)*256+*(rxb+(rdp+12+i)%rxbuflen)*256*256+*(rxb+(rdp+13+i)%rxbuflen)*256*256*256;
		    if (MasterSoeTime==0)
				{
					 if (lpStaP->LastDataType==Soe1stBoard)
							lpStaP->LastDataType=Soe2stBoard;
			  		 else lpStaP->LastDataType=0xff;
			  		 break;
				}
			TimeTemp=MasterSoeTime-MasterSyncTime;
			eve.Station = lpChP->StaNo;

					  time (&timer);
                      t = localtime (&timer);
			  Minute =lpStaP->MIN;

			  if (lpStaP->SEC + TimeTemp /1000 >=60 )
                         {
			   Minute++ ;      
			   Second = lpStaP->SEC + TimeTemp /1000 -60;
                         }
              else
		   	  Second = lpStaP->SEC + TimeTemp /1000;
			  TimeTemp %=1000 ;
			  if (lpStaP->MS+ (TimeTemp /10 ) >=100 )
                         {
                          Second ++ ;
						  MinSec = (WORD)((lpStaP->MS +TimeTemp /10 -100 )) *10;
                         }
			 eve.Hour=t->tm_hour;
			 eve.Min=Minute;
			 eve.Sec=Second;
			 eve.Ms=MinSec;

			 SoeAddress = ((*(rxb+(rdp+i+13)%rxbuflen) >> 4 ) & 0x01) *8 +(*(rxb+(rdp+i+13)%rxbuflen) >> 5)*16 ;
			 SoeAddress +=(RecSoeBoardAddress[lpChP->StaNo]-YXStartBoard) *64;
             bit_temp =0x01 ; bit_count =0 ;
		     for ( int k =0 ; k<7; k++)
             	{
                	if (*(rxb+(rdp+i+8)%rxbuflen) & bit_temp )
                    	{
			      			eve.Order = SoeAddress +bit_count ;
							if (*(rxb+(rdp+i+14)%rxbuflen) & bit_temp )
							  	eve.data[0] = 0xcc;
							  else
								eve.data[0] = 0x33;
							bit_temp  <<=1; bit_count ++ ;

                         }
			 	}
			BYTE yxtype = GetType(YXDB, lpChP->StaNo, eve.Order);
			if (yxtype&YXSWITCH) eve.EventType = KGEVENT;
            else if (yxtype&YXLINKER) eve.EventType = DZEVENT;
            else if (yxtype&YXPROTECT) eve.EventType = BHEVENT;
			TBFlag[lpChP->StaNo]=0xff;
              }
	}
	else if (lpStaP->LastDataType==KWHType)
	{
	WORD KwhOrder=0;
    BYTE KwhFlag;
		for (BYTE i=0;i<Len-3;i++)
		    {
				BYTE bKwh0  =*(rxb+(rdp+4+i*4)%rxbuflen);
				BYTE bKwh1  =*(rxb+(rdp+5+i*4)%rxbuflen);
				BYTE bKwh2  =*(rxb+(rdp+6+i*4)%rxbuflen);
				KwhFlag=*(rxb+(rdp+7+i*4)%rxbuflen);
                DWORD Value=bKwh0*256*256+bKwh1*256+bKwh2;
				if (KwhFlag&0x20)
					{
						if ((KwhOrder+8)>=GetRcdNum(KWHDB,lpChP->StaNo)) break;
					}
			   	else if(KwhFlag&0x10)
					{
						if (KwhOrder>=GetRcdNum(KWHDB,lpChP->StaNo))  break;
					}
                SetValue(KWHDB,lpChP->StaNo,KwhOrder,Value);
				KwhOrder++;
		    }
		    if (KwhFlag & 0x10) lpStaP->KwhDealFlag=0x04;
			else if (KwhFlag & 0x20) lpStaP->KwhDealFlag=0x08;
			else lpStaP->KwhDealFlag = 0;
	}
	lpStaP->RANDOM[1]=0x80;
}
void ProcBadCallData_1d(BYTE FAR *rxb,WORD rdp)
{
	if (lpStaP->LastCode==0xd && lpStaP->LastCodeType==KWHType)
		lpStaP->KwhDealFlag=0;
	else {lpStaP->LastCode=0x1a;lpStaP->RANDOM[1]=0x80;lpStaP->LastCodeType=0xff;} 

}
//遥控选择
WORD N4fYkSel(BYTE FAR *txb,WORD wrp)
{
    BYTE val;WORD val1,vall;
	*(txb+wrp)=lpStaP->STATIONNO;
	*(txb+(wrp+1)%txbuflen)=0x1e;
	*(txb+(wrp+2)%txbuflen)=4;
	*(txb+(wrp+3)%txbuflen)=(YKStartBoard<<3)|0x01;
	val=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3]-1;
	val1=0x01;
	vall = (val1<<val/8)*256+val1<<val%8;
	vall=vall<<2;
	if (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3]==0x33) vall=vall|0x02;
	else    vall=vall|0x01;
    lpStaP->YKMESSAGE=vall;
	*(txb+(wrp+4)%txbuflen)=LOBYTE (vall);
	*(txb+(wrp+5)%txbuflen)=HIBYTE (vall);
	*(txb+(wrp+5)%txbuflen)=4;
	WORD CRCDATA=MKCRC16(txb,wrp,4,txbuflen);
	*(txb+(wrp+6)%txbuflen)=4;
	*(txb+(wrp+7)%txbuflen)=LOBYTE(CRCDATA);
	*(txb+(wrp+8)%txbuflen)=HIBYTE(CRCDATA);
	return (wrp+9);
}

⌨️ 快捷键说明

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