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

📄 iec101.c

📁 电力变电站RTU监控软件(80C196NT单片机) 遥控
💻 C
📖 第 1 页 / 共 2 页
字号:
			{
			     Arg->FileLength <<=8;
			     Arg->FileLength +=*(Arg->RecBuf+i);
			};
		   };	 */
		   break;
	   case  1:// 读方式打开文件
/*		   T.B.Low=(*(Arg->RecBuf+5));
		   T.B.High=(*(Arg->RecBuf+6));
		   Arg->RxdPacketNo=T.Word;
		   if(Arg->RxdPacketNo==0)
		   {
		      Arg->TxdCode=0;
		      Arg->TxdPacketNo=0;
		   };
		   LoadFile(Arg);  */
		   break;
	   case  2://Receive Text(struct TIEC101LinkStruct FARDATA *Arg); 正文传送
/*		   i=(*(Arg->RecBuf+5))+(*(Arg->RecBuf+6))*256;
		   if(i==(Arg->RxdPacketNo-1))
		   {
		       Ack(Arg);
		       break;
		   }
		   if(i!=Arg->RxdPacketNo)
		   {
		       Nak(Arg,2);
		       break;
		   };
		   Arg->RxdPacketLength=*(Arg->RecBuf)+*(Arg->RecBuf+1)*256-2;
		   fwrite(Arg->RecBuf+7,sizeof(char),Arg->RxdPacketLength,Arg->fp);
		   Arg->FileLength -=Arg->RxdPacketLength;
		   Arg->RxdPacketNo++;
		   Ack(Arg); */
		   break;
	   case  4:// SendEot(Struct TIEC101LinkStruct FARDATA *Arg); 正文传送结束
/*		   i=(*(Arg->RecBuf+5))+(*(Arg->RecBuf+6))*256;
		   if(i!= Arg->RxdPacketNo)
		   {
		       Nak(Arg,2);
		       break;
		   };
		   Arg->RxdPacketLength=*(Arg->RecBuf)+*(Arg->RecBuf+1)*256-2;
		   fwrite(Arg->RecBuf+7,sizeof(char),Arg->RxdPacketLength,Arg->fp);
		   Arg->FileLength -=Arg->RxdPacketLength;
		   fclose(Arg->fp);
		   Arg->RxdCode=0; //nouse;
		   if(Arg->FileLength==0)
		   {
		       Arg->STANo=0;
		       if((Arg->WriFlag==0xff)&&(strncmpi((char FARDATA *)Arg->RecName,"outfile.x1a",11)==0))
		       {
			   setdisk('e'-'a');
			   Arg->WriFlag=0;
			   Ack(Arg);
			   delay(3000);
		       }else
		       {
			   Arg->WriFlag=0;
			   Ack(Arg);
			};
		   }else  Nak(Arg,3);	*/
		   break;
	   case  5://传目录
/*		   FileName(Arg);   */
		   break;
	   case  8:/*if(unlink((char FARDATA *)(Arg->RecBuf+5))==0) Ack(Arg);//文件删除
		    else				   Nak(Arg,5);
		    */
				    break;
	   case 24:/*fclose(Arg->fp);
		   Ack(Arg);*/
		   break;
	   default:Nak(Arg,0);
     };
}

unsigned char FileError(struct TIEC101LinkStruct FARDATA *Arg)
{
     if(Arg->TxdCode !=0)
     {
	 Arg->TxdRepeat--;
	 if((Arg->TxdRepeat)) //if((Arg->TxdRepeat-1)!=0)
	 {
		*(Arg->TxdBuf+3)|=0x80;
		IEC101LinkSendAFrame(Arg);
	 }else
	 {
		if(*(Arg->TxdBuf+3)==0x82)
		{
		 *(Arg->TxdBuf)=0;
		 *(Arg->TxdBuf+1)=0;
		 *(Arg->TxdBuf+2)=2;
		 *(Arg->TxdBuf+3)=24;
		 *(Arg->TxdBuf+4)=RTUStatus(Arg);
		 IEC101LinkSendAFrame(Arg);
		}
	 }
	 return(0);
     }
     return(0xff);
}

void IEC101LinkNak(struct TIEC101LinkStruct FARDATA *Arg)
{
     if(Arg->TxdCode !=0)
     {
	 Arg->TxdRepeat--;
	 if((Arg->TxdRepeat))
	 {
	     *(Arg->TxdBuf+3)|=0x80;
	     IEC101LinkSendAFrame(Arg);
	 }else
	 {
	     if(*(Arg->TxdBuf+3)==0x82)
	     {
		 *(Arg->TxdBuf)=0;
		 *(Arg->TxdBuf+1)=0;
		 *(Arg->TxdBuf+2)=2;
		 *(Arg->TxdBuf+3)=24;
		 *(Arg->TxdBuf+4)=RTUStatus(Arg);
		 IEC101LinkSendAFrame(Arg);
	     }
	 };
     }else
     {
	 *(Arg->TxdBuf+3)|=0x80;
	 IEC101LinkSendAFrame(Arg);
     }
}

