Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Tavola Rotante


Messaggi consigliati

Inserito:

Buonasera.

Dovrei gestire il posizionamento di una tavola rotante,la tavola fa una rotazione di 360°,la lettura della posizione viene fatta tramite un encoder a 360 Impulsi.

Il posizionamento e di tipo 0n/off nel senzo che parte ad una velocità alta e qualche grado prima di arrivare in quota rallenta per finire ad arrestarsi sulla quota impostata.

Il problema si viene a manifestare proprio sulla quota di rallento perche l'encoder si azzera ogni volta che percorre una rotazione intera,in pratica quando arriva a 359° allo scattare del prossimo impulso anzichè pasare a 360 ricomincia da 0.

Il problema che si viene a manifestare e che oltrepassato i 360° non riesco a calcolare la quota di rallento,nel senso che per calcolarmi la quota di rallento di solito sottraggo il rallento alla mia quota target (quella a cui devo arrivare).Solo che,se mi trovo a 300° a devo andare a 3° e il mio rallento e impostato a 5° gradi prima come faccio a calcolarmi la quota di rallento che corrisponde a quota 350°,se eseguo il calcolo di rallento secondo il mio principio avrei un risultato pari a -2,cosi facendo non riuscirei a rallentare mai

Qualcuno saprebbe indicarmi se c'è un modo per calcolare il rallento oltrepassati i 359°

Spero di essere stato chiaro

Grazie


Inserita:

Scusate dell'errore,riformulo da domanda

uonasera.

Dovrei gestire il posizionamento di una tavola rotante,la tavola fa una rotazione di 360°,la lettura della posizione viene fatta tramite un encoder a 360 Impulsi.

Il posizionamento e di tipo 0n/off nel senzo che parte ad una velocità alta e qualche grado prima di arrivare in quota rallenta per finire ad arrestarsi sulla quota impostata.

Il problema si viene a manifestare proprio sulla quota di rallento perche l'encoder si azzera ogni volta che percorre una rotazione intera,in pratica quando arriva a 359° allo scattare del prossimo impulso anzichè pasare a 360 ricomincia da 0.

Il problema che si viene a manifestare e che oltrepassato i 360° non riesco a calcolare la quota di rallento,nel senso che per calcolarmi la quota di rallento di solito sottraggo il rallento alla mia quota target (quella a cui devo arrivare).Solo che,se mi trovo a 300° a devo andare a 3° e il mio rallento e impostato a 5° gradi prima come faccio a calcolarmi la quota di rallento che corrisponde a quota 358°,se eseguo il calcolo di rallento secondo il mio principio avrei un risultato pari a -2,cosi facendo non riuscirei a rallentare mai

Qualcuno saprebbe indicarmi se c'è un modo per calcolare il rallento oltrepassati i 359°

Spero di essere stato chiaro

Grazie

Inserita:

Forse non ho capito bene,

ma una cosa del tipo

SE IL RISULTATO DELL'OPERAZIONE E' <0, ALLORA SOMMA 360.

...Potrebbe andare?

Ciao, Emanuele

Inserita:

Prova a farti delle camme SW

del tipo da 358 a 10 gradi mi faccio una M

se c'e' la M devo rallentare

ovviamente il codice che genera le camme deve controllare se inizio camma e' maggiore di fine camma

Luca

Inserita:

Scusami Luca Bad non ho capito bene il tuo concetto,me lo potresti esporre in modo più chiaro

Grazie

Inserita:

Emanuele ho provato la soluzione da te indicata ,ho constatato che funziona in parte.

Se ad esempio mi trovo a 1° e devo andate a 3° gradi e ho un rallento di 5° gradi,succede che l'asse parte con la velocita alta al posto della lenta perche dovrei rallentare a 34° ma in realta io mi trovo ad una quota superiore a 34° quindi succede che io per la quota di rallento durante l'arco del mio posizionamento non ci passo.

Spero di essere stato chiaro

Grazie

Inserita: (modificato)
Spero di essere stato chiaro

Non tanto, anzi poco.

Quando si esegue un posizionamento, in modo semplificato come il tuo, per prima cosa si verifica che la quota di partenza più la quota di rallentamento sia minore o uguale al valore della quota da raggiungere. Se la candizione è verificata si aprte in veloce, se no si aprte direttamente in lento.

Quindi se tu hai un rallentamento pari a 5o e parti da 1o per raggiungere 3o, esegui 5o + 1o > 3o, quindi parti inlento.

Questo vale anche per se la partenza fosse a 359o per raggiungere 3o

359o + 5o = 364o - 360o = 4o > 3o

Modificato: da Livio Orsini
Inserita:

Non e' chiaro come effettui il posizionamento ,

solitamente hai 2 possibilita' che possiamo chiamare PROPORZIONALE o A SCALINI

in PROPORZIONALE gestisci un segnale di velocita' ed in basa alla differenza dalla quota attuale a quella di arrivo , diminuisci questo segnale in modo quasi proporzionale

a SCALINI invece fai dei gradini di velocita' , del tipo vado nel SET1 ( 50Hz ) , quando mancano da 50 a 30 gradi all'arrivo vado nel SET2 ( 30Hz ) quando mancano da 30 a 0 gradi all'arrivo vado nel SET3 (10HZ)

