Vai al contenuto
PLC Forum


Dint => Int


robyvelocity

Messaggi consigliati

So che se ne era parlato, ma non riesco a trovare il post.

Qualcuno mi sa aiutare? Non esiste già qualcosa di fatto dalla SIEMENS?

Grazie

Link al commento
Condividi su altri siti


Spiegati meglio .... <_<

Vuoi spezzare in contenuto del DINT in due INT?

Es. DINT = 12345678 --> INT1 = 1234, INT2 = 5678

... oppure vuoi fare altro ??? :blink:

Link al commento
Condividi su altri siti

Matteo Montanari

potresti utilizzare la funzione Trunc

Formato

TRUNC

Descrizione dell'operazione 

TRUNC (Converti numero in virgola mobile a 32 Bit, IEEE-FP, in numero intero a 32 bit) interpreta il contenuto dell'accumulatore 1 come numero in virgola mobile (a 32 bit, IEEE-FP). L'operazione converte il numero in virgola mobile (a 32 bit, IEEE-FP) in un numero intero (a 32 bit). Il risultato è dato dalla parte intera del numero in virgola mobile (modo di arrotondamento IEEE 'Round to Zero'). Se il numero non rientra nell'area di validità, i bit di stato OV e OS vengono settati a "1". Il risultato viene memorizzato nell'in ACCU 1.

Qualora si dovesse verificare un errore (presenza di NaN o di numero in virgola mobile non rappresentabile quale numero intero a 32 bit), la conversione non viene eseguita e viene indicato un overflow.

Parola di stato 

BIE    A1    A0    OV    OS    OR    STA    RLC    /ER
Scrive:    -    -    -    x    x    -    -    -    -
Esempio 

AWL    Spiegazione
L  MD10    //Carica il numero in virgola mobile (a 32 bit, IEEE-FP) in ACCU 1-L.
TRUNC  //Converte il numero in virgola mobile (a 32 bit, IEEE-FP) in un numero intero (a 32 bit) e arrotonda il risultato. Memorizza il risultato in ACCU 1-L.
T  MD20    //Trasferisce il risultato (numero intero, 32 bit) a MD20.
Valore prima della conversione  Valore dopo la conversione
MD10  =  "100.5"    =>   TRUNC   =>    MD20  =  "+100"
MD10  =  "-100.5"    =>   TRUNC   =>    MD20  =  "-100"

