Vai al contenuto
PLC Forum


Interrupt - generare un interrupt


roberto8303

Messaggi consigliati


  • Risposte 91
  • Created
  • Ultima risposta

Top Posters In This Topic

  • roberto8303

    61

  • Livio Orsini

    31

Per prima cosa con il 200 è meglio non scendere sotto i 10 ms.

Poi se vai all'help on line di microwin o, meglio, al manuale dello S722x c'è il capitolo interrupt dove spiega bene come si genera e come si deve procedere per progammare il timere di sistema per generare l'interupt a tempo. Ci sono anche esempi molto chiari (strano ma vero)

Roberto il manuale, prima o poi, dovresti leggerlo, risparmieresti anche tempo ;)

Link al commento
Condividi su altri siti

Ciao Livio si l ho letto il manuale ma mi sa che il manuale migliore fino adesso sei tu! :) a parte gli scherzi, ti spiego dove sono le mie difficolta, è un po come se dovessi spiegare a qualcuno come si fa una torta quando dirai che ci vogliono le uova e chi ti ascolta non sa cosa siano sara difficilissimo che avra capito! il manuale del s7200 spiega le funzioni nello specifico i box quali compiti hanno ma non ci sono riferimenti in particolare per le singole e personali applicazioni, io non ho basi di informatica essendo un elettrotecnico sto appena iniziando ad imparare il plc mi affascina molto e vorrei capire anche i minimi particolari! Sapessi la confusione che ho in testa con tutte le cose da sapere sui plc, piano piano sto facendo qualche progresso ma purtroppo sono costretto a rompere le scatole sempre a voi esperti del forum!e devo dire soprattutto grazie al forum che ho fatto qualche applicazione funzionante con il plc!ora come avrai capito devo completare il posizionatore che mi hai spiegato e tra dire e il fare c è di mezzo il mare...teoricamente ho capito anche come deve funzionare ma quando vado sui segmenti vuoti del programma microwin cala il silenzio...!auhaha, comunque non mi arrendo ;)

Link al commento
Condividi su altri siti

Roberto vai a pagina 163 del manuale c'è un esmepio chiarissimo che richiama la lettura dell'analogica ogni 100 ms.

SBR0 è lò asubroutine d'inizializzazione che devi fare sempre e comunque, perchè li si inizializzano tutte le operazioni.

INT0 è la subroutine richiamata dal timer. Nel tuo caso invece di leggere l'analogico ci scrivi il posizionatore.

Se vuoi usare i PLC devi imparare almeno i fondamentali della programamzione. Non si può continuare a far funzionare i programmi a mazzate :)

Link al commento
Condividi su altri siti

Si oggi ho fatto delle prove l esempio sul manuale è molto chiaro ho visto sulla tabella di stato i due valori uno diretto cioe AWI0 nel tempo e sotto quello aggiornato ogni 200ms nell interrupt 0 chiamato VW100 ogni piccola variazione che facevo con la manopola dell alimentatore cambiava istantaneamente la curva del valore AWI0 mentre quella sotto cioe scansionata dall interrupt ogni 200ms la curva era molto piu dolce perche non prendeva in esame le brusche variazioni nel tempo inferiore a 200ms.

Perche si puo usare un tempo che va da 5ms a 255ms? e non di piu?

ho fatto un altro piccolo programma dove incrementavo con sm05 di 200 punti il valore di ingresso della tensione fissata a 5volt quindi ho aggiornato un contatore con 200 e ogni mezzo secondo mi aumentava il valore in uscita della tensione ho usato un box addizione, ora chiedo, questo che ho fatto si puo fare con la sub routine e interrupt? eventuali calcoli matematici vanno inseriti nel main subroutine o nella pagina interrupt?? nel manuale per interrupt periodici fa riferimento ad temporizzatori t32 questo ultimo dove va inserito nel main o subroutine? ultima cosa perche il programma di esempio nel manuale compare solo SMB34 e non anche SMB35?? ho capito come richiamare un interrupt ogni 100ms o quello che sia ma non ho capito come incrementarlo di x per avere il mio bel contatore virtuale di riferimento!! sono mortificato :( Pero Livio ogni tua spiegazione mi apre la mente! gia il fatto di sostituire il valore analogico da leggere campionato ogni 200ms dell esempio con le operazioni del posizionatore gia ho capito come funziona! resta sempre il piccolissimo problema di scrivere le istruzioni correttamente!credo che domani mi ci mettero di nuovo ormai è una questione di principio!Grazie ancora in tal caso aggiornero tutto quello che faccio sperando di non scocciare troppo!! ;)

