Jump to content
PLC Forum


Sign in to follow this  
mazzinga

controllo uscite con encoder assoluto

Recommended Posts

mazzinga

Prima di iniziare la discussione auguro un buon anno a tutti

Sto studiando come gestire le uscite su una tavola rotante con 30 asole porta pezzo,cerco di spiegare meglio l'applicazione,sto realizzando una macchina dove è stata inserita una tavola rotante con 30 asole e 28 stazioni di lavoro piu una di carico e una di scarico,in corrispondenza della prima asola e situato un nastro trasportatore da dove vengono fatti entrare dei flaconi.Le stazioni non si trovano tutte allo stesso interasse a 12° l'una dall'altra,ma possono essere piu vicino o più l'ontano,la macchina non lavora a step,ma in continuo il flacone quando arriva sotto alla propria stazione il plc deve dare un'uscita per un tempo impostato dall'operatore.

Per quanto riguarda l'hardware è stato previsto un s7-1200 con un ingresso ssi per leggere la posizione di un encoder assoluto,l'encoder previsto è multi giro,in tal caso un giro di encoder corrisponde ad un giro di tavola.E stato previsto un encoder assoluto per ricordarsi la posizione quando la macchina viene accesa,ed per poter ripartire senza vuotare la macchina.

la difficoltà che trovo è sulla gestione delle uscite delle stazioni,immaginando che la prima stazione si trovi a 8°,la seconda a 15° e la terza a 24°,avrò che quando l'encoder conta un valore di 8 posso fare un confronto e dirgli che se la quota è >=8 e <10 il plc da fuori la prima uscita idem per la seconda stazione,ma nel momento in cui la quota encoder vale 16 il plc deve ridare l'uscita della prima stazione,la mia difficoltà e coordinare le uscite delle stazioni con la quota encoder.

Un'altro grosso ostacolo è l'azzeramento dell'encoder,essendo che parliamo di un encoder assoluto con un valore limite,quando viene superato questo limite il valore letto dall'encoder viene riazzerato.

 

Qualcuno potrebbe spiegarmi come viene realizzato il sincronismo tra la posizione dell'encoder e le posizioni della tavola,guardando in rete ho visto la gestione di camma elettronica,ma non so se è la gestione corretta.

Share this post


Link to post
Share on other sites

Livio Orsini

Ci sono parecchi modi per gestire questo problema.

Io farei 30 casi (o quanti te ne servono), assegnando ad ognuno d loro le uscite da alzare ed le quote relative; poi dipende dal linguaggio che usi.

Con il 300 c'era la scheda che effettuava la funzione di camma elettronica; la metodologia per risolvere il problema è proprio quella della camma.

Non hai spiegato bene come  fai lavorare il tuo encoder, che dici di essere un multigiro assoluto.

La scelta non è ottimale per quel lavoro. Meglio avere un monogiro senza limiti di rotazione. Comunque ti basta dividere la quota letta, se il valore è maggiore di un giro, la quota corrispondente ad un giro, il resto della divisione ti da la posizione reale.

Share this post


Link to post
Share on other sites
mazzinga

poi dipende dal linguaggio che usi.

 Di solito con 1200 utilizzo ST, "purtroppo l'AWL non c'è piu una delle poche cose buone che aveva siemens"

 

Con il 300 c'era la scheda che effettuava la funzione di camma elettronica; la metodologia per risolvere il problema è proprio quella della camma.

Da quello che scrivi sembra proprio che la soluzione a questo problema sembra proprio la camma elettronica,avendo un 1200 è possibile ricreare quella funzione? potresti spiegarmi come ricreare la funzione

 

Non hai spiegato bene come  fai lavorare il tuo encoder, che dici di essere un multigiro assoluto.

l'encoder è calettato direttamente sulla tavola 1/1 un giro di tavola,un giro di encoder,Quali altre info possono essere utili 

 

La scelta non è ottimale per quel lavoro. Meglio avere un monogiro senza limiti di rotazione

Ok valuto l'idea di montare un monogiro

 

