StringToLogFile, salva stringa in un file di log

  1. Home
  2. Knowledge Base
  3. Manualistica
  4. Programmazione IEC 61131-3
  5. Gestione storicizzazione dati
  6. StringToLogFile, salva stringa in un file di log

Questo blocco funzione effettua la scrittura di una stringa in un file su disco, ogni riga viene terminata con CR-LF. Il FB ha esecuzione atomica, può essere eseguito come una funzione.

Eseguendo il FB viene salvata su disco la stringa puntata da LData, eseguito il salvataggio, viene attivata per un loop l'uscita Done. In caso di errore esecuzione viene attivata per un loop l'uscita Fault. Il FB ha due modi di funzionamento in funzione del parametro RIndex.

RIndex:=eNULL (Accodamento): La scrittura avviene accodando la stringa (Cui viene aggiunto CR-LF) al contenuto del file. Al raggiungimento della dimensione definita in FSize non viene più effettuata la scrittura segnalando errore.

RIndex:=ADR(Buffer) (Circolare): La scrittura avviene scrivendo la stringa (Cui viene aggiunto un numero di spazi per raggiungere la lunghezza definita in RLength seguiti da CR-LF) nella posizione indicata nel buffer puntato da RIndex. Al raggiungimento della dimensione definita in FSize si riprende a salvare dall'inizio del file sovrascrivendo le righe già presenti.

Function block
CODESYS: Non disponibile
LogicLab: eLLabLogLib

LData (@STRING) Puntatore a stringa da scrivere nel file.

RLength (UDINT) Se modalità circolare (RIndex <> eNULL) definisce il numero massimo di caratteri per ogni riga, se stringa più lunga viene troncata.

Filename (@STRING) Percorso e nome del file in cui è eseguita la scrittura (es.: 'C:/MyFile.txt').

FSize (UDINT) Dimensione massima del file. Se modalità accodamento raggiunta la dimensione non viene più eseguita scrittura. Se modalità circolare raggiunta la dimensione si riparte a scrivere dall'inizio.

RIndex (@UDINT) Pointer alla variabile usata per memorizzare posizione di scrittura nel file. Se si desidera mentenere la posizione allo spegnimento definire variabile RETAIN.

Done (BOOL) Attivo per un loop se la scrittura nel file è riuscita.

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

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_StringToLogFile_v2: Viene dimostrato l'utilizzo del FB per salvare acquisizioni analogiche in un file csv. Ogni tempo definito 2 valori analogici sono scritti in un file csv, ogni riga del file inizia con la data e l'ora di acquisizione seguita dai valori acquisiti.

ST_MontlyLog: Attivando da debug le variabili ELog[x] viene scritto un record di log in un file. Ogni scrittura è accodata alla scrittura precedente.

DataLoggerOnCSVFile: Ogni 5 minuti viene eseguita la scrittura di un record di dati in un file CSV. Il file potrà essere così facilmente importato in Excel per un esame dei dati.

LogicLab (Ptp136)
PROGRAM ST_StringToLogFile_v2
VAR
    i : UDINT; (* Auxiliary variable *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    AInput : ARRAY[0..1] OF SysGetAnInp; (* Analog input acquisistion *)
    DateTime : SysETimeToDate; (* Epoch to date *)
    Logger : StringToLogFile_v2; (* Data logger *)
    AStr : STRING[ 64 ]; (* Auxiliary string *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_StringToLogFile_v2"
// *****************************************************************************
// At every defined time two analog inputs are readed and their values stored
// into a row of a csv file. Every row is started with the sample data and time.
//
// Following some row of the written file.
//
// 17/02/2020; 17:31:46; 2.785; 2.782
// 17/02/2020; 17:31:50; 5.856; 5.802
// 17/02/2020; 17:31:55; 5.110; 5.101
// -----------------------------------------------------------------------------

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

    IF (SysFirstLoop) THEN
        AInput[0].Address:=0; //Module address
        AInput[0].Channel:=0; //Input channel
        AInput[0].Mode:=AD_VOLT_0_10_COMMON; //Acquisition mode

        AInput[1].Address:=0; //Module address
        AInput[1].Channel:=1; //Input channel
        AInput[1].Mode:=AD_VOLT_0_10_COMMON; //Acquisition mode

        Logger.Filename:=ADR('C:/Log.csv'); //Log file
        Logger.FSize:=10000; //File size
        Logger.RIndex:=NULL; //Row index buffer

        TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
    END_IF;

    // -------------------------------------------------------------------------
    // DATA SAMPLE
    // -------------------------------------------------------------------------
    // Data acquisition.

    FOR i:=0 TO 1 DO AInput[i](); END_FOR;

    // Every defined time the analog inputs are sampled and a new record is
    // stored on the log file.

    IF ((SysGetSysTime(TRUE)-TimeBf) < 5000000) THEN RETURN; END_IF;
    TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)

    // -------------------------------------------------------------------------
    // CREATE LOG RECORD
    // -------------------------------------------------------------------------
    // Data are stored in a CSV file, first two columns contain sample time. The
    // following columns contain data sampled.
    // DD/MM/YYYY; HH:MM:SS; Value; Value.

    DateTime(EpochTime:=SysDateTime);//Local Date/Time

    i:=SysVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%02d/'), USINT_TYPE, ADR(DateTime.Day));
    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%02d/'), USINT_TYPE, ADR(DateTime.Month));
    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%04d; '), UINT_TYPE, ADR(DateTime.Year));

    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%02d:'), USINT_TYPE, ADR(DateTime.Hour));
    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%02d:'), USINT_TYPE, ADR(DateTime.Minute));
    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%02d; '), USINT_TYPE, ADR(DateTime.Second));

    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%05.3f; '), REAL_TYPE, ADR(AInput[0].Value));
    i:=SysCVsnprintf(ADR(AStr), SIZEOF(AStr), ADR('%05.3f'), REAL_TYPE, ADR(AInput[1].Value));

    Logger(LData:=ADR(AStr)); //Write data to file

// [End of file]
LogicLab (Ptp136)
LogicLab (Ptp181)

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 31 Dicembre 2020