Datalogger con memorizzazione dati su SDCard
Home › Forum › Programmazione IEC 61131 (LogicLab) › Datalogger con memorizzazione dati su SDCard
- Il topic è vuoto.
-
AutorePost
-
Febbraio 12, 2019 alle 9:40 am #46652
domenico.romano
PartecipanteHo 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.
Febbraio 12, 2019 alle 10:08 am #46654Sergio Bertana
Amministratore del forumIn 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).
Febbraio 15, 2019 alle 7:20 am #46661domenico.romano
PartecipanteGrazie 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 ?
Febbraio 15, 2019 alle 7:38 am #46665Sergio Bertana
Amministratore del forumQuesto 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).
-
AutorePost
- Devi essere connesso per rispondere a questo topic.