?? protocol.h
字號(hào):
void PLCResponse(void)
{
unsigned char i,ChkSum,HiByte,LoByte,WordLen,k,j,TempByte;
unsigned int Temp,WordAdrFrom;
TxdIndex=0;ChkSum=0;WordAdrFrom=0;
for (i=0;i<ReceivedByte-2;i++) ChkSum+=RxdBuf[i];
if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
else HiByte=(ChkSum>>4)+0x30;
if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
else LoByte=(ChkSum&0x0f)+0x30;
if ( (HiByte==RxdBuf[ReceivedByte-2]) && (LoByte==RxdBuf[ReceivedByte-1]) ) {
if (RxdBuf[3]=='4') {
switch (RxdBuf[4]) {
case '2': //Bit Set COMMAND
switch (RxdBuf[6]) {
case 'M':
PORTB|=0x02;
Temp=(RxdBuf[7]&0x0f)*1000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[8]&0x0f)*100;
WordAdrFrom+=Temp;
Temp=(RxdBuf[9]&0x0f)*10;
WordAdrFrom+=Temp;
Temp=RxdBuf[10]&0x0f;
WordAdrFrom+=Temp;
for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];
TxdBuf[5]='0';
if ( RxdBuf[5]=='3') SnrBuf[WordAdrFrom]=0xff;
if ( RxdBuf[5]=='4') SnrBuf[WordAdrFrom]=0;
//k=9+(WordLen<<2)+1;
ChkSum=0;
for (i=0;i<6;i++) ChkSum+=TxdBuf[i];
if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
else HiByte=(ChkSum>>4)+0x30;
if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
else LoByte=(ChkSum&0x0f)+0x30;
TxdBuf[6]=HiByte;
TxdBuf[7]=LoByte;
TxdBuf[8]=ETX;
PORTB&=0xfd;
PORTB|=0x04;
USR|=0x40;
TxdByte=9;
for (i=0;i<9;i++) {
TempByte=0;
for (j=0;j<7;j++) {
if ((TxdBuf[i]>>j)&0x01) TempByte++;
}
if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;
//UDR=TxdBuf[i];
//while (1) {
// if (USR&0x40) break;
//}
//USR|=0x40;
}
UDR=TxdBuf[0];
ReceivedEnd=0;
PORTB&=0xfb;
break;
default:
break;
}
break;
case '4': //M Read Command
if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
else HiByte=RxdBuf[5]&0x0f;
if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
else LoByte=RxdBuf[6]&0x0f;
WordLen=(HiByte<<4)+LoByte;
switch (RxdBuf[7]) {
case 'M':
Temp=(RxdBuf[8]&0x0f)*1000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[9]&0x0f)*100;
WordAdrFrom+=Temp;
Temp=(RxdBuf[10]&0x0f)*10;
WordAdrFrom+=Temp;
Temp=(RxdBuf[11]&0x0f);
WordAdrFrom+=Temp;
for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];
TxdBuf[5]='0';
for (i=0;i<WordLen;i++) {
if ( SnrBuf[WordAdrFrom+i]==0xff ) TxdBuf[6+i]='1';
else TxdBuf[6+i]='0';
k=6+i+1;
}
ChkSum=0;
for (i=0;i<k;i++) ChkSum+=TxdBuf[i];
if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
else HiByte=(ChkSum>>4)+0x30;
if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
else LoByte=(ChkSum&0x0f)+0x30;
TxdBuf[k]=HiByte;
TxdBuf[k+1]=LoByte;
TxdBuf[k+2]=ETX;
USR|=0x40;
TxdByte=k+3;
for (i=0;i<k+3;i++) {
TempByte=0;
for (j=0;j<7;j++) {
if ((TxdBuf[i]>>j)&0x01) TempByte++;
}
if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;
//UDR=TxdBuf[i];
//while (1) {
// if (USR&0x40) break;
//}
//USR|=0x40;
}
UDR=TxdBuf[0];
ReceivedEnd=0;
break;
default:
break;
}
break;
case '5': //M WRITE COMMAND
if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
else HiByte=RxdBuf[5]&0x0f;
if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
else LoByte=RxdBuf[6]&0x0f;
WordLen=(HiByte<<4)+LoByte;
switch (RxdBuf[7]) {
case 'M':
PORTB|=0x02;
Temp=(RxdBuf[8]&0x0f)*1000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[9]&0x0f)*100;
WordAdrFrom+=Temp;
Temp=(RxdBuf[10]&0x0f)*10;
WordAdrFrom+=Temp;
Temp=RxdBuf[11]&0x0f;
WordAdrFrom+=Temp;
for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];
TxdBuf[5]='0';
for (i=0;i<WordLen;i++) {
if ( RxdBuf[12+i]=='1') SnrBuf[WordAdrFrom+i]=0xff;
else SnrBuf[WordAdrFrom+i]=0;
}
//k=9+(WordLen<<2)+1;
ChkSum=0;
for (i=0;i<6;i++) ChkSum+=TxdBuf[i];
if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
else HiByte=(ChkSum>>4)+0x30;
if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
else LoByte=(ChkSum&0x0f)+0x30;
TxdBuf[6]=HiByte;
TxdBuf[7]=LoByte;
TxdBuf[8]=ETX;
PORTB&=0xfd;
PORTB|=0x04;
//UDR=0x44;
//UDR=TxdBuf[0];
USR|=0x40;
TxdByte=9;
for (i=0;i<9;i++) {
TempByte=0;
for (j=0;j<7;j++) {
if ((TxdBuf[i]>>j)&0x01) TempByte++;
}
if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;
//UDR=TxdBuf[i];
//while (1) {
// if (USR&0x40) break;
//}
//USR|=0x40;
}
UDR=TxdBuf[0];
ReceivedEnd=0;
PORTB&=0xfb;
break;
default:
break;
}
break;
case '6': //DR READ COMMAND
if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
else HiByte=RxdBuf[5]&0x0f;
if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
else LoByte=RxdBuf[6]&0x0f;
WordLen=(HiByte<<4)+LoByte;
switch (RxdBuf[7]) {
case 'R':
PORTB|=0x02;
Temp=(RxdBuf[8]&0x0f)*10000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[9]&0x0f)*1000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[10]&0x0f)*100;
WordAdrFrom+=Temp;
Temp=(RxdBuf[11]&0x0f)*10;
WordAdrFrom+=Temp;
Temp=RxdBuf[12]&0x0f;
WordAdrFrom+=Temp;
for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];
TxdBuf[5]='0';
for (i=0;i<WordLen;i++) {
if ( (DM[WordAdrFrom+i]&0xf000)>0x9000 ) TxdBuf[6+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0xf000)>>12)+0x37;
else TxdBuf[6+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0xf000)>>12)+0x30;
if ( (DM[WordAdrFrom+i]&0x0f00)>0x0900 ) TxdBuf[7+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x0f00)>>8)+0x37;
else TxdBuf[7+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x0f00)>>8)+0x30;
if ( (DM[WordAdrFrom+i]&0x00f0)>0x0090 ) TxdBuf[8+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x00f0)>>4)+0x37;
else TxdBuf[8+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x00f0)>>4)+0x30;
if ( (DM[WordAdrFrom+i]&0x000f)>0x0009 ) TxdBuf[9+(i<<2)]=(unsigned char)(DM[WordAdrFrom+i]&0x000f)+0x37;
else TxdBuf[9+(i<<2)]=(unsigned char)(DM[WordAdrFrom+i]&0x000f)+0x30;
k=9+(i<<2)+1;
}
ChkSum=0;
for (i=0;i<k;i++) ChkSum+=TxdBuf[i];
if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
else HiByte=(ChkSum>>4)+0x30;
if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
else LoByte=(ChkSum&0x0f)+0x30;
TxdBuf[k]=HiByte;
TxdBuf[k+1]=LoByte;
TxdBuf[k+2]=ETX;
PORTB&=0xfd;
PORTB|=0x04;
//UDR=0x44;
//UDR=TxdBuf[0];
USR|=0x40;
TxdByte=k+3;
for (i=0;i<k+3;i++) {
TempByte=0;
for (j=0;j<7;j++) {
if ((TxdBuf[i]>>j)&0x01) TempByte++;
}
if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;
//UDR=TxdBuf[i];
//while (1) {
// if (USR&0x40) break;
//}
//USR|=0x40;
}
UDR=TxdBuf[0];
ReceivedEnd=0;
PORTB&=0xfb;
break;
default:
break;
}
break;
case '7': //DR WRITE COMMAND
if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
else HiByte=RxdBuf[5]&0x0f;
if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
else LoByte=RxdBuf[6]&0x0f;
WordLen=(HiByte<<4)+LoByte;
switch (RxdBuf[7]) {
case 'R':
PORTB|=0x02;
Temp=(RxdBuf[8]&0x0f)*10000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[9]&0x0f)*1000;
WordAdrFrom+=Temp;
Temp=(RxdBuf[10]&0x0f)*100;
WordAdrFrom+=Temp;
Temp=(RxdBuf[11]&0x0f)*10;
WordAdrFrom+=Temp;
Temp=RxdBuf[12]&0x0f;
WordAdrFrom+=Temp;
for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];
TxdBuf[5]='0';
for (i=0;i<WordLen;i++) {
if ( RxdBuf[13+(i<<2)]>'9') DM[WordAdrFrom+i]=(RxdBuf[13+(i<<2)]-7)&0x0f;
else DM[WordAdrFrom+i]=RxdBuf[13+(i<<2)]&0x0f;
DM[WordAdrFrom+i]<<=4;
if ( RxdBuf[14+(i<<2)]>'9') DM[WordAdrFrom+i]+=((RxdBuf[14+(i<<2)]-7)&0x0f);
else DM[WordAdrFrom+i]+=(RxdBuf[14+(i<<2)]&0x0f);
DM[WordAdrFrom+i]<<=4;
if ( RxdBuf[15+(i<<2)]>'9') DM[WordAdrFrom+i]+=((RxdBuf[15+(i<<2)]-7)&0x0f);
else DM[WordAdrFrom+i]+=(RxdBuf[15+(i<<2)]&0x0f);
DM[WordAdrFrom+i]<<=4;
if ( RxdBuf[16+(i<<2)]>'9') DM[WordAdrFrom+i]+=((RxdBuf[16+(i<<2)]-7)&0x0f);
else DM[WordAdrFrom+i]+=(RxdBuf[16+(i<<2)]&0x0f);
}
//k=9+(WordLen<<2)+1;
ChkSum=0;
for (i=0;i<6;i++) ChkSum+=TxdBuf[i];
if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
else HiByte=(ChkSum>>4)+0x30;
if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
else LoByte=(ChkSum&0x0f)+0x30;
TxdBuf[6]=HiByte;
TxdBuf[7]=LoByte;
TxdBuf[8]=ETX;
PORTB&=0xfd;
PORTB|=0x04;
//UDR=0x44;
//UDR=TxdBuf[0];
USR|=0x40;
TxdByte=9;
for (i=0;i<9;i++) {
TempByte=0;
for (j=0;j<7;j++) {
if ((TxdBuf[i]>>j)&0x01) TempByte++;
}
if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;
//UDR=TxdBuf[i];
//while (1) {
// if (USR&0x40) break;
//}
//USR|=0x40;
}
UDR=TxdBuf[0];
ReceivedEnd=0;
PORTB&=0xfb;
break;
default:
break;
}
break;
default:
break;
}
}
}
else ReceivedEnd=0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -