Realizzare una FB per lettura cella da file CSV
Home › Forum › Programmazione IEC 61131 (LogicLab) › Realizzare una FB per lettura cella da file CSV
- Questo topic ha 11 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 7 mesi fa da
Sergio Bertana.
-
AutorePost
-
Marzo 12, 2016 alle 9:01 am #35971
Prisco
PartecipanteHo 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.
Marzo 12, 2016 alle 9:07 am #39451Sergio Bertana
Amministratore del forumQuello 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,9Utilizzando 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).
Marzo 12, 2016 alle 10:26 pm #39452Prisco
PartecipanteGrazie 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.
Marzo 13, 2016 alle 10:38 am #39453Sergio Bertana
Amministratore del forumHo 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.
Maggio 17, 2016 alle 10:10 am #39581Prisco
PartecipanteI 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.
Maggio 17, 2016 alle 10:28 am #39582Sergio Bertana
Amministratore del forumCome 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).
Maggio 21, 2016 alle 12:03 pm #39586Prisco
PartecipanteHo 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.
Maggio 23, 2016 alle 6:29 am #39587Sergio Bertana
Amministratore del forumIntanto 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.
Settembre 6, 2019 alle 9:58 am #49538Stefano
PartecipanteAnch’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.
Settembre 6, 2019 alle 10:12 am #49550Sergio Bertana
Amministratore del forumIntanto 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;
Settembre 11, 2019 alle 6:11 am #49583Stefano
PartecipanteNon 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.Settembre 11, 2019 alle 6:12 am #49585Sergio Bertana
Amministratore del forumTutto chiaro…
Il simulatore su PC non gestisce l’acceso al file system. Per eseguire la scrittura su file occorre disporre fisicamente del PLC. -
AutorePost
- Devi essere connesso per rispondere a questo topic.