void IEC101LinkAck(struct TIEC101LinkStruct FARDATA *Arg)
{
     switch(Arg->TxdCode)
     {
	case 0:
		break;
	case 1:if(Arg->FileLength==0)
	       {
		  Arg->TxdCode=0;
		  return;
	       }
	       if(Arg->FileLength > IEC101LinkPACKETSIZE)  //not the end packet
	       {
		  Arg->FileLength -=IEC101LinkPACKETSIZE;
		  Arg->TxdRepeat=IEC101LinkREPEAT;
		  *(Arg->TxdBuf ) =(IEC101LinkPACKETSIZE+1) & 0xFF;
		  *(Arg->TxdBuf+1)=(IEC101LinkPACKETSIZE+1) >> 8;
		  *(Arg->TxdBuf+2)=01;
		  *(Arg->TxdBuf+3)=02;//Text send
		  *(Arg->TxdBuf+4)=RTUStatus(Arg);
		  *(Arg->TxdBuf+5)=Arg->TxdPacketNo;
		  if(fread(Arg->TxdBuf+6,sizeof(char),IEC101LinkPACKETSIZE,Arg->fp)!=IEC101LinkPACKETSIZE)
		  {
		       Nak(Arg,5);
		       return;
		  }
		  IEC101LinkSendAFrame(Arg);
		  Arg->TxdPacketNo++;
	       }else	// Send end packet of a file Send
	       {
		  Arg->TxdRepeat=IEC101LinkREPEAT;
		  *(Arg->TxdBuf)=(unsigned char)(Arg->FileLength+1) & 0xFF;
		  *(Arg->TxdBuf+1)=(unsigned char)(Arg->FileLength+1) >> 8;
		  *(Arg->TxdBuf+2)=01;
		  *(Arg->TxdBuf+3)=04;// end of Text send
		  *(Arg->TxdBuf+4)=RTUStatus(Arg);
		  *(Arg->TxdBuf+5)=Arg->TxdPacketNo;
		  if(fread(Arg->TxdBuf+6,sizeof(char),(size_t)Arg->FileLength,Arg->fp)!=(size_t)Arg->FileLength)
		  {
			 Nak(Arg,5);
			 return;
		  }
		  fclose(Arg->fp);
		  IEC101LinkSendAFrame(Arg);
		  Arg->FileLength =0;
	       };
	       break;
     };
}

unsigned  char	RTUStatus(struct TIEC101LinkStruct FARDATA *Arg)
{
     unsigned	char	i;
     i=Arg->StatusCode;
     return(i);
}

void IEC101LinkTimer(struct TIEC101LinkStruct FARDATA *Arg)
{
     ResetTimer(Arg->ComTaskNo);
/*
	 Tgets(Arg->ComTaskNo,255,Arg->RxdBuf+7);
	 Arg->RxdBufLength=0;
	 Arg->RxdStatus=START;
	 ResetCom(Arg->ComTaskNo);
	 ChangeProWarn(Arg->ComTaskNo,0,1);
	 ChangeProWarn(Arg->ComTaskNo,1,1);
	 Nak(Arg,6); // Receive Data error
	 SetTimer(Arg->ComTaskNo,0); */
}


unsigned int readfile(void FARDATA *dbuf,size_t maxl,FILE *fp)
{
	 size_t i=0;
/*	 unsigned char FARDATA *dp;
	 rewind(fp);
	 dp=(unsigned char FARDATA *)dbuf;
	 while(!feof(fp) && (i<maxl))
	 {
	    dp[i]=fgetc(fp);
	    i++;
	 };
	 if(feof(fp))
	 {
	    i--;
	    dp[i]=0;
	 };
*/
	 return(i);
}


