Iris _

Pixsys Forum

everybody's effort for the same goal

Conversione DWORD a REAL

Goliath86
Posts: 31
Joined: 13/01/2019, 12:23

Conversione DWORD a REAL

Post 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
Pixsys tecnico 1
Moderatore
Posts: 1649
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione DWORD a REAL

Post 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".
Goliath86
Posts: 31
Joined: 13/01/2019, 12:23

Re: Conversione DWORD a REAL

Post 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
Pixsys tecnico 1
Moderatore
Posts: 1649
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione DWORD a REAL

Post 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
Goliath86
Posts: 31
Joined: 13/01/2019, 12:23

Re: Conversione DWORD a REAL

Post by Goliath86 »

Risulta sempre lo stesso valore anche se metto la variabile
Pixsys tecnico 1
Moderatore
Posts: 1649
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione DWORD a REAL

Post 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
Goliath86
Posts: 31
Joined: 13/01/2019, 12:23

Re: Conversione DWORD a REAL

Post by Goliath86 »

Sì è col segno
Goliath86
Posts: 31
Joined: 13/01/2019, 12:23

Re: Conversione DWORD a REAL

Post 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/
Pixsys tecnico 1
Moderatore
Posts: 1649
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione DWORD a REAL

Post 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.
Goliath86
Posts: 31
Joined: 13/01/2019, 12:23

Re: Conversione DWORD a REAL

Post 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
Post Reply