Vai al contenuto

mcendron

Caratteri strani leggendo una db con snap7 in vb.net

Recommended Posts

mcendron

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

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini

0x6F, ad esempio, indica che quel byte di memoria contiene il valore 6F in esadecimale.

Condividi questa discussione


Link discussione
Condividi su altri siti
mcendron

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

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini

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.

Condividi questa discussione


Link discussione
Condividi su altri siti
lucios

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

Condividi questa discussione


Link discussione
Condividi su altri siti
mcendron

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

Condividi questa discussione


Link discussione
Condividi su altri siti
ilguargua

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.

Condividi questa discussione


Link discussione
Condividi su altri siti
Livio Orsini
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.

Condividi questa discussione


Link discussione
Condividi su altri siti
lucios
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?

Condividi questa discussione


Link discussione
Condividi su altri siti
mcendron

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.

Condividi questa discussione


Link discussione
Condividi su altri siti
ilguargua

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

 

Ciao, Ale.

Condividi questa discussione


Link discussione
Condividi su altri siti
mcendron

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

Condividi questa discussione


Link discussione
Condividi su altri siti
lucios
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.

Condividi questa discussione


Link discussione
Condividi su altri siti
mcendron

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.

Condividi questa discussione


Link discussione
Condividi su altri siti
lucios
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?

Condividi questa discussione


Link discussione
Condividi su altri siti
batta
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.

Condividi questa discussione


Link discussione
Condividi su altri siti
lucios
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:

 

Condividi questa discussione


Link discussione
Condividi su altri siti
batta
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.

Condividi questa discussione


Link discussione
Condividi su altri siti
mcendron

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

Condividi questa discussione


Link discussione
Condividi su altri siti
batta

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

Condividi questa discussione


Link discussione
Condividi su altri siti
incus
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

Condividi questa discussione


Link discussione
Condividi su altri siti

Registrati o accedi per inserire messaggi

Devi essere un utente registrato per lasciare un messaggio. La registrazione è GRATUITA.

Crea un account

Iscriviti alla nostra comunità. È facile!

Registra un nuovo account

Connettiti

Hai già un account? Connettiti qui

Connettiti adesso


×