Velocità acquisizione ingressi digitali moduli espansione

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

Home Forum Controllori SlimLine e Netsyst (LogicLab) Velocità acquisizione ingressi digitali moduli espansione

Questo argomento contiene 4 risposte, ha 3 partecipanti, ed è stato aggiornato da  Sergio Bertana 4 anni, 1 mese fa.

Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)
  • Autore
    Articoli
  • #35265

    Diego
    Partecipante

    Osservando il data sheet hardware dei moduli slimline, si vede che esistono ingressi denominati high speed, quale è la differenza rispetto agli altri ingressi disponibili ?

    Volendo leggere degli inpulsi encoder con frequenza massima 200Hz si possono usare anche ingressi non high speed ?

    #37367

    Sergio Bertana
    Amministratore del forum

    Gli ingressi high speed sono realizzati con optoisolatori molto veloci, e possono acquisire segnali in ingresso con una frequenza massima di 50 Khz. Tutti gli altri ingressi hanno optoisolatori lenti e possono acquisire segnali in ingresso con una frequenza massima di 10 Khz. Ma al di là del limite elettrico di velocità, occorre entrare nella logica di funzionamento del modulo di acquisizione per comprenderne le possibilità ed i limiti.

    Su tutti gli ingressi (Anche quelli veloci) è predisposto un filtro digitale di 5 mS che limita la frequenza massima di acquisizione a 200 Hz. Il filtro è stato inserito per tagliare i segnali di rimbalzo (Debouncing) dei contatti elettrici, un PLC deve acquisire segnali che arrivano da trasduttori elettromeccanici e deve garantirne la corretta acquisizione.

    Sugli ingressi veloci è previsto un circuito di conteggio che utilizzando il segnale prima del filtro permette di gestire un encoder in quadratura con frequenza massima pari a quella tipica dell’optoisolatore.

    #37368

    Sergio Bertana
    Amministratore del forum

    Ma per rispondere alla tua domanda, ti ricordo che nella libreria di blocchi funzioni esiste l’FB IOEncoder, incremental encoder over I/O (Vedi estratto manuale). Collegando a questo questo blocco funzione due ingressi digitali è possibile acquisire sugli stessi un encoder incrementale.

    Naturalmente la frequenza massima che potrai gestire dipende dalla velocità con la quale viene eseguito il blocco funzione, ipotizzando di utilizzare per l’acquisizione i due ingressi del modulo CPU (Non hanno nessun filtro) realizzando un semplice programma ladder come quello presente nel manuale, potrai inserire il programma nella task fast ed eseguendolo ogni 1 mS potrai gestire encoder con una frequenza massima di 200 Hz (Vedi nota applicativa).

    Puoi anche eseguire l’acquisizione diretta degli ingressi tramite il blocco funzione SysGetPhrDI, get peripheral digital input, e poi appoggiare gli ingressi a più istanze del blocco funzione IOEncoder gestendo più encoders.

    #38634

    Maurizio Conti
    Partecipante

    Stò acquisendo una batteria di DI con lo SlimLine come da codice seguente:

    FOR i:=0 TO 21 DO
    (* CASE i OF 
        0..5: DIN[i]:= SysCPUDI[i];
        6..21: DIN[i]:= SysDI00[i-6];
      END_CASE; *)

      CASE i OF
        0: DIN[0]:= %IX255.0;
        1: DIN[1]:= %IX255.1;
        …
        21:DIN[21]:=%IX0.15;
      END_CASE;
    END_FOR;

    Mentre il CASE scommentato funziona, quando tento di compattare il codice (codice commentato) ottengo i seguenti errori: SysCPUDI => Complex variables cannot have process image
    SysDI00 => Complex variables cannot have process image

    L’accesso all’elemento dell’array SysDI00 però all’interno della finestra di watch invece non da problemi. Cosa sto sbagliando ?

    Inoltre ti chiedo, volendo acquisire i DI tramite Modbus è consigliabile/preferibile usare la Read Input Status (FC=02) oppure appoggiarli su una variabile interna e leggeri con la funzione Read Holding Registers (FC=03)?

    #38635

    Sergio Bertana
    Amministratore del forum

    Il problema riguarda il modo in cui è gestita l’immagine di processo degli I/O, trovi ulteriori informazioni in questo topic. In pratica gli ingressi digitali sono acquisiti dal sistema operativo nella task Slow e sono trasferiti nelle variabili UDINT SysCPUDI e SysDIxx, poi sono trasferiti nella tabella di variabili BOOL %IXxx.

    Quando un programma si riferisce ad una variabile %IXxx LogicLab controlla che task stà eseguendo il programma e se è la task Slow, si riferisce alla variabile reale, se è la task Back esegue una copia della variabile reale in una variabile di appoggio creando una ulteriore immagine di processo.

    L’immagine di processo chiamiamola copia, viene fatta automaticamente solo sulle variabili %IXxx, quindi la soluzione al tuo problema è quella di eseguire il programma nella task Slow.

    In riferimento alla acquisizione da Modbus, sia il comando 16#02 Read input status che 16#03 Read holding registers, hanno grosso modo la stessa lunghezza in bytes nel frame di risposta quindi a livello di frame sono paragonabili. Poi certo la prima ti ritorna un array di BOOL mentre la seconda ti ritorna una o più words che poi dovrai ancora scompattare per avere i valori in variabili BOOL.

Stai vedendo 5 articoli - dal 1 a 5 (di 5 totali)

Devi essere loggato per rispondere a questa discussione.