Vai al contenuto
PLC Forum


Problema Somma Numeri Virgola Mobile


Messaggi consigliati

Inserito:

Buongiorno a tutti. sono nuovo e vorrei porvi un quesito sulla somma tra numeri in virgola mobile,

devo contare gli impulsi di un contatore e il codice è il seguente:

U "UTF COGENERATORE"
FP M 31.1
SPBNB _004
L "Variabili_Contatori".utf_coge
L 1
+I
T "Variabili_Contatori".utf_coge
_004: NOP 0

////////////////////////////////////////////////////////////////////////////////////////

U(
U(
L "Variabili_Contatori".utf_coge
L 100
==I
)
FP M 31.5
SPBNB _005
L "Variabili_Contatori".UTF_Cogeneratore
L "Variabili_Contatori".appoggiovirgola (valore 0,01)
+R
T "Variabili_Contatori".UTF_Cogeneratore
UN OV
SAVE
CLR
_005: U BIE
)
SPBNB _006
L 0
T "Variabili_Contatori".utf_coge
_006: NOP 0
Praticamente conto gli impulsi del mio ingresso, quando arrivo a 100 impulsi sommo di 0,01 la mia variabile "Variabili_Contatori".UTF_Cogeneratore.
Il problema è che a lungo andare il valore assume 3 decimali dopo la virgola e dopo vari conteggi a causa dell'arrotondamento il valore diventa diverso da quello del contatore,
ad esempio io sommo 0,01 al numero 4567,88 il risultato da 4567,89 dopo qualche conteggio mi ritrovo valori tipo 4567,893 che arrotondando diventa 4567,89. quindi non incrementa.
come posso risolvere questo inghippo'
spero di essere stato chiaro e che qualcuno mi possa aiutare.
Grazie

Inserita: (modificato)

Ciao e benvenuto nel forum.

Per chiarimenti sul formato REAL puoi leggere qui: http://www.plcforum.info/file/corrieri/Real_Numbers.pdf

Se ho ben capito tu hai un contatore integer che quando arriva a 100 incrementa di 0.01 un altro contatore real, ma questo 2° contatore real a cosa ti serve? per visualizzarlo su un HMI? se sì puoi modificarlo in DINT e impostare sull'HMI 2 posizioni decimali.

Modificato: da JumpMan
Inserita: (modificato)

Quello che succede è assolutamente normale.

Per risolvere, hai solo due modi: utilizzare variabili in virgola mobile a 64 bit anziché 32 bit, oppure utilizzare variabili DINT al posto delle REAL.

Visto che S7-300 non gestisce virgola mobile a 64 bit, non ti resta che utilizzare il secondo metodo.

Dato che lavorando con interi non puoi certo fare incrementi di 0,01, devi incrementare di una unità e tenere conto che le ultime due cifre sono decimali.

Se devi per forza passare questo valore ad una variabile REAL, potresti fare come segue:

........
    FP    M     31.5
      SPBNB _005
      L     "Variabili_Contatori".UTF_Cogeneratore_x100    // Variabile di tipo DINT
      +     L#1
      T     "Variabili_Contatori".UTF_Cogeneratore_x100
      DTR
      L 0.01
      *R    
      T     "Variabili_Contatori".UTF_Cogeneratore
........

In questo modo potrai gestire valori fino a 2147483647 che, con due cifre decimali, diventa 21474836,47.

Tieni presente che questo valore in realtà ti verrà visualizzato come 2.147484e+007
Non potrai quindi vedere ogni singolo incremento di 0.01.

Se questo numero lo devi visualizzare su un pannello operatore, ti conviene usare la variabile di tipo DINT e impostare la visualizzazione con due cifre decimali.

Modificato: da batta
Inserita:

Ciao.

io devo visualizzare sul pannello il valore del contatore, è un contatore in Mwh e devo visualizzare ogni singolo incremento,

se ho ben capito dici di usare il valore in DINT e quindi nel pannello mettere la virgola con 2 cifre decimali.....

non ci avevo pensato

Grazie mille del tuo consiglio

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