Vai al contenuto
PLC Forum


Interrupt Ogni 8 Secondi


roberto8303

Messaggi consigliati

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


ciao

dovresti spiegare in che modo viene attivata questa uscita...se secondo un determinato evento che può essere ad esempio il fronte di salita di un ingresso

o l'uscita viene attivata con alternanza di tipo on/off

eccc

ciao

Link al commento
Condividi su altri siti

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

Perchè non utilizzare dei temperizzatori....

LD     I0.0                     
TON    T32,8000  
           
AN     T33
A      T32
=      Q0.0                 

LD     Q0.0
TON    T33, 800

Modificato: da alfa84
Link al commento
Condividi su altri siti

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

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

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 8s

per 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 moltiplicazione

dovrebbe essere cosi al limite chiarira qualcuno senz'altro più esperto di me

ciao :)

Link al commento
Condividi su altri siti

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

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

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: :mellow:

Modificato: da alfa84
Link al commento
Condividi su altri siti

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

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

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

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

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

In questo modo sfrutti il bit di clock SM0.5 (periodo 1s) per incrementare una word, ottenendo 16 bit di clock:

M10.0 = 2s

M10.1 = 4s

M10.2 = 8s

M10.3 = 16s

M10... = ...

Modificato: da JumpMan
Link al commento
Condividi su altri siti

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 jampman

ora non mi resta che cercare questo toggle e fare altre prove...

grazie ragazzi ;)

Link al commento
Condividi su altri siti

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: da batta
Link al commento
Condividi su altri siti

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

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

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

Ecco la pappa pronta, fai copia-incolla e poi converti in KOP

Soluzione 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 spiegazione

Soluzione 5:

2 temporizzatori da 8 secondi

Link al commento
Condividi su altri siti

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

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