Il mio suggerimento era valido per il funzionamento a scalini

Se la posizione di arrivo e' a 40 gradi ( esempio ) fai 2 camme elettriche

1) da 340 a 10

2) da 11 a 40

con la cam ( o fase ) 1 attivi un SET all'inverter che decrementa la velocita' , con la fase 2 altro set che la riduce ancora

Ciao

Luca

Inserita:
solitamente hai 2 possibilita'...

Il più antico e semplice metodo di posizionamento consiste nel posizionare con due velocità: lenta e veloce. Se la posizione attuale è < della quota dir allentamento si va in veloce, altrimenti in lento sino al raggiungimento della quota. E' il classico posizionamento con 2 prozimities: rallentamento e posizione.

Inserita:

Non so se e' corretto pero' si potrebbe pensare di eseguire un posizionamento differenziato nel caso di passaggio per lo Zero.

Io ho pensato di isolare 4 distinti casi, che in realta' sono solo 2.

Considero i seguenti 4 casi :

Case 1 (Final_Pos - Start_Pos) < 180 then Action := Forward; // Normal Forward

Case 2 (Final_Pos - Start_Pos) >= 180 then Action := Reverse; // Reverse turn

Case 3 (Final_Pos - Start_Pos) < 0 then Action := Reverse; // Normal Reverse

Case 4 (Final_Pos - Start_Pos) < -180 then Action := Forward; // Forward turn

come considerare il Posizionamento :

Case 1 then // Normal Forward

Pos_Rel := Pos_Actual;

Target_Pos:= Final_Pos;

Velocity := (Target_Pos-Pos_Rel)*Gain_Vel;

end_if;

Case 2 then // Reverse Turn

if Pos_Actual > 180 then Pos_Rel := Pos_Actual;

if Pos_Actual <= 180 then Pos_Rel := Pos_Actual -360;

if Final_Pos >180 then Target_Pos := Final_Pos -360;

if Final_Pos <=180 then Target_Pos := 0 - Final_Pos;

Velocity := (Target_Pos-Pos_Rel)*Gain_Vel;

end_if;

Case 3 then // Normal Reverse

Pos_Rel := Pos_Actual;

Target_Pos:= Final_Pos;

Velocity := (Final_Pos-Pos_Rel)*Gain_Vel;

end_if;

Case 4 then // Forward Turn

if Pos_Actual > 180 then Pos_Rel := Pos_Actual;

if Pos_Actual <= 180 then Pos_Rel := Pos_Actual -360;

if Final_Pos >180 then Target_Pos := Final_Pos -360;

if Final_Pos <=180 then Target_Pos := 0- Final_Pos;

Velocity := (Final_Pos-Pos_Rel)*Gain_Vel;

end_if;

se osservi bene il Caso 1 e 3 e' un posizionamento normale in avanti oppure indietro.

Case 1,3 se -180 < (Final_Pos - Start_Pos) > 180

mentre invece i casi 2 e 4 implicano il passaggio per i 0 gradi o 360 gradi

in questi due casi si spostano le posizioni sia attuale che di traguardo in maniera tale

di avere una valore Positivo da 0 a 180, e negativa da 360 a 180.

In questo modo attiene un posizionamento corretto anche passando per lo Zero.

piu' semplicemente i casi 1 e 3 si fondono in un solo caso,

cosi' pure i casi 2 e 4.

if -180 < (Final_Pos - Start_Pos) < 180 then Case 1,3 // Nessun Passaggio sullo Zero

else Case 2,4 // Passaggio sullo Zero

Case 1,3 then // Normal Forward

Pos_Rel := Pos_Actual;

Target_Pos:= Final_Pos;

end_if;

Case 2,4 then // Reverse Turn

if Pos_Actual > 180 then Pos_Rel := Pos_Actual;

if Pos_Actual <= 180 then Pos_Rel := Pos_Actual -360;

if Final_Pos >180 then Target_Pos := Final_Pos -360;

if Final_Pos <=180 then Target_Pos := 0- Final_Pos;

end_if;

Velocity := (Target_Pos-Pos_Rel)*Gain_Vel;

Inserita:

Scusate ma leggendo il post inserito mi sono reso conto che non ho spiegato molto bene l'aplicazione,cerchero di rispiegarla in modo piu chiara e precisa.

Dovrei gestire il posizionamento di una tavola rotante,la tavola fa una rotazione di 360°,la lettura della posizione viene fatta tramite un encoder a 360 Impulsi che si riazzera ad gni giro,

la tavola può girare sono in un verso "Avanti"

Il posizionamento e di tipo 0n/off nel senzo che parte ad una velocità alta e qualche grado prima di arrivare in quota rallenta per finire ad arrestarsi sulla quota impostata.

Di solito il posizionamento io lo gestisco cosi: Quota_Target - Quota_Rallento = Quota_Rallento

Per attivare il rallento di solito facio così : Non appena la Posizione_Tavola è maggiore della Quota_Rallento attivo il rallento e cambio velocità

