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




Programma per movimento stepper


Messaggi consigliati

Inserito:

Salve, 

Come da titolo devo fare un programmino per degli spostamenti in sequenza di uno stepper motor collegato al plc s7 1200 la cpu 1211cc a transistor.

Ho gia collegato il motore con il suo driver rta al plc.

Ho parametrizzato l asse 1 come pto impulso e direzione Q0.0 e q0.1 e ho settato i finecorsa di inizio e fine, fatto questo sono andato in messa in servizio e il motore esegue 1 giro con 400 impulsi.

Adesso devo fare un programma che mi permetta di far compiere al motore diversi e ben precisi movimenti ripetitivi. Es:

Do lo start e le quote da raggiungere sono 10 (quota 400 600 900 1000 1400 ecc fino a 10 spostamenti), fatto questo deve ritornare direttamente al punto di partenza quota 0.0 e ripartire dall inizio.

Ovviamente tra una quota ed un altra tra le dieci c è un tempo di pausa che anch' esso deve essere variabile,esempio :arrivo alla prima quota e mi fermo 2 sec poi alla seconda quota mi fermo 1 sec e cosi via fino ad ultimare tutti i posizionamenti.

Ho pensato di creare una variabile o meglio un array che contenga tutte le quote predefinite ma non so come si crea un array in questo plc? oppure posso spostare queste singole quote su una variabile MW10 la quale poi andrebbe nel box del movimento assoluto del asse1, ma è piu macchinoso dover usare 10 move diversi e poi farli aggiornare con diversi temporizzatori...

Chi mi da una dritta prima che inizi sbagliando...grazie


Inserita:

 Premetto che è molto tempo che non uso Il 1200...

 Io procederei in questo modo: dichiaro un array di 10 elementi di posizioni, un array di 10 elementi di velocità, un array di 10 elementi di accelerazioni , un array di 10 elementi di tempi di pausa. A questo punto usi un solo blocco Di movimento( per esempio Mc_MoveAbsolute) per fare i tuoi spostamenti. Per ogni spostamento eseguirei in sequenza:

-Caricamento valori di posizionamento(es Mc_MoveAbsolute1.Position:=MioArrayPosizioni[1]; Mc_MoveAbsolute1.Velocity:==MioArrayVelocità[1] ) e cosi via;

- start movimento;

- controllo movimento preso in carico( si alza il bit Busy);

-Controllo movimento terminato(si abbassa Busy);

-eventualmente controllo bit "done" alto( ma io non lo faccio mai, quando si abbassa il busy è sufficiente);

