Vai al contenuto
PLC Forum


Caratteri strani leggendo una db con snap7 in vb.net


mcendron

Messaggi consigliati

Salve, sto cercando di leggere i valori contenuti in una db che ho impostato in s7-1200 a cui ho impostato un valore di avvio (figura1)

Ho modificato il programma demo che ho trovato allegato alle libreria snap7 (figura2)

Quando lo mando in esecuzione, dopo essermi connesso, e letto il buffer, con il button1 visuallizzo quello che ho letto e come vedete ci sono dei caratteri strani di cui non capisco la provenienza (figura3)

 

figura1.png

figura2.png

figura3.png

Link al commento
Condividi su altri siti


mi riferivo alle stringhe visualizzate a destra di button1 che dovrebbero essere equivalenti al valore di avvio, ma invece vengono visualizzate con dei caratteri strani

Link al commento
Condividi su altri siti

Non si vedono caratteri strani, se non il carattere di partenza; significa che nella stringa c'è un codice che l'applicazione VB non riconosce.

Dovresti entrare nel debug dell'applicazione e visulaizzare i valori dellle variabili che hai associato alle stringhe.

Link al commento
Condividi su altri siti

Sono semplicemente i codici corrispondenti ai caratteri ASCII 0x14 (DC4) e 0x5 (ENQ) che ti trovi prima della parola "linea" e di 0x14 e 0x9 prima della parola "operatore".

Questi caratteri non sono stampabili quindi, trasformandoli in stringa, VB.Net te li mostra così.

Link al commento
Condividi su altri siti

grazie per la precisazione, ma allora sono io che sbaglio a leggere 22 caratteri invece che 20? perchè avevo letto che la stringa occupa la lunghezza + 2

Link al commento
Condividi su altri siti

Non conosco il dettaglio, comunque così a occhio ci sta che 0x14 indichi che il dato è una stringa, il carattere successivo (0x05 - 0x09) la lunghezza della stringa stessa, quindi il tuo programma dovrebbe agire di conseguenza.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

1 ora fa, Livio Orsini scrisse:

Dovresti entrare nel debug dell'applicazione e visulaizzare i valori dellle variabili che hai associato alle stringhe.

 

Ricito me stesso, così puoi vedere cosa arriva e come viene trattato.

Link al commento
Condividi su altri siti

Quote

ma allora sono io che sbaglio a leggere 22 caratteri invece che 20? perchè avevo letto che la stringa occupa la lunghezza + 2

Detto così non significa nulla.