Comunque ti basta dividere la quota letta, se il valore è maggiore di un giro, la quota corrispondente ad un giro, il resto della divisione ti da la posizione reale.

Non ho ben capito il tuo concetto,potresti spiegarmelo meglio,o magari con un esempio

Share this post


Link to post
Share on other sites
Livio Orsini

Puoi anche adottare la soluzione dedicata proposta da Lelos; potresti effettivamente risparmiare tempo e danaro.

Nel caso valutassi la soluzione con PLC più adatta.

Scegli un encoder monogiro ma con possibilità di rotazioni infinite ovvero senza blocchi meccanici.

Ipotizziamo un 10 bits il che comporta 1023 divisioni per giro.

Io non conosco ST come linguaggio, immagino che sia strutturato ed abbia la possibilità di avere l'istruzione "case" o qualche cosa di simile.

Ti fai una serie di "case" quante sono le camme ed in ognuno di questi "case" setti le uscite che corrispondono a quella camma.

Se tu avessi invece un multigiro diciamo, ad esempio 10 giri, con conteggio totale pari a 20 bits, ovvero 1.048.575 divisioni, ad ogni lettura se il codice è maggiore di 104.857 (ovvero un giro), sottrai alla lettura 104.857 sino a quando il risultato è <=104.857. In questo caso 104.857 si dice "modulo" ovvero il tuo encoder è modulo 104.857.

Se vuoi, ti posso mettere un esempio in pseudo "C" per darti l'idea di come si fa, però come ti ho scritto non conoscendo "ST" non posso garantirti la corrispondenza 1:1

Share this post


Link to post
Share on other sites
Livio Orsini

Facciamo un caso semplice: 5 camme per giro.

Camma 1 a 15° e setta l'uscita 1 e 3 le altre uscite sono invariate

Camma 2 a 75° e setta l'uscita 2 e resetta l'uscita 1 e 3

Camma 3 a 120°, alza l'uscita 4

Camma 4 a 180°, alza l'uscita 5

Camma 5 a 300° azzera le uscite 2, 4 e 5

Le costanti corrispondono all'angolo, moltiplicato per 1023/360; angolo è la lettura del codice dell'encoder

int angolo;

switch (angolo)
    {
       case 42:
          out1 = 1;
          out3 = 1;
          break;
       case 213:
          out1 = 0;
          out3 = 0;
          out2 = 1;
          break;          
       case 341:
          out4 = 1;
          break;
       case 511:
          out5 = 1;
          break;                    
       case 852:
          out4 = 0;
          out4 = 0;
          break;
    }      
          

 

Questo è un esempio di massima di come si risolverebbe in "C". Se "ST" ha istruzioni equivalenti è semplicissimo

 

Share this post


Link to post
Share on other sites
mazzinga

ho visto il tuo esempio in C,in ST avrei scritto allo stesso modo,

Allego un disegno della macchina per farti capire al meglio come è fatta la macchina e come deve lavorareImmagine.thumb.jpg.15e88ae96ef0536521fac

 

Diciamo che per comodità le stazioni sono ad un'interasse di 25° "non saranno cosi,ma è un dato che imposta l'operatore",prendiamo in esame la stazione n° 2 che si trova a 25° rispetto all'alimentatore di carico dei pezzi nella tavola,quando il valore del mio encoder"convertito in gradi vale 25° devo attivare un'uscita per un tempo x,la stessa uscita deve essere attivata sempre per un tempo x quando il valore dell'encoder vale 50,75,100..325,350,lo step successivo 375°,ma a 360° il valore del mio contatore ricomincia da 0,quindi la mia uscita deve attivarsi a 15°.

L'esempio descritto da livio lavora con delle quote assoluto,mentre la mia tavola ha delle quote relative che imposta l'operatore,variabili nel tempo, quindi è impossibile calcolare il numero di case,Le mie difficoltà sono nell'aggiornare continuamente la quota di attivazione dell'uscita,e gestire il trabocco dell'encoder quando arriva a 360°

Se avete dubbi chiedete pure

Share this post


Link to post
Share on other sites
Livio Orsini

