mazzucconi Inserito: 20 aprile 2009 Segnala Inserito: 20 aprile 2009 Buongiorno a tutti,io posso introdurre da un pannello un valore decimale di un temporizzatore (massino 60.0 secondi) ed ho a disposizione nel plc il suo valore in formato esadecimale.Come posso metterlo a disposizione in una word con formato intero ? (es 14s30ms = 143)Leggendo nelle varie discussioni sono riuscito a trovare l'operazione contraria.
Matteo Montanari Inserita: 20 aprile 2009 Segnala Inserita: 20 aprile 2009 ESEMPIO://;// Creazione del timer//; UN T 9 L MW 0 SE T 9//;// Trasferimento del valore di set-point del timer in un valore intero//; L MW 0 // Caricamento del preset del timer (utilizzato sopra) SLW 4 // Fai scorere parola a sinistra (di 4 bit) per togliere la base dei tempi SRW 4 // Fai scorere parola a destra (di 4 bit) per "azzerare" i 4 bit piu' significativi BTI // Converti numero BCD in numero intero T MW 2 // Valore intero del preset del timer//;con il valore: S5T#9s500mstradotto in bcd ottieni 2#0000_1001_0101_0000mentre come valore intero ottieni 950attenzione perche' togliendo la base dei tempi potresti avere lo stesso risultato per valori diversi:S5T#20s500ms -> 2#0001_0010_0000_0101 -> 205S5T#2s500ms -> 2#0000_0010_0000_0101 -> 205
mazzucconi Inserita: 21 aprile 2009 Autore Segnala Inserita: 21 aprile 2009 Ciao a tuttiutilizzando il consiglio di Matteo ho effettuato questa modifica per ovviare al problema della base dei tempi :ESEMPIO://;// Creazione del timer//;UN T 9L MW 0SE T 9//;// Trasferimento del valore di set-point del timer in un valore intero//;L MW 0 // Caricamento del preset del timer (utilizzato sopra)SLW 4 // Fai scorere parola a sinistra (di 4 bit) per togliere la base dei tempiSRW 4 // Fai scorere parola a destra (di 4 bit) per "azzerare" i 4 bit piu' significativiBTI // Converti numero BCD in numero interoT MW 2 // Valore intero del preset del timerU M0.4 // se la base dei tempi è uno moltiplico il valore per 10SPBN ENDL 10*IT MW2END :NOP 0//;con il valore: S5T#9s500mstradotto in bcd ottieni 2#0000_1001_0101_0000mentre come valore intero ottieni 950attenzione perche' togliendo la base dei tempi potresti avere lo stesso risultato per valori diversi:S5T#20s500ms -> 2#0001_0010_0000_0101 -> 205S5T#2s500ms -> 2#0000_0010_0000_0101 -> 205Al supervisore metto così a disposizione un intero che dovrà sempre dividere per 100.Ho provato con tempi fino a 60 secondi come serve a me e sembra funzionare.
batta Inserita: 21 aprile 2009 Segnala Inserita: 21 aprile 2009 Solo per curiosità, potrei sapere perché devi fare questa conversione?
mazzucconi Inserita: 23 aprile 2009 Autore Segnala Inserita: 23 aprile 2009 Ciao Battaho dovuto fare questa conversione perchè, attraverso una delle tante schede MPI/Ethernet, un supervisore raccoglie il dato come numero intero.
batta Inserita: 23 aprile 2009 Segnala Inserita: 23 aprile 2009 Ma il dato non viene anche scritto dallo stesso supervisore?Se così fosse, ti converrebbe scrivere il dato in intero, e convertirlo poi in formato S5Time, piuttosto che fare il contrario.Altra strada possibile (dipende dal supervisore, ma direi che più o meno tutti sono in grado di farlo), è effettuare la conversione nel supervisore.
mazzucconi Inserita: 23 aprile 2009 Autore Segnala Inserita: 23 aprile 2009 Il supervisore legge solamente.I vari dati di processo vengono inseriti nella macchina attraverso un proprio pannello dedicato (GEFRAN) il cui progetto non possiamo ne vedere ne modificare.Per spiegare velocemente noi verifichiamo se e quando è modificato tale dato (sono parecchi tra temporizzatori,conteggi e altro) perchè questo potrebbe modificare il prodotto.
batta Inserita: 23 aprile 2009 Segnala Inserita: 23 aprile 2009 ...noi verifichiamo se e quando è modificato tale dato...Quindi il supervisore esegue già delle operazioni.Motivo in più, a mio avviso, per far fare al supervisore anche la conversione da S5Time a INT (DINT se vuoi coprire tutta la scala dei timer in centesimi di secondo).Questo anche perché nella tua conversione tieni conto solo della base tempi di 10ms o di 100ms. Non effettui controlli per base tempi 1s o 10s.Se sei sicuro che i tuoi timer non utilizzano base tempi 1s e 10s, può andar bene. Rimane comunque un lavoro "incompleto".Potresti almeno aggiungere anche il controllo del bit 13 (M0.5 nel tuo esempio) e moltiplicare x100 se è alto. Avresti quindi le seguenti possibilità:base tempi 00: nessuna operazionebase tempi 01: moltiplichi x10base tempi 10: moltiplichi x100base tempi 11: moltiplichi x100Nota bene: ti basta moltiplicare x10 se è alto M0.4 e moltiplicare x100 se è alto M0.5, ed hai già coperto tutte le combinazioni.Il risultato è il tempo in centesimi di secondo.Rischi però di superare il valore massimo di una variabile INT.Potresti anche procedere come segue:base tempi 00: dividi /10base tempi 01: nessuna operazionebase tempi 10: moltiplichi x10base tempi 11: moltiplichi x100Nota bene: ti basta moltiplicare x100 se è alto M0.5 e dividere /10 se è basso M0.4 ed hai già coperto tutte le combinazioni.Il risultato è in decimi di secondo.Con la divisione però taglieresti i centesimi di secondo.Se invece da supervisore leggi semplicemente il dato così com'è (ricorda però che è in BCD), e la conversione la fa il supervisore, risulta un lavoro più completo e più pulito.
mazzucconi Inserita: 24 aprile 2009 Autore Segnala Inserita: 24 aprile 2009 Ciao Batta la conversione mi è stato chiesto di farla nel PLC per non sovraccaricare ulteriormente il supervisore.Deve raccogliere moltissimi dati di produzione e di processo ed eseguire una serie di controlli.Detto questo farò come tu mi hai suggerito, visto che le cifre da convertire possono andare da 0,0 a 99,9.Grazie ancora.
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