Vai al contenuto
PLC Forum


Convertire String In Dint


ricki

Messaggi consigliati


Il Primo Byte della tua Stringa contiene la Lunghezza della Stringa Stessa,

per Esempio "Giorgio"

Byte 0 = 7 (Lunghezza Caratteri o Bytes della Stringa)

Byte 1 = "G" (047 Hex)

Byte 2 = "i" (069 Hex)

Byte 3 = "o" (06F Hex)

Byte 4 = "r" (072 Hex)

Byte 5 = "g" (067 Hex)

Byte 6 = "i" (069 Hex)

Byte 7 = "o" (06F Hex)

Puoi Leggere i Bytes con una DWord (4 Bytes) non mi ricordo se è corretto l' ordine, oppure devi

usare degli Swap dei Bytes per ottenere la giusta Sequenza della Stringa.

Io Normalmente uso programmare con il Linguaggio SCL perchè si riesce trattare le stringhe molto

facilmente, cosi pure per Strutture Dati etc.

Modificato: da Henon Research
Link al commento
Condividi su altri siti

Aggiunta:

Se invece da una Stringa contenente un Valore numerico la vuoi convertirla in DINT,

Esempio Stringa := "13003"

Penso che esista una FC nelle Librerie Standard del Step7.

Altrimenti con Pazienza devi controllare :

1) che la tua stringa contenga sono Caratteri Numerici

2) Esecuire un Ciclo dalla cifra più a destra verso l'ultima la più a Sinistra (Unità,decine, centinaia......)

Eseguire la Somma delle Varie Cifre con il Giusto Peso (Unità *1, Decina*10, Centinaia*100.....etc)

Spero che tu trovi questa FC nella Libreria Standard della Siemens, altrimenti penso che la dovrai costruire.

Ciao Buona Fortuna.

Link al commento
Condividi su altri siti

Nell'esempio: Stringa := "13003"

L'algoritmo e': (Byte6 - 48) + (Byte5 - 48)*10 + (Byte4 - 48)*100 + (Byte3 - 48)*1000 + (Byte2 - 48)*10000

L DBXX.DBBYY (BYTE 6)

L 48

-I

T MD AAA.B (DWORD DI APPOGGIO)

///

L DBXX.DBBYY (BYTE 5)

L 48

-I

ITD

L L#10

*D

L MD AAA.B (DWORD DI APPOGGIO)

+D

T MD AAA.B (DWORD DI APPOGGIO)

...

...

...

L DBXX.DBBYY (BYTE 2)

L 48

-I

ITD

L L#10000

*D

L MD AAA.B (DWORD DI APPOGGIO)

+D

T MD AAA.B (DWORD DI APPOGGIO)

Devi sottrarre 58 al byte perche' 48 e' il valore di '0'; da cui, per esempio, '3' ha valore 51 e sottraendo 48 ottieni proprio 3.

I byte 0 e 1 sono riservati per il tipo string.

Spero di essere stato chiaro; l'esempio e' teorico e non e' stato testato.

Salutoni,

Sassi

Link al commento
Condividi su altri siti

  • 3 weeks later...

Le stringhe in realtà vengono implementate come sequenza di bytes.

La differenza è che i primi due bytes contengono la lunghezza massima possibile dell'area di stringa (0..255) e la lunghezza della stringa attuale (0...255) a seguire poi ci sono i bytes corrispondenti ai caratteri ascii della stringa stessa.

Il tuo esempio viene codificato con [LMAX] [LSTR][P][P][P][O] quindi lunga 6 bytes non 4.

Se la stringa l'hai memorizzata da MW0, occuperà fino a MW5 compreso (vale anche per le DB)

Se tu scrivi L MD2, hai già caricato un DINT con la tua stringa !!

Se la tua stringa è una variabile temporanea in una FC od anche statica in una FB la cosa è leggermente più complicata in quanto il sistema si accorge del formato diverso.

Allora devi aggirare il controllo facendo:

L P#MiaStringa // Ptr alla stringa

LAR1

L D[AR1,P#2.0] // Quì ti trovi il DINT (P#2.0 per scavalcare i bytes lunghezza)

Se la tua FB è multiistanza devi aggiungere AR2 al pointer.

N.B. Non l'ho testato ma dovrebbe funzionare.

Ciao ;)

Link al commento
Condividi su altri siti

  • 10 years later...

se hai una variabile DINT puoi scriverci dentro , e visualizzare , fino a 4 caratteri 

L  'ciao'

T DB10.DBD0

 

******

U(

L  DB10.DBD0

L  'ciao' 

)

= M40.0

 

Se hai 2 variabili DINT ..... 8 caratteri , senza porcherie alla fine come usualmente siemens usa fare 

Se hai un array di int o dint puoi scriverci e visualizzare caratteri quanti ne vuoi 

Link al commento
Condividi su altri siti

Giuseppe Signorella

Considerata la vetustà della discussione, non ha  più senso tenerla aperta .

********Dscussione è chiusa. *********

Link al commento
Condividi su altri siti

  • Giuseppe Signorella locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...