Questa funzione da eseguire in task Back, permette di cambiare l’indicatore di posizione del file precedentemente aperto dalla funzione Sysfopen e passato come stream nel parametro File. Il parametro Offset specifica il numero di bytes dall’origine indicata nel parametro Origin, dove posizionare l’indicatore di posizione.
La funzione ritorna un (DINT) con il valore attuale dell’indicatore di posizione. In caso di errore l’indicatore di posizione rimane inalterato e la funzione ritorna eEOF.
Funzione
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib
Descrizione
File (eFILEP) Flusso dati stream riferito al file su disco aperto con la funzione SysFfopen.
Offset (DINT) Numero di bytes dall’origine dove posizionare l’indicatore di posizione.
Origin (INT) Definizione posizione di origine (Vedi definizione).
La funzione ritorna un (DINT) con il valore attuale dell’indicatore di posizione, eEOF se errore
Suggerimenti
Nel caso si desideri conoscere la posizione attuale dell’indicatore di posizione del file è possibile eseguire:
Position:=Sysfseek(Fp, 0, ID_SEEK_CUR);
Nel caso si desideri leggere uno o più caratteri dal file e poi riposizionarsi sul punto di inizio lettura è possibile eseguire:
i:=Sysfgetc(Fp); i:=Sysfseek(Fp, -1, ID_SEEK_SET);
Esempi
Come utilizzare gli esempi.
Nell’esempio ad ogni attivazione da debug della variabile RLine, viene letta una riga dal file C:/System/Logs.txt che contiene i logs di sistema e la riga letta viene trasferita nella variabile LString che è visualizzabile in debug.
LogicLab (Ptp116, ST_Sysfseek)
PROGRAM ST_Sysfseek
VAR
RLine : BOOL; (* Read line command *)
Line : USINT; (* Line number *)
RChars : INT; (* Number of characters read *)
FPos : DINT; (* File read position *)
Ptr : @STRING; (* Auxiliary pointer *)
Fp : eFILEP; (* File pointer *)
LString : STRING[ 128 ]; (* Line string *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_Sysfseek"
// *****************************************************************************
// At every set of the "RLine" command a line of text is read from the
// "C:/System/Logs.txt" file and stored in the "LString" variable.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// FILE READ
// -------------------------------------------------------------------------
// Wait for a "RLine" command.
IF NOT(RLine) THEN RETURN; END_IF;
RLine:=FALSE; //Read line command
// Open the file, exit on error.
Fp:=SysFfopen(ADR('C:/System/Logs.txt'), ADR('r')); //File pointer
IF (Fp = eNULL) THEN RETURN; END_IF;
// Set position to read on file.
// On error, there is not more lines to read.
IF (Sysfseek(Fp, FPos, ID_SEEK_SET) = eEOF) THEN
Fp:=FClose(Fp); //File pointer
RETURN;
END_IF;
// Read a line from file. It's assumed that every line has maximum 128
// characters.
RChars:=Sysfread(ADR(LString), TO_INT(SIZEOF(LString)), 1, Fp); //Number of characters read
Fp:=FClose(Fp); //File pointer
// If no characters are read, the file is ended.
IF (RChars = 0) THEN RETURN; END_IF;
// Have surely read at least one line. The line ends with check
// if there are line terminators.
Ptr:=SysStrFind(ADR(LString),ADR('$r$n'), FIND_GET_END); //Auxiliary pointer
IF (Ptr = eNULL) THEN RETURN; END_IF;
// Terminate the read line just after .
eTO_JUNK(eSetBYTE(Ptr, 16#00)); //Insert "0" end of line marker
// Set file position to the start of next line.
FPos:=FPos+TO_DINT(Ptr-ADR(LString)); //File read position
Line:=Line+1; //Line number
// [End of file]