Vai al contenuto

Posizionamento asse con trasduttore effetto hall

Home Forum Programmazione IEC 61131 (LogicLab) Posizionamento asse con trasduttore effetto hall

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #54197
    Andrea
    Partecipante

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

    #54199
    Sergio Bertana
    Amministratore del forum

    Dal 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’attuatore

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

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