Scusa ma c'è qulache cosa di non chiaro.

Se l'encoder è assoluto le quote sono assolute. Potranno variare nel tempo perchè l'operatore le cambia, ma una rivoluzione vale sempre 360° e l'origine, slvo slittamenti tra tavola ed encoder, sarà sempre eguale.

Differente se l'encoder fosse incrmentale, ma una volta fatto lo zero le cose non differiscono di molto.

Io comunque non capisco perchè se una camma è situata a 25° dall'origine  il giro successivo sia naticipata a 15°.

Se non c'è un algoritmo che fa variare automaticemente il posizionamento, o non lo varia l'operatore, la camma deve essere  sempre in quella posizione.

Se c'è un algoritmo di variazione e questo è noto, basta applicarlo per il ricalcolcolo delle quote.

Se invece è l'operatore che le varia dovrà introdurle.

Alla fine però lo switching no  cambia, basta aggiornare i valori del "case"

Share this post


Link to post
Share on other sites
epoch_ita

Io comunque non capisco perchè se una camma è situata a 25° dall'origine  il giro successivo sia naticipata a 15°.

Suppongo perché quell'encoder è multigiro, quindi di giro in giro non ha gli stessi valori.

se possibile cambia l'encoder con un monogiro, ti risparmi mille grattacapi e calcoli inutili. Perché usare un encoder che conta da 0 a 1023 su più giri quando tu devi ragionare a giro unico?

Mi sembra roba da U.C.A.S (Ufficio Complicazione Affari Semplici.)

 

Edited by epoch_ita

Share this post


Link to post
Share on other sites
Livio Orsini

Suppongo perché quell'encoder è multigiro, quindi di giro in giro non ha gli stessi valori.

 

Se legggi quello che ho scritto prima, capisci che deve avere gli stessi valori anche se è moltigiro. Si tratta di tenere conto del modulo.

Non credo che non intendesse questo.

Poi, in ordine, al monogiro è il primo consiglio che ho dato perchè è effettivamente un UCAS usare un multigiro.

Share this post


Link to post
Share on other sites
epoch_ita

Ora ho capito quello che scrive.

Diciamo che per comodità le stazioni sono ad un'interasse di 25° "non saranno cosi,ma è un dato che imposta l'operatore",prendiamo in esame la stazione n° 2 che si trova a 25° rispetto all'alimentatore di carico dei pezzi nella tavola,quando il valore del mio encoder"convertito in gradi vale 25° devo attivare un'uscita per un tempo x,la stessa uscita deve essere attivata sempre per un tempo x quando il valore dell'encoder vale 50,75,100..325,350

Va bene, ammesso che ci sia veramente un'uscita a quelle quote.

 

lo step successivo 375°,ma a 360° il valore del mio contatore ricomincia da 0,quindi la mia uscita deve attivarsi a 15°. 

Il tuo errore sta qui:

360/25=14,4. con le uscite a 25° luna dall'altra non avrai mai una distribuzione omogenea. Quindi:

  1. C'è effettivamente un'uscita alla posizione assoluta 15° gradi ma la successiva sarà distanziata di soli 10°, visto che parti dall'assunto che la prima sia a 25°
  2. non ci sono uscite tra la posizione 350° e 25°. Quindi arrivato a superare 360° devi ripartire automaticamente da 25°.

 

 

 

Share this post


Link to post
Share on other sites
mazzinga

Credo di non essermi spiegato bene è aver fatto un po di confusione,allego un'altra immagine piu chiara e semplificata

Immagine.thumb.jpg.a11b2695f3bdd10c4949b

per semplificare le cose ho fatto una tavola con 8 asole con un'interasse di 45°,e con 6 stazioni di lavoro posizionate a 0°,70°,140°,210°,280°,e 350°,l'encoder è un monogiro un giro 360°

Ipotizzando che la tavola inizi a ruotare,l'asola 1 deve fare il controllo del pezzo a 0°,a 70° attivare l'uscita della stazione 1,a 140° la 2,a 210°la 3 a 280° la 4 e in fine a 350° la 5,le uscite vengono resettate dopo un tempo stabilito dall'operatore,ma questo non cambia il concetto