ma attenzione che se hai un numero in doppio intero che è superiore a 32768 (limite dell'intero) puoi avere dei problemi ad utilizzare questa funzione.

se devi fare delle operazioni matematiche, penso che sia meglio convertire il tuo numero doppiointero in BCD e poi utilizzare le cifre BCD per fare quello che vuoi.

informazioni sul tipo di dati e limiti le trovi nel manuale in linea (appendice -> tipi di dati e parametri)

e comunque come ti è già stato suggerito:

Spiegati meglio
Modificato: da keosmm
Link al commento
Condividi su altri siti

Mi serve convertire un valore REAL (32bit con virgola) in un DINT(32bit) e poi in un INT(16bit). Ovviamente considerando che i limiti sono differenti, scontato, ma non dimenticando che il numero può essere minore o maggiore.

Sono stato chiaro?

Grazie. Ciao

Link al commento
Condividi su altri siti

La prima conversione come sopra, TRUNC

poi, se vuoi trasformare un numero DINT espresso com max 16 bit su 32 in uno INT puoi usare il trucco dello spiazzamento di una word.

Numero DINT in DB1.DBD0

L DB1.DBD0 // legge in formato DINT

L DB1.DBW2 // legge in formato INT

Modificato: da rguaresc
Link al commento
Condividi su altri siti

non so se con l'istruzione TRUNC la conversione può funzionare. Secondo me il compilatore interpreterebbe l'argomento della funzione come un real e darebbe un risultato non plausibile. A questo punto il modo migliore per convertire potrebbe essere un MOVE della variabile DINT in una di tipo INT, sempre che la stessa variabile non superi 32768, come giustamente dice keosmm, e questo perchè viene trasferito solo l'ACCU1 (a 16 bit).

Link al commento
Condividi su altri siti

Beh, ma non si possono usare anche le funzioni RND+ (arrotonda al numero intero superiore) e RND- (arrotonda al numero intero inferiore) ?

Ciao

Link al commento
Condividi su altri siti

La soluzione di rguaresc è proprio quella che pensavo. E penso di aver capito il problema.

Se si prova a fare con MD100(DINT): L MW102 T MW200. MW200 avrà il numero INT di MD100 compreso il segno. OK.

Provate a farlo su una variabile locale di un FB. Funziona?

Dovrebbe. Forse sbaglio qualcosa nell'indirizzamento. A voi?

GRazie

Link al commento
Condividi su altri siti

ifachsoftware

Spero che il valore immagazzinato nel double a 32 bit non usi come parte intera piu' di 16 bit , altrimenti avrai dei problemi durante la conversione.

Non so il tuo problema esattamente (e non conosco l'S7 nello specifico) ma eventualmente ottenuto l'intero a 32 bit potresti usare (se applicabile) una funzione di scaling del tuo valore per convertire i 32 bit in 16 bit. , mentre se non usi valori che superano i 32 bit dovresti copiare la parte bassa della word a 32 bit nella variabile a 16.

Ciao :)

Link al commento
Condividi su altri siti

Matteo Montanari

L Real

TRUNC

T Int (Word)

chiaramente i numeri che metti nella varibile "Real" devono esere compresi nei campi ammessi dallì'intero.

io lo utilizzo in un FB parametrizzata per scivere le uscite analogiche, quindi funziona.

Modificato: da keosmm
Link al commento
Condividi su altri siti

Certo keosmm l'ho usato anche io, fino al giorno che mi si è presentato un impianto con delle temperature negative. Se fai caso il TRUNC sballa sotto lo 0.

OCIO!!!

Link al commento
Condividi su altri siti

Matteo Montanari

se hai problemi con i numeri negativi, trasformali in positivi, esegui le operazioni che devi fare, poi convertili nuovamente.

confesso che la funzione per come la utilizzo io, ha sempre numeri positivi, ma basta poco per modifcare la formula e renderla adatta anche ai numeri negativi.

potresti utilizzare anche un altra funzione, RND.

fino al giorno che mi si è presentato un impianto con delle temperature negative. Se fai caso il TRUNC sballa sotto lo 0.

a leggere il manuale No, ma non ho avuto modo di provare, appena posso lo faccio subito.

comunque la cosa è molto diversa dalla domanda che hai posto ad inizio discussione, come sempre più le richieste sono precise, maggiori e chiare sono le risposte

Modificato: da keosmm
Link al commento
Condividi su altri siti

Ho trovato l'FC già bella che pronta per essere utilizzata!!! Mi ricordavo che esisteva, anzi l'avevo anche usata. Domani la publico così se qualcun altro ne ha bisogno. Si può vero?

Ciao

Link al commento
Condividi su altri siti

Non capisco come mai dite che con i nr. negativi non funziona...

Secondo me non c’è nessun problema a fare:

L MD10 // -32768 formato DINT

T MW50 // -32768 formato INT

Se visualizziamo in binario avremo:

MD10 = 2#1111 1111 1111 1111 1000 0000 0000 0000

MW50 = 2#1000 0000 0000 0000 (gli spazietti li ho messi per capire meglio).

I 16 bit scartati quando si trasferisce un numero a 32 bit (ACCU1 è a 32 bit) in un INT sono insignificanti a patto che il numero a 32 bit sia compreso tra -32768 e +32767.

E forse è per questo che non c’è una funzione DI_I, (però se la mettevano magri si poteva gestire l’overflow).

Se mi sono spiegato male correggetemi !

Link al commento
Condividi su altri siti

emanuele.croci

Ciao,

ti dico il mio sistema:

L real

TRUNC

NEGD

NEGI

T Int

Che ne dici?

Ciao, Emanuele

N.B. Se fate:

L Real

TRUNC

T Int

...non funziona con i numeri negativi perchè nei DINT il segno è il 32° bit mentre negli INT il segno è il 16° bit; in altre parole se il numero DINT è negativo e voi lo trasferite su una word, sarà trasferita solo la parte dei bit 1-16 e l'informazione del segno negativo, bit 32°, andrà persa...

Modificato: da emanuele.croci
Link al commento
Condividi su altri siti

Codice:

//conversione in valore DINT

L #OUT_REAL

RND

T #OUT_INT_32bit

//conversione in valore INT

L #OUT_INT_32bit

L L#32767

>D

SPB END

TAK

L L#-32768

<D

SPB END

L P##OUT_INT_32bit

LAR1

L W [AR1,P#2.0]

T #OUT_INT_16bit

SPA END1

END: NOP 0

L 0

T #OUT_INT_16bit

SPA END1

END1: NOP 0

Ciao :)

Link al commento
Condividi su altri siti

emanuele.croci

..mi correggo secondo me ha ragione JumpMan, ho provato e funziona anche senza negarlo (la doppia negazione è utile se vuoi passare da INT a DINT...)

Ciao, Emanuele

Link al commento
Condividi su altri siti

emanuele.croci

Sì hai ragione, la doppia negazione era in realtà una mia teoria che funzionava benissimo... per il fatto che non serviva a niente e avrebbe funzionato anche senza, come tu dimostri!

(ed in effetti è giusto anche nel caso opposto usare "ITD"..)

Ciao, Emanuele

Link al commento
Condividi su altri siti

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