(* example of how to use the file position function blocks *)
PROGRAM FILE.POINT_PRG
VAR
xFilePosInit: BOOL:=FALSE;
uiFilePosState: UINT:=0;
udiActualPosition: UDINT:=0;
udiActualEoFPosition: UDINT:=0;
sFileName: CAA.FILENAME:= 'TestFile.txt';
hFile: CAA.HANDLE;
filop: FILE.Open;
filcl: FILE.Close;
filgp: FILE.GetPos;
filsp: FILE.SetPos;
fileof: FILE.EOF;
END_VAR
IF NOT xFilePosInit THEN
filop(xExecute:=FALSE);
filcl(xExecute:=FALSE);
filgp(xExecute:=FALSE);
filsp(xExecute:=FALSE);
fileof(xExecute:=FALSE);
xFilePosInit:=TRUE;
uiFilePosState:=0;
ELSE
CASE uiFilePosState OF
0:(* open file *)
filop.sFileName:= sFileName;
filop.eFileMode:=FILE.MRDWR;
filop.xExclusive:=TRUE;
filop( xExecute:=TRUE);
IF filop.xDone THEN
hFile:=filop.hFile;
uiFilePosState:=1;
END_IF
IF filop.xError THEN
(* error handling*)
;
END_IF
1: (* get actual internal positon file pointer *)
filgp.hFile:= hFile;
filgp( xExecute:=TRUE);
IF filgp.xDone THEN
udiActualPosition:=filgp.udiPos;
uiFilePosState:=2;
END_IF
IF filgp.xError THEN
(* error handling*)
;
END_IF
2:(* query - end of file is reached *)
fileof.hFile:= hFile;
fileof( xExecute:=TRUE);
IF fileof.xDone THEN
IF fileof.xEOF THEN
udiActualEoFPosition:=udiActualPosition;
END_IF
uiFilePosState:=3;
END_IF
IF filgp.xError THEN
(* error handling*)
;
END_IF
3: (* set the internal positon file pointer *)
filsp.hFile:= hFile;
filsp.udiPos:=udiActualEoFPosition - 5;
IF filsp.udiPos < 0 THEN
filsp.udiPos:=0;
END_IF
filsp( xExecute:=TRUE);
IF filsp.xDone THEN
uiFilePosState:=4;
END_IF
IF filsp.xError THEN
(* error handling*)
;
END_IF
4:(* close file *)
filcl.hFile:=hFile;
filcl( xExecute:=TRUE);
IF filcl.xDone THEN
uiFilePosState:=5;
END_IF
IF filcl.xError THEN
(* error handling*)
;
END_IF
5: (* end of example*)
;
END_CASE
END_IF