niuron Inserito: 25 maggio 2004 Segnala Inserito: 25 maggio 2004 Ciao a tutti!Vorrei sapere se esiste in AWL per s7-300 una funzione per convertire una stringa in valore numerico decimale (es: "FD0C" -> 64780) o se esistono funzioni intermedie che mi evitino di scrivere tutto il codice di conversione.GrazieDavide
rddiego Inserita: 25 maggio 2004 Segnala Inserita: 25 maggio 2004 Cerca nella libreriaIEC Function block : FC37 STRNG_DI FC38 STRNG_IFC39 STRNG_R
niuron Inserita: 25 maggio 2004 Autore Segnala Inserita: 25 maggio 2004 Ho guardato come lavorano queste funzioni ma credo che dovrò costruirmi io tutta la conversione perché non mi vanno bene...Grazie comunqueciaoDavide
JumpMan Inserita: 26 maggio 2004 Segnala Inserita: 26 maggio 2004 Ma tu intendi inserire un valore esadecimale con un pannello operatore? perchè di solito i pannelli hanno già la possibilità di dichiarare una variabile come esadecimale.Nel tuo caso se tramite OP scrivi nella DBnn.DBWnnn (dichiarata come HEX) il valore "FB0C" otterrai in quella DW esattamente quello che vuoi:- Se la leggi in esadecimale = FB0C- Se la leggi in decimale = 64268- Se la leggi in binario = 1111101100001100Se non ho capito la domanda spiegati meglio...
niuron Inserita: 26 maggio 2004 Autore Segnala Inserita: 26 maggio 2004 Ciao!il mio problema é ottenere il valore numerico in base 10 a partire da un array di caratteri letti tramite seriale e memorizzati in un DB. Per esempio io ricevo una stringa di 32 caratteri (byte) "0809FD0CA0423.....", devo estrarre pezzi di stringa a blocchi di 4 caratteri alla volta e poi ricavare l'equivalente valore numerico. Qui il secondo blocco é "FD0C" che é uguale a 64780, ma come faccio a calcolarlo usando le funzioni già esistenti? Ho cominciato la decodifica in questo modo: -estraggo i blocchi di 4 caratteri-assegno ad ogni carattere il suo equivalente decimale (F=15,D=13,0=0,C=12)-calcolo il valore 15*16^3+13*16^2+12*16^1 = 64780Questa é la teoria ma sto impazzendo a scriverlo perché non é così facile....Qualunque suggerimento é ben accetto!GrazieciaoDavide
dago_ Inserita: 26 maggio 2004 Segnala Inserita: 26 maggio 2004 Forse ti puo' andar bene la funzione FC37 (STRNG_DI)DescrizioneCon la funzione FC 37 è possibile convertire una stringa di caratteri in una variabile con formato DINT. Il primo carattere nella stringa di caratteri può essere un segno o una cifra, i caratteri successivi devono essere costituiti da cifre. Se la lunghezza della stringa di caratteri è zero o maggiore di 11 oppure si trovano caratteri inammissibili nella stringa di caratteri, non avviene alcuna conversione ed il bit BIE viene azzerato. Se il risultato della conversione si trova fuori del campo numerico DINT, il risultato viene limitato al valore corrispondente ed il risultato binario BIE viene azzerato.Parametro Dichiarazione Tipo di dati Area di memoria DescrizioneS INPUT STRING D, L Stringa di caratteri di ingressoRET_VAL OUTPUT DINT E, A, M, D, L RisultatoPer il parametro di ingresso è possibile assegnare solo una variabile definita in modo simbolico .La trovi in Biblioteche > Standard Library > IEC Function Blocks.
rddiego Inserita: 26 maggio 2004 Segnala Inserita: 26 maggio 2004 NIURON forse ho capito che ti serve... Prova a guardare nella libreria TI-S7 Converting Blocks la FC94 ATH_CONVERT
niuron Inserita: 28 maggio 2004 Autore Segnala Inserita: 28 maggio 2004 ciao!questa funzione mi potrebbe servire, perché mi converte una stringa in esadecimale, però mi serve ancora passare da esadecimale a decimale.Se per esempio ho 2 byte B#16#42 e B#16#39 la funzione ATH mi fornisce B#16#B9 ma a me serve il valore decimale di B9 che é 185. La conversione da BCD a intero (BTI a 16 bit o BTD a 32 bit) accetta solo i numeri da 0 a 9 e non A,B,C... quindi non mi converte B9....Suggerimenti?
dago_ Inserita: 28 maggio 2004 Segnala Inserita: 28 maggio 2004 ma a me serve il valore decimale di B9 che é 185Forse se muovi B9 in una variabile dichiarata come INT.
rddiego Inserita: 28 maggio 2004 Segnala Inserita: 28 maggio 2004 Niuron, ma dove lo devi visualizzare sto numero? Su un pannello? Su un pc? Non importa.... ricorda che una sequenza di bit puoi leggerla come ti pare in base 16 o base 10 al PLC non frega niente. Non devi fare nessuna conversione.il numero decimale 185 = esadecimale B9 = binario 10111001Qualsiasi operazione tu debba fare con questi dati, NON devi fare nessuna conversione perchè non ha senso.La visualizzazione è compito del "visualizzatore" al quale gli si dice prendi questo dato e visualizzamelo in decimale, o esadecimale, o ASCII etc. (NON è una conversione).Se per comodità vuoi fare operazioni con numeri decimali purtroppo Step 7 crea delle limitazioni in quanto, se dichiari il tipo di dato di una variabile, non ti permette di fare operazioni in altri formati. O copi il tuo dato Hex in un altro dichiarato INT, oppure utilizza i Merker senza dichiararli nella tabella dei simboli. Ho detto 'Se per comodità..', ma prova a fare conti in esadecimale: è identico al sistema decimale (abitudine)
niuron Inserita: 7 giugno 2004 Autore Segnala Inserita: 7 giugno 2004 Ciao rddiego!con la tua "dritta" ho cambiato il mio codice di conversione (che avevo scritto e funzionava) in uno più semplice e snello. Hai perfettamente ragione, mi spiace solo che non ci ho pensato prima io... ahahahaComunque 1000 grazie per il tuo prezioso aiuto!Davide
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