I problemi che si vengono a minifetare sono:

-Se per esempio mi trovo ad una quota di 3° e deo andare a 5° e ho una quota di rallento pari a 7° la tavola va sempre con la velocità lenta.

-Se ad esempio mi trovo ad una quota di 352° e devo andare a 4° è ho una quota di rallento pari a 7° l'asse parte con la velocita lenta

-Se ad esempio mi trovo a 10° e devo andare a 2° e devofare una rotazione intera per arrivare a 2° e succede che la tavola parte con la velocita lenta

Spero che questa volta sono stato molto più chiaro ad esporre il problema

Grazie

Inserita:

Allora il mio primo post e' quello che ti serve

ovviamente puoi fare gli scalini che ti pare , a volte ne faccio 2 e a volte ne faccio 3

a te ti serve con 2 scalini

Come ti dicevo , fatti delle camme , magari che si generano impostando solo la posizione di arrivo , del tipo :

la posizione di partenza e' ininfluente

Posizione di arrivo 100 con 10 gradi di bassa velocita'

ti fai una camma che = 100 come fine e ( 100-10 ) come inizio , quindi hai una camma che va' da 90 a 100 gradi

con questa camma , se e' =1 attivi la velocita' bassa.

Luca

Inserita:

Luca Bab se ho capito bene tu mi consigli di gestire il posizionamento in qursto modo:

In pratica se mi trovo a X quota e devo andare a Y ed ho una rallento di 10°, vedo quanti impulsi mi mancano per andare in lento.Avvio un contatore in parallello alla posizione della tavola,una volta che il contatore a incrementato di un tot di impulsi che mancavano per andare in lento alzo l'uscita fino ad arrivare in quota.

Spero di aver apito il tuo concetto

Grazie

Inserita:

No , in quel modo ricorri di nuovo al problema che hai

il mio suggerimento era di crearti delle camme elettriche

non so' che PLC usi , con siemens ti fai una M ( e' come ricreare in maniera elettronica gli induttivi che leggono delle camme su un albero )

Ti leggi la quota encoder e tramite confronti con valore inizio e valore fine , questa M e' a 0 o 1

ovviemmente queste camme devono poter essere programmate anche con inizio 350 e fine 10

in questo modo la tua M andra' ad 1 a 350 gradi e andra' a 0 quando arriva a 10 gradi

prova a cercare ( anche nel forum ) come lavora un programmatore di camme per chiarirti le idee

Luca

Inserita: (modificato)

Scusa ma hai letto l'algoritmo che ti ho delucidato, oppure no.

Questa procedura risolve il tuo problema.

Infatti questa procedura trova il tragitto piu' corto per raggiungere la posizione

ed inoltre ti seleziona la corretta velocita' sia in segno che in ampiezza.

Se devi fare due gradini (veloce e lenta), prendi il risultato della variabile "Velocity"

se questo valore e' maggiore di una determinata velocita' commuti in veloce altrimenti in lenta.

Lenta if (abs(Velocity) < Soglia)

Veloce if (abs(Velocity) > Soglia)

Questa procedura ti evita errori di posizionamento usando il tuo procedimento

"Quota_Target - Quota_Rallento = Quota_Rallento".

Altrimenti se tu dalla posizione iniziale di 330gradi devi andare a 10gradi,

e' chiaro che devi avanzare e non retrocedere come i gamberi. (ma il tuo procedimento va in Tilt)

Cosi pure se da 25 gradi devi andare a 350 gradi devi retrocedere.

Modificato: da Beatrice_Ru
Inserita:

Beatrice_Ru ,

Il tuo algoritmo e' ineccepibile, :clap: :clap:

La difficolta' per Pineto credo stia nel tradurlo in linguaggio Ladder o lista istruzioni IEC.

Ivan

Inserita:

Ma Scusa Pineto che tipo di PLC hai ?

Cosi posso mandarti una sorgente adeguata al tuo PLC.

Comunque kamikase ti ringrazio, ma questa procedura non l' ho testata, e solo frutto di un mio raggionamento,

probobilmente ha forse qualche bacco, pero' speravo fosse utile il concetto.

Ciao Pineto e grazie Kamikaze.

Inserita:
Ma Scusa Pineto che tipo di PLC hai ?

Cosi posso mandarti una sorgente adeguata al tuo PLC.

Per questo Lavoro devo utilizzare Panasonic "Nais" ma ho anche il tul di sviluppo pdella Siemens S7-200

La difficoltà' per Pineto credo stia nel tradurlo in linguaggio Ladder o lista istruzioni IEC.

Purtroppo la mia difficoltà è proprio quella preferisco il Lader

Grazie

Inserita:

come ha detto emanuele.croci basta aggiungere 360 quando il calcolo della distanza è negativo

ovvero, durante il movimento (e non solo alla partenza) calcoli:

- Pos_target - Pos_attuale = Distanza_dal_target

- se Distanza_dal_target<0 allora sommi 360

- quello che hai ottenuto è la distanza che deve ancora percorrere la tavola girando sempre nello stesso senso

quando questo valore scende al di sotto della soglia di rallentamento, attivi la velocità di lento

ciao

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