-carico tempo di attesa: ( es MioTon.PT:=MioArrayTimer[1];

-start timer;

- controllo timer scaduto;

-Passo allo step successivo.

 

Ci sono altri 100 modi di farlo, di organizzare i dati ecc.. 

Spero di essere stato d'aiuto

Matteo

Inserita:

ok grazie Matteo, gli array non sono tanto un problema ,adesso è piu la difficoltà a far slittare l indice dell array contemporaneamente sia 

quello della posizione della velocità ed il tempo, l accelerazione per adesso non serve

Quindi come incremento l indice di tutti gli array una volta effettuato il primo passo poi il secondo e cosi via...

Inserita:

Nel mio esempio non era contemplata la possibilità di usare un indice di array da incrementare, ma solo un indice assoluto.

Se vuoi usare l'indice non credo vi siano grossi problemi: dichiari una variabile che sarà appunto il tuo indice di array; una volta effettuato il primo posizionamento lo incrementi e controlli che sia ancora <=10(o quello che vuoi tu). Se Vero vai avanti, se falso azzeri l'indice e consideri concluso il ciclo. Come dicevo esistono 1000 modi per farlo

Inserita:

//Ciclo Posizionamento

 

CASE FaseStepper OF  //Fase Stepper Variabile Int

 

0: MioIndiceArray:=0;

    FaseStepper:=10;

 

10: IF StartPos THEN   //StartPos   bit di start sequenza

         Mc_MoveAbsolute1.Position:=MioArrayPosizioni[MioIndiceArray]; //Caricamento Valori di inizio

         Mc_Absolute1.Velocity:=MioArrayVelocità[MioIndiceArray];

         MioTimer.PT:=MioArrayTempi[MioIndiceArray];

         FaseStepper:=20;

    END_IF;

 

20:MoveAbsolute1.Start:=TRUE; 

     FaseStepper:=30;

 

30:IF MoveAbsolute1.Busy THEN

         MoveAbsolute1.Start:=FALSE; 

         FaseStepper:=40;

    END_IF;

 

40:IF Not MoveAbsolute1.Busy THEN FaseStepper:=50; END_IF;

 

50:MioTimer.IN:=TRUE; 

     FaseStepper:=60;

 

60:IF MioTimer.Q THEN 

         MioTimer.IN:=FALSE;

         FaseStepper:=70;

     END_IF;

 

70: IF MioIndiceArray<= 10 THEN 

          MioIndiceArray:=MioIndiceArray+1; 

          FaseStepper:=10;

      ELSE

         FaseStepper:=0;

      END_IF;

END_CASE;

 

Esempio fatto di fretta, magari mi sono perso o dimenticato qualcosa...scusami

 

Se usi il Ladder puoi fare esattamente la stessa cosa, è questione di abitudine...non c'è il CASE ma col MOVE fai la stessa cosa. 

          

 

Inserita:

ma l indice cioè la variabile che dovra far scorrere gli elementi dell array la devo incrementare con la giusta sequenza dei tempi  cioè le pause tra un movimento e un altro.

Quindi su questo ho qualche dubbio...ho faccio un temporizzatore a cascata oppure?

Inserita:

Nel mio esempio non scorre nulla. Se guardi la fase 50 ad esempio faccio partire un timer al quale in precedenza avevo passato il valore di preset contenuto nella variabile MioArrayTempi[MioIndiceArray]. Nella fase iniziale del tuo ciclo MioIndiceArray vale 0, quindi passerà al timer il valore contenuto in MioArrayTempi[0]. Una volta terminato il primo posizionamento, vi sarà quindi una pausa uguale al valore impostato in tale variabile, e via via che si incrementa l'indice ci sarà una pausa diversa in funzione del valore impostato in MioArrayTempi[1] , MioArrayTempi[2], ecc ecc. 

Cioè, forse ti è sfuggito il passaggio in cui il tempo di pausa viene già tenuto in considerazione.Nel mio esempio MioTimer è un timer di tipo TON(ritardo all'inserzione).Dovresti trovarlo facilmente nella lista delle istruzioni

Inserita:
Quote

dichiaro un array di 10 elementi di posizioni, un array di 10 elementi di velocità, un array di 10 elementi di accelerazioni , un array di 10 elementi di tempi di pausa.

Oppure, a seconda dei gusti, un array di 10 STRUCT, dove ogni struttura contiene le variabili che servono.

 

Quote

ma l indice cioè la variabile che dovra far scorrere gli elementi dell array la devo incrementare con la giusta sequenza dei tempi  cioè le pause tra un movimento e un altro.

Infatti, nell'esempio di "step-80", il preset del timer non è fisso, ma cambia in funzione dell'indice.
 

Inserita:
2 minuti fa, batta scrisse:

Oppure, a seconda dei gusti, un array di 10 STRUCT, dove ogni struttura contiene le variabili che servono.

Esatto Batta, io ero di fretta ed ho specificato che si potevano organizzare i dati in altri modi. Alla fine poi ognuno si crea col tempo e l'esperienza un sistema che gli va piu a genio;)

 

Inserita:

Ahh ecco ho capito quindi un solo temporizzatore con il preset dei tempi che cambiano nell array, purtroppo sono agli inizi con tia portal ho capito come dovrebbe funzionare ma devo capire bene come creare e utilizzare queste funzioni comunque grazie

Inserita:

qualcuno sa in quale variabile risiede il valore della posizione attuale? cioe vorrei vedere gli impulsi avanzare sul display per sapere dove si trova il motore. 

Inserita:

ciao,La posizione attuale dell'asse e altri stati si possono visualizzare all'interno del Db generato in "oggetti tecnologici". Prova a cercare "DB.MotionStatus.Position"

Inserita:

Fatto grazie c e un blocco mc.read e si possono leggere tutti i parametri dell asse configurato, anche se non centra con la discussione sai per caso se sul pannello ktp 400 si puo avere un indicatore circolare?oppure c e solo la barra verticale?

Inserita:

Quando lo usavo io Mc_Read non esisteva..o almeno non lo ricordo. 

Per quanto riguarda il Ktp mi spiace non saprei come aiutarti.

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