Posizionamento asse con trasduttore effetto hall
Home › Forum › Programmazione IEC 61131 (LogicLab) › Posizionamento asse con trasduttore effetto hall
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 5 anni, 1 mese fa da
Sergio Bertana.
-
AutorePost
-
Marzo 20, 2020 alle 5:35 pm #54197
Andrea
PartecipanteVolevo fare una domanda sul posizionamento di un asse, stò utilizzando un attuatore Linak che ha un trasduttore di posizione gestito da un sensore ad effetto hall che genera un treno di impulsi in base allo spostamento dell’asse. Ho scritto queste semplici righe per calcolare la posizione dell’attuatore (Note moderatore, ho riscritto il programma mantenendo il concetto).
// ------------------------------------------------------------------------- // INIZIALIZZAZIONE // ------------------------------------------------------------------------- IF (SysFirstLoop) THEN DInp.Address:=255; //Module address DInp.Mode:=DI_8_LL; //Acquisition mode END_IF; // ------------------------------------------------------------------------- // CONTEGGIO IMPULSI // ------------------------------------------------------------------------- // Eseguo acquisizione ingressi digitali. DInp(); //Digital input acquisition // Controllo quale comando è attivo se Up o Down. Up:=TO_BOOL(DInp.Value AND 16#01); //Comando Up attivo Dw:=TO_BOOL(DInp.Value AND 16#02); //Comando down attivo // Conteggio impulsi da sensore trasduttore. IF (TO_BOOL(DInp.Value AND 16#04) <> Pulse) THEN Pulse:=TO_BOOL(DInp.Value AND 16#04); //Input pulse // Se si controlla "Pulse" incremento solo su fronte attivazione. // Togliendo controllo si incrementa anche su fronte disattivazione. IF (Pulse) THEN IF (Up) THEN Position:=Position+1; END_IF; IF (Dw) THEN Position:=Position-1; END_IF; END_IF; END_IF; // [End of file]
Aprendo e richiudendo fino a fine corsa l’attuatore non ci sono problemi, ma se gestisco comandi di apertura/chiusura parziali mi trovo con errori di posizione.
PS: Non ho ancora inserito l’azzeramento posizione su finecorsa chiusura proprio per vedere eventuali errori.
Marzo 20, 2020 alle 6:21 pm #54199Sergio Bertana
Amministratore del forumDal programma che hai fatto vedo che utilizzi 3 ingressi digitali del modulo CPU:
Di00 per rilevare il comando Up dell’attuatore
Di01 per rilevare il comando Dw dell’attuatore
Di02 per rilevare il trasduttore effetto hall dell’attuatoreDal problema che lamenti, modificherei il programma in questo modo.
VAR Pulse : BOOL; (* Input pulse *) DwUp : BOOL; (* Direzione, Dw:FALSE, Up:TRUE *) Position : DINT; (* Posizione asse *) DInp : SysGetPhrDI; (* Digital input acquisition *) END_VAR // ------------------------------------------------------------------------- // INIZIALIZZAZIONE // ------------------------------------------------------------------------- IF (SysFirstLoop) THEN DInp.Address:=255; //Module address DInp.Mode:=DI_8_LL; //Acquisition mode END_IF; // ------------------------------------------------------------------------- // CONTEGGIO IMPULSI // ------------------------------------------------------------------------- // Eseguo acquisizione ingressi digitali. DInp(); //Digital input acquisition // Controllo quale comando è attivo se Up o Down. IF TO_BOOL(DInp.Value AND 16#01) THEN DwUp:=TRUE; END_IF; IF TO_BOOL(DInp.Value AND 16#02) THEN DwUp:=FALSE; END_IF; // Conteggio impulsi da sensore trasduttore. IF (TO_BOOL(DInp.Value AND 16#04) <> Pulse) THEN Pulse:=TO_BOOL(DInp.Value AND 16#04); //Input pulse // Se si controlla "Pulse" incremento solo su fronte attivazione. // Togliendo controllo si incrementa anche su fronte disattivazione. IF (Pulse) THEN IF (DwUp) THEN Position:=Position+1; ELSE Position:=Position-1; END_IF; END_IF; END_IF; // [End of file]
Non è molto diverso dal tuo, unica differenza è utilizzare una sola flag per indicare la direzione, in questo modo anche quando spegni il motore dell’attuatore rimane memorizzata l’ultima direzione. Così siccome sull’arresto non c’è un arresto immediato ma ci potrebbero essere ancora degli impulsi in questo modo vengono contati correttamente.
Nota: E’ importante che la variabile Position sia di tipo DINT per permettere di andare in negativo nel caso servisse.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.