aleb2 Inserito: 9 dicembre 2008 Segnala Inserito: 9 dicembre 2008 Ho questo problema:devo leggere un ingresso analogico, fare una serie di calcoli il risultato dei quali inserirlo come SP in un temporizzatore, quindi l ultima operazione è una conversione intero--bcd, ora tutto mi va bene fino a che non aumento (sopra 3750 ) l' ingresso analogico (0-32000); mi va in stop la cpu con errore di conversione.come è la sequenza corretta per fare la conversione tra intero e bcd?
Livio Orsini Inserita: 9 dicembre 2008 Segnala Inserita: 9 dicembre 2008 Intero esadecimale (num) ===> BCD1 - Test se num > 9999, se si divido per 10000 e ho le decine di migliaia, salvo il resto come num. Se no salto direttamente al 22 - Test se num >999, se si divido per 1000 e ho le migliaia, salvo il resto in num. Se no salto direttamente al 33 - Test se num > 99, se si divido per 100 e ho le centinaia, salvo il resto come num. Se no salto direttamente al 44 - Test se num >9, se si divido per 10 e ho le decine, salvo il resto in num. Se no salto direttamente al 55 - unità = num
batta Inserita: 10 dicembre 2008 Segnala Inserita: 10 dicembre 2008 Se posti il codice si può dare un'occhiata per individuare l'errore.Per evitare che la cpu vada in stop, ti basta aggiungere OB121 (mi pare), anche vuoto.La conversione non darà, ovviamente, un risultato corretto ma, se il programma continua a girare, è più facile individuare l'errore.
aleb2 Inserita: 12 dicembre 2008 Autore Segnala Inserita: 12 dicembre 2008 proprio cosi`, ho inserito OB121 e la cpu non va in stop ma in SF; nel codice ho un operazione I-BCD (es.20761 da convertire), di seguito la word di uscita la inserisco nel temporizzatore S_ODT, ma il numero non e` corretto; la cpu mi dice errore di conversione BCD; il temporizzatore dovrebbe avere la risoluzione in decimi di secondo;e devo impostare un tempo che puo` variare da 200ms a 60sgrazie
batta Inserita: 12 dicembre 2008 Segnala Inserita: 12 dicembre 2008 Per convertire un intero in BCD ci sono due istruzioni: ITB (Integer To BCD) e DTB (DuobleInteger To BCD).Nel tuo caso ti basta usare ITB, perché il preset del timer può andare da 0 a 999, e l'istruzione ITB può convertire in BCD numeri compresi tra -999 e +999.Se all'istruzione dai in pasto 20761 (come da tuo esempio) è normale che venga segnalato un errore.Per fare quello che desideri (usare ingresso analogico per impostare preset di un timer), devi prima scalare il valore analogico 0÷27648 --> 0÷999.Ricorda che per S7-300 il valore analogico non arriva a 32000, ma solo a 27648 (6C00 in esadecimale).Dopo esserti assicurato che il valore intero da convertire rispetta i limiti previsti, esegui la conversione da INT a BCD.Hai così pronto il valore di preset del timer.Ora devi impostare la base tempi.Se hai convertito un numero compreso tra 0 e 999 (quindi positivo) i bit da 12 a 15 dopo la conversione sono tutti a zero. Questo significherebbe base tempi di 10ms.Per impostare la base tempi = 100ms, ti basta mettere in OR la variabile ottenuta dalla conversione con il valore esadecimale 1000.Per finire, se vuoi limitare il preset da 200ms a 60s (ovvero da 2 a 600 decimi di secondo), ti basta scalare il valore analogico da 2 a 600 (invece che da 0 a 999).
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