Vai al contenuto
PLC Forum


Encoder Assoluto - è necessario?


Messaggi consigliati

Inserito:

Devo rimodernare una macchina per avvolgere matasse, vorrei mettere un plc con encoder sulla bobinatrice e un pannello dove scrivere e leggere il numero di spire da avvolgere e ovviamente sottrarle se bisogna tornare indietro.

ho pensato di farlo con encoder incrementale ma se va via la corrente e l operatore avra fatto 3000spire e ne doveva fare 5000 dopo l interruzione della corrente non sapra quante ne ha fatte..!c è un modo nel plc per memorizzare tale valore oppure ci vuole per forza un encoder assoluto?


  • Risposte 61
  • Created
  • Ultima risposta

Top Posters In This Topic

  • roberto8303

    29

  • rddiego

    10

  • busanela

    10

  • mazzinga

    6

Inserita:

Imposta come ritentive le memorie in cui appoggi il valore di conteggio, semplice. ;)

Inserita:

L'encoder assoluto ti consegna una grandezza che equivale ad un determinato angolo tra 0 e 360 gradi.

Ad ogni giro completo di ruota, sarebbe una variabile retentiva che va acquisendo i numeri di giri eseguiti piu' l'ultimo valore angolare. Niente altro.

Inserita:
Imposta come ritentive le memorie in cui appoggi il valore di conteggio, semplice.

come si fa?? intendi usando un encoder incrementale? ad esempio memorizzo hc0 in una word che poi la leggo dal pannello quindi come faccio a memorizzarla?

ora la macchina ha un micro che conta con una camma sul albero ogni giro e uno strumento contatore della omron, ha il vantaggio che rimane memorizzato l ultimo valore se manca la corrente, ma ovviamente se si va all indietro l operatore deve contare lui... :rolleyes:

secondo voi per l encoder che risoluzione dovrei scegliere visto che non serve nessuna precisione la ruota è 400mm e anche se si ferma 20° piu avanti non è un problema.

Inserita:

ho capito devo andare su aree a ritenzione ma non capisco cosa impostare in area 0 in offset e numero elementi. ad esempio io voglio che il valore in vw100 dell encoder incrementale rimanga in memoria cosa scrivo nelle tre caselle?

Inserita: (modificato)

Le caselle sono numerate da 0 a 5 perchè hai la possibilità di designare come ritentive 6 aree di memoria (per es. per temporizzatori, contatori, merker M e V, ...).

La prima cella denominata Area Dati, definisce quale tipo di elemento destinare alla ritentiva (VB, VW, T, C, MB, MW, ...); la seconda cella (offset) da quale memoria iniziare il salvataggio nella mem. non volatile, la terza definisce il numero di elementi da salvare, in riferim. a quanto definito nella prima cella.

Per es. se nell'area dati hai definito VB, nell'offset 0 e come numero di elementi 10, hai destinato alla mem. non volatile 10 Byte della memoria V, da VB0 a VB10.

Tieni comunque presente che le aree a ritenzione sono quelle aree della memoria di dati che l’utente definisce in modo che

restino invariate in seguito allo spegnimento e alla riaccensione della CPU, purché il condensatore ad elevata capacità (e la batteria opzionale, se presente) non si scarichino.

Modificato: da busanela
Inserita:

Busanela ho trasferito hco in Vd0 ho messo nell area 1 Vd offset 0 e n elementi 2048, quando vado a caricare il programma nella cpu mi esce un avvertenza 2756 e dice che l area a ritenzione 0 non è ammessa per il tipo di cpu selezionata. che vuole dire??

Inserita:

Beh, il messaggio mi sembra abbastanza chiaro; che tipo di cpu utilizzi?

Inserita:

la 222, a me non sembra chiaro, perche io ho identificato la cpu con refresh e quindi la riconosce in automatico! forse la mia cpu non puo svolgere questa funzione??

Inserita:

allora ho notato due cose...

primo l errore che giustamente il programma mi riportava era perche selezionavo molte aree di memoria, piu di quanto la mia cpu ne potesse memorizzare.