void FileName(struct TIEC101LinkStruct FARDATA *Arg)
{
     unsigned int	 i,ii,j,FileNum,dt,LEN;
     union	    WTEMP_ST	T;
//   struct	    ffblk    FileDAT;
     int     done;

/*   memset(FilePtr,0x00,2000);
     FileNum=0;
     T.B.Low=(*(Arg->RecBuf+5));
     T.B.High=(*(Arg->RecBuf+6));
     Arg->RxdPacketNo=T.Word;
     if(T.Word==0) Arg->TxdPacketNo=0;
     if(Arg->RxdPacketNo>5)Arg->RxdPacketNo=0;
     i=(*(Arg->RecBuf+11));
     if((i==0x43)||(i==0x63))
     {
       done=findfirst("c:\\*.*",&FileDAT,0);//0:成功,-1:失败
     }else
     {
       done=findfirst("d:\\*.*",&FileDAT,0);//0:成功,-1:失败
     }
     for(i=0;i<80;i++)
     {
	 if(done==0)
	 {
	   strcpy(str[i],FileDAT.ff_name);
	   FileNum++;
	   done=findnext(&FileDAT);
	 }else i=200;
     };
     for(i=0; i<FileNum; i++)
     {
	 for(ii=0; ii<13; ii++) *(FilePtr+13*i+ii)=str[i][ii];
     };
     if(FileNum==0)
     {
	 Nak(Arg,3);// Send File Nak for file open error
	 Arg->RxdCode=0;//NOUSE
	 Arg->RxdPacketNo=0;
     }else
     {
	 T.Word=FileNum*13;
	 LEN=T.Word;
	 dt=Arg->RxdPacketNo*245;
	 if(LEN>dt)  j=LEN-dt;
	     else    j=0;
	 if(j>245)
	 {
	    *(Arg->TxdBuf)=0xF5;
	    *(Arg->TxdBuf+1)=0;
	    *(Arg->TxdBuf+2)=0x01;
	    *(Arg->TxdBuf+3)=0x02;
	    *(Arg->TxdBuf+4)=RTUStatus(Arg);
	    *(Arg->TxdBuf+5)=Arg->RxdPacketNo;
	    *(Arg->TxdBuf+6)=0;
	    for(i=0; i<245; i++)
	    {
		for(ii=0; ii<13; ii++) *(Arg->TxdBuf+7+13*i+ii)=*(FilePtr+dt+ii+13*i);
	    };
	    IEC101LinkSendFrame(Arg);
	    Arg->TxdPacketNo++;
	 }else
	 {
	    if(j!=0)
	    {
	       T.Word=j;
	       *(Arg->TxdBuf)=T.B.Low;
	       *(Arg->TxdBuf+1)=T.B.High;
	       *(Arg->TxdBuf+2)=0x01;
	       *(Arg->TxdBuf+3)=0x04;
	       *(Arg->TxdBuf+4)=RTUStatus(Arg);
	       *(Arg->TxdBuf+5)=Arg->RxdPacketNo;
	       *(Arg->TxdBuf+6)=0;
	       for(i=0; i<j; i++)
	       {
		 for(ii=0; ii<13; ii++) *(Arg->TxdBuf+7+13*i+ii)=*(FilePtr+dt+ii+13*i);
	       };
	       IEC101LinkSendFrame(Arg);
	       Arg->TxdPacketNo++;
	    }else
	    {
	       *(Arg->TxdBuf)=0;
	       *(Arg->TxdBuf+1)=0;
	       *(Arg->TxdBuf+2)=0x01;
	       *(Arg->TxdBuf+3)=0x04;
	       *(Arg->TxdBuf+4)=RTUStatus(Arg);
	       *(Arg->TxdBuf+5)=Arg->RxdPacketNo;
	       *(Arg->TxdBuf+6)=0;
	       IEC101LinkSendFrame(Arg);
	       Arg->TxdPacketNo++;
	    }
	 }
     };
*/
}

void LoadFile(struct TIEC101LinkStruct FARDATA *Arg)
{
/*   switch(Arg->TxdCode)
     {
	case   0:fclose(Arg->fp);
		 if((Arg->fp=fopen((char FARDATA *)(Arg->RecBuf+7), "rb"))== NULL)
		 {
		     // Send File Nak for file open error
		     Nak(Arg,3);
		     Arg->RxdCode=0;//NOUSE
		 }else
		 {
		     Arg->TxdPacketNo=0;
		     if(fseek(Arg->fp,0,SEEK_END))
		     {
			  Nak(Arg,5);
			  return;
		     }
		     Arg->FileLength=ftell(Arg->fp);
		     if(fseek(Arg->fp,0,SEEK_SET))
		     {
			  Nak(Arg,5);
			  return;
		     }
		     Arg->TxdCode=1;
		     IEC101LinkFileSend(Arg);
		 };
		 break;
	case   1:IEC101LinkFileSend(Arg);
		 break;
       default	:Nak(Arg,4);
		 Arg->RxdCode=0;//NOUSE
		 break;
     }
*/
}

