📄 iec101.c
字号:
{
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 + -