Gestire un conteggio veloce su ingresso digitale
Home › Forum › Programmazione IEC 61131 (LogicLab) › Gestire un conteggio veloce su ingresso digitale
- Questo topic ha 7 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 9 anni, 5 mesi fa da
Sergio Bertana.
-
AutorePost
-
Dicembre 12, 2014 alle 5:00 pm #35693
Corrado
PartecipanteHo un problema con un segnale da fotocellula che entra nell’ingresso DI12 e DI13 di un modulo PCB129*000 Se passa a velocità standard della macchina vedo visivamente accendersi il led corrispondente all’ingresso del modulo ma non aumenta il counter dove viene letto.
Non ho potuto al momento verificare con oscilloscopio la durata dell’impulso, ma se rallento il passaggio il problema non si verifica. Avete suggerimenti.
Dicembre 12, 2014 alle 5:10 pm #38584Sergio Bertana
Amministratore del forumMi parli di due ingressi quindi immagino che i conteggi siano due, ma per chiarire il modo in cui sono gestiti gli I/O dal sistema ti rimando alla lettura di questo topic.
Quindi venendo al tuo problema e non conoscendo ne come hai fatto il programma ne in che task lo esegui, immagino tu stia utilizzando l’immagine di processo che di default acquisisce gli ingressi ogni 10 mS. Dovendo eseguire un conteggio, devi rilevare la variazione di stato dell’ingresso, quindi occorre che l’ingresso sia attivo per almeno 10 mS e poi disattivo per almeno 10 mS. In caso contrario il LED è acceso ma se l’ingresso si disattiva per un tempo inferiore ai 10 mS il programma non può catturane la variazione di stato.
Per acquisire ingressi velocemente, occorre utilizzare la task fast (Di default è eseguita ogni 1 mS), quindi gestendo tutta la logica ma anche l’acquisizione fisica degli ingressi nella task fast possiamo controllare variazioni di stato molto più veloci.
Ma come al solito più delle parole vale un esempio, ecco un programa che esegue un doppio conteggio su ingressi digitali, nel programma utilizzo gli ingressi del modulo CPU, ma tu puoi cambianto l’indirizzo di modulo usare gli ingressi che desideri. Da notare il modo di acquisizione DI_I_8_LL Read 0-7 input mode (Immediate), per eliminare il debouncing di 4.7 mS tipico degli ingressi digitali (Stampa programma, Programma sorgente).
Dicembre 16, 2014 alle 8:23 am #38591Corrado
PartecipanteGrazie per il suggerimento, utilizzando gli I/O del modulo CPU il problema si è risolto… anzi ho dovuto inserire un filtro per evitare i rimbalzi di lettura.
Dicembre 16, 2014 alle 8:24 am #38592Sergio Bertana
Amministratore del forumQuando serve acquisire ingressi in modo molto veloce conviene utilizzare se possibile gli ingressi del modulo CPU, questo perchè essendo fisicamente connessi al microcontrollore ne è estremamente veloce l’acquisizione (Pochi uS).
Per acquisire gli ingressi dai moduli di estensione è necessario un tempo che varia in funzione del numero di ingressi acquisisti (Per 8 ingressi è dell’ordine di 100 uS). Essendo il tempo di esecuzione di default della task fast impostato a 1 mS la sola acquisizione di 100 uS occupa un decimo del tempo disponibile.
Il tempo necessario alla acquisizione degli ingressi diventa ancora più significativo nel caso in cui si desideri velocizzare l’esecuzione della task fast utilizzando la funzione SysSetTaskLpTime (Il tempo minimo è 100 uS). In quel caso non vi sarebbe più neanche il tempo per eseguire l’acquisizione degli ingressi dai moduli periferici (Topic). Ecco un’altro esempio in cui sono utilizzati gli ingressi veloci per acquisire un lettore tag RFiD (Topic).
Certo poi come fai notare tu, acquisendo velocemente gli ingressi, se l’ingresso proviene da un dispositivo elettromeccanico, occorrerà cautelarsi contro i rimbalzi del contatto.
Novembre 27, 2015 alle 2:45 pm #39224Anonimo
InattivoHo realizzato un counter (Creato come da consuetudine con l’operando ADD: Var+1 in Var) su contatto pulse del modulo CPU IX255.0 (Come in questo topic). A questo ingresso ho connesso un sensore magnetico fisico PNP NC (attivato da ruota con un solo punto su albero motore).
Inserendo il programma nella task Slow ho notato che la variabile non si incrementa quale può essere il problema.
Novembre 27, 2015 alle 2:57 pm #39225Sergio Bertana
Amministratore del forumCome dici tu il sensore magnetico legge un solo punto sull’albero, quindi non devi utilizzare la frequenza come parametro di riferimento, ma il tempo di attivazione del sensore. Per assurdo se il punto di controllo è puntiforme la durata dell’impulso può essere di pochi mS.
Considerando che gli ingressi digitali hanno un filtro hardware di 4,7 mS e che sono acquisiti nella task Slow ogni 10 mS capisci che l’impulso può andare perso. Per essere certi di acquisire impulsi molto brevi devi acquisire direttamente gli ingresi con la funzione SysGetPhrDI come indicato in questo topic.
Novembre 27, 2015 alle 3:04 pm #39226Anonimo
InattivoHo provato ad utilizzare il FB SysGetCounter, ho provato ad inserire Mode a 8192 in decimale ma il FB mi dava errore. Poi ho provato con Mode a “0” e il conteggio funziona m aho 2 impulsi a giro.
Novembre 27, 2015 alle 3:08 pm #39227Sergio Bertana
Amministratore del forumIl FB SysGetCounter permette di sfruttare il circuito hardware di conteggio presente in alcuni moduli, per vedere i moduli che dispongono del counter devi fare riferimento al manuale di descrizione hardware del modulo.
Il modulo CPU ha un solo counter hardware sull’ingresso Di00, quindi è utilizzabile, però non dispone degli ingressi di Reset e di Reverse. Quindi ecco perchè impostando Mode a 8192 il FB ti dava errore.
Il fatto che conti due impulsi giro con Mode a 0 mi suggerisce un problema di rimabalzi sulla lettura, essendo il counter hardware molto veloce basta anche un impulso piccolissimo per generare un clock. Sono sicuro che se mettessi un oscilloscopio sull’ingresso vedresti i due impulsi.
Attenzione, il counter hardware gestisce il conteggio in modo autonomo, quindi il programma che esegue il FB SysGetCounter può essere tranquillamente messo sia nella task Slow che nella Back.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.