quindi ho scritto memorizza da vd0 a vd10 e gia l errore non esce piu.

ora pero c è un altro problema ho caricato hco in vd0 sia nel main che nel sbr0 ma quando tolgo corrente al ripristino sia vd0 che hco nella tabella di stato sono a 0! ho fatto pero un altra prova perche mi piace osservare come si comporta qualsiasi sistema passi per le mie mani, e cioe ho caricato un numero ad es 100 in vd0 e quando tolgo la corrente questo invece viene memorizzato!! ora mi chiedo perche hco no???? e forse mi spiego che nella tabella aree a ritenzione ci sono i contatori C ma non hco quindi siccome quando va via la corrente hc0 cade a 0 viene trasferito 0 nella vd 0? è forse cosi??

Inserita:

sì ma Roberto è evidente che, se devi memorizzare il valore di un encoder incrementale che ad ogni nuova accensione parte naturalmente con valore 0, non devi passare il valore dell'encoder direttamente nella variabile VD0!!! Dovrai fare in maniera differente e cioè dovrai eseguire delle semplici somme algebriche.

VD0 sarà uguale a sè stesso più il valore attuale dell'encoder meno il valore precedente (della precedente lettura)

Tutto questo se conti in avanti, se conti indietro dovrai sottrarre a VD0 sempre la differenza tra la lettura precedente meno l'attuale (o se vuoi usi il valore assoluto della prima operazione)

Spero di essermi spiegato e di avere fatto le operazioni corrette, ma ad ogni modo è più facile che faccia tu i calcoli e ti renda conto di cosa ti sto dicendo...

Inserita:

Grazie per il chiarimento rddiego!!infatti non ci avevo pensavo che all inizio della scansione con Sm0.1 carica 0 nel bit Smd...nel interrupt dell encoder! ecco spiegato.

VD0 sarà uguale a sè stesso più il valore attuale dell'encoder meno il valore precedente (della precedente lettura)

quindi Vd0=Vd0+ come faccio a calcolare il valore precedente dell encoder??

Inserita:

Tieni presente che il sistema ti permette di memorizzare con precisione il valore raggiunto solo se l'interruzione di corrente avviene a macchina ferma.

Se invece tale interruzione avviene a macchina in funzione, il plc smetterà di contare praticamente all'istante, mentre l'avvolgitura continuerà per inerzia.

Inserita: (modificato)

HC0 = valore attuale letto direttamente dall'encoder

VD0 = valore finale (che utilizzerai in tutto il programma)

VD2 = valore della lettura precedente

VD4 = differenza tra attuale e precedente

Esegui nell'ordine:

VD4 = HC0 - VD2

VD2 = HC0

VD0 = VD0 + VD4

Esempio

