robyvelocity Inserito: 12 maggio 2005 Segnala Share Inserito: 12 maggio 2005 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 More sharing options...
jumpier Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 Spiegati meglio .... Vuoi spezzare in contenuto del DINT in due INT?Es. DINT = 12345678 --> INT1 = 1234, INT2 = 5678... oppure vuoi fare altro ??? Link al commento Condividi su altri siti More sharing options...
Matteo Montanari Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 (modificato) potresti utilizzare la funzione TruncFormato 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: 12 maggio 2005 da keosmm Link al commento Condividi su altri siti More sharing options...
robyvelocity Inserita: 12 maggio 2005 Autore Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
rguaresc Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 (modificato) La prima conversione come sopra, TRUNCpoi, 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.DBD0L DB1.DBD0 // legge in formato DINTL DB1.DBW2 // legge in formato INT Modificato: 12 maggio 2005 da rguaresc Link al commento Condividi su altri siti More sharing options...
chibboy Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
lucios Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
robyvelocity Inserita: 12 maggio 2005 Autore Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
ifachsoftware Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
Matteo Montanari Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 (modificato) L RealTRUNCT 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: 12 maggio 2005 da keosmm Link al commento Condividi su altri siti More sharing options...
robyvelocity Inserita: 12 maggio 2005 Autore Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
Matteo Montanari Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 (modificato) 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: 12 maggio 2005 da keosmm Link al commento Condividi su altri siti More sharing options...
robyvelocity Inserita: 12 maggio 2005 Autore Segnala Share Inserita: 12 maggio 2005 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 More sharing options...
JumpMan Inserita: 12 maggio 2005 Segnala Share Inserita: 12 maggio 2005 Non capisco come mai dite che con i nr. negativi non funziona...Secondo me non c’è nessun problema a fare:L MD10 // -32768 formato DINTT MW50 // -32768 formato INTSe 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 More sharing options...
emanuele.croci Inserita: 13 maggio 2005 Segnala Share Inserita: 13 maggio 2005 (modificato) Ciao,ti dico il mio sistema:L realTRUNCNEGDNEGIT IntChe ne dici?Ciao, EmanueleN.B. Se fate: L RealTRUNCT 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: 13 maggio 2005 da emanuele.croci Link al commento Condividi su altri siti More sharing options...
robyvelocity Inserita: 13 maggio 2005 Autore Segnala Share Inserita: 13 maggio 2005 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 END1END: NOP 0 L 0 T #OUT_INT_16bit SPA END1END1: NOP 0Ciao Link al commento Condividi su altri siti More sharing options...
emanuele.croci Inserita: 13 maggio 2005 Segnala Share Inserita: 13 maggio 2005 ..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 More sharing options...
JumpMan Inserita: 13 maggio 2005 Segnala Share Inserita: 13 maggio 2005 (la doppia negazione è utile se vuoi passare da INT a DINT...)non serve, c'è l'apposita funzione Link al commento Condividi su altri siti More sharing options...
emanuele.croci Inserita: 16 maggio 2005 Segnala Share Inserita: 16 maggio 2005 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora