Vai al contenuto

Datalogger con memorizzazione dati su SDCard

Home Forum Programmazione IEC 61131 (LogicLab) Datalogger con memorizzazione dati su SDCard

  • Il topic è vuoto.
Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #46652
    domenico.romano
    Partecipante

    Ho la necessità di effettuare la scrittura dei valori riportati da sonde di pressione collegati in 4-20mA al modulo di I/O . I valori dovrebbero venire campionati ogni 100ms e memorizzati su file csv giornaliero nominati con la data di riferimento. Inoltre tali file dovrebbero essere raggiungibili tramite l’FTP server del PLC.

    Purtroppo sono ancora a digiuno con la programmazione e sono a chiedervi quale possa essere il programma dimostrativo che più si avvicina alle mie esigenze.

    #46654
    Sergio Bertana
    Amministratore del forum

    In questo topic trovi alcune informazioni e links verso altri topics utili. Ma in merito al tuo problema, ipotizzando di salvare ogni 100 mS un record del tipo HH/MM/SS,m VV.VVV; avresti una 20 di caratteri ad ogni salvataggio che ammontano a 200 al secondo 720Kbytes all’ora oltre 17Mb al giorno.

    Per evitare di avere file troppo grandi ti consiglierei di creare un file per ogni ora e magari di mettere nel file solo i dati nominando il file con il valore di ora. Ad esempio nel programma SimplyLogger (Stampa) è stato fatto qualcosa di molto simile a quello che ti serve (Download programma).

    #46661
    domenico.romano
    Partecipante

    Grazie mille Sergio, al momento sto cercando una soluzione invece per scrivere l’orario nel formato hh:mm:ss.msec ma non riesco a trovare  alcuna variabile di sistema che abbia i msec implementati e mi risulta macchinoso tirarli giu da SysGetSysTime. Mi sto perdendo una soluzione piu semplice ?

    #46665
    Sergio Bertana
    Amministratore del forum

    Questo programma può essere un suggerimento

    VAR
    EpochTime : UDINT; (* Epoch time *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    Milliseconds : UDINT; (* Tempo in mS *)
    TimeDf : UDINT; (* Time difference (uS) *)
    TimeSetup : BOOL; (* Setup time *)
    END_VAR
    
    IF (TimeSetup) THEN
    TimeSetup:=FALSE; //Setup time
    EpochTime:=SysDateTime; //Time reference (Epoch)
    TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
    Milliseconds:=0; //Tempo in mS
    END_IF;
    
    TimeDf:=SysGetSysTime(TRUE)-TimeBf; //Time difference (uS)
    IF (TimeDf >= 1000) THEN
    TimeBf:=SysGetSysTime(FALSE)-(TimeDf-1000); //Time buffer (uS)
    Milliseconds:=Milliseconds+1; //Tempo in mS
    
    IF (Milliseconds >= 1000) THEN
    Milliseconds:=Milliseconds-1000; //Tempo in mS
    EpochTime:=EpochTime+1; //Time reference (Epoch)
    END_IF;
    END_IF;

    Su comando TimeSetup setto EpochTime con tempo di sistema (Ma potrei sincronizzarlo ad esempio con un server NTP) e poi ogni 1 mS incremento il valore di Milliseconds ed ogni secondo il valore di EpochTime. Nota la riga:

    TimeBf:=SysGetSysTime(FALSE)-(TimeDf-1000);

    La chiamata SysGetSysTime(FALSE) ritorna lo stesso valore ritornato alla precedente chiamata SysGetSysTime(TRUE), eseguendo la differenza (TimeDf-1000) tengo conto dell’errore sul controllo del tempo per compensare il tempo di jitter sulla esecuzione del programma (Download programma mSecTime).

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