Link al commento
Condividi su altri siti

...sperando di non scocciare troppo!!

Nel caso te lo diciamo :P Comunque il forum serve proprio per aiutare ed essere aiutati.

Nella sub di interrupt puoi scrivere tutto quello che vuoi, è una subroutine come le altre. Però è buona prassi di programamzione ridurre al minimo indispensabile le operazioni da eseguire in quelle sub. Questo perchè, ed è anche intiutivo, se la CPU elabora la sub di interrupt non fa le altre operazioni. Ora se ogni 10 ms, per esempio, richiami una sub zeppa di conti ela CPU impiega, per esempio, 8 ms per risolvere questa sub tu hai che la CPU passa lo 80% del tempo a fare quel lavoro e può dedicare solo il 20% delle sue risorse per eseguire tutto il resto.

Con una CPU S7-22x, anche se il timer puà essere programamto a 5 ms, per esperienza non scenderei mai sotto i 10 ms. Questo perchè a questi livelli si rischia sia di saturare la CPU (per quello che ho scritto prima), sia perchè si perde in precisione di tempo.

Sopra i 255 è una scelta del progettista della macchina. Avrà avuto le sue valide ragioni. COmunque con questi livelli di ritardo è semplice gestire il tutto dall'esterno. Se, ad esempio, desideri un clock a 1", fai un interrupt a 250 ms, nella sub fai un conteggio per 4 ed ecco il tuo secondo.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Buongiorno e Buona Pasqua a tutti! Livio quindi nella stessa sub ci sara anche configurato L hsco del contatore veloce giusto?oppure sara configurato in una altra sub routine chiamata ad esempio sbr_0 per hsco , e sbr_1 per l interrupt a tempo ogni 10ms? e se cosi nel main dovro richiamare entrambe le due subroutine? Livio un ultima cosa ho pensato di fare una prova per capire bene il concetto dell interrupt, prima di associare l hsc0 e qiundi il programma finito..che farei dopo questa esercitazione, quindi realizzare propio solo il contatore virtuale per ora, penso di fare cosi:

Copio la subroutine come dal manuale ma con la sola differenza come esercitazione che devo incrementare il valore di 5 da 0 a 32000 ogni 100ms quindi 32000 diviso 5 = 6400 livelli (5 -10-15-20-25...31995-32000) ora ogni livello sara compiuto in 100ms quindi il valore completo 0-32000 avra un tempo di 6400 x100ms che portato in secondi 6400x0,1 =640 secondi circa 10minuti!! fondo scala 32000! quindi deduco dal tuo consiglio che 10ms sara piu o meno 1 minuto per portare il valore da 0-10v nel caso in cui la differenza tra la posizione attuale del mio encoder e la posizione teorica del contatore virtuale sia il massimo(cosa che succederebbe solo in cui l encoder non si muova per niente) Per fare questo quale funzione o box utilizzare per incrementare il valore dopo 100ms di 5 punti ho provato a fare sia l addizione di 5 piu il valore corrente ma logicamente una volta eseguita l operazione ad esempio 20000 piu 5 =20005 la successiva operazione dopo 100ms me la ripete con il valore di 20000 e non aggiornato al valore 20005!!quindi devo usare un box contatore? dove ogni 100ms si abilita il contatore e moltiplico per 5 che poi sommo a 20000?

