📄 n4f.cpp
字号:
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 + -