Vai al contenuto

Realizzare una FB per lettura cella da file CSV

Home Forum Programmazione IEC 61131 (LogicLab) Realizzare una FB per lettura cella da file CSV

Stai visualizzando 12 post - dal 1 a 12 (di 12 totali)
  • Autore
    Post
  • #35971
    Prisco
    Partecipante

    Ho una SlimLine MPS046B100, volevo sapere se era possibile leggere un file excel da SD Card. Se si potreste farmi un esempio in linguaggio ST, per esempio leggere il contenuto della terza riga, seconda colonna.

    #39451
    Sergio Bertana
    Amministratore del forum

    Quello che cerchi lo puoi realizzare partendo dal FB di esempio FindTAGOnFile che  trovi nel programma postato in questo topic.

    Ma avendo stamattina un pò di tempo a disposizione e per dare a tutti gli utenti del forum un esempio di come utilizare l’ambiente LogicLab e le funzioni ed FB di supporto ho realizzato il programma CSVFileReader che contiene il blocco funzione RdCellFromCSV che permette di leggere una specifica cella (Indicata da riga e colonna) da un file CSV. Ammettendo di avere un file Data.csv caricato nella cartella Storage (Il file si può caricare con una connessione FTP, Topic) che contiene:

    1,2,3
    4,5,6
    7,8,9

    Utilizzando il FB RdCellFromCSV ed indicando Row=1, Column=2 il FB ritornerà il valore 6. Ricordo che la numerazione delle righe e  delle colonne parte da 0. Come si vede dalla stampa del FB ho inserito la gestione dello spionaggio (Topic) che permette da telnet di controllarne il funzionamento (Download programma).

    #39452
    Prisco
    Partecipante

    Grazie per l’esempio,ma non ho capito quale è la variabile dove mi viene restituito il valore letto e in che formato. Per la mia applicazione io invio da PC file CSV contenenti solo numeri.

    #39453
    Sergio Bertana
    Amministratore del forum

    Ho inserito i sorgenti nel programma proprio per permettere a tutti di comprenderne il funzionamento e poter modificare il FB secondo le proprie necessità. Quindi non ho realizzato un manuale dedicato al FB.

    Come vedi dal programma LD del progetto al FB si passa la variabile CBAddress in cui occorre fornire l’indirizzo di una stringa dove l’FB appoggerà il valore letto dalla cella CSV (L’FB ritorna sempre stringhe). Siccome l’FB copia il contenuto della cella nella stringa per evitare che se la cella contiene un valore più lungo della stringa di appoggio si vada a sporcare locazioni contigue in CBLength occorre passarne la dimensione.

    Ora aggiungo che siccome l’FB ritorna sempre stringhe anche se il tuo file CSV contiene numeri, i numeri sono comunque scritti in formato stringa, per ricavare da una stringa il numero si utilizza la funzione SysVarsscanf.

    #39581
    Prisco
    Partecipante

    I file CSV che devo caricare sono 11, posso usare la cartella Storage o devo inserire una SD ? La dimensione dei file può variare a secondo delle righe inserite.

    #39582
    Sergio Bertana
    Amministratore del forum

    Come vedi in questo topic, è possibile formattare le cartelle per avere fino ad un massimo di 64 files ciascuna. Devi tenere presente però che l’area totale a disposizione viene equamente divisa per il numero di files che indichi in fase di formattazione.

    Quindi nel tuo caso se formatti (Topic) la cartella Storage con 11 files avrai dei files con dimensione massima di 24Kb (270 Kb/11).

    #39586
    Prisco
    Partecipante

    Ho inserito l’FB ma non funziona, ho attivato la modalità Spy e dal Telnet mi dice che non è attiva. Quindi ho inserito una variabile che mi restituisce un numero per vedere dove si blocca l’FB. Si ferma su FILE non trovato ma il file c’e.  Poi ho ceato un nuovo progetto e ho inserito solo la funzione Sysfopen e la funzione SysGetLastErr.

    Fp:=Sysfopen(‘Storage/sequenza.csv’, ‘r’);

    L’errore restituito è : 9996200 Impossibile utilizzare porta da programma utente

    Posto anche il richiamo del FB ReadCsv

    RdCellFromCSV.SpyOn := TRUE;
    RdCellFromCSV.Filename := ‘Storage/sequenza.csv’;
    RdCellFromCSV.CBLength := 10;
    RdCellFromCSV.Row := to_usint(num_riga_da_leg_seq_man);
    RdCellFromCSV.Column := 0;
    RdCellFromCSV.CBAddress := ADR(valore_letto);
    RdCellFromCSV();
    STATO_CONVERSIONE := SysVarsscanf(ADR(valore_letto), ‘%u’, UDINT_TYPE, ADR(durata_sequenza));

    Hho modificato l’FB per avere una lettura ciclica quindi l’enable l’ho eliminato.

    #39587
    Sergio Bertana
    Amministratore del forum

    Intanto chiariamo l’errore 9996200, questo errore indica che non ci sono più risorse disponibili per il programma. Se vuoi provare ad aprire il file con una Sysfopen lo devi poi richiudere con una Sysfclose, altrimenti consumi tutte le risorse. NB. Ricordati che il nome del file e case sensitive, quindi se il file esiste ed è scritto correttamente la

    Fp:=Sysfopen(‘Storage/sequenza.csv’, ‘r’);

    Deve ritornare un valore.

    Mi dici che hai eliminato l’enable. Ma se non dai enable l’FB non si attiva ed il fatto che lo Spy dice non attivo stà ad indicare proprio che manca l’abilitazione.

    Se vuoi eseguire una lettura ciclica devi abilitare l’Enable, attendere il Done e poi disabilitare l’enable. Per una nuova abilitazione devi riattivare l’Enable e cos’ via.

    #49538
    Stefano
    Partecipante

    Anch’io sto tentando di utilizzare i comandi Sysfopen, Sysfwrite e Sysfclose ma non funziona.

    L’intento è quello si salvare in un piccolo file di testo  nella directory Storage del PLC, le variabili impostate dal pannello di controllo per poterli rileggere e risettare le variabili in caso di riavvio fisico del PLC. Ho usato questo codice:

    Filename='Storage/settings.txt';
    IF (Fp = NULL) THEN
        Fp:=Sysfopen(Filename, 'rw'); (* open file pointers *)
    END_IF;
    IF (Fp <> NULL) THEN
        TxChars:=Sysfwrite(ADR(Parameter), 32, 1, Fp); (* write data to file *)
        Fp:=Sysfclose(Fp);
    END_IF;

    Ma non crea ne scrive nulla.

    #49550
    Sergio Bertana
    Amministratore del forum

    Intanto eseguendo l’apertura in ‘rw’ se nella cartella “Storage” non hai il file presente il file non viene creato. Se vuoi che venga creato devi eseguire l’apertura in ‘a’.

    Poi devi accertarti che la cartella “Storage” esista e che vi si possa scrivere all’interno (Collegati in FTP e prova a copiare un file e poi lo cancelli, eventualmente cerca nel forum come eseguire la formattazione del disco (Vedi topic, topic).

    Ecco un programma di esempio, attivando da debug la variabile WCommand viene seguita la scrittura di una riga nel file.

    VAR
        WCommand : BOOL; (* Write command *)
        i : DINT; (* Auxiliary variable *)
        Line : USINT; (* Line counter *)
        Filename : STRING[ 32 ]; (* Nome file *)
        Fp : FILEP; (* File pointer *)
        WrBuffer : STRING[ 32 ]; (* Write buffer *)
    END_VAR
    
    IF (WCommand) THEN
        WCommand:=FALSE; //Write command
        Filename:='Storage/settings.txt'; //Nome file
    
        // Apro file e se file aperto eseguo scrittura.
    
        IF (Fp = NULL) THEN Fp:=Sysfopen(Filename, 'a'); END_IF;
        IF (Fp <> NULL) THEN
            Line:=Line+1; //Line counter
            i:=SysVarfprintf(Fp, 'Line: %d$r$n', USINT_TYPE, ADR(Line));
            Fp:=Sysfclose(Fp);
        END_IF;
    END_IF;
    #49583
    Stefano
    Partecipante

    Non ho ancora potuto provare sul PLC, ma solo in simulazione. Non crea il file ne scrive nulla eppure i diritti in scrittura li ho.
    Mi propongo di provare direttamente sul PLC eventualmente formattando. Per il momento ringrazio.

    #49585
    Sergio Bertana
    Amministratore del forum

    Tutto chiaro…
    Il simulatore su PC non gestisce l’acceso al file system. Per eseguire la scrittura su file occorre disporre fisicamente del PLC.

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