Link al commento
Condividi su altri siti

Nella sbr0 devi mettere tutte le inizializzazioni, quindi anche l'inizializzazione di HSC0, l'inizializzazione del timer di sistema ed altre eventuali condizioni iniziali.

Nel Main chiami la sbr0 una sola volta, quando esegui il programma per la prima volta. Per questo c'è un merker di sistema che sta a "1" solo il primo ciclo. E' il bit SMB..(questo te lo cerchi cosi vedi anche gli altri SMB "speciali" ;) )

Poi ogni 100 ms (per esempio) quando scade il timer e si attiva l'interrupt, nella sub dell'interupt (quella dove ora leggi l'ingresso analogico) andrai a copiere le seguenti operazioni:

1 - incrementi il contatore che somma il differenziale di posizione alla posizione teorica

2 - leggi HSC0

3 - sottrai la posizione reale a quella teorica

4 - se la differenza è amggiore della bandanorta metti in uscita sul D/A la differenza (eventuallmente moltiplicata per una costante), altrimenti metti a zero l'uscita e comandi anche lo stop

5 - termina la sub di interrupt

Queste poche operazioni dovrebbero impegnare la CPU per <2ms

Per fare il posizionamento devi pensare a qaunti impulsi di encodere avrai alla massima velocità. Immaginiamo che per fare il giro l'antenna impieghi 60", avrai 3600 impulsi in 60", che sono 6 impulsi ogni 100 ms.

Quindi quando parti per un posizionamento aggiungerai7sottrarrai 6 impulsi ad ogni interrupt. Se, come penso, il risultato che andrà sul D/A, sarà un valore troppo basso, con conseguente movimento troppo lento, basta che tu moltiplichi per una costante. QUesta costante diventa il tuo guadagno proporzionale.

Prova, anche senza far funzionare il motore. Così vedi se l'uscita cresce in rampa fino a quando il conteggio ha raggiunto il valore di posizioe. A questo punto l'uscita non cresce più. Allora muovi lentamente l'encoder a mano e vedrai calare il valore della tensione sino ad azzerarsi.

Fai le prove e facci sapere. Buona Pasqua e buone prove :D

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Perfetto, si il bit Sm0.1... per differenziale di posizione si intende la posizione effettiva del hsc0 ? oppure hsc0 meno la posizione teorica del contatore virtuale?appena posso oggi vedo di combinare qualcosa grazie per l ennesime spiegazioni ti faro sapere oggi stesso ;)

Link al commento
Condividi su altri siti

Ho provato a fare un esempio di programma voglio incrementare di 53 punti partendo da 0 l uscita AQW0 ogni 50 ms ora posto il programma in AWL perche non ho capito dove è lo sbaglio per cui il valore del contatore non si aggiorna e rimane il ramo sempre ad on usando anche le transizioni positive e negative!!

LD SM0.1

CALL SBR_0:SBRO

SBR

LD SMO.O

MOVB 50, SMB34

ATCH INT_0:INTO,10

INT

LD SMO.O

LD I0.5 usato per resettare il contatore...

CTU CO,32000

LD SM0.0

MOVW CO, VW100

*I + 53, VW100

LD SM0.0

MOVW VW100, AQW0

Perche il contatore CTU non si aggiorna incrementa ogni 50 ms? il ramo che va al box è sempre on? anche se non lo vedo ad occhio dovrebbe andare ad on e off ogni 50ms se ho generato tale interrpt?ho provato anche ogni 200ms ma niente rimane a 0!

Link al commento
Condividi su altri siti

Chiedo scusa la mia ignoranza non mi ero accorto che un ctu non puo leggere piu di 7 impulsi al secondo!!

ora ho programmato cosi e funziona!

posto solo l interrupt

LD SM0.0

AN MO.0

+I53, VW100

LD SM0.0

MOVW VW100,VW200

LD SM0.0

MOVW VW200, AQW0

LD SMO.O

AW> VW200,3000

M0.0

