SysGetEncoder, get encoder input

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Gli encoder sono apparati elettromeccanici che convertono la posizione in un segnale elettrico digitale composto da due onde quadre sfasate di 90°. Opportuni circuiti hardware permettono di contare questi impulsi determinando, in base alla differenza di fase, il senso di rotazione.

Questo blocco funzione esegue la lettura di un canale encoder (Utilizzabile solo sui moduli che hanno la gestione della quadratura encoder a livello hardware), è prevista la gestione della tacca di zero e la possibilità di acquisire valori di quota all’interno di un segnale logico di gate. Non è da confondere con il FB IOEncoder che esegue la lettura con un algoritmo software e con cui è possibile utilizzare qualsiasi ingresso logico.

Trucchi & suggerimenti

Per gestire un valore di quota encoder su variabili a maggiore numero di bits è possibile utilizzare il FB EncoderPulses. In alternativa utilizzare la tecnica riportata nel programma ST_EQuoteManage visibile in basso.

Moduli con gestione hardware quadratura encoder

Questo FB opera solo sui moduli che implementano la gestione hardware di quadratura encoder di seguito una tabella riassuntiva.

CodeChannelsZeroGateNote
PCB124*0001YesYesEncoder outputs must be push pull. Frequency up to 50kHz. Encoder signals must be connected as follow:
Di12:Zero mark, Di13:Gate, Di14:Ph A, Di15:Ph B
PCB124*0102Yes
See note
Yes
See note
Encoder outputs must be push pull. Frequency up to 50kHz. Zero mark and gate are managed if it’s used only the channel 0. Encoder signals must be connected as follow:
Di12:Zero mark, Di13:Gate, Di14:Ph A, Di15:Ph If both 2 channels are used Zero mark and Gate cannot be used. Encoder signals must be connected as follow:
Di12:Ph A, Di13:Ph B (Channel 1)
Di14:Ph A, Di15:Ph B (Channel 0)
PCB129*0001YesYesEncoder outputs must be push pull. Frequency up to 50kHz. Encodersignals must be connected as follow:
Di12:Zero mark, Di13:Gate, Di14:Ph A, Di15:Ph B
Information Circle

Blocco funzione

CODESYS: eCDSXUnified12Lib

LogicLab: eLLabXUnified12Lib

Descrizione

Address (USINT) Occorre specificare l’indirizzo di modulo da cui eseguire l’acquisizione (Range da 0 a 255). Il valore 0 indica il primo modulo di estensione, 1 il secondo e così di seguito. L’indirizzo 255 indica il modulo CPU.
Channel (USINT) Occorre specificare l’indirizzo del canale sul modulo (Range da 0 a 15).
RCount (BOOL) Reverse counting, attivando questo ingresso si inverte l’incremento di quota EQuote in funzione della direzione di rotazione encoder.
ZeroEn (BOOL) Attivando questo ingresso si ha il reset della quota EQuote al passaggio della tacca di zero encoder.
GateEn (BOOL) Attivando questo ingresso sul fronte di variazione dell’ingresso di Gate viene trasferito il valore di EQuote in GQuote.
RGate (BOOL) Attivando questo ingresso viene gestito il fronte di disattivazione dell’ingresso Gate.
Done (BOOL) Dato acquisisto, viene attivato per un loop di programma al termine della acquisizione.
Fault (BOOL) Errore di acquisizione, viene attivato in caso di errore nella sequenza di gestione.
ZeroD (BOOL) Tacca di zero encoder acquisita, viene settata su acquisizione tacca di zero encoder, si resetta disattivando l’ingresso ZeroEn.
GateD (BOOL) Segnale di gate acquisito, viene attivato per un loop alla acquisizione del segnale Gate.
GQuote (UINT) Quota di gate, valore di quota encoder EQuote memorizzata sul fronte selezionato del segnale Gate.
EQuote (UINT) Quota encoder, valore di quota encoder, al raggiungimento del valore minimo o massimo viene eseguito il roll over.

