4.75 1 1 1 1 1 1 1 1 1 1 Rating 4.75 (2 Votes)

Valutazione attuale: 0 / 5

Stella inattivaStella inattivaStella inattivaStella inattivaStella inattiva
 

Mi รจ capitato di recente di utilizzare un ambiente di sviluppo per PLC nel quale nonc'era modo di appoggiare i dati su indirizzi di memoria fisici quali Merker, DB, %T e di dover interpretare una variabile di tipo Float 32 bit a precisione singola letta da un dispositivo che la spacchettava in 2 word, rispettivamente LSW ( Least Significant Word) e SW (Most Significant Word) .  Partendo dalla definizione di float (Wikipedia), si ha la seguente organizzazione dei bit:

 IEEE753 32Single Wiki

     31------------------------MSW-------------------16 + 15----------------------LSW------------------------0

Normalmente avrei risolto appoggiando MSW e LSW su due aree di memoria continue e quindi definito una variabile di tipo REAL con offset uguale  all'indirizzo di LSW:

LSW AT %MW0 : WORD;

MSW AT %MW1 : WORD;

VarFLOAT AT %MD0 : REAL;

 Ma non avevo a disposizione aree %M o altro! quindi, partendo dalla seguente relazione:

 

Value[float]= (-1)^sign * 2^(Exponent-127) * 1.fraction

 

Che tradotto in Codesys v.3.5 SP4 Patch 2 da vita alla seguente funzione:

 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

FUNCTION WordsToFloat : REAL
VAR_INPUT
    LSW: WORD;
    MSW:WORD;
END_VAR
VAR
Sign:DINT;
Exponent:DINT;
Fraction:REAL;
END_VAR

 

Sign:=SHR(MSW,15);
Exponent:=SHR(SHL(MSW,1),8);
Fraction:=ANY_TO_REAL((SHR(SHL(MSW,9),9)*EXPT(2,16))+LSW)/EXPT(2,23);

WordsToFloat:=EXPT(-1,Sign)*EXPT(2,Exponent-127)*(Fraction+1.0);

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

Qui di seguito un piccolo video dal mio account Youtube che mostra il comportamento della funzione: da una parte "VarFloat" mappata su %MD0 e settata (manualmente) tramite "MyValue"; dall'altra parte  "VarTest" come valore d'uscita

 

In allegato il progetto.Spero vi sia utile!

Per qualsiasi domanda, richiesta, chiarimento, non esitate a contattarmi!

 

 

 

 

 

 

 

 

 

 

Attachments:
Download this file (WordsToFloat.7z)WordToFloat PRJ[ ]30 kB483 Downloads2014-05-06 18:28