Vai al contenuto
PLC Forum


Unitypro Pausa Del Programma E Ripresa Dallo Stesso Punto


Andrea Panda

Messaggi consigliati

Ciao a tutti, avrei una domanda da fare, sto eseguendo un esercizio e mi ritrovo un poco bloccato, l' esercizio riguarda un nastro trasportatore che trasporta dei contenitori, questi contenitori devono essere riempiti in base a che fotocellula viene attivata dal contenitore, fin qui tutto a posto però poi mi si richiede una cosa particolare e cioè che al premere il pulsante stop la macchina si deve arrestare ma non resettare le variabili, in modo tale che se premo il pulsante start essa riparte da dove era rimasta.

Allora il mio problema principale risiede nel fatto che utilizzo dei timer e quindi non so come fare a dirgli se premo questo pulsante e il tuo ciclo è di 12s ma sei arrivato a 4 fermati finchè non premo il pulsante start e allora riparti da 4, se l' ingresso del timer va a zero questo si resetta e quindi il timer riparte da zero, spero che qualcuno possa aiutarmi grazie a tutti.

Link al commento
Condividi su altri siti


Giuseppe Signorella

Che tipologia di PLC stai utilizzando?

In genere in quasi tutti i PLC esistono degli accumulatori "temporali", sostanzialmente dei timer che contano solo quando hanno in ingresso un segnale alto.

Una volta raggiunto il loro preset vanno resettati.

In alternativa puoi trasferire il valore di conteggio in una variabile, e quando riavvi il ciclo, trasferisci questo valore all'interno del timer.

Ciao

Link al commento
Condividi su altri siti

E già che ci sono vi chiedo anche questo, è possibile usare un solo timer per più eventi? mi spiego meglio io ho 1 timer da 10s in tutto, voglio che dopo 6 faccia una cosa dopo 8 un altra e a 10 un altra ancora, è possibile o devo usare 3 timer diversi da 6,8 e 10 ? grazie mille


per ora sto facendo la simulazione con un plc BMX P34 1000 02.10, ma usando unitypro posso mettere un pò che plc voglio sopra, ad ogni modo usa un modulo DDM 16022.

Per i timer li ho visti ma conosco solo i TON e i TOF e basta

Modificato: da Andrea Panda
Link al commento
Condividi su altri siti

Giuseppe Signorella

Non è proprio semplicissimo, ma si può usare un solo timer con temporizzazioni anche differenti per effettuare più operazioni, purché effettui usa sola operazione la volta.
Se hai delle operazioni che si intersecano tra loro, all'ora devi usare timer differenti.
La tecnica è pressapoco la seguente:
Io utilizzo in genere un registro di scorrimento. ipotizziamo un byte. (Chiamiamolo per comodità "byte_di_processo")

1) Evento che avvia il ciclo, setti un bit. (chiamiamolo bit di inizio ciclo) lo resettiamo poi alla fine del ciclo. Usando un bit che resta attivo per tutto il ciclo, riusciamo ad avere un controllo sul ciclo.
Con fronte di salita di questo bit settato alzo il primo bit del "byte_di_processo". Con il primo bit del "byte_di_processo" trasferisci il valore nel temporizzatore e lo avvia. .
Quindi prima operazione in corso.
2) Trascorso il tempo di preset usa un fronte (salita o discesa) lo decidi tu in funzione a come redigi il programma, trasferisci il nuovo valore al temporizzatore (preset) ed effettui un'operazione di scorrimento di un bit sul "byte_di_processo", avvia di nuovo il temporizzatore con il nuovo valore di preset.
con l'operazione di scorrimento, si alza il secondo bit sul "byte_di_processo".
Quindi seconda operazione in corso
Ripeti le operazioni di prima, trasferisci il nuovo valore nel temporizzatore e lo avvi.
.

Ripeti l'operazione fino alla fine.

Terminato il ciclo resetta il bit bit di inizio ciclo, e con esso tutta la procedura
Ora sto uscendo, se non ti è chiaro poi te lo spiego meglio. Ciao

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

Grazie mille davvero, sei stato molto gentile e sicuramente più che esaustivo purtroppo credo di non avere le competenze per capire quello che mi hai spiegato, non saprei come settare un bit e mantenerlo per farlo muovere all interno di un registro purtroppo, se mi sai indicare qualche guida mi informo e sono sicuro che poi troverò le tue informazioni utilissime, grazie ancora

Link al commento
Condividi su altri siti

Giuseppe Signorella

Se fai una banale ricerca con qualche parola chiave, sia sul forum che su google, trovi molto materiale.

Prova con le seguenti parole chiavi: registro di scorrimento, oppure SHL e SHR, oppure SHIFT, rotazione ecc.

Un altro metodo è quello di incrementare una variabile con un fronte di salita e/o discesa quando il timer termina il conteggio e con il valore assunto dalla variabile fai dei confronti.

Se il valore coincide, eseguo le le tue operazioni.

Link al commento
Condividi su altri siti

