Vai al contenuto
PLC Forum


Da Stringa Ascii A Real


Messaggi consigliati

Inserito:

Salve a tutti,

Ho un altro bel quesito per chi è più esperto di me:

esiste una funzione per la conversione di stringhe ascii in numeri rial sui Plc S7?

ovviamente la stringa ascii rappresenta un numero in virgola mobile o fissa con tanto di segno.


Inserita:

Attenzione che il formato real di Siemns è diverso dal real comunemente usato.

Se non ricordo male no c'è neanche la funzione che converta L'ASCII in binario. Mi sa che dovrai scriverti tu la funzione di conversione ASCII-_>Real

Federico Milan
Inserita:

La tua string è a dimensioni fisse? oppure ha dimensioni variabili?

ad ogni modo - salvo smentite - credo che non esista una funzione pronta per questo. A suo tempo ho dovuto generarmi un semplice "interprete" che convertisse una stringa numerica in un reale/intero. Non è niente di difficile, basta solo applicare le regole della base 10 :)!

L'unica grossa machinosità è semai controlare la presenza di un formato ingenieristico, ma tutto questo è da valutare su cme memorizzi la stringa e su come è presenata ...

ciao

Inserita:
ad ogni modo - salvo smentite - credo che non esista una funzione pronta per questo

io - salvo ulteriori smentite - confermo

come ti ha gia' detto federico ,

789 in char

primo char - 48 x 100

secondo - 48 x 10

terzo - 48 x 1

sommi il tutto in un int o dint

gestire la virgola e' un po piu' incasinato

ciao

Luca

Inserita:

Attenzione che se èuna stringa ASCII è un poco diversa.

Ad esmepio se si ha una stringa ASCII "32383733" corrisponderà al numero 2873, cioè caratter-30h ==> cifra numerica, ovviamete se si usa l'intero esadecimale bisogna anche tenere presente che ci sono "A,B,C,D,E,F". Poi c'è da considerare il formato dell virgola mobile Siemns che è uno standard differente da quello più comune, Dovrei avere ancora in giro la routine in VB per convertire i vari formati di Real.

Inserita:
ASCII "32383733" corrisponderà al numero 2873, cioè caratter-30h ==> cifra numerica

Ciao Livio , mi interessava approfondire il discorso .

perche' a 2873 ??? se in asci prendi il singolo carattere e togli 48 ( o 30h che e' la stessa cosa ) non dovresti trovare l'intero decimale relativo ??

L'esempio che hai fatto con 32383733 ( letto in ascii con 8 caratteri ovviamente ) corrispondera' allo stesso numero ( doppio intero ) in decimale 32383733 o no ??

Ciao

Luca

Inserita: (modificato)
esiste una funzione per la conversione di stringhe ascii in numeri rial sui Plc S7?
No , ce solo l'FC 94, "ATH" ASCII to HEX. Se tu hai una STRING= '1.23456' allora l'FC 94 ti converte in HEX = 1023456.. quindi non ti serve.

Pratticamente quello che tu avresti bisogno sarebbe convertire da Stringa to Floating Point, non neccessariamente da ASCII in floating Point. Dovresti creare la funzione...

Attenzione che il formato real di Siemns è diverso dal real comunemente usato
Perche' mai?

Dal HTML .
Floating-point numbers in STEP 7 conform to the basic format, single width, described in the ANSI/IEEE standard 754-1985, IEEE Standard for Binary Floating-Point Arithmetic. .. 
The sign S 

The exponent e = E + bias, increased by a constant (bias = +127) 

The fractional part of the mantissa m. 
The whole number part of the mantissa is not stored with the rest, because it is always equal to 1 within the valid number range. 