quindi ho usato una word spostando di 53 ogni interrput generato in 100ms usare un contatore normale era sbagliato...!e ora se ho la conferma di aver fatto bene passo a programmare il mio bel contatore virtuale... ;)

Link al commento
Condividi su altri siti

. per differenziale di posizione si intende la posizione effettiva del hsc0 ?

No! Leggi bene il mio ultimo post. Cerca di capire l'esempio delle ultimi righe.

Link al commento
Condividi su altri siti

ho capito,il differenziale di posizione è l incremento di x sull contatore hc0 (copiato in una word di appoggio )x esempio VW100= (hco)+ i(ncrementato di x ogni 10ms) = differenziale di posizione! ora fatto questo sottraggo il differenziale al valore effettivo di hsc0= VW100-HC0 mettiamo dei valori per praticita Ad encoder fermo sara VW100=2 hc0=0 2-0=2 che appoggio in una word VW200 il valore di 2 durera solo per i primi 10ms e si incrementera di 2(2-4-6-8) ogni 10ms fino a che sara < della posizione desiderata scritta in una VW300 (es 1000)! ora se scrivo la posizione desiderata in VW300 (es 200) devo fare un confronto tra VW300 ed hco in modo da stabilire il senso di rotazione del motore per andare in avanti o indietro!

Chiarito questo chiedo: Il programma con queste operazione sopra descritte somme confronti differenze devo scriverlo tutto nella sezione interrupt come ho fatto l esercitazione o nella main dopo il segmento che richiama la sbr0?

Link al commento
Condividi su altri siti

No!

Esempio

SBR0

....

VB10 = 6 ;differenziale di posizione

VW200=5 ;coefficiente di proporzionalità

....

INTxx

VW100=VW100+VB10

VW102=HSC0

VW104 = VW100-VW102; VW104 = errore di posizione

VW106=VW104*VW200; VW106 = riferimento di velocità da mettere in uscita (fare i test per <-32000 e >32000) [VW106 ==> uscita nalogica]

fine sub INTxx

Questo è un esempio; devi tradurlo in instruzioni KOP, aggiungere i test per raggiunta posizione, verificare che non ci siano problemi con i segni e...poi posiziona.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Buongiorno, sto facendo delle prove e devo dire che funziona perfettamente ma sto impazzendo quando cambio la quota da raggiungere mi si sballa tutto!!sono arrivato a questo punto ho messo una quota di esempio 25000 nella word 200 vado in run e piano piano da zero con la somma ogni 10ms di 6 il conteggio si porta a 25000 salendo di tensione ad encoder fermo fino a 3volt poi se lo ruoto bilancio la tensione di uscita che si ferma arrivato a 25000 perche non incremento piu il box addizione e mano mano scende quando finisco di ruotare l encoder, ora succede questo quando carico il valore 5000 nella word 200 perche nel confronto mi appare -25000 cioe mi si inverte il segno!! e ovviamente non si trova piu il confronto per cui non va a fare la sottrazione del differenziale! un altra cosa sul tester mi segna 0.01volt e l encoder ha ancora 25 impulsi da azzerare ma se vado oltre sul tester mi esce -0,00 e poi si inverte la polarita è normale?l inverter si muove ancora a 0,01volt di riferimento?la polarita dell modulo analogico dovrebbe cambiare quando invece di sommare sottraggo? e perche mi cambia il segno nella word e quindi nel confronto che predispongo se sommare o sottrarre se carico un valore piu basso di quello iniziale!!

Link al commento
Condividi su altri siti

Roberto, qualche post addietro ti ho spiegato come fare per tornare indietro. Nel'ultimo post ti ho anche detto che devi fari i controlli ><.

Non penserai sul serio di risolvere tutto con sole 5 righe 5 di programma! Dai è un po' più complesso, magari alla fine si arriva anche a 15 righe :D

Forza, spremere un poco le meningi eun po' di olio di...tastiera e prima di sera hai il programma che gira e l'antenna si posiziona. :clap:

Link al commento
Condividi su altri siti

si infatti sono arrivato a 12 righe quindi manca poco... :) un utlima domanda e poi lo risolvero!(speriamo!!) ma l encoder è configurato bene senza avvio senza reset e ne inversione del segno vero?

Link al commento
Condividi su altri siti

ma l encoder è configurato bene senza avvio senza reset e ne inversione del segno vero?

????

Se vuoi sapere dov'è l'antenna quando accendi il tutto devi prima fare una ricerca di posizone zero

Link al commento
Condividi su altri siti

Caro Livio non so come ringraziarti!! se non era per il tuo insegnamento non ci arrivavo prima di natale!! devo dire che andata benissimo per Pasqua! tutto funziona alla meraviglia! ho trovato l errore che mi sballava tutto!! nel box sottrazione dove toglievo 6 dal virtual clock avevo scritto 6-25000 e andava tutto in negativo!!!ora va bene il segnale aumenta e si stabilizza mano a mano che ruoto l encoder addirittura se oltrepasso tale quota desiderata il segnale diventa negativo e devo riportare indietro l encoder per azzerare i volt! Grazie al tuo consiglio ora ho un sistema molto piu preciso di quello che volevo fare io! Ora sono rimaste due cose una collegare il pannello hmi (li non ho problemi :) ) e poi resta il fatto di dare l homing al sistema cioe lo zero appena accendo il tutto!!non ho idea di come farlo...se mi puoi dare una dritta anche con questo gia che ci siamo... ;)

Link al commento
Condividi su altri siti

E va bhè, diamom anche questa. Poi mando una parcella globale :D

Allora devi avere un fine cora di zero, che fa anche da fine corsa per il massimo (0o == 360o). Quando accendi comandi, su richiesta e/o automaticamente, la sub di homing.

La sub di homing prevede un riferimento basso (velocità molto lenta) in negativo, sino ad incontrare il fine corsa; ti fermi e dai un riferimento avanti molto lento sino ad in contrare la prima tacca di zero dell'encoder. Questo è lo zero dell'apparecchiatura. A questo punto azzeri HSC0, contatore virtuale e tutte le eventuali altre variabili.

Questa procedura è un classico per tutti i posizionatori.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Ho capito e infatti devo pagare veramente per queste preziose spiegazioni! domani appena posso durante il lavoro mi metto un poco e cerco di fare anche la sub dell homing e ti faro sapere ;)

Link al commento
Condividi su altri siti

Buongiorno, aggiorno il lavoro che sto facendo anche se ho avuto solo una mezzoretta da stamattina per provare l homing del sistema,

ho provato la funzione jmp quando lo start del pannello che poi sarebbe per provare il contatto I0.6 normalmente aperto salto il programma nel INT_0 dove con una tensione negativa in AQW0 mando il motore a cercare il micro non appena lo tocca cambio il segno della tensione e va in avanti si ferma quando HC0 è uguale a 0

nella prova fatta velocemente succede questo il programma entra nella LBL ma poi non esce piu quando attivo il contatto I0.6 e la legge sempre nel programma!oggi provero a trovare un altra soluzione! devo scartare l utilizzo della funzione del salto jmp per fare eseguire l homing?

Link al commento
Condividi su altri siti

Ho richiamato un altra sub quando l interruttore di start è aperto, non capisco come fare l homing con il finecorsa e lo zero dell encoder! ho problemi perche quando mando indietro il motore a cercare il finecorsa e poi lo tocca e va avanti non appena rilascia il micro il motore torna indietro!!e non arriva mai al confronto dello 0 encoder!!devo usare un temporizzatore per scavalcare il micro quando viene rilasciato per andare avanti??se no mi torna sempre indietro il motore a cercare il micro!!

Link al commento
Condividi su altri siti

che necessita cè di fare andare in negativo il motore?non posso farlo andare fino allo zero dell encoder?? cè rischio di instabilita intorno allo 0?

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