Allora mi sono dato un letta un poco alla funzione SHL sia sulla guida del programma che in internet, purtroppo ora mi è chiarissimo cosa fa ma non come utilizzarla come tu mi hai spiegato, mi mancano alcune nozioni per capire frasi del tipo:

"Con il primo bit del "byte_di_processo" trasferisci il valore nel temporizzatore e lo avvia"

utilizzando il LADDER mi trovo un attimo in difficoltà nel capire come passare le cose a cosa,se avrai la pazienza di spiegarmi sarò ben lieto di imparare.

Per quanto riguarda il problema invece di premere il pulsante stop fermare tutto il processo ma se premo il pulsante start esso riparte da dove era stato fermato come lo risolvo ?

Link al commento
Condividi su altri siti

Giuseppe aspetto una qualche tua | |----------(S) illuminazione, in caso non si fosse capito, ok era pessima scusate XD

io lampada

Link al commento
Condividi su altri siti

Giuseppe Signorella

I metodi per scrivere all'interno di un byte di una word ecc possono essere diversi.

Molto dipendere dal PLC e dall'ambiente di sviluppo in uso.

Puoi accedere ad un’area di memoria sia in modo simbolico, (indiretto) quindi dichiarando una variabile che punta all’area di memoria che vuoi scrivere, oppure in modo assoluto e/o diretto scrivendo direttamente l’area di memoria.

Se dichiaro una variabile ad esempio “processo” che punta all’area di memoria MB10, essa andrà a scrivere nel byte 10 dell’areare di memoria M.

Se la dichiaro come MW10, esso andrà a scrivere in due byte consecutivi. MB10 e MB11

Quindi se scriverò processo = FF, (oppure MB10=FF) andrò ad impostare tutti i bit del byte 10 ad 1

Se invece dovessi scrivere M10.3=F (oppure True) andrò ad impostare ad 1 il bit n° 4 del byte 10 della memoria M.

Una soluzione meno articolata è quella di trasferire e leggere il peso del bit alto all’interno del byte.

Ad esempio se scrivo processo=1 imposto il primo bit ad 1 (M10.0=1)

Effettuo ora un shift di una posizione e vado a leggere il peso del bit alto all’interno della variabile processo.

Se la mia variabile processo mi restituisce come valore un bel 2 vuol dire che ho il secondo bit alto, se mi restituisce 4 è il secondo, se mi restituisce 8 ho il terzo e così via.

Spero che quello che ho scritto sia stato chiaro.

Ciao

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

si è chiarissimo, quello lo capisco lo facevo in programmazione, il fatto sta nel farlo in ladder, come detto io utilizzo unity pro come ambiente di sviluppo, ho trovato il modulo SHL per far shiftare il bit ma purtroppo non riesco a trovare altre info su come farlo funzionare ne sulla guida ne su internet e ne se devo collegarlo poi al timer o deve stare a parte e avere in ingresso solo il contatto del timer.

Link al commento
Condividi su altri siti

Premesso che non conosco il sw in questione, ma solitamente per trasferire un valore in ladder si usa l'istruzione MOVE( quindi 'muovi'un valore da una variabile all'altra, o da una costante ad una variabile).

Per l'istruzione SHL, solitamente ha un ingresso per l'evento che vuoi che effettui lo shift(usa il fronte) e la variabile da shiftare, in alcuni sw è possibile indicare in uscita anche un'altra variabile dove appoggiare il risultato. Se la tua istruzione è cosi indica la stessa variabile in entrata ed in uscita e dovresti essere a posto.

Come diceva il buon Giuseppe, con l'evento che avvia il ciclo setti un bit, che resterà alto per tutto il ciclo.

Col fronte di questo bit alzi il primo bit della tua variabile di processo( es MB0.0) e poi col suddetto bit esegui due operazioni:

1)trasferisci il primo valore al timer( supponiamo una costante, t#5s) quindi farai una cosa del tipo MOVE t#5s in Mio_Timer.PT ;

2) fai partire il timer.

A questo punto non devi fare altro che interrogare l'uscita del timer(cioè quando arriva a fine conteggio ), ripeto non conosco unity ma dovrebbe essere una cosa del genere 'Mio_timer.Q' . Col fronte di questo bit esegui lo shift della variabile di processo e la prima parte del tuo ciclo sarà cosi conclusa per passare alla seconda. Ora ti troverai alto il secondo bit( e qui come diceva Giuseppe puoi interrogare sia il singolo bit che il valore della variabile) e ripeti praticamente quello fatto prima.

Ciao

Link al commento
Condividi su altri siti

purtroppo le istruzioni cosi a me sembrano molto da linguaggio C o sl, ma in ladder non ho mai visto dove poter inserire istruzioni di questo tipo, una volta che inserisco un contatto o una bobina la cosa è finità li non posso inserire altri tipi di oggetti, o sbaglio?

Link al commento
Condividi su altri siti

ciao

io lo farei con una word di ciclo e un blocco funzione timer fatto ad hoc

ti giro qualche immagine di esempio

e3af870794b1e70a1d51100ba05364c3.PNG

7a3819409e1f1b0e1d58763162e2978d.PNG