L'asola 2 è anticipata di 45° rispetto alla 1,quando la tavola si trova a 25° devo attivare l'uscita della stazione 1,a 95° la 2,a 165° la 3,a 235° la 4,a 305° la 5 ed in fine quando la tavola è a 315° devo controllare il carico del pezzo

se ho fatto tutti i calcolo corretti,da come si puo vedere le due asole lavorano a delle quote diverse l'una dall'altra,l'operatore non imposta i gradi per ogni singola asola,ma imposta i gradi riferiti all'asola 1,quella posta a 0°.In questo caso imposterà i valori corrispondenti a 0°,70°,140°,210°,280,e 350° le asole 2,3,4,5,6,7,8,,dovranno ricalcolarsi le quote corrette,questo è un primo ostacolo che non riesco a risolvere,con quale criterio mi ricalcolo le posizioni della tavola riferite alle asole.

Adesso prendiamo in esame l'asola 5 che è sfasati di 180° rispetto alla 1,quando la tavola si trova a 30° devo attivare l'uscita sulla stazione 3,a 100° la 4,a 170 la 5,a 180° esegue il controllo del carico,a 250° attiva l'uscita sulla stazione 1,ed in fine a 320° attiva l'uscita sulla stazione 2.

L'esempio che ha postata livio puo andar bene per l'asola 1,ad ogni case associo la quota che inserisce l'operatore,ma per le asole 2,3,4,5,6,7,8 le quote sono diverse.

 

Spero di essere stato chiaro ,e di non aver creato confusione

 

Edited by mazzinga

Share this post


Link to post
Share on other sites
mazzinga

Puo essere una domanda banale,ma la faccio lo stesso,documentandomi ho capito che gli encoder assoluto multigiro sono come i monogiro,con l'unica differenza che i multigiro hanno un doppio registro,uno restituisce il numero di impulsi su un giro,mentre l'altro il numero di giri fisici che ha compito l'encoder,

Su un encoder multigioro da 2048 imp/giro ed 1000 giri avrò un valore che varia da 0-2048 su un giro di encoder,poi ci sara un'altro registro che indica quanti giri a effettuato l'encoder che varia da 0-1000 per poi riprendere da zero come gli impulsi.

Ho capito bene ho il numero di impusi "2048" è spalato sul numero di giri che puo fare l'encoder,quindi avro 2.048 impulsi per giro encoder

Share this post


Link to post
Share on other sites
Livio Orsini

Il tuo errore sta qui:

Forse non sai come lavora un  encoder assoluto

Guarda il disegno, se ipotizzi 2048 impulsi giro, l'asola 2 sarà sempre in corrispondenza del codice equivalente a 256. Ammesso di avere un encoder multigiro a registro singolo, avrai 256 il primo giro, 2304 il secondo, 4352 il terzzo e così via. Basta ogni volta sottrarre il modulo, ovvero 2048, sino a che il codice indica un valore <=2048.

Questo vale per tutte le stazioni.

 

Mazzinga a me era chiaro anche prima.

Non devi fare altro che crearti tanti casi quante sono le asole ed assegnare ad ogni caso le uscite da alzare ed abbassare.

Se le posizioni delle asole non sono fisse, ma le imposta l'operatore, ti crei un array, "angolo[n]", con i 30 valori ed ogni volta che l'operatore varia una quota si aggiornerà l'array.

Nei case angolo [n] con n che varia da 1 a 30, per esempio, sostituirà angolo.

Share this post


Link to post
Share on other sites
salvatore.cam

Buongiorno, e scusate, ma credo che un plc sia sprecato per questo tipo di lavoro, esistono programmatori a camme elettroniche che costano quattro soldi li utilizzavo venti anni fa sulle termoformatrici sono precisi e affidabili, non c'è bisogno di programmarle se non dare on/off a determinati gradi.

saluti

Share this post


Link to post
Share on other sites
epoch_ita

Non devi fare altro che crearti tanti casi quante sono le asole ed assegnare ad ogni caso le uscite da alzare ed abbassare.