void IEC101LinkFileSend(struct TIEC101LinkStruct FARDATA *Arg)
{
     union   WTEMP_ST	 T;

/*   if(Arg->FileLength==0)
     {
	   Arg->TxdCode=0;
	   *(Arg->TxdBuf ) =0x00;
	   *(Arg->TxdBuf+1)=0x00;
	   *(Arg->TxdBuf+2)=01;
	   *(Arg->TxdBuf+3)=04;
	   *(Arg->TxdBuf+4)=RTUStatus(Arg);
	   T.Word=Arg->RxdPacketNo;
	   *(Arg->TxdBuf+5)=T.B.Low;
	   *(Arg->TxdBuf+6)=T.B.High;
	   IEC101LinkSendFrame(Arg);
	   Arg->TxdPacketNo++;
	   return;
     }
     if(Arg->FileLength > IEC101LinkPACKETSIZE)  //not the end packet
     {
	   Arg->FileLength -=IEC101LinkPACKETSIZE;
	   Arg->TxdRepeat=IEC101LinkREPEAT;
	   *(Arg->TxdBuf ) =(IEC101LinkPACKETSIZE) & 0xFF;
	   *(Arg->TxdBuf+1)=(IEC101LinkPACKETSIZE) >> 8;
	   *(Arg->TxdBuf+2)=01;
	   *(Arg->TxdBuf+3)=02;//Text send
	   *(Arg->TxdBuf+4)=RTUStatus(Arg);
	   T.Word=Arg->TxdPacketNo;
	   *(Arg->TxdBuf+5)=T.B.Low;
	   *(Arg->TxdBuf+6)=T.B.High;
	   if(fread(Arg->TxdBuf+7,sizeof(char),IEC101LinkPACKETSIZE,Arg->fp)!=IEC101LinkPACKETSIZE)
	   {
		 Nak(Arg,5);
		 return;
	   }
	   IEC101LinkSendFrame(Arg);
	   Arg->TxdPacketNo++;
     }else // Send end packet of a file Send
     {
	   //  Arg->TxdPacketNo++;
	   Arg->TxdRepeat=IEC101LinkREPEAT;
	   *(Arg->TxdBuf)=(unsigned char)(Arg->FileLength) & 0xFF;
	   *(Arg->TxdBuf+1)=(unsigned char)(Arg->FileLength) >> 8;
	   *(Arg->TxdBuf+2)=01;
	   *(Arg->TxdBuf+3)=04;// end of Text send
	   *(Arg->TxdBuf+4)=RTUStatus(Arg);
	   T.Word=Arg->TxdPacketNo;
	   *(Arg->TxdBuf+5)=T.B.Low;
	   *(Arg->TxdBuf+6)=T.B.High;
	   if(fread(Arg->TxdBuf+7,sizeof(char),(size_t)Arg->FileLength,Arg->fp)!=(size_t)Arg->FileLength)
	   {
	      Nak(Arg,5);
	      return;
	   }
	   fclose(Arg->fp);
	   IEC101LinkSendFrame(Arg);
	   Arg->FileLength =0;
     };
*/
}

void IEC101LinkSendFrame(struct TIEC101LinkStruct FARDATA *Arg)
{
     int Length;
     unsigned int Sum;
     unsigned char Count;
     unsigned char FARDATA *Frame;
     unsigned int Crc;
     unsigned int i;
     Frame=Arg->TxdBuf;
     Length=(*Frame)+(*(Frame+1))*256+7;
     Sum=Length;
     if(!(*(Arg->TxdBuf+3)&0x80))
     {
	Crc = 0;
	while (--Length >= 0)
	{
	     Crc = (Crc ^ (((int)*(Frame++)) << 8));
	     for (i = 0; i < 8; ++i)
	     if (Crc & 0x8000) Crc = ((Crc << 1) ^ 0x1021);
		  else	       Crc = Crc << 1;
	};
	Crc &= 0xFFFF;
	*(Arg->TxdBuf+Sum)=Crc;
	*(Arg->TxdBuf+Sum+1)=Crc>>8;
     }
     Sum += 2;
     Tputc(Arg->ComTaskNo,1); //01H
     ChangeProWarn(Arg->ComTaskNo,1,Sum);
     SetTimer(Arg->ComTaskNo,0);
     if(Sum >255)  Count=255;
	    else   Count=Sum;
     Arg->TxdPtr=Count;
     Tputs(Arg->ComTaskNo,&Count,(char FARDATA *)Arg->TxdBuf);
     Arg->TxdBufLength=Sum;
     Arg->TxdPtr -=Count;
     if(Arg->TxdBufLength>Arg->TxdPtr) Arg->TxdStatus=SEND;
}

⌨️ 快捷键说明

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