Vai al contenuto
PLC Forum


S7-200 Modulare Un Valore Analogico In Uscita...


Messaggi consigliati

Inserito:

Buon giorno a tutti,

avrei un piccolo quesito da risolvere che sicuramente voi ne sapete piu' di me'.

Devo far modulare un valore in un uscita analogica di un'S7-200.

Io ho 0-32000 counts nel mio plc.

Se questo valore lo porto in scrittura verso AQW0 (che e' la mia uscita analogica) va tutto bene, modula perfettamente col variare del valore in scrittura.

Vorrei far modulare da 0 a 32000 con un tempo di circa 1ora,cioe' una rampa di salita lineare che duri 1 ora.Per poi ricrearne un'altra di discesa da 32000 a 0 in 1 ora.

Lo scopo e' quello di ricostruire un'alba e' un tramonto per un sistema di lampade (150 neon da 58watt) dimmerabbili con ingresso 0-10V che servono per illuminare un'impianto di acquecultura.

Anticipo i ringraziamenti per l'aiuto.


Inserita:

se non ho capito male puoi praticamente dividere il tuo valore dell'analogica ( 32000 ) per i secondi che hai in un'ora ( 3600 ) in questo modo sai il valore dell'incremento ( circa 9 ) (tutto questo è solo matematica che non riguarda il tuo progamma ) poi crei la logica con il contatto di cloc ad 1 secondo che con contatto di transazione positiva somma 9 ( frutto del tuo calcolo precedente ) ad una costante libera che ti serve per il calcolo. Infine utilizzi un mov per muovere la tua costante all'interno dell'uscita analogica

Inserita:

Dividi il tuo valore massimo analogico (32000) per il numero di passi che vuoi avere per fare la tua rampa. Se la rampa e' di un'ora e ogni passo di un secondo, ad ogni passo il valore analogico aumentera' di circa 9. Se vuoi avere un passo ogni 2 secondi avrai 1800 passi e un aumento di circa 18 del valore analogico.

Lo stesso per la rampa di discesa.

Inserita:

Giusto... :D

Io mi sono costruito il mio orologio suddiiso per giorno-ora-minuti-secondi.

Chiedo:

come faccio a costruire il ontatto di cloc ad ugni secondo?

Inserita:

Non devi usare l'orologio. Devi usare l'interrupt sul timer di sistema (se guardi gli esempi del manuale o l'help in linea lo trovi già fatto). Fissi un clock da 100ms, p.e., e ogni 10 interrupts chiami la routine che incrementa o decrementa la rampa.

Inserita: (modificato)

Quindi dovrei mettere un temporizatore tipo T200 da 100mS e un incremento x sulla variabile in uscita con riferimento del T200?

Modificato: da VINZENT
Inserita:

se e' cosi' ho un'altro problema:

come faccio a farli mantenere il valore del T200 (temporizat.) quando la cpu viene disalimentata o portata in stop?

Mettiamo che il T200 si trovi a 15000 ,quindi in fase di rampa,se tolgo alimentazione riparte da 0 metre per le uschite analogiche non ho questo problema perche' posso congelare lo stato.

Ma visto che la mia uscita analogica e' governata dal T200 mi frega perche' si resetta.

Inserita:

Non conosco la serie 200, ma sulla 300, puoi usare tranquillamente anche l'orologio di sistema (Merker di Clock sulla configurazione hardware e poi ti ricavi impulsi, blink, clock e tutto quello che ti serve), per quanto riguarda la mia esperienza è molto preciso.

Inoltre per un compito così semplice dove non credo che sia ndispensabile spaccare il secondo, puoi anche utilizzare un banale timer che si autoresetta quando ha finito di contare.

Inserita:

>come faccio a farli mantenere il valore del T200 (temporizat.) quando la cpu viene disalimentata o portata >in stop?

>Mettiamo che il T200 si trovi a 15000 ,quindi in fase di rampa,se tolgo alimentazione riparte da 0 metre per >le uschite analogiche non ho questo problema perche' posso congelare lo stato.

>Ma visto che la mia uscita analogica e' governata dal T200 mi frega perche' si resetta.

No... il T200 (se scegli questa soluzione) ti fa incrementare la varibile X, ed è il valore di questa varibile che ti governa l'anogica e che devi tenere memorizzato (se fosse la serie 300 basta metterlo in una DB... non conosco la serie 200).

Il fatto che si riazzeri il T200 ti fa errare al massimo di 100ms

Inserita:

Mettiamo che io appaggio in un merker i secondi del mio orologio che ho creato.

I secondi di questo merker dove devo appog***o per avere l'implsi a secondo?

Inserita:

Mi pare tu abbia ancora le idee piuttosto confuse.

Lasciamo perdere interrupt e cose del genere, che fornirebbero una maggior precisione (non richiesta per questo tipo di applicazione) pagando però il prezzo di una gestione un pò più complicata.

Allora, per il clock di un secondo puoi generarlo partendo da SM0.5, che è un merker di sistema che è ON per 0,5s e OFF per 0,5s. Rilevi il fronte di salita ed hai un merker alto per una scansione ogni secondo.

Vedi esempio (posto esempi in STL per comodità, ma basta fare copia/incolla e visualizzare in ladder, se ti piace di più)

Network 1
LD     SM0.5
EU
=      M0.0
Network 2
LD     M0.0
+I     +9, VW0
Incrementando di 9 anziché di 8,888889 arrivi da 0 a 32000 in 3556 secondi, 44 secondi in anticipo. Non credo sia un problema. Oppure potresti generare un clock ogni 3,6 secondi con un timer nel seguente modo:
Network 1
LDN    T5
TON    T5, +36
Network 2
LD     T5
+I     +32, VW0

Perché 3,6 secondi? perché così divido un'ora in 1000 parti ed incremento di 32 (intero).

Lascio a te fermare l'incremento al momento giusto e verificare che il valore di VW0 rimanga compreso tra 0 e 32000.

Poi prendi VW0 e trasferisci all'uscita analogica. VW0 mantiene il suo valore anche se spegni il plc.

Inserita: (modificato)
Lasciamo perdere interrupt e cose del genere, che fornirebbero una maggior precisione (non richiesta per questo tipo di applicazione) pagando però il prezzo di una gestione un pò più complicata.

batta perchè più complicata? Una volta programmato il timer di sistema legandolo ad un interrupt (4 istruzioni copiabili pari pari dall'help in linea) nella routine di interrutp hai:

' segmento 1 verifica scadenza differenziale di tempo per rampa: in questo caso base tempi 100ms e     differenziale = 1"


+I     1, #decimi
AENO
AW>=   #decimi, 10
MOVW   0, #decimi
AENO
S      M0.1, 1

'secmento 2 verifica se attiva rampa in salita o in discesa: incrementa-decremeta rampa attiva.

LD     M0.1
LPS
A      #salita
+I     #delta, #rampa
AENO
LPS
AW>=   #rampa, 32000
R      #salita, 1
LPP
R      M0.1, 1
LPP
A      #discesa
-I     #delta, #rampa
AENO
LPS
AW<=   #rampa, 0
R      #discesa, 1
LPP
R      M0.1, 1

'Fine routine manca solo l'istruzione di uscita sull'analogica

25 istruzioni totali con tutti i casi esaminati. Non mi sembra complicato anche per un principiante. Se poi lo scrivi in KOP è banale.

E' una funzione ampliamente generalizzabile, come deovrebbe essere ogni funzione ben scritta, con i parametri modificabili anche "running time",

Modificato: da Livio Orsini
Inserita:
batta perchè più complicata? Una volta programmato il timer di sistema legandolo ad un interrupt

Una volta programmato il timer di sistema...

Proprio questo volevo evitare.

Per il resto le istruzioni sono uguali, non cambia niente. Pensavo solo di eliminare la parte di configurazione dell'interrupt, in modo da concentrarsi sulla gestione degli incrementi/decrementi del valore.

Una volta digerita questa parte, in un attimo si sposta in una routine di interrupt.

Inserita:

gentilissimi e disponibili come sempre.

Ho provato quello che mi da detto batta perche' per me' mi sembra piu' semplice.

Tutto ok! era quello che cercavo.

Per curiosita' vorrei capire meglio quello che diceva livio cioe' di creare un'interrupt.

Non me ne volete ma io non ho mai usato un'interrupt.

A cosa serve nello specifico?

Come potrei usarlo?

Aiutatemi a capire quali sono i vantaggi nell'usare un'interrupt.

Grazie.

Inserita:

I vantaggi di usare l'interrupt stanno nel fatto che hai la certezza di eseguire delle determinate istruzioni a scadenze temporali fisse e precise, slegate dal tempo ciclo del PLC. Quando scatta l'interrupt, il ciclo di scansione del PLC viene interrotto e viene eseguito quanto definito nel blocco relativo all'interrupt; ovviamente se ne abusi sarà il ciclo PLC a risentirne...

Spesso si usa per i controlli PID, o in casi particolari in cui determinate macchine o impianti necessitano di eseguire certi compiti in maniera precisa (temporalmente parlando). IMHO nel tuo caso è inutile ricorrere agli interrupt, anche se può essere una buona occasione per capire come funzionano e imparare ad usarli.

comunque è tutto scritto nel manuale... basta un po' di volontà per andarselo a leggere...

Inserita:

Grazie per la spiegazione,avvolte leggendo i manuali sono piu' complessi del solito.

Quindi io potrei scrive un'istruzione richiamando un'interrupt per fare un'altra istruzione senza che l'interrupt stesso compia nell'OB?

Ho capito bene?

Quindi quello che diceva livi era di scrivere la rampa nell'interrupt e richiamarlo in qualsiasi momenta da qualsiasi FC?

:unsure:

Inserita:

Vinzent, devi leggerti il manuale di istruzione almeno per il capitolo relativo agli interrupt, poi poni domande specifiche. Altrimenti si deve riscrivere il manuale dello S7-200

Inserita:

giusto livio :D

ancora grazie per la disponibilita' che mi avete dato ma sopratutto per la pazienza che avete avuto a rispondere alle mie "domande " poco esperte.

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