FIFOFile, gestisce registro FIFO su file (COPIA)

Home / Knowledge Base / Manualistica / Programmazione IEC 61131-3 / Gestione storicizzazione dati / FIFOFile, gestisce registro FIFO su file (COPIA)

Questo blocco funzione effettua la gestione di un registro FIFO, il registro può essere appoggiato su un'area di memoria oppur su di un file. Il FB ha esecuzione atomica, può essere eseguito come una funzione.

In FIFOFilename occorre definire il fpercorso completo del file di appoggio del registro FIFO, se FIFOFilename=NULL i dati del registro FIFO sono salvati in un buffer di memoria RAM allocato automaticamente (RMalloc) anziché su disco. La dimensione del registro FIFO è definita dalla variabile FIFOSize, se si opera con un buffer in memoria si consiglia di tenere un valore inferiore agli 8KBytes. Appoggiando il registro FIFO in memoria i dati non sono mantenuti allo spegnimento del sistema.

In FIFOIDx occorre fornire l'indirizzo di un array di 2 UDINT che devono essere allocati dal programma. Se si desidera che la situazione dei dati nel FIFO sia mantenuta allo spegnimento del sistema occorre allocare questo array in una memoria tampone. Se FIFOFIDx=NULL gli indici del registro FIFO sono salvati internamente al FB. In questo caso i dati non sono mantenuti allo spegnimento del sistema.

Attivando In i dati nel buffer puntato da Dp per la dimensione indicata in Dls sono inseriti nel registro FIFO. In UTCTime è ritornato il valore di Data/Ora UTC di inserimento nel registro FIFO. Attivando Out si hanno due differenti azioni in funzione del valore in Dls.

Se Dp=eNULL e/o Dls=0: Sono valorizzati in uscita UTCTime e Dl con i dati del record che è stato inserito per primo nel registro (Se esiste). Se il registro è vuoto Dl viene ritornato con valore 0.

Se Dls<>0: Sono trasferiti nel buffer di uscita puntato da Dp la cui dimensione è definita in Dls i dati del record che è stato inserito per primo nel registro (Se esiste) e sono valorizzati in uscita UTCTime e Dl con i dati relativi. Se nessun record presente viene attivato Fault.

Attivando Delete il primo record inserito nel FIFO (Se esiste) viene rimosso dal registro. Se nessun record presente viene attivato Fault.

L'uscita DataOn se attiva indica la presenza di almeno un record nel registro FIFO. In FIFOSpace viene ritornato lo spazio disponibile, dati di dimensione inferiore o uguale possono essere inseriti nel registro. L'uscita Ok si attiva per un loop di programma ad ogni esecuzione di un comando se l'esecuzione ha esito positivo. In caso di errore esecuzione viene attivata per un loop l'uscita Fault.

Function block
CODESYS: Non disponibile
LogicLab: eLLabLogLib

In (BOOL) Comando di inserimento record nel registro FIFO.

Out (BOOL) Comando di lettura record dal registro FIFO. Se Dp=eNULL e/o Dls=0 sono valorizzati in uscita UTCTime e Dl con i dati del record nel registro (Se esiste). Se il registro è vuoto Dl viene ritornato con valore 0.

Delete (BOOL) Comando di cancellazione record dal registro FIFO.

FIFOIDx (@UDINT) Pointer alla variabile indici registro FIFO (Deve essere un array di 2 UDINT). Se definito NULL sono utilizzati indici all'interno del FB, in questo caso non sono mantenuti i dati nel registro FIFO allo spegnimento del sistema.

FIFOFilename (@STRING) Percorso e nome del file in cui memorizzare i dati del registro FIFO (es.: 'C:/FIFO.bin'). Se definito NULL viene utilizzata memoria (RMalloc) per memorizzare i dati nel registro FIF, in questo caso non sono mantenuti i dati nel registro FIFO allo spegnimento del sistema.

FIFOSize (UDINT) Lunghezza massima del registro FIFO. Se definito file di appoggio sarà la dimensione massima del file, se si utilizza memoria è la dimensione del buffer di memoria allocato, in questo caso si consiglia di non superare 8Kb.

Dp (@eVOID) Pointer al buffer dati sia ingresso che in uscita dal FIFO.

Dls (UDINT) Lunghezza record dati in ingresso al FIFO. Dimensione buffer dati in uscita dal FIFO.

Ok (BOOL) Attivo per un loop se comando riuscito.