Prima scansione (ipotizza che l'encoder segni 5)

VD4 = 5 - 0

VD2 = 5

VD0 = 0 + 5

Successiva scansione (ora l'encoder segna 10)

VD4 = 10 - 5

VD2 = 10

VD0 = 5 + 5

Nuova accensione (l'encoder sarà = 0 e ripartendo segnerà nuovamente 5)

VD4 = 5 - 0

VD2 = 5

VD0 = 10 + 5

E così via ... stessa roba andando indietro ma eseguendo sottrazioni

NB.

Nell'esempio si suppone ritentivo solo VD0 quindi hai due possibilità:

1 -> per VD2 e VD4 usi variabili non ritentive che andranno a 0 ad ogni riaccensione

2 -> ad ogni riaccensione utilizzando il bit di prima scansione (SM0.0 credo non ricordo) imponi a 0 VD2 e VD4

Ci sono poi ulteriori controlli che dovresti mettere per esempio che la variabile VD0 incrementi o decrementi solo con il bit di running del motore per evitare che durante una manutenzione dell'encoder (muovendolo a mano praticamente) non si sfalsi la misura (teoricamente la misura di posizione non cambia nella realtà). Verificare ed evitare che HC0 raggiunga valori limite per cui dovrai eseguire ulteriori calcoli per il ritorno a 0 del valore letto dall'encoder durante il movimento.

Modificato: da rddiego
Inserita:

per Batta, la macchina ha un elettrofreno sul motore

Per Rddiego ora sono a lavoro ho dato solo un occhiata stasera lo provo subito!! grazie per la pazienza che hai avuto per postare tutto :) ti faccio sapere come va questa sera stesso ;)

Inserita:
Nuova accensione (l'encoder sarà = 0 e ripartendo segnerà nuovamente 5)

ho provato non è cosi :( , mi da una misura minore all accensione! per esempio lo fermo a 5000 all accensione mi esce 3500, poi anche mentre conta hco da una misura e vd0 ne da un altra. ho solo usato vd0 vd4 vd8 perche non potevo fare operazione con byte della stessa parola.io faccio i calcoli nel main con sm0.0 ma secondo me c è sempre un ritardo di elaborazione il che fa perdere il conto alla cpu quando taglio la corrente!

LD SM0.1

CALL HSC_INIT:SBR1

LD SM0.0

MOVD HC0, VD8

-D VD4, VD8

LD SM0.0

MOVD HC0, VD4

LD SM0.0

+D VD8, VD0

ritentive ho messo vd0 a vd2 non ho scritto il procedimento per la differenza perche sto provando solo ad incrementare non centra se non funziona?

Inserita:

il calcolo è corretto ovviamente devi saperlo gestire con quel PLC.

Anzichè eseguire la seconda istruzione come hai fatto tu

LD SM0.0

MOVD HC0, VD4

è meglio che scrivi così

LD SM0.0

MOVD VD8, VD4

ho solo usato vd0 vd4 vd8 perche non potevo fare operazione con byte della stessa parola

Perfetto, il mio è solo un esempio, non sto programmando S7200, non ho neanche pensato al formato delle variabili per me poteva essere x, y, z

ho provato non è cosi , mi da una misura minore all accensione! per esempio lo fermo a 5000 all accensione mi esce 3500

non importa tu col bit di prima scansione metti VD4 e VD8 uguali entrambi a HC0 sempre e comunque, così siccome noi vogliamo sommare una differenza tra la misura attuale e la successiva alla prima accensione la differenza sarà certamente 0 (ovviamente da fermo)

mentre conta hco da una misura e vd0 ne da un altra

per forza scusa non possono essere uguali, noi stiamo sommando delle variazioni a prescindere dal valore letto dall'encoder

secondo me c è sempre un ritardo di elaborazione il che fa perdere il conto alla cpu quando taglio la corrente

sì ma scusa tu tagli la corrente mentre si muove??? se il plc si spegne mentra la bobina si muove ehehe è sicuro che non ti ritrovi.

A questo punto ho perso il filo della tua richiesta/problema. Probabilmente forse ti ci vuole un assoluto allora

Inserita:

ti seguo,

non importa tu col bit di prima scansione metti VD4 e VD8 uguali entrambi a HC0 sempre e comunque

ma io ho usato il bit che è sempre attivo ad ogni scansione e cioe sm0.0 invece con sm0.1 bit solo alla prima scansione e solo per la prima ricihamo l interrpt encoder.

no non ho fermato l encoder mentre girava, a me serve come stai cercando di farmi capire tu, perche tanto se va via la corrente l elettrofreno senza corrente blocca il disco subito circa max 10gradi di spostamento e non arriva mai ad un giro!ora riprovo

Inserita:

allora ho messo con Sm0.1 vd4 e vd8 uguali a hco solo per il primo ciclo, cosi facendo memorizza il valore e funziona :) poi ho provato a cambiare il secondo segmento, i numeri in vd0 crescono da soli anche ad albero encoder fermo!! meglio il primo caso!

pero ho fatto un altra prova ho provato a fare parecchi mezzi giri di albero dopo 4 -5 volte quindi se prima l escursione del mezzo giro avanti indietro era da 500 a 2000 mano mano è sceso il valore è arrivato da -1000 a 500 eppure l albero lo spostavo di soli e sempre circa 180° :huh:

Inserita:
i numeri in vd0 crescono da soli anche ad albero encoder fermo

mi sembra strano che incrementi con albero fermo poichè

VD8 = HC0 - VD4 con albero fermo deve dare risultato 0

siccome dopo copi HC0 in VD4, la scansione successiva con albero fermo, HC0 non è variato perciò ancora uguale a VD4 e ne risulta di conseguenza che VD8 deve essere uguale a 0.

L'istruzione VD0 = VD0 + VD8 non farà niente infatti VD8 con albero fermo è uguale a 0

pero ho fatto un altra prova ho provato a fare parecchi mezzi giri di albero dopo 4 -5 volte quindi se prima l escursione del mezzo giro avanti indietro era da 500 a 2000 mano mano è sceso il valore è arrivato da -1000 a 500 eppure l albero lo spostavo di soli e sempre circa 180°

con questo mi vuoi dire che la variazione di 180° equivale sempre a 1500 punti encoder?? Oppure ti da fastidio il segno -? Il risultato della differenza mettilo in valore assoluto.

Inserita:
con questo mi vuoi dire che la variazione di 180° equivale sempre a 1500 punti encoder??

Buongiorno, no, ti voglio dire che se io giro l encoder di 180° ad esempio quota 500 2000 deve essere sempre 500 e 2000 e non dopo tanti e stessi(solo avanti indietro) spostamenti cambia il numero!! perche se l encoder fisicamente è in quella posizione io devo leggere sempre quel valore!

Inserita:
devo leggere sempre quel valore

in teoria sì se non viene mai spento l'encoder, ma la filosofia che ti voglio far adottare è svincolata dal valore "assoluto" letto dall'encoder poichè il valore vero è dato da VD0 che è la somma di tutte le variazioni (differenza tra valore attuale e precedente).

Quello che in questo modo importa e non dovrebbe variare è appunto questa differenza cioè per uno spostamento di 180° ipotizziamo l'encoder misuri 1000 punti, questo numero deve essere rilevato sempre per tutti i valori di partenza dell'encoder.

Esempio 1:

Valore iniziale encoder 0; rotazione di 180°; valore finale 1000; differenza 1000

Esempio 2:

Valore iniziale encoder 500; rotazione di 180°; valore finale 1500; differenza 1000

Esempio 3:

Valore iniziale encoder -100; rotazione di 180°; valore finale 900; differenza 1000

Esempio 4:

Valore iniziale encoder -3000; rotazione di 180°; valore finale -2000; differenza 1000

Più chiaro così?? "Disinteressati" del valore letto da HC0, soffermati sulle variazioni

Inserita:

domanda ( magari nel tuo caso non è possibile ):

ma quando spegni la macchina puoi tenere

in vita il plc alimentando l'encoder

e tagliare gli ausiliari

in ditta da me ci sono macchine che si spengono

ma il plc è sempre alimentato .

in questo modo se si dovesse muovere il nastro

non perderesti niente.

:rolleyes:

Inserita:

Anni fa c'erano encoder incrementali, alimentati con batteria in tampone e contatore interno, lettura in modo seriale con linea RS485 veloce.

Erano in catalogo anche da un costruttore italiano.

Con questo tipo di encoder si avrebbe la sicurezza di non perdere il conteggio anche in caso di improvvisa mancanza di alimentazione al PLC o all'encoder.

Inserita:

per felino

ma quando spegni la macchina puoi tenere

in vita il plc alimentando l'encoder

si ma posso farlo solo con una batteria perche nell azienda viene tolta la tensione forza motrice a fine giornata!inoltre il plc è a 220volt e l encoder lo alimento con al 24volt del plc!

per Livio

alimentati con batteria in tampone e contatore interno, lettura in modo seriale con linea RS485 veloce

mi domando (non conoscendo la differenza di prezzo): a questo punto a livello economico non è migliore comprare un encoder assoluto?

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...