Vai al contenuto

Gestire un conteggio veloce su ingresso digitale

Home Forum Programmazione IEC 61131 (LogicLab) Gestire un conteggio veloce su ingresso digitale

Stai visualizzando 8 post - dal 1 a 8 (di 8 totali)
  • Autore
    Post
  • #35693
    Corrado
    Partecipante

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

    #38584
    Sergio Bertana
    Amministratore del forum

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

    #38591
    Corrado
    Partecipante

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

    #38592
    Sergio Bertana
    Amministratore del forum

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

    #39224
    Anonimo
    Inattivo

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

    #39225
    Sergio Bertana
    Amministratore del forum

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

    #39226
    Anonimo
    Inattivo

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

    #39227
    Sergio Bertana
    Amministratore del forum

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

Stai visualizzando 8 post - dal 1 a 8 (di 8 totali)
  • Devi essere connesso per rispondere a questo topic.