Fault (BOOL) Attivo per un loop su errore esecuzione comando.

DataOn (BOOL) Attivo se almeno un record dati è presente nel registro FIFO.

FIFOSpace (UDINT) Spazio disponibile nel registro FIFO.

UTCTime (UDINT) Data/Ora in UTC di inserimento record nel FIFO.

Dl (UDINT) Lunghezza record letto da FIFO.

Errori

In caso di errore si attiva l'uscita Fault, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Esempi

Come utilizzare gli esempi.

ST_FIFOFile_v1: Viene dimostrato l'utilizzo del registro FIFO, forzando da debug la variabile In viene inserito nel registro FIFO un record del tipo "Counter=1234". Forzando da debug la variabile Out viene estratto dal registro FIFO il primo record inserito che viene poi eliminato. Se si desidera mantenere i dati nel registro FIFO anche allo spegnimento del sistema la variabile FIFOIDx và dichiarata RETAIN.

ST_FIFO_DataLog: Si utilizza un registro FIFO in memoria per salvare records di log. Quando i records occupano più della metà del registro o comunque ogni tempo definito, vengono letti dal FIFO e accodati in un file su disco. Il vantaggio di utilizzare un FIFO di appoggio permette di storicizzare velocemente i dati in memoria e non stressare i disco con continue scritture di records.

LogicLab (Ptp136)
PROGRAM ST_FIFOFile_v1
VAR
    In : BOOL; (* Insert record on FIFO *)
    Out : BOOL; (* Extract record from FIFO *)
    i : UDINT; (* Auxiliary variable *)
    FIFO : FIFOFile_v1; (* FIFO file FB instance *)
    Counter : UDINT; (* Counter *)
    FIFOIDx : ARRAY[0..1] OF UDINT; (* FIFO indexes *)
    FIFOIn : STRING[ 32 ]; (* FIFO data Input *)
    FIFOOut : STRING[ 32 ]; (* FIFO data Output *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_FIFOFile_v1"
// *****************************************************************************
// By setting In command a record is inserted on the FIFO register. By setting
// Out command if present a record is extracted from the FIFO register.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Execute program initialization.

    IF (SysFirstLoop) THEN
        FIFO.FIFOFilename:=ADR('C:/FIFO.bin'); //Filename
        FIFO.FIFOIDx:=ADR(FIFOIDx); //FIFO indexes
        FIFO.FIFOSize:=10000; //FIFO register size

        // Wear leveling, if the two indexes have the same value delete
        // the FIFO file. I'll be created in a new disk position.

        IF (SysGetFileLen(ADR('C:/FIFO.bin')) <> -1) THEN
            IF (FIFOIDx[0] = FIFOIDx[1]) THEN i:=SysFileRemove(ADR('C:/FIFO.bin')); FIFOIDx[0]:=0; FIFOIDx[1]:=0; END_IF;
        END_IF;
    END_IF;

    // -------------------------------------------------------------------------
    // EXECUTE FIFO REGISTER
    // -------------------------------------------------------------------------
    // Execute FIFO register, this is not needed, but can be useful to manage
    // the output variables.

    FIFO(); //FIFO file FB instance

    // -------------------------------------------------------------------------
    // INSERT DATA ON FIFO REGISTER
    // -------------------------------------------------------------------------
    // If In command is set counter is increased and its value stored on FIFO.

    IF (In) THEN
        In:=FALSE; //Insert record on FIFO

        // Increase the counter and add value to FIFO.

        Counter:=Counter+1; //Counter
        i:=SysVsnprintf(ADR(FIFOIn), SIZEOF(FIFOIn), ADR('Counter=%d'), UDINT_TYPE, ADR(Counter));
        FIFO(In:=TRUE, Dp:=ADR(FIFOIn), Dls:=LEN(FIFOIn)); //Write record on FIFO
    END_IF;

    // -------------------------------------------------------------------------
    // EXTRACT DATA FROM FIFO REGISTER
    // -------------------------------------------------------------------------
    // If Out command is set a record is extracted from FIFO register.

    IF (Out AND FIFO.DataOn) THEN
        Out:=FALSE; //Extract record from FIFO

        FIFO(Out:=TRUE, Dp:=ADR(FIFOOut), Dls:=SIZEOF(FIFOOut)); //Read record from FIFO
        FIFO(Delete:=TRUE); //Delete record from FIFO
    END_IF;

// [End of file]
LogicLab (Ptp136)

Ti è stato utile questo articolo ?