Vai al contenuto
PLC Forum


Come poter cancellare il contenuto di una stringa


TravelMen

Messaggi consigliati

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:

image.png.84c42e2efeae230fb5b53e31ceaba67e.png

 

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

image.png.c15d82e71d75db358779ff3fc73d01e7.png

 

Dimenticavo S7-1500 1511-1PN

 

Saluti

Modificato: da TravelMen
Link al commento
Condividi su altri siti


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

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

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: download.gif.dc2fc22895da043ca077ced59482c91c.gif:

 

Link al commento
Condividi su altri siti

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:

image.png.f5fce4196c69c14f5600455e6e96c1eb.png

come si vede c'è una a al nella stringa, ecco come appare dopo l'esecuzione della funzione

image.png.96f0157cefd498fed740b96e09cfb430.png

come si può notare la a è rimasta.

 

Saluti

 

Link al commento
Condividi su altri siti

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: da TravelMen
Link al commento
Condividi su altri siti

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

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

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: da batta
Link al commento
Condividi su altri siti

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:

image.png.d1a6d80a2ec2058d5cdf79bf19d32a2c.png

 

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

image.png.6dfba58341b3fca29562a80f9c717c97.png

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

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

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

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:

image.png.dd9bbfbe7072ca62f098f26e534053de.png

 

image.png.20d08fd9dfbce6c6cc4d0b9e27feb38b.png

 

per tanto la cancellazione vera e propria avviane al riavvio del plc se i dati della DB non sono ritentivi.

image.png.698089473f8a4be96b8b02daf5d060d0.png

Saluti 

Link al commento
Condividi su altri siti

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

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

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: da TravelMen
Link al commento
Condividi su altri siti

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

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

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

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

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

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

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: da leleviola
Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...