nella comparazione c'è scritto : conteggio >= set_point

97c7923fe2ee3aa2d89309f8b4625ddb.PNG

nell'esempio ho fatto un ciclo a 10 step

ad ogni step viene caricato un suo tempo di step

con il bit congela arresti il conteggio senza azzerare il tempo

saluti Valvolina

Modificato: da valvolina
Link al commento
Condividi su altri siti

ho santi numi tutta quella roba devo ancora imparare cosa sia....

Allora ho risolto intanto il discorso di mettere il programma in pausa settando il bit di sistema %s1 cosi fà il warmstart e sono a posto XD

per quanto riguarda il timer e altro vi inserisco direttamente il mio problema cosi ne capiamo un attimo

In sostanza ho un rullo che trasporta dei contenitori, questi contenitori sono di 3 misure fisse e devono essere riempiti da 2 valvole poste sopra delle fotocellule, prima di queste valvole ci sono 3 fotocellule che riconoscono l' altezza dei contenitori perche per ogni contenitore c'è un tempo di riempimento sotto ogni valvola.

E' necessario porre molta attenzione nella fase di lettura delle fotocellule per il riconoscimento del tipo di contenitore, onde evitare errori, il sistema richiede una sorta di ritardo nell' attivazione di alcune fotocellule in modo da ottenere una lettura sequenziale leggermente ritardata da parte dei tre sensori ciò eviterebbe molti errori nel tipo di funzionamento ||| qui io pensavo di inserire un bit di sistema che desse un delay di qualche ms in modo da risolvere il problema giusto ? |||

LA fase di riempimento di ciascun contenitore deve avvenire nella seguente maniera:

1 una volta posizionato sotto l' elettrovalvola interessata esso dovrà fermarsi dopo 1 secondo per posizionarsi correttamente

2 dopodichè si ha una attesa di 2s prima che avvenga il riempimento passati i quali si aprirà l' elettrovalvola per i secondi richiesti

3 terminato il riempimento si ha nuovamente una attesa di 2 secondi

4 passati i due secondi il contenitore riprenderà la marcia

i 3 diversi contenitori si dovranno rimepire con queste tempistiche

a) 8 sec sotto la prima valvola e 6 sotto la seconda

b.) 12 secondi sotto la prima

c) 9 secondi sotto la seconda

ogni ciclo di riempimento di ciascun contenitore dovrà far in modo di escludere sia la lettura che il ciclo di lavoro di una altro contenitore dina a quando non sarà terminata la sua fase di lavoro

ogni contenitore può effettuare al massimo un ciclo di 10 riempimenti.

Ok questo è il problema ora vi faccio vedere quello che ho fatto io fino ad adesso

435fad3f980eab5b097b44b0fea395f8.jpg

sicuramente sarà un poco incasinato ma sono alle prime armi scusate, questo pezzo di programma riempie solo il contenitore A (e ho già avuto parecchi problemi cosi va XD) sono riuscito a fare entrare i ciclo i timer settandoli e resettandoli come se avessero un interruttore ma è un modo lungo e laborioso sono sicuro ce ne sia uno piu corto XD

Modificato: da Andrea Panda
Link al commento
Condividi su altri siti

Valvolina, ho provato a capire come funziona il tuo timer, non riesco solo a capire bene il processo di come poter tenere vari conteggi all' interno del timer, in più a vedere le immagini mi sembra che anche tu usi unity, anche io ho la sezione "fb derivati" ma purtroppo non riesco neanche ad aggiungere il timer ne a crearlo, come posso fare ? scusa per la mia ignoranza se non hai tempo/voglia di spiegare indirizzami solo dove potrei informarmi cosi mi arrangio da solo grazie mille.

Link al commento
Condividi su altri siti

Un altra cosa vi volevo chiedere il discorso degli array, piu che altro a concetto logico, sono piccoli cassetti in cui io posso inserire 1 o 0 e basta non per dire il numero 23, per capirci meglio ho un counter e 3 input, quando uno di questi arriva a 10 quell' input si deve staccare e non funzionare più, ora io l' ho fatto con 3 counter, ma sarebbe possibile usarne uno ? per capirci se fossi in c++ userei una variabile che al passaggio di ogni input prende un +1 quando questo arriva a 10 lo spegne, però in LD come lo faccio usando 1 solo counter e 3 input ? non credo si possa o sbaglio ? grazie ciaociao

Link al commento
Condividi su altri siti

ciao

ti metto l'immagine di un programmino timer fatto senza utilizzo di blocchi funzione

tanto perchè tu possa capire come funziona, qualche istruzione di funzionamento sta nelle immagini.

c96c2a77f167e49fdc3c5a4421366059.PNG

a87f56c194868eae7162da6a9d7b5e6d.PNG

nella variabile set_point devi mettere un valore (ad esempio con una tabella di animazione) di tempo che ti serve,

ad esempio se in quella variabile ci scrivi 100 corrispondera a 10 secondi, visto che il conteggio è in decimi.

fammi sapere

saluti Valvolina

Modificato: da valvolina
Link al commento
Condividi su altri siti

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