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 supportati
Questo FB opera solo sui moduli che implementano la gestione hardware di quadratura encoder di seguito una tabella riassuntiva.
Code | Channels | Zero | Gate | Note |
---|---|---|---|---|
PCB137, MPS054 | 1 | No | No | Encoder outputs must be push pull. Frequency up to 10kHz. Encoder signals must be connected as follow: Di00:Ph A, Di01:Ph B A protection key must be applied |
PCB141, MPS056 | 1 | No | No | Encoder outputs must be push pull. Frequency up to 10kHz. Encoder signals must be connected as follow: Di00:Ph A, Di01:Ph B A protection key must be applied |
PCB124*000 | 1 | Yes | Yes | Encoder 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*010 | 2 | Yes 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*000 | 1 | Yes | Yes | Encoder 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 |
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.

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]