TravelMen Inserito: 30 settembre 2021 Segnala Share Inserito: 30 settembre 2021 (modificato) Ciao a Tutti ho un piccolo "fastidio", non riesco a ripulire una variabile stringa in un DB, riporto di seguito la parte di codice che sto provando: ho provato anche con #DECODE[_Field]."STRING" := ''; ma niente da fare, la stringa mantiene i caratteri scritti in precedenza. Alcune info in più TIA v16 update3 DB Ottimizzata Dimenticavo S7-1500 1511-1PN Saluti Modificato: 30 settembre 2021 da TravelMen Link al commento Condividi su altri siti More sharing options...
batta Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 Parli di stringhe ma, nell'esempio, io vedo solo array di char. Poi vedo che stai scrivendo una stringa all'interno di ogni carattere. La quale stringa, inoltre, non dichiarando la dimensione, assume la dimensione di default di 254 caratteri. Sempre che non mi sfugga qualcosa. Per svuotare una strinda dovrebbe bastare scrivere: myString := ''; (apice apice) Per ripulire uno ad uno i caratteri dell'array, nel ciclo FOR, ti basta anche lì scrivere '' (sempre apice apice) al posto di EMPTY_STRING. Link al commento Condividi su altri siti More sharing options...
leleviola Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 non vorrei dire una castroneria, scusate l'intromissione, sto lavorando molto con le stringhe ultimamente derivanti dalla lettura di QRcode e quando il lettore ottico non mi legge e non ho risultato metto tutti zero nelle stringhe ASCII così che mi compare un codice alfanumerico vuoto, forse dico qualcosa di sbagliato e si tratta di un'altra metodologia di dati e non va bene, non ho controllato ma nel mio caso è così, preciso che non sto lavorando su un Siemens ma la codifica alfanumerica o dei cartteri dovrebbe essere analoga o identica Link al commento Condividi su altri siti More sharing options...
seragno Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 36 minuti fa, batta ha scritto: Parli di stringhe ma, nell'esempio, io vedo solo array di char. Per me invece è corretto, è un array di strutture il cui primo elemento "STRING" è appunto una stringa. Comunque questa gif che avevo scaricato dal forum della Siemens, aiuta secondo me a capire quello che succede quando si trattano stringhe e caratteri: : Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 30 settembre 2021 Autore Segnala Share Inserita: 30 settembre 2021 Ciao Batta ma da dove hai ricavato questa affermazione? Quote Parli di stringhe ma, nell'esempio, io vedo solo array di char L'array è un array con due campi uno stringa ed uno numerico, e nella funzione passo l'array e vedo quanti capi ha. Quote myString := ''; (apice apice) che è quello che mi sarei aspettato anche io ma questo non succede, ti riporto quello che succede. Partiamo da questa situazione: come si vede c'è una a al nella stringa, ecco come appare dopo l'esecuzione della funzione come si può notare la a è rimasta. Saluti Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 30 settembre 2021 Autore Segnala Share Inserita: 30 settembre 2021 (modificato) Ciao seragno Il secondo byte della stringa indica il numero di caratteri "validi" o "visibili" quando si visualizza la stringa su HMI. Ma perché se prendo una stringa (di pari lunghezza) la funzione azzera solamente il secondo byte? Saluti Modificato: 30 settembre 2021 da TravelMen Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 30 settembre 2021 Autore Segnala Share Inserita: 30 settembre 2021 56 minuti fa, leleviola ha scritto: non vorrei dire una castroneria, scusate l'intromissione, sto lavorando molto con le stringhe ultimamente derivanti dalla lettura di QRcode e quando il lettore ottico non mi legge e non ho risultato metto tutti zero nelle stringhe ASCII così che mi compare un codice alfanumerico vuoto, forse dico qualcosa di sbagliato e si tratta di un'altra metodologia di dati e non va bene, non ho controllato ma nel mio caso è così, preciso che non sto lavorando su un Siemens ma la codifica alfanumerica o dei cartteri dovrebbe essere analoga o identica Ciao, la parte di funzione è appunto una decodifica dell'array di caratteri ricevuti da una dataloig Power scan. La funzione l'avevo sviluppata per S7-300, ed ora l'ho convertita per il 1500/1200, sfruttando diverse migliorie del 1500 per rendere la funzione più flessibile. Se ho interpretato correttamente quello che hai scritto, e quello che vorrei fare io, con l'unica differenza che io ogni volta che decodifico le informazioni contenute nel QRCode vorrei azzerare quelle precedenti. Saluti Link al commento Condividi su altri siti More sharing options...
seragno Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 Potresti provare ad utilizzare la funzione DELETE. Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 30 settembre 2021 Autore Segnala Share Inserita: 30 settembre 2021 25 minuti fa, seragno ha scritto: Potresti provare ad utilizzare la funzione DELETE Grazie per il suggerimento, ma non funziona la 'a' rimane nella stringa, me ne faccio una ragione e per il momento lascio così. Vorrei precisare che in visualizzazione si vede correttamente senza la a, ne deduco che tutte queste operazioni vanno solo a mettere il secondo byte a zero. Saluti Link al commento Condividi su altri siti More sharing options...
batta Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 (modificato) 1 ora fa, TravelMen ha scritto: L'array è un array con due campi uno stringa ed uno numerico Ok, l'array "DECODIFICATION", che però non vedo dove viene usato. Come avevo scritto: sempre che non mi sfugga qualcosa. Il codice dovrebbe essere corretto. Ma "EMPTY_STRYNG", dichiarata nelle costanti, io vedo il valore in grigetto, non in nero. Come se alla costante non fosse stato assegnato nessun valore. Se non si scrive nulla, dovrebbe prendere zero per la costanti numeriche, e la stringa vuota nel tuo caso. Non credo proprio che il problema sia lì, ma sempre meglio impostare esplicitamente ''. Potresti anche eliminare la costante EMPTY_STRING e scrivere, nel ciclo FOR, semplicemete ''. Ma hi già detto che ottieni lo stesso risultato. Comunque, ho provato con un codice praticamente identico e, come è ragionevole aspettarsi, funziona. IF #decode THEN FOR #i := 0 TO 7 DO #myArray[#i].myString := #kEmptyString; #myArray[#i].myReal := 0.0; END_FOR; #decode := FALSE; END_IF; Sicuro di non andare a scrivere successivamente qulcos'altro nelle stringhe? Il risultato è sempre lo stesso, o le stringhe assumono valori diversi? Per finire, a meno che tu non abbia bisogno di tutti i 254 caratteri, che è la massima lunghezza della stringa (ed è il valore che assume di default se non specifichi la dimensione), meglio dichiarare le dimensioni delle stringhe, inserendo il numero di caratteri tra parentesi quadre nella dichiarazione della variabile. Quote Ma perché se prendo una stringa (di pari lunghezza) la funzione azzera solamente il secondo byte? Perché il primo byte indica la dimensione della stringa, piena o vuota che sia. Modificato: 30 settembre 2021 da batta Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 30 settembre 2021 Autore Segnala Share Inserita: 30 settembre 2021 Ciao Batta a livello visivo la stinga cambia da ' a' ad 'anat01', ma se vai a vedere singolo carattere per singolo carattere vedi che la a rimane: Ho modificato nelle costanti affinché sia in nero, ma la situazione non cambia. Le stringe sono messe a 254 perché così non ci devo mettere mano ad ogni progetto, perché mi basta cambiare la configurazione del codice a barre Così faccio anche un controllo sul barcode che certi clienti richiedono. Se le stringhe variano ogni volta che viene scannerizzato un barcode o QRCode. Saluti Link al commento Condividi su altri siti More sharing options...
acquaman Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 Secondo me la 'a' rimane perchè la lunghezza della stringa è di 6 caratteri, quindi la cancellazione avviene per 6 caratteri, la 'a' probabilmente è dello sporco creato quando hai letto una stringa di 8 caratteri, poi l'hai ridotta a 6 e sia il trasferimento che il delete lavorano sulla dimensione reale. Con il vecchio 300 se volevi cancellare una stringa bastava mettere a 0 il secondo byte quello della lunghezza reale, poi anche se rimanevano dei caratteri nella stringa comunque la stringa era vuota. Link al commento Condividi su altri siti More sharing options...
batta Inserita: 30 settembre 2021 Segnala Share Inserita: 30 settembre 2021 1 ora fa, TravelMen ha scritto: a livello visivo la stinga cambia da ' a' ad 'anat01', ma se vai a vedere singolo carattere per singolo carattere vedi che la a rimane: Secondo me il codice per svuotare le stringhe è corretto. Sicuro che non vai a scriverci dentro da qualche altra parte? Se modifichi a mano il valore della stringa, quello che scrivi rimane? Se lanci il ciclo FOR commentando la riga dove ripulisci la stringa, cosa succede? Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 1 ottobre 2021 Autore Segnala Share Inserita: 1 ottobre 2021 Ciao Batta succede quello che ha scritto Seragno, o meglio la clip gif. Se modifichi a mano la stringa da vat, per esempio la visualizzazione non cambia fintanto che non modifiche il valore nel secondo byte, tu poi avere scritto tutti e 254 caratteri me il secondo byte c'è scritto 2, la stringa visualizzata sarà solo di 2 caratteri, ma questo è alla base delle stringe. Qualsiasi cosa si cerchi di fare per cancellare una stringa scritta, l'unico cosa che succede è che il valore del secondo byte viene messo a zero, riporto un esempio: per tanto la cancellazione vera e propria avviane al riavvio del plc se i dati della DB non sono ritentivi. Saluti Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 1 ottobre 2021 Autore Segnala Share Inserita: 1 ottobre 2021 14 ore fa, acquaman ha scritto: Secondo me la 'a' rimane perchè la lunghezza della stringa è di 6 caratteri, quindi la cancellazione avviene per 6 caratteri, la 'a' probabilmente è dello sporco creato quando hai letto una stringa di 8 caratteri, poi l'hai ridotta a 6 e sia il trasferimento che il delete lavorano sulla dimensione reale. non è proprio così, il 6 nel secondo byte sta ad indicare quanti caratteri verranno visualizzati in un campo stringa, anche se la stringa è lunga 254 caratteri. Si la "a" è la stringa ricavata in una precedente lettura del codice a barre, e si ogni volta che vile letto un codi a barre o QRCode, la stringa potrà essere di un caratteri o di 15 caratteri non lo a priori, e quello che volevo fare era cancellare i caratteri che non sono del codice appena letto dalla pistola. Saluti Link al commento Condividi su altri siti More sharing options...
leleviola Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 18 ore fa, TravelMen ha scritto: Ciao, la parte di funzione è appunto una decodifica dell'array di caratteri ricevuti da una dataloig Power scan. La funzione l'avevo sviluppata per S7-300, ed ora l'ho convertita per il 1500/1200, sfruttando diverse migliorie del 1500 per rendere la funzione più flessibile. Se ho interpretato correttamente quello che hai scritto, e quello che vorrei fare io, con l'unica differenza che io ogni volta che decodifico le informazioni contenute nel QRCode vorrei azzerare quelle precedenti. Saluti scusa se mi intrometto ma nella gestione del lettore non hai un'area di memoria del lettore con cui scambi dei bit di status e di controllo? con quelli dovrai gestire la comunicazione col lettore e da tali bit gestire lo scambio dei dati che magari dovrai appoggiare su un area di memoria specifica del PLC, a seconda delle condizioni dei bit di status potrai gestire in maniera autonoma i dati che ricevi dal lettore e interpretarli ogni volta come ti è necessario, forse da quello che capisco interpreti in maniera continuativa quello che leggi dal lettore e non vorrei fosse questo il problema. Sulla faccenda di azzerare i dati alfanumerici mettendo tutti zero nei dati i caratteri scompaiono, così è quello che faccio io nei dati letti da un lettore, questo lo riscontro tramite un pannello HMI sul quale visualizzo le stringhe che quando pongo a zero compaiono a video come stringhe vuote Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 1 ottobre 2021 Autore Segnala Share Inserita: 1 ottobre 2021 (modificato) Ciao leleviola Forse ti è sfuggito nel mio primo post questo: IF START_DECODE and not(DECODE_DONE) THEN la funzione viene eseguita una sola volta, alla ricezione dei dati da parte della pistola, per tutto il resto del tempo la funzione non viene eseguita. Si hai ragione ha video compaiono "vuote" perché il secondo byte viene messe a zero, se tu provi a modificare il valore del secondo byte da vat, una volta cancellata una stringa, vedrai ri-apparire i caratteri, come ampiamente documentato nei post precedenti. Saluti Modificato: 1 ottobre 2021 da TravelMen Link al commento Condividi su altri siti More sharing options...
batta Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 3 ore fa, TravelMen ha scritto: succede quello che ha scritto Seragno, o meglio la clip gif. Se modifichi a mano la stringa da vat, per esempio la visualizzazione non cambia fintanto che non modifiche il valore nel secondo byte, tu poi avere scritto tutti e 254 caratteri me il secondo byte c'è scritto 2, la stringa visualizzata sarà solo di 2 caratteri, ma questo è alla base delle stringe. Quindi, la stringa è vuota. Se continui a gestire la variabile come stringa, è tutto regolare. A questo punto, non capisco più dove sia il problema. Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 1 ottobre 2021 Autore Segnala Share Inserita: 1 ottobre 2021 Ciao Batta non è un vero e proprio problema, ma più un mio fastidio che la stinga viene visualizzata vuota, ma non lo è. Da quello che emerge, mia personale interpretazione, suppongo per risparmiare tempo ciclo, quando uno fa un loop per azzerare una stringa questa non viene azzerata, ma semplicemente viene messo a zero il secondo byte. Saluti Link al commento Condividi su altri siti More sharing options...
batta Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 24 minuti fa, TravelMen ha scritto: suppongo per risparmiare tempo ciclo Immagino anch'io che il motivo sia questo, e condivido la filosofia: perché mai dovrei scrivere 254 caratteri quando posso scrivere un solo byte? Per esempio, io adotto lo stesso criterio nella gestione di un registro FIFO. Per gestire un registro FIFO (o LIFO, il concetto non cambia) ci sono fondamentalmente due sistemi: fare lo scroll di tutto il registro quando si inserisce un dato (il che comporta parecchio lavoro se il registro è lungo), oppure gestire degli indici per puntare alle celle dove inserire o dove estrarre il dato (in questo caso, il lavoro da fare è minimo ed indipendente dalla lunghezza del registro). Lo stesso azzeramento del registro non richiede la scrittura a zero di tutti gli elementi, ma è sufficiente azzerare gli indici. Tutto il resto, è solo lavoro inutile. Link al commento Condividi su altri siti More sharing options...
leleviola Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 Verissimo quello che dici batta ma il tuo non è FIFO è una gestione indicizzata di una serie di operandi che siano bit o quel che si voglia, un FIFO deve poter prevedere in ingresso una gestione casuale della vericidità degli operandi in ingresso Link al commento Condividi su altri siti More sharing options...
batta Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 2 ore fa, leleviola ha scritto: un FIFO deve poter prevedere in ingresso una gestione casuale della vericidità degli operandi in ingresso Non capisco cosa tu intenda con questa frase. Ma FIFO significa semplicemente che il primo dato che entra sarà il primo dato ad uscire. Questo è ciò che conta, non come si ottiene il risultato. Per dire, nelle librerie LGF di Siemens (che consiglio, sia perché ci sono funzioni utili, sia perché sono libere e, studiandole, si possono imparare parecchie cose), ci sono i registri FIFO e LIFO che funzionano proprio con gli indici, e non con lo scroll dei dati. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 2 ore fa, leleviola ha scritto: un FIFO deve poter prevedere .... ?????? FIFO <===> First In First Out, che tradotto in italiano standard significa: il primo dato che entra è anche il primo dato che esce. LIFO <===> Last In Last Out, che tradotto in italiano standard significa: l'ultimo dato che entra è anche l'ultimo dato che esce. Uno stack o pila o catasta è un classico esempio di LIFO, ad esempio. Link al commento Condividi su altri siti More sharing options...
leleviola Inserita: 1 ottobre 2021 Segnala Share Inserita: 1 ottobre 2021 (modificato) Nella fretta di scrivere in pausa pranzo mi sono espresso male, come dice Livio il primo che entra è anche il primo che esce, però ciò che entra può variare ogni volta il suo stato e la pila di dati a seconda di quello che entra può variare il valore della pila di dati considerandola nel suo insieme, quello a cui fai riferimento tu batta non è un FIFO ma la gestione indicizzata di una pila di operandi che non fanno affatto uno scroll di dati ma ne fai l'analisi del dato puntando ogni volta a un operando indicizzandolo Modificato: 1 ottobre 2021 da leleviola Link al commento Condividi su altri siti More sharing options...
seragno Inserita: 2 ottobre 2021 Segnala Share Inserita: 2 ottobre 2021 Si sta andando OT.... Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora