Vai al contenuto
PLC Forum


Ingresso Analogico - conversione INTERO-BCD


Messaggi consigliati

Inserito:

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?


Inserita:

Intero esadecimale (num) ===> BCD

1 - 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 2

2 - Test se num >999, se si divido per 1000 e ho le migliaia, salvo il resto in num. Se no salto direttamente al 3

3 - Test se num > 99, se si divido per 100 e ho le centinaia, salvo il resto come num. Se no salto direttamente al 4

4 - Test se num >9, se si divido per 10 e ho le decine, salvo il resto in num. Se no salto direttamente al 5

5 - unità = num

Inserita:

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.

Inserita:

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 60s

grazie

Inserita:

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

  • 3 weeks later...

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