roberto8303 Inserito: 20 dicembre 2017 Segnala Inserito: 20 dicembre 2017 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
step-80 Inserita: 21 dicembre 2017 Segnala Inserita: 21 dicembre 2017 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
roberto8303 Inserita: 21 dicembre 2017 Autore Segnala Inserita: 21 dicembre 2017 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...
step-80 Inserita: 21 dicembre 2017 Segnala Inserita: 21 dicembre 2017 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
step-80 Inserita: 21 dicembre 2017 Segnala Inserita: 21 dicembre 2017 //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.
roberto8303 Inserita: 21 dicembre 2017 Autore Segnala Inserita: 21 dicembre 2017 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?
step-80 Inserita: 21 dicembre 2017 Segnala Inserita: 21 dicembre 2017 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
batta Inserita: 21 dicembre 2017 Segnala Inserita: 21 dicembre 2017 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.
step-80 Inserita: 21 dicembre 2017 Segnala Inserita: 21 dicembre 2017 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
roberto8303 Inserita: 21 dicembre 2017 Autore Segnala Inserita: 21 dicembre 2017 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
roberto8303 Inserita: 22 dicembre 2017 Autore Segnala Inserita: 22 dicembre 2017 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.
step-80 Inserita: 23 dicembre 2017 Segnala Inserita: 23 dicembre 2017 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"
roberto8303 Inserita: 24 dicembre 2017 Autore Segnala Inserita: 24 dicembre 2017 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?
step-80 Inserita: 24 dicembre 2017 Segnala Inserita: 24 dicembre 2017 Quando lo usavo io Mc_Read non esisteva..o almeno non lo ricordo. Per quanto riguarda il Ktp mi spiace non saprei come aiutarti.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora