Velocità acquisizione ingressi digitali moduli espansione
Home › Forum › Controllori SlimLine e Netsyst (LogicLab) › Velocità acquisizione ingressi digitali moduli espansione
- Questo topic ha 4 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 10 anni, 3 mesi fa da
Sergio Bertana.
-
AutorePost
-
Agosto 8, 2012 alle 8:58 pm #35265
Anonimo
InattivoOsservando 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 ?
Agosto 9, 2012 alle 6:40 am #37367Sergio Bertana
Amministratore del forumGli 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.
Agosto 9, 2012 alle 6:52 am #37368Sergio Bertana
Amministratore del forumMa 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.
Gennaio 11, 2015 alle 9:45 am #38634Maurizio Conti
PartecipanteStò 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 imageL’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)?
Gennaio 12, 2015 alle 1:54 pm #38635Sergio Bertana
Amministratore del forumIl 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.