The three components together occupy one double word (32 bits):  ...
DB120.DBD    0        FLOATING_POINT     9999.99     
DB120.DBD    0        HEX               DW#16#461C3FF6    
DB120.DBD    0        DEC               L#1176256502    
DB120.DBD    0        CHARACTER         'F?ö'        
DB120.DBB    0        CHARACTER         'F'     
DB120.DBB    1        CHARACTER         ''     
DB120.DBB    2        CHARACTER         '?'     
DB120.DBB    3        CHARACTER         'ö'
DB120.DBB    0        HEX                B#16#46     
DB120.DBB    1        HEX                B#16#1C     
DB120.DBB    2        HEX                B#16#3F     
DB120.DBB    3        HEX                B#16#F6
Come si puo' apprezzare nella VAT sopra ( Byte 0-1-2-3) , la differenza di Siemens e' la consirerazione del ordine per il LSB/MSB.
SIMATIC: 
15..............0
BYTE 0 BYTE 1

INTEL:
15..............0
BYTE 1 BYTE 0

Modificato: da Savino
Gianmario Pedrani
Inserita:

ciao ragai vi devo smentire... riguardo alle funioni che non esistono....

esiste in tep7 nella parte libreria-standar_librari-IEC function bloc

la fc38 da stringa a nunero intero 16 bit

la fc37 da stringa a nunero intero a 32 bit

la fc39 da stringa a nunero reale 32 bit

ciaooooooooo

Inserita:
la fc39 da stringa a nunero reale 32 bit
Well done Gian.. infatti era sotto la stdlibs!! :)
Inserita:

Perche' mai

Savino mi sono espresso in modo poco chiaro. Non è il numero di bit dedicati a caratteristica e mantissa che è differente, ma come vengono trattate caratteristaca e mantissa.

Purtroppo sono in vacanza e non ho la documentazione, ma dispongo di una vecchia funzione in VB che avevo creato apposta per avere in contemporanea la conversione dei formati Siemens (che non è solo siemens) ed il più comunemente usato.

Se vuoi, dopo Agosto quando rientrerò a casa, potrò spegare meglio la questione.

Fortunatamente c'è Gianmario che è sempre perfettamente aggiornato e ci ha dato una buona informazione :P

Inserita:
perfettamente aggiornato..
A dir la verita' il FC38 STRING_I (String To Integer) lo avevo gia' utilizzato qualche mese fa' in una programma... il FC 39 STRING_R (String To Real) si trovava nella stessa folder di libreria IEC :blink: .. accidenti alla mia dimentichezza che a volta mi tradisce !! :( .. ma bisogna dire che al FC39 li devi dare in input una stringa di 14 elementi, in formato notazione scientifica.

es. '-' '1' '.' '5' '8' '7' '9' '1' '8' 'e' '+' '0' '2' '9' per ricavare il floating point -1.587918e+029

Per una conversione a numero reale in virgola fissa, importante nello gestionale piuttosto, dove la precisione sarebbe pu' importante della dimensione, non vedo l'utilizzo del FC 39 cosi usefull. <_< ... infatti mi era venuto subito in mente che se ti serve una conversione del tipo intervallo -9999.999 / +9999.999 allora meglio se ti costruisci la funzione apposta.

Federico Milan
Inserita:

Ciao, credo di non aver mai visto la FC39 in vita mia, ma a suo tempo mi sono fatto il parser e il convertitore, proprio pechhè avrei potuto avere stringhe numeriche di lunghezza "variabile". Del resto, la compatibilità del formato reale è un tema particolare, in quanto se:

il numero viene spedito (esempio in seriale) solo in caratteri, la conversione interna è un fatto di siemens.

Per dare una idea, la conversione io la facevo più o meno così:

Scansione della stringa per trovare il pun to decimale. A questo punto due puntatori mi scandiscono uno a ritroso i caratteri numerici moltiplicandoli per 10.0^(i) e uno in progressione che moltiplicava per 10.0^(-i). La converisone a formato reale Siemens è automatica e la funzione è trasfportabile in qualunque altro sistema :).

Ovviamente la mia FC controllava anchese era presente una notazione scientifica (1.2222 E 3). MA il concetto è lo stesso in quanto il parser deve lavorare come prima e poi se incontra una E eseguire un'ulteriore moltiplicazione ... è più facile farlo che spiegarlo :). A dire il vero ci rabbero altri formati e cosucce da stare attenti, ma non sono diffcili :) ...

ciao

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