roberto8303 Inserito: 31 maggio 2009 Segnala Share Inserito: 31 maggio 2009 come posso generare un interrupt ogni 8 secondi? devo attivare una uscita ogni 8 secondi precisi! nella sub trasferisco nel smb34 max 255 Link al commento Condividi su altri siti More sharing options...
alfa84 Inserita: 31 maggio 2009 Segnala Share Inserita: 31 maggio 2009 ciaodovresti spiegare in che modo viene attivata questa uscita...se secondo un determinato evento che può essere ad esempio il fronte di salita di un ingressoo l'uscita viene attivata con alternanza di tipo on/offecccciao Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 si attiva quando alzo un ingresso x ad 1 passano 8 secondi e si attiva l uscita per 8 secondi , poi passati altri 8 secondi si spegne e cosi via a ciclo on off fino a quando non abbasso l ingresso x Link al commento Condividi su altri siti More sharing options...
alfa84 Inserita: 31 maggio 2009 Segnala Share Inserita: 31 maggio 2009 (modificato) Perchè non utilizzare dei temperizzatori....LD I0.0 TON T32,8000 AN T33 A T32 = Q0.0 LD Q0.0 TON T33, 800 Modificato: 31 maggio 2009 da alfa84 Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 voglio utilizzare gli interrupt per una questione di precisione dovrei solo moltiplicare per 80 un interrupt di 100ms ma dove eseguire la moltiplicazione se nel box dove carico 100ms è un box mov B in smb34...! Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 comunque grazie per il consiglio alfa84!!ho trovato pero un messaggio di Livio che mi ha scritto tempo fa in merito ad un altra applicazione spero che lo legga per dei chiarimenti...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.come faccio il conteggio per 4 nella sub? Link al commento Condividi su altri siti More sharing options...
alfa84 Inserita: 31 maggio 2009 Segnala Share Inserita: 31 maggio 2009 Dunque non sono molto esperto di s7-200 comunque...il tuo ingresso abilita un interrupt a tempo di 100 ms nella relativa Sbr dove moltiplichi il valore di tempo per 80 per ottenere gli 8sper fare la moltiplicazione dovresti prima di tutto convertire il valore contenuto di Smb34 in un numero intero 16 bit dopo di che puoi effettuare la moltiplicazionedovrebbe essere cosi al limite chiarira qualcuno senz'altro più esperto di me ciao Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 il valore contenuto in smb34 è max 255 guarda caso di soli 8 bit (byte) perche siemens ha voluto cosi! quindi come convertire un byte in una word...penso non posso farlo...pero stavo pensando invece di usare il contatto con Sm0.0 cioe richiama la sbr ogni ciclo di scansione perche non usare un temporizzatore di 80ms pero come farlo ciclare ogni 80ms...!!devo usare questo conteggio per 80 ma non ho capito come fare...non mi resta che aspettare una risposta del mio caro Livio !! Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 31 maggio 2009 Segnala Share Inserita: 31 maggio 2009 Semplice, nella intterrupt incrementi una word, e quando arriva a 80 inverti l'uscita e azzeri la word! Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 ah giusto jumpman!! ora ci provo..va bene usare un confronto vwxx=80 -----> Q0.0 on? e mov 0 in vwxx poi quando arriva di nuovo a 80 come faccio a disattivare q0.0? devo usare set e reset? Link al commento Condividi su altri siti More sharing options...
alfa84 Inserita: 31 maggio 2009 Segnala Share Inserita: 31 maggio 2009 (modificato) Semplice, nella in tterrupt incrementi una word, e quando arriva a 80 inverti l'uscita e azzeri la word!uhm è la soluzione più adatta...ad ogni ciclo richiamando l'interrupt a tempo incrementa una word,alla fine fai un confronto e inverti lo stato dell'uscitàse il confronto è vero. :mellow: Modificato: 31 maggio 2009 da alfa84 Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 ragazzi ho appena provato ma la vw100 si incrementa di 1 e poi si ferma non incrementa piu!eppure ho eseguito l interrupt a tempo come da manuale!!cosa puo essere?? Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 scusate ho sbagliato io!!ho messo mov 1 in vw100 e basta...ho dimenticato di spostare vw100 aggiornato per ricaricare di nuovo 1 al prossimo interrput! Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 31 maggio 2009 Autore Segnala Share Inserita: 31 maggio 2009 ho provato ad usare anche un contatore ctu che si abilita ad ogni interrupt carico uno e arrivato ad 80 resetto il ctu ma non conta!! eppure un contatore normale dovrebbe contare 6 impulsi al secondo io ne do uno ogni 200ms quindi ne sono 5 in un secondo ma il ctu non li avverte chissa perche! Link al commento Condividi su altri siti More sharing options...
batta Inserita: 1 giugno 2009 Segnala Share Inserita: 1 giugno 2009 ho provato ad usare anche un contatore ctu che si abilita ad ogni interrupt carico uno e arrivato ad 80 resetto il ctu ma non conta!!Il contatore conta solo se vede un fronte di salita sull'ingresso.Se tu richiami il contatore nella tua routine di interrupt con ingresso sempre alto, il contatore conta solo il primo impulso e poi basta.Domanda: un S7-200 con un programma non troppo complesso gira con tempi di scansione di pochi millisecondi.Sei sicuro che la precisione offerta da un programma eseguito in una normale subroutine (non di interrupt) con normali timer non sia sufficiente al tuo scopo? Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 1 giugno 2009 Segnala Share Inserita: 1 giugno 2009 (modificato) un S7-200 con un programma non troppo complesso gira con tempi di scansione di pochi millisecondi.Sei sicuro che la precisione offerta da un programma eseguito in una normale subroutine (non di interrupt) con normali timer non sia sufficiente al tuo scopo?La precisione del timer potrebbe bastare però c'è un inconveniente: se lo fai con un timer che si auto-resetta perdi 1 ciclo ogni 8 secondi, vale a dire che se il ciclo è di 5ms dopo 200 commutazioni sei già fuori di 1 secondo.Roberto, non capisco perchè non ti funziona l'incremento, devi solo usare la funzione ADD_I !Il confronto lo farei su >= (anche se va benissimo anche =)Per invertire l'uscita devi fare un toggle, cerca la parola "toggle" nel forum, se ne è ampiamente discusso...C'è anche un altro modo:Segmento 1 LD SM0.5 EU +I 1, MW10 Segmento 2 LD M10.3 = A0.0In questo modo sfrutti il bit di clock SM0.5 (periodo 1s) per incrementare una word, ottenendo 16 bit di clock:M10.0 = 2sM10.1 = 4sM10.2 = 8sM10.3 = 16sM10... = ... Modificato: 1 giugno 2009 da JumpMan Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 1 giugno 2009 Autore Segnala Share Inserita: 1 giugno 2009 Jampman come mi hai consigliato tu mi funziona!! dopo l addizione non avevo memorizzato la vdxx per l addizione successiva con il valore di vdxx aggiornato..!io è propio questo che volevo dire se ce un piccolo ritardo nei conteggi in questo caso dei timer ogni ciclo di scansione quando viene resettato il timer lungo andare il piccolo ritardo diventerebbe significativo... come dice jampmanora non mi resta che cercare questo toggle e fare altre prove...grazie ragazzi Link al commento Condividi su altri siti More sharing options...
batta Inserita: 1 giugno 2009 Segnala Share Inserita: 1 giugno 2009 (modificato) La precisione del timer potrebbe bastare però c'è un inconveniente: se lo fai con un timer che si auto-resetta perdi 1 ciclo ogni 8 secondi, vale a dire che se il ciclo è di 5ms dopo 200 commutazioni sei già fuori di 1 secondo.Sì, certo, se usi un timer che si autoresetta perdi una scansione ad ogni commutazione.Come dici tu però, nel caso in esame, avremmo un errore di circa un secondo ogni 200 commutazioni, ovvero ogni 1600 secondi.Un errore quindi dello 0,0625%.Torno a fare la domanda: siamo sicuri che un simile errore rappresenta un problema?Se serve maggior precisione (io ne dubito), oppure se è per fare esercizio, ben vengano gli interrupt e tutto il resto.Se invece la precisione data da un semplice programma con timer è sufficiente, l'utilizzo degli interrupt diventa solo una inutile complicazione.Dimenticavo...l'errore causato dal ciclo perso con timer che si autoresetta, può essere facilmente coretto. Vedi SMW22 - Tempo ultimo ciclo. Modificato: 1 giugno 2009 da batta Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 1 giugno 2009 Autore Segnala Share Inserita: 1 giugno 2009 serve sopratutto per fare esercitazione Batta! Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 2 giugno 2009 Autore Segnala Share Inserita: 2 giugno 2009 Per invertire l'uscita devi fare un toggle, cerca la parola "toggle" nel forum, se ne è ampiamente discusso...non sono riuscito a trovare come fare un toggle!potete aiutarmi? Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 2 giugno 2009 Autore Segnala Share Inserita: 2 giugno 2009 praticamente io ho questa word che si incrementa ogni 200ms che richiamo l interrupt arrivata ad 80 con un confronto attivo la mia uscita..e da qui non so come azzerare la word! Link al commento Condividi su altri siti More sharing options...
alfa84 Inserita: 2 giugno 2009 Segnala Share Inserita: 2 giugno 2009 praticamente io ho questa word che si incrementa ogni 200ms che richiamo l interrupt arrivata ad 80 con un confronto attivo la mia uscita..e da qui non so come azzerare la word!quando si verifica il confronto puoi trasferire la costante "0" nella word di riferimento con l'operazione trasferisci ciao Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 3 giugno 2009 Segnala Share Inserita: 3 giugno 2009 Ecco la pappa pronta, fai copia-incolla e poi converti in KOPSoluzione 1 (INT_0 richiamata ogni 100ms, con contatore che quando arriva a 80 commuta l'uscita Q0.0)Segmento 1: Contatore cicli INT_0 LD SM0.0 +I 1, MW10 UENO UW>= MW10, 80 EU MOVW 0, MW10 UENO = M12.0 //impulso ogni 8 secondi Segmento 2: Toggle uscita ogni 8 secondi LD M12.0 O A0.0 LDN M12.0 ON A0.0 ULD = A0.0 // _____---------______--------______------- Soluzione 2 (la più rapida, l'ho già descritta ma l'hai ignorata) Segmento 1 LD SM0.5 EU +I 1, MW10 // Mw10 contiene 16 clock diversi da 1-2-4-8-16-... secondi) Segmento 2 // Trasferisce il flag di clock 8s. direttamente in uscita LD M10.3 = A0.0 Soluzione 3 (variante della 1, usa il toggle ma non usa INT_0, viene fatto il conteggio dei tempi ciclo plc in OB1) Segmento 1: Somma tempi ciclo e quando arriva a 8000ms genera un impulso LD SM0.0 +I SMW22, MW10 UENO UW>= MW10, 8000 EU -I 8000, MW10 UENO = M12.0 Segmento 2: Toggle uscita ogni 8 secondi LD M12.0 O A0.0 LDN M12.0 ON A0.0 ULD = A0.0 // _____---------______--------______------- Soluzione 4:1 temporizzatore e un toggle, non serve spiegazioneSoluzione 5:2 temporizzatori da 8 secondi Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 3 giugno 2009 Segnala Share Inserita: 3 giugno 2009 Ah, dimenticavo, come fai a dire che non trovi niente sul toggle????Ho scritto la parola toggle sulla funzione ddi ricerca e mi escono 2 pagine !!!Fai click quiNon è che sei un po' pigro ? Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 3 giugno 2009 Autore Segnala Share Inserita: 3 giugno 2009 non sono pigro forse un po ignorante in materia e non riesco a capire e raffrontare gli esempi con il mio caso...comunque grazie per le dritte!! Link al commento Condividi su altri siti More sharing options...
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