Sysfseek, file seek

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

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.

Information Circle

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

Immagine funzione Sysfseek

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
    i : UDINT; (* Auxiliary counter *)
    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
        i:=Sysfclose(Fp); //Close file
        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
    i:=Sysfclose(Fp); //Close file

    // 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 .

    @Ptr:='$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]
Was this article helpful?