Vai al contenuto

Gestione registro FIFO per log dati

Home Forum Programmazione IEC 61131 (LogicLab) Gestione registro FIFO per log dati

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Autore
    Post
  • #35785
    Marcelo
    Partecipante

    Mi collego al mio precedente topic aggiungendo una ulteriore necessità, come già espresso dovrei gestire l’acquisizione di dati da linea di produzione, per l’acquisizione utilizzo un modulo CPU master connesso in rete RS485 Modbus con diversi moduli CPU compact. La CPU master a sua volta è interrogata da un PC di supervisione che acquisisce records con tutti i dati della linea ad intervalli regolari per storicizzarli in un database centrale.

    Ora il mio problema è gestire un registro FIFO sulla CPU master in modo da memorizzare al suo interno i dati di produzione per passarli poi su richiesta al PC di supervisione. In questo modo potrei garantire il log dei dati anche in assenza della connessione con il PC di supervisione. Al ripristino della connessione, il PC di supervisione potrà interrogare il registro FIFO leggendo tutti i records memorizzati al suo interno.

    Per mantenere un elevato numero di records pensavo di utilizzare come registro FIFO un file su SDCard. Chiedevo se avete già affrontato qualcosa di simile e se esiste un qualche esempio da cui trarre ispirazione.

    #38908
    Sergio Bertana
    Amministratore del forum

    Ho aggiunto un FB apposito nella nuova versione della libreria eLogLib_B100, come si vede dalla documentazione (Estratto manuale) il FB FIFOFile, gestisce un registro FIFO su file.

    Nel programma di esempio (Vedi stampa) è gestito l’inserimento e lettura dal registro FIFO appoggiato sul file Storage/FIFO.bin di un record dati di tipo RECORDDATASTRUCT. Il record dati si compone di una stringa in cui viene riportata la data e l’ora nel formato “14/05/15 12.24.04” e due campi REAL il cui valore viene simulato nel programma.

    Ad ogni attivazione dell’ingresso Di00 sul modulo CPU si ha l’inserimento di un record nel registro FIFO ed il valore di NrOfRecs viene incrementato. Ad ogni attivazione dell’ingresso Di01 sul modulo CPU si ha la lettura di un record dal registro FIFO ed il valore di NrOfRecs viene decrementato.

    Ho limitato la dimensione del file FIFO a 50 Kb (Con records da 32 bytes potrà contenere oltre 1500 records). Naturalmente è possibile aumentare la dimensione del file a piacere (Download programma sorgente).

    #58948
    Rubox
    Partecipante

    Riesumo un vecchio post sull’utilizzo del FIFOFile_v1. Ho aggiornato da XTarget12 a XUnified, creo un progetto nuovo per XUnified, inserisco un blocco FIFOFile_v1 da libreria eLLabLogLib_B400 (l’ultima disponibile) e mi da in compilazione il seguente errore, solo con la dichiarazione della variabile:

     FIFOFile_v1(195) - errore S1305: Sysfopen => Funzione sconosciuta

    Dove sbaglio?

    #58955
    Sergio Bertana
    Amministratore del forum

    Non sbagli, ci sismo dimenticati di pubblicare sul sito per il download l’ultima versione della libreria eLLabLogLib. Ho provveduto a farlo quindi basterà scaricare la nuova versione di libreria ed importare il FB.

    #63377
    Rubox
    Partecipante

    Uso un registro FIFO per salvare una stringa di dati da inviare tramite HTTP al server. Quando la trasmissione è andata a buon fine cancello il record dal FIFO.

    Ho definito la dimensione del file su cui appoggiare il FIFO: se ho ben capito quando il file ha raggiunto la dimensione massima, il FIFO tramite gli indici in FIFOIDx ricomincia a scrivere da zero?

    Cosa succede quando il file è pieno? I dati vecchi vengono sovrascritti? Oppure il FB smette di inserire i valori nel FIFO?

    Perché mi son ritrovato con il file alla dimensione massima, ma senza più dati presenti dentro, e il sistema non s’è riavviato.

    Non capisco dove sbaglio come logica di funzionamento.

    #63389
    Sergio Bertana
    Amministratore del forum

    Se non vi è più spazio nel file o nella memoria allocata per il registro FIFO il record non viene più inserito.

    Su comando In il record viene inserito solo se lo spazio è sufficente FIFOSpace maggiore/uguale a dimensione record.

    Sono i due indici a tenere traccia delle posizioni di scrittura e lettura dati non conta la dimensione del file, siccome il file non viene mai cancellato dopo un po che il FIFO  lavora ti troverai un file esattamente grande come la dimensione definita in FIFOSize.

    I dati nel file continuano ad essere scritti in modo circolare (Raggiunta la fine si riparte dall’inizio). In questo modo si continua ad usare nuovi settori sul disco evitandone lo stress.

    Ti ricordo l’utility FIFOViewer che ti permette di visualizzare i dati inseriti nel registro FIFO.

    Venendo alla tua domanda non capisco quando dici che il file aveva dimensione massima ma senza dati dentro. Vuoi dire che non era attivo DataOn e che FIFOSpace è uguale a FIFOSize.

    #63392
    Rubox
    Partecipante

    Mi sono ritrovato con DataOn con valore false, FIFOSize a 100.000 come è definito nel programma e FIFOSpace a 252. I record che inserisco nel FIFO sono lunghi 300, quindi non trovando più spazio non sono stati scritti (gli indici FIFOIdx erano differenti). Stavo per scaricare il file del FIFO e controllare altri valori quando chi era in remoto ha tolgo e rimesso alimentazione, impedendomi di vedere i vari valori di debug.

    Ho aumentato la dimensione del file FIFO e adesso mi “punto la sveglia”: quando la dimensione del file sarà quasi quella massima mi collego al PLC e controllo i valori di indici e tutto il resto.

    Per i valori mancanti li ho caricati con un piccolo script nel DB del server dai file di log presenti sulla SD del PLC.

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Devi essere connesso per rispondere a questo topic.