Immagine FB SysGetEncoder

Esempi

Come utilizzare gli esempi.

ST_SysGetEncoder: Viene eseguita l’acquisizione dell’ingresso encoder dal canale 0 del modulo 0, il valore di quota encoder è trasferito nella variabile Value.

ST_EQuoteManage: Il FB SysGetEncoder ritorna la lettura del contatore hardware a 16 bits presente sulla scheda di acquisizione encoder, di cui non è possibile eseguire nè il reset né il preset. Nella gestione della quota acquisita da un encoder molte volte è necessario gestire un valore di quota espresso su variabile a 32 bits e/o poter gestire anche il reset o il preset del valore. Tutte queste operazioni sono possibili con semplici operazioni matematiche sul valore di quota ritornato dal FB. Il programma calcola il numero di impulsi acquisiti dall’encoder tra due esecuzioni (Può essere un valore positivo se o negativo in base alla direzione di rotazione). Il valore di impulsi viene sommato al valore di quota che è una variabile DINT. In questo modo abbiamo una quota espressa su 32 bit ed il valore della variabile Quote può essere modificato da programma (Resettato o presettato) come si desidera.

LogicLab (Ptp116, ST_SysGetEncoder)
PROGRAM ST_SysGetEncoder
VAR
    Value : UINT; (* Encoder value *)
    EInp : SysGetEncoder; (* Encoder acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetEncoder"
// *****************************************************************************
// This program acquires an encoder from the extension module 0.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // ENCODER ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires encoder 0 from the extension module 0.

    EInp.Address:=0; //Module address
    EInp.Channel:=0; //Module channel
    EInp(); //Encoder acquisition
    IF (EInp.Done) THEN Value:=EInp.EQuote; END_IF;

// [End of file]
CODESYS (Ptp161, ST_SysGetEncoder)
PROGRAM ST_SysGetEncoder
VAR
    Value : UINT; //Encoder value
    EInp : SysGetEncoder; //Encoder acquisition
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetEncoder"
// *****************************************************************************
// This program acquires an encoder from the extension module 0.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // ENCODER ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires encoder 0 from the extension module 0.

    EInp.Address:=0; //Module address
    EInp.Channel:=0; //Module channel
    EInp(); //Encoder acquisition
    IF (EInp.Done) THEN Value:=EInp.EQuote; END_IF;

// [End of file]
LogicLab (Ptp116, ST_EQuoteManage)
PROGRAM ST_EQuoteManage
VAR
    Pulses : INT; (* Encoder pulses *)
    EMemo : UINT; (* Encoder memo *)
    Quote : DINT; (* Encoder quote *)
    EInp : SysGetEncoder; (* Encoder acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_EQuoteManage"
// *****************************************************************************
// This program shows it's possible to manage an encoder quote.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // PROGRAM INITIALIZATION
    // -------------------------------------------------------------------------
    // Execute initializations.

    IF (SysFirstLoop) THEN
        EInp.Address:=1; //Module address
        EInp.Channel:=0; //Module channel
        EInp.RCount:=FALSE; //Reverse count
        EInp.ZeroEn:=FALSE; //Zero pulse enable
        EInp.GateEn:=FALSE; //Gate enable
        EInp.RGate:=FALSE; //Reset gate
    END_IF;

    // -------------------------------------------------------------------------
    // ENCODER QUOTE MANAGEMENT
    // -------------------------------------------------------------------------
    // Execute the encoder quote management.

    EInp(); //Encoder acquisition

    // Execute the quote management.The program counts the encoder pulses
    // between two executions and adds them to the quote value.

    Pulses:=TO_INT(EInp.EQuote-EMemo); //Encoder pulses
    EMemo:=EInp.EQuote; //Encoder memo
    Quote:=Quote+TO_DINT(Pulses); //Encoder quote

    // Beyond this point the quote value can be modified (Reset or preset).

// [End of file]
Was this article helpful?