Datalogger con memorizzazione dati su SDCard

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

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

Questo argomento contiene 3 risposte, ha 2 partecipanti, ed è stato aggiornato da  Sergio Bertana 6 mesi, 1 settimana fa.

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #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 vedendo 4 articoli - dal 1 a 4 (di 4 totali)

Devi essere loggato per rispondere a questa discussione.