Probabilmente ci ha beccato ilguargua e la stringa che ti arriva è composta da un carattere di start (0x14) + un carattere di lunghezza (0x5 = lunghezza di "linea" 0x9 = lunghezza di "operatore" + la stringa stessa. Quindi lunghezza + 2

La documentazione di Snap7 non dice nulla a riguardo?

Link al commento
Condividi su altri siti

Il valore delle variabili è uguale a quello che visualizzo come stringa e corrisponde al contenuto della DB letta.

Ribadisco che sto utilizzando una parte del codice demo, e sto utilizzando lo stesso codice degli esempi.

Non mi pare sia scritto da nessuna parte che devo leggere una parte della stringa perchè 2 byte contengono il tipo e la lunghezza.

S7.GetCharsAt(Buffer, 0, 22) dovrebbe ritornare automaticamente il contenuto della stringa di 20 caratteri.

Scusate se magari non riesco a spiegarmi correttamente.

Link al commento
Condividi su altri siti

Ale sicuramente posso risolvere come hai proposto tu, quello che mi preoccupa e quando andrò a leggere i campi bolean, avevo già provato senza successo

Link al commento
Condividi su altri siti

Quote

Non conosco e non ho mai usato Snap7, perà a questo punto proverei con S7.GetCharsAt(Buffer, 2, 20), magari risolvi.

Potrebbe essere un'idea però non capisco perchè ti diano fastidio quei due caratteri iniziali, li puoi sempre eliminare a livello applicazione.

Anzi ti sono utili per fare le operazioni di estrapolazione dei dati che ti servono dall'array di byte che vai a leggere.

Link al commento
Condividi su altri siti

Non mi danno fastidio e che mi aspettavo che la funzione che ricava la stringa me la desse già pulita, e come ho già detto avevo provato a leggere anche dei bolean ma mi sono trovato risultati completamente diversi.

Link al commento
Condividi su altri siti

Quote

mi aspettavo che la funzione che ricava la stringa me la desse già pulita

Eh ma tu stai leggendo un'array di byte da un DB e la funzione che utilizzi ti permette di scegliere il primo e quanti ne vuoi leggere.

Non è detto che il DB contenga stringhe e, in ogni caso, è organizzato come un array (cioè una sequenza di informazioni ordinate per indirizzo) quindi la soluzione più giusta è leggere i dati su un buffer di byte, che infatti viene accettato come parametro di risultato della funzione. Sarai poi tu, utilizzando le potenti classi di manipolazione delle stringhe di .NET a sistemarti i dati.

Quote

avevo provato a leggere anche dei bolean ma mi sono trovato risultati completamente diversi

E cioè? Che problemi ti da?

Oltre alla funzione "GetCharsAt" che altro ti mette a disposizione la libreria?

Link al commento
Condividi su altri siti

Quote

Non mi pare sia scritto da nessuna parte che devo leggere una parte della stringa perchè 2 byte contengono il tipo e la lunghezza.

C'è scritto nella documentazione del TIA. Non dipende da Snap7, ma da Siemens.
Se cerchi nella guida in linea com'è fatta una variabile STRING, viene chiaramente specificato che il primo byte contiene la lunghezza totale della stringa (dipende da quanti caratteri hai impostato nella dichiarazione della variabile, nel tuo caso sono 20 che, guarda caso, corrisponde a 14Hex), il secondo byte ti dice quanti caratteri sono usati (infatti "linea" è una parola da 5 caratteri e "operatore" da 9), ed i rimanenti sono i caratteri della stringa.
Direi quindi che non c'è nessun problema. Snap7 svolge brillantemente il suo compito. Devi solo interpretare quello che leggi in modo corretto.

Link al commento
Condividi su altri siti

Quote

dipende da quanti caratteri hai impostato nella dichiarazione della variabile, nel tuo caso sono 20 che, guarda caso, corrisponde a 14Hex

 

Quote

il secondo byte ti dice quanti caratteri sono usati (infatti "linea" è una parola da 5 caratteri e "operatore" da 9), ed i rimanenti sono i caratteri della stringa.

batta = Siemens evangelist A++

:thumb_yello:

 

Link al commento
Condividi su altri siti

Quote

batta = Siemens evangelist A++

I complimenti sono sempre bene accetti, ma non ho fatto assolutamente nulla di speciale. Bastava cercare nella guida in linea.

Una chiara indicazione c'era anche solamente guardando il DB, con l'indirizzo della seconda variabile che inizia da 22, e non da 20.

Link al commento
Condividi su altri siti

Non vorrei essere frainteso, non mi sembra di aver detto che snap7 non funziona, e avevo capito che i due byte erano aggiunti da siemens. Ho solo espresso un parere che ribadisco essere questo se leggo la stringa con la funzione di snap7 pensavo fosse logico restituirmi solo il contenuto e non anche il contenuto dei due byte.

Grazie per l'aiuto

Link al commento
Condividi su altri siti

Ma tu dai chiare istruzioni per leggere 44 byte e metterli in "buffer", e poi dai altrettanto chiare istruzioni per estrarre da "buffer" 22 caratteri partendo dal byte 0, e altri 22 partendo dal byte 22.
In base a quale principio Snap7 dovrebbe, autonomamente, decidere di non leggere i primi due byte?

La soluzione è comunque molto semplice, ed è già stata suggerita da "ilguargua".

Link al commento
Condividi su altri siti

il 3/12/2017 at 23:55 , mcendron scrisse:

libreria snap7 (figura2)

salve, sto cercando la libreria di cui parla mcendron, qualcuno saprebbe indicarmi dove scaricarla?

 

grazie

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...