Iris _

Pixsys Forum

everybody's effort for the same goal

Conversione a Real

Post Reply
user7490
Posts: 50
Joined: 21/01/2014, 8:23

Conversione a Real

Post by user7490 »

Buongiorno
Ho un problema di conversione di un dato Float letto da un dispositivo Modbus generico, che ovviamente viene diviso su due variabili Word e che con le normali funzioni Word to Dword , to Real , ecc., non c'è verso che venga riportato al Real originale.
Ho visto in un precedente topic che la questione è già nota e che un altro utente si è dovuto cosrtruire una funzione custom per poter ovviare al problema, dato che con le funzioni offerte da LogicLab non riescono a risolvere il problema.
La domanda è: visto che sono già passati un paio d'anni da questo topic, nel frattempo sono state implementate delle soluzioni per agevolare la soluzione del problema ? O devo seguire la stessa strada dell'utente citato ?

Grazie
Pixsys tecnico 6
Moderatore
Posts: 1188
Joined: 12/09/2016, 14:49

Re: Conversione a Real

Post by Pixsys tecnico 6 »

Buongiorno,
Il dato Float è ben diverso dal dato Real e per eseguire la conversione del dato bisogna eseguire operazioni matematiche complesse.
In allegato trova un FB da importare nel progetto LogicLab tramite l'"importa oggetti" (eseguendo click destro sopra al nome del progetto) in cui esegue la conversione del dato FLOAT a REAL.
Le due WORD che legge dovranno essere convertite in una DWORD utilizzando il blocchetto "Two_Word_into_DWord" e poi inserito in ingresso del FB, in uscita una variabile di tipo REAL.

Cordiali Saluti
You do not have the required permissions to view the files attached to this post.
StefanoChesini
Posts: 3
Joined: 29/09/2022, 11:12

Gestione formati interi e floating point

Post by StefanoChesini »

Buongiorno,
sto ricevendo da un modulo modbus generico una serie di variabili formattate floating point (IEEE 754).
Naturalmente ricevo due WORD per ogni variabile, poi con la funzione Two_Word_into_DWord registro il valore
in una DWORD (valore che è gia formattato floating point).
Il problema è quando provo a trasferire questo valore in una variabile REAL.
Con tutti i metodi che ho utilizzato il sistema introduce sempre una conversione implicita Intero -->> Float.
Io avrei bisogno di fare semplicemente una copia bit a bit da una variabile DWORD(Var1) a una REAL(Var2).
Per intenderci con AWL di siemens userei:
L Var1
T Var2

Ho provato anche con le istruzioni LD e ST ma anche queste introducono una conversione Intero -->> Float.

In definitiva è possibile eseguire una copia bit a bit di due variabili a 32 bit?
user7490
Posts: 50
Joined: 21/01/2014, 8:23

Re: Conversione a Real

Post by user7490 »

Grazie
Ma non funziona. Ricapitolo:
- Leggo un dato Float su due registri che il nodo Modbus assegna a 2 Word
- Passo le 2 Word alla funzione "Two_Word_into_DWord"
- Passo la DWord alla funzione FB e in uscita mi trovo una variabile Real che non ha lo stesso valore Float di partenza
- Ho provato a mettere in uscita dalla "Two_Word_into_DWord" una variabile Real , data poi in pasto alla FB, ma anche in questo caso, come nel caso di utilizzo della funzione "to Real", il valore ottenuto non è corretto.
Penso che il dato subisca una conversione implicita che di fatto impedisce la copia bit to bit della variabile e di conseguenza falsa il risultato.
Pixsys tecnico 1
Moderatore
Posts: 1659
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione a Real

Post by Pixsys tecnico 1 »

Ha provato a invertire le due WORD che passa al FB "Two_Word_into_DWord"?
E' sicuro che il dato sia un float standard IEEE 754?
Pixsys tecnico 1
Moderatore
Posts: 1659
Joined: 29/10/2010, 10:09
Contact:

Re: Gestione formati interi e floating point

Post by Pixsys tecnico 1 »

StefanoChesini wrote:Buongiorno,
sto ricevendo da un modulo modbus generico una serie di variabili formattate floating point (IEEE 754).
Naturalmente ricevo due WORD per ogni variabile, poi con la funzione Two_Word_into_DWord registro il valore
in una DWORD (valore che è gia formattato floating point).
Il problema è quando provo a trasferire questo valore in una variabile REAL.
Con tutti i metodi che ho utilizzato il sistema introduce sempre una conversione implicita Intero -->> Float.
Io avrei bisogno di fare semplicemente una copia bit a bit da una variabile DWORD(Var1) a una REAL(Var2).
Per intenderci con AWL di siemens userei:
L Var1
T Var2

Ho provato anche con le istruzioni LD e ST ma anche queste introducono una conversione Intero -->> Float.

In definitiva è possibile eseguire una copia bit a bit di due variabili a 32 bit?
Salve,
se vuole tentare di "sovrapporre, bit a bit" le due variabili, può usare questo FunctionBlock.
FB_Real.zip
You do not have the required permissions to view the files attached to this post.
user7490
Posts: 50
Joined: 21/01/2014, 8:23

Re: Conversione a Real

Post by user7490 »

Salve
Ho visto che ha riunito anche la richiesta fatta dal mio collega che stava facendo le stesse prove per cercare di risolvere il problema; ottimo, così uniamo la discussione.
Sembra che il problema si risolva mappando due variabili, una DWord e una Real con lo stesso indirizzo; la DWord è solo in appoggio alla funzione "Two_Word_into_DWord" e non la utilizziamo, mentre andiamo a leggere la Real che ha lo stesso indirizzo e ci riporta correttamente il valore iniziale.
Le prime prove hanno dato esito positivo, ora verificheremo che non ci siano ulteriori problematiche.
Grazie
Pixsys tecnico 1
Moderatore
Posts: 1659
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione a Real

Post by Pixsys tecnico 1 »

ottimo, di fatto è esattamente quello che fa il function block "FB_Real.zip" allegato.
user7490
Posts: 50
Joined: 21/01/2014, 8:23

Re: Conversione a Real

Post by user7490 »

Salve
Riprendo il topic , perchè succede questo:
- Con la release 5.18.0.2 avevamo raggiunto lo scopo di leggere il dato correttamente con lo script seguente:
FUNCTION ConvModbusVar: REAL
VAR
SwapWords : Two_Word_into_DWord;
Merged_REAL : REAL;
p_ValDW : @REAL;
END_VAR
VAR_INPUT
Word_High : WORD;
Word_Low : WORD;
END_VAR

SwapWords(Word_H:=Word_High, Word_L:=Word_Low);

p_ValDW := ADR( SwapWords.Double_Word );
Merged_REAL := @p_ValDW;

ConvModbusVar := Merged_REAL;

In compilazione da un warning G0083 relativo a SwapWords(Word_H:=Word_High, Word_L:=Word_Low), ma niente di che.

Con la release 5.20.0.2 , oltre al warning, da anche un errore G0271: p_ValDW => Invalid operation on different pointed types

E' possibile risolvere o bypassare questo errore ?
Grazie.
Pixsys tecnico 1
Moderatore
Posts: 1659
Joined: 29/10/2010, 10:09
Contact:

Re: Conversione a Real

Post by Pixsys tecnico 1 »

Salve,
le3 ultime versioni attivano di default il controllo sui tipo di puntatori.
Questo controllo su può disabilitare attraverso l'apposito flag che si trova nelle proprietà del progetto:
Strict_pointer_check.PNG
You do not have the required permissions to view the files attached to this post.
Post Reply