Page 1 of 2

Conversione DWORD a REAL

Posted: 24/06/2020, 11:13
by Goliath86
buongiorno,
sapreste cortesemente dirmi come convertire una DWORD in un REAL? Leggo da Modbus il valore 16#43C966F3 e dovrei visualizzarlo in REAL con la virgola.

Grazie mille

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 11:21
by Pixsys tecnico 1
Salve,
dal gruppo funzioni "Operators and blocks" può usare la funzione "TO_REAL". Se la libreria è suddivisa in cartelle (default per le nuove versioni di LogicLab), la funzione si trova nella sotto-cartella "Conversion".

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 11:33
by Goliath86
Grazie della risposta:

se provo:

VOLTAGE_A := TO_REAL(16#43c966f3);

Nella finestra Watch di LogicLab vedo il valore 1137272576.000 invece mi aspetterei 402.804

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 12:05
by Pixsys tecnico 1
Se il valore letto deriva da una lettura Modbus, questo sarà associato ad un variabile, inserisca tra le parentesi della funzione la variabile e non il suo valore in esadecimale

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 12:16
by Goliath86
Risulta sempre lo stesso valore anche se metto la variabile

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 12:19
by Pixsys tecnico 1
è possibile che il dato sia inteso con il segno (negativo)?

Il risultato che lei ottiene (1137272576.000) è la conversione in decimale del numero esadecimale 43C966F3, con 3 punti decimali quindi è "potenzialmente" corretto, da dove ricava 402.804?

Tenga presente che una Dword è sempre intesa come intera

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 12:20
by Goliath86
Sì è col segno

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 12:22
by Goliath86
Pixsys tecnico 1 wrote:è possibile che il dato sia inteso con il segno (negativo)?

Il risultato che lei ottiene (1137272576.000) è la conversione in decimale del numero esadecimale 43C966F3, con 3 punti decimali quindi è "potenzialmente" corretto, da dove ricava 402.804?

Tenga presente che una Dword è sempre intesa come intera
Se inserisco il numero esadecimale su questo sito ottengo come risultato il dato corretto

https://gregstoll.com/~gregstoll/floattohex/

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 17:01
by Pixsys tecnico 1
Il problema probabilmente è l'interpretazione del dato dal Modbus, dovrebbe leggere il registro che le interessa e salvarlo direttamente in una variabile REAL (non DWORD). Il fatto probabilmente è che il numero che acquisisce dal modbus ha già l'informazione del "punto" ma salvandolo in una dword di fatto salva un altro valore.

Provi ad associare direttamente una REAL al registro modbus che sta acquisendo.

Re: Conversione DWORD a REAL

Posted: 24/06/2020, 19:01
by Goliath86
Pixsys tecnico 1 wrote:Il problema probabilmente è l'interpretazione del dato dal Modbus, dovrebbe leggere il registro che le interessa e salvarlo direttamente in una variabile REAL (non DWORD). Il fatto probabilmente è che il numero che acquisisce dal modbus ha già l'informazione del "punto" ma salvandolo in una dword di fatto salva un altro valore.

Provi ad associare direttamente una REAL al registro modbus che sta acquisendo.
Già provato e non è servito. Provato a leggere da Modbus direttamente in REAL e nessun valore letto; provato a passare la variabile letta in DWORD ad una variabile REAL e niente (stesso risultato ottenuto con la funzione TO_REAL()). Unica soluzione: ho creato io una funzione per la conversione ed ora il dato viene correttamente convertito da DWORD a REAL come testato su vari siti di conversione dati. La variabile DWORD in realtà è un FLOAT32 mappato su due registri Modbus adiacenti; quindi contiene già l'indicazione del "punto"; dovevo solo convertirlo in un decimale leggibile da HMI. Con la mia funzione ora va.

Grazie lo stesso