Oppure farti un array di offset riferito alle asole.

immaginando un array a base 0, l'indice varrà 0 per l'asola 1. dentro scrivi gli offset di quell'asola relativi all'asola 1, ovviamente per l'asola 1 l'offset varrà 0.

OffsetAsola[0]:= 0;
OffsetAsola[1]:= 45;
OffsetAsola[2]:= 90;
OffsetAsola[3]:= 135;
OffsetAsola[4]:= 180;
OffsetAsola[5]:= 225;
OffsetAsola[6]:= 270;
 

Quando fai il controllo della posizione, a seconda dell'asola che devi verificare sommi algebricamente l'offset alla misura letta dall'encoder per la posizione della stazione che ti interessa. In questo modo usi l'esempio di prima perché la misura è dinamica riferita all'asola e non alla sola posizione dell'encoder.

 

Share this post


Link to post
Share on other sites
Livio Orsini

I "case" sono le istruzioni che servono per configurare le uscite corrispondenti ad ogni caso. Non hai letto l'esempio?

Share this post


Link to post
Share on other sites
mazzinga

Prima di scrivere il messaggio,un GRAZIE a tutte le persone che mi stanno aiutando, 

OffsetAsola[0]:= 0;
OffsetAsola[1]:= 45;
OffsetAsola[2]:= 90;
OffsetAsola[3]:= 135;
OffsetAsola[4]:= 180;
OffsetAsola[5]:= 225;
OffsetAsola[6]:= 270;
 

Quando fai il controllo della posizione, a seconda dell'asola che devi verificare sommi algebricamente l'offset alla misura letta dall'encoder per la posizione della stazione che ti interessa

 A questo concetto,ci ero arrivato anche io,basta sommare alla propria asola l'ofset,riferito in gradi,ma ad esempio la stazione n° 8 si trova a  315° rispetto allo zero,quindi,quando l'encoder vale zero la posizione dell'asola 8 vale 315 (Pos_Tav "0°"+315°=315°),ma quando il valore della tavola vale 90° il valore dell'asola 8 vale 450° (Pos_Tav "90°"+315=450°"),con questo valore le uscite sull'asola 8 non si attiveranno mai perche è un valore superiore alle quote delle stazioni 0°,70°,140°,210°,280,e 350°.Quando il valore della tavola torna 0° il valore della dell'asola 8 vale 315.

Sempre in esame l'asola 8 nel mio caso mi dara l'uscita solo quando incontra la stazione 5,perche fino a quando la tavola non supera i 45° il valore dell'asola 8 si trova dentro i 360°.

Se mi sbaglio correggetemi

 

Share this post


Link to post
Share on other sites
epoch_ita

A questo concetto,ci ero arrivato anche io,basta sommare alla propria asola l'ofset,riferito in gradi,ma ad esempio la stazione n° 8 si trova a  315° rispetto allo zero,quindi,quando l'encoder vale zero la posizione dell'asola 8 vale 315 (Pos_Tav "0°"+315°=315°).

 No, aspetta...
Io per "asole" intendo gli "spazi" (slot?) sulla ruota girevole su cui entrano i pezzi da lavorare. Corretto?

Contiamo i gradi partendo dal "Controllo Carico":

  1. Se l'asola 1 si trova in corrispondenza del "controllo carico" l'encorer segnerà 0°
  2. Se l'asola 6 si trova in corrispondenza del "controllo carico" l'encorer segnerà 270°

Ora se la stazione 8 si trova a 315° rispetto al "controllo carico", quanto dovrà segnare l'encoder per far arrivare l'asola 6 alla sua posizione?

Encoder=posizione8-offset[6]=315-270=45.

 

Share this post


Link to post
Share on other sites
epoch_ita

Chiedo scusa: per la fretta nel messaggio precendente ho detto asola 6 a 270 gradi. in realtà intendevo l'alsola 7 coin l'offset 6 dell'array da spostare nella posizione 5.

Riscrivo.

Perché le asole si trovano a:

OffsetAsola[0]:= 0;       //Asola 1
OffsetAsola[1]:= 45;     //Asola 2
OffsetAsola[2]:= 90;     //Asola 3
OffsetAsola[3]:= 135;   //Asola 4
OffsetAsola[4]:= 180;   //Asola 5
OffsetAsola[5]:= 225;   //Asola 6
OffsetAsola[6]:= 270;   //Asola 7
OffsetAsola[7]:= 315;   //Asola 8

Quindi ricapitolando:

Vuoi portare l'asola 8 (offset di 315°) alla posizione di lavoro5 che si trova a 350°?
Devi muovere la ruota alla posizione encoder:Encoder=posizione5-OffsetAsola[7]=350-315=35.

 

Vuoi portare l'asola 6 (offset di 225°) alla posizione di lavoro1 che si trova a 70°?
Devi muovere la ruota alla posizione encoder:Encoder=posizione1-OffsetAsola[5]=70-225= -155 che normalizzato corrisponde a 360-155=205° dell'encoder.

Edited by epoch_ita

Share this post


Link to post
Share on other sites
mazzinga

Scusami, non riesco proprio a capire

 

Io per "asole" intendo gli "spazi" (slot?) sulla ruota girevole su cui entrano i pezzi da lavorare. Corretto?

Esatto 

Contiamo i gradi partendo dal "Controllo Carico":

La tavola gira in senso orari,per la stazione di carico le asola passano per quest'ordine 1-8-7-6-5-4-3-2-1-8-7 ecc.l'encoder conta in modo crescente 

Se l'asola 6 si trova in corrispondenza del "controllo carico" l'encorer segnerà 270

no vale 135° ci sono solo 3 passi prima che l'asola 6 arrivi in corrispondenza della stazione di carico

 

Credo di non aver capito il tuo ragionamento,riesci ad essere piu chiaro , con un esempio pratico

Share this post


Link to post
Share on other sites
mazzinga

Ok,adesso è tutto chiaro,credo che tu consideravi la rotazione della tavola al contrario rispetto a come ragionavo io,nel tuo ultimo ragionamento se il risultato della sottrazione viene negativo il valore preso nel proprio segno va sommato a 360.

 

Facendo dei ragionamenti,avrei anche una soluzione molto simile alla tua,con l'unica differenza che nel tuo caso i calcolo non sono legati alla posizione encoder,mentre nel mio caso sono legati alla posizione encoder quindi vengono aggiornati di continuo,provo a esprimerla.

Prendo il valore encoder e sommo il valore dell'ofset dell'asola,il risultato è la posizione assoluto dell'asola sulla tavola,quando il risultato supera 360,lo stesso risultato va sottratto a 360.

Cerco di spiegare il concetto con un esempio,

Prendiamo l'asola 7 che rispetto allo zero si trova a 270°,immaginando che l'encoder vale 0 il valore di dell'asola è 270+0=270,ora immaginando che la tavola vale 25° la quota dell'asola 7 vale 270+25=295,quando il valore era 280 attivavo le uscite sulla stazione 4,ora immaginando che la tavola vale 160° la quota dell'asola 7 vale 270+160=430,siccome è maggiore di 360° va normalizzato 430-360=70,questo è il valore che assume l'asola in quel momento che corrisponde esattamente alla posizione della stazione 1.

Credo che il mio ragionamento sia molto simile al tuo,cosa ne pensi,potrebbe creare dei problemi il fatto di avere la quota che si aggiorna di continuo

Share this post


Link to post
Share on other sites
Livio Orsini

Perchè complicarsi la vita con gli ofsset e balle del genere?

Basta impostare la quota reale rispetto allo zero, come si fa normalmente nelle macchine utensili. In questo modi si minimizzano anche gli inevitabili errori.

Share this post


Link to post
Share on other sites
mazzinga

Perchè complicarsi la vita con gli ofsset e balle del genere?

Basta impostare la quota reale rispetto allo zero, come si fa normalmente nelle macchine utensili. In questo modi si minimizzano anche gli inevitabili errori.

 

puoi farmi un esempio pratico,come quelli fatti da epoch_ita

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...