Vai al contenuto
PLC Forum


Gestione Variabile Temporale.


Messaggi consigliati

Inserito:

Ciao a tutti,

voglio chiedere, gentilmente, un'indicazione: ho scritto un programma di gestione per un PLC VIPA (che comunque è "come" un S7-300) in cui ci sono dei timers a cui ho legato delle costanti di tempo.

Ora avrei bisogno che tali costanti non siano legate al timer cioè non siano fisse per ogni timer ma che esse risiedano in memoria (magari impostate secondo il valore di certi ingressi) e che vengano lette dai timer dalla memoria e non, ripeto, come un valore fisso associato al singolo timer.

Ciò che non conosco è come, in AWL, posso fare queste operazioni:

- Memorizzare la costante di tempo, ad esempio S5T#1S in una locazione di memoria

- Leggere la locazione di memoria dove si trova la costante ed assegnarla ad un timer.

Qualcuno mi può indicare il codice da adoperare?

Grazie mille!


Inserita:

Ti basta usare l'. dello step 7 per vedere che un S5T#10s o similari è una variabile formata da 16bit (word), da qua a creare una struttura con n° dati ed in base a scelte uno di questi dati viene passato al tuo timer.

Solo una considerazione, stai attento che se tu cambi il tempo di un timer prima che quest'ultimo abbia finito di fare il suo lavoro, il tempo di conteggio non cambia, rimane quello di quando hai avviato il timer.

AREA con i tuoi dati 

L #Valore di tuo interesse
T #TempoConteggio

L #TempoConteggio
SD #T1

Inserita:

Ciao Gianluca, anzitutto grazie per la risposta.

Con "L" carico un valore "costante", numerico, nel timer e va bene.

Nel timer vorrei, però, caricare il valore conservato in una locazione, di 16 bit, di memoria piuttosto che un valore costante: cioè mi servirebbe fare una cosa del genere, espressa in un linguaggio a piu alto livello:

if (stato_di_un_certo_ingresso=1) then

M1=S5T#1S

else

M1=S5T#2S

end if

poi, per il contatore fare qualcosa tipo:

SET Valore_di_conteggio=M1

In sostanza mi manca il come fare una cosa tipo:

1. Carica_valore_S5T#1S_in_una_locazione_di_memoria

2. Assegna_al_timer_il_valore_della_locazione_di_memoria

Grazie ancora!

Inserita:

Appunto è come te l'ho indicato a grandi linee

AREA con i tuoi dati

A #Input
Jcn 2time
L #Valore di tuo interesse
T #TempoConteggio
ju Timer
2time:
L #2Valore di tuo interesse
T #TempoConteggio
:Timer
L #TempoConteggio
SD #T1

Inserita:

Ciao Gianluca, sei stato chiarissimo e ti ringrazio: implementerò la gestione delle costanti di tempo come mi hai indicato.

Buon fine settimana!

Luca.

Inserita: (modificato)

Una soluzione più "elegante" potrebbe essere questa

L #Valore di tuo interesse
T #TempoConteggio

A #Input
Jcn Timer

L #2Valore di tuo interesse
T #TempoConteggio

A #2-Input
Jcn Timer

L #3Valore di tuo interesse
T #TempoConteggio

:Timer
L #TempoConteggio
SD #T1

Così eviti un pò di salti. Buon lavoro e buon fine settimana anche a te

Modificato: da TravelMen
Inserita:

Ho impostato il flusso delle istruzioni come mi hai indicato e va tutto bene.

Vorrei profittare della tua gentilezza, e competenza, per chiederti un'altra informazione: avrei bisogno di leggere il valore di un timer per poterlo comparare con una costante: cioè utilizzando ad esempio il timer T0, dove trovo la "variabile di conteggio" che mi indichi ad ogni ciclo di scansione il valore raggiunto?

Mi occorre fare una cosa tipo:

if (T0.timeInMillis()< K1) then

fai_qualcosa

end if

Grazie ancora...

Luca.

Inserita:

Be molto semplice al posto del classico temporizzatore SD (TON) devi usare il temporizzatore S_ODT (sempre TON) che ti fornisce il tempo trascorso in formato BCD.

Tramite . in linea del simatic Step7 trovi la descrizione del temporizzatore in questione.

Inserita:

Grazie Gianluca, guarderò la documentazione del temporizzatore che mi hai indicato.

Il valore BCD che emette tale timer devo provvedere a convertirlo per ottenere un INT da mettere in input ad un comparatore o è già "pronto" per tale scopo?

In WinPLC, te lo scrivo nel caso in cui tu non abbia avuto modo di lavorarci, c'è una comoda funzionalità la quale permette di leggere il valore di un timer facendo riferimento al nome stesso del temporizzatore; cioè è possibile scrivere un codice AWL del genere:

A (
       L    T       101
       L    30
       <I
)

che consente di valutare un ingresso "composto" dal comparatore che ha in input una costante ed il valore del timer.

Con S7 però pare che questo codice non funzioni.

Grazie ancora e buon lavoro a te!

Luca.

Inserita:

Attraverso l'. dello step7 trovi il formato S5TIME che come dice . è formato da 16 bit o due byte per esempio byte-n e byte-n+1, dove nel byte-n+1 trovi i primi due numeri del tuo tempo in formato bcd, ovvero, 4bit per ogni valore (0-9) e nei primi 4bit del byte-n trovi la terza cifra, per tanto il valore massimo che ci puoi scrivere è 999.

Dopo di che nei 4bit successivi del byte-n, trovi la costante di tempo, che sempre tramite . vedi come vengono interpretati.

per tanto, nello stesso S5TIME scrivi 333 che possono essere con base 0.01s per tanto il tuo time vale 3.33s oppure base 1s allora vale 333s, e come vedi il valore 333 rimane sempre lo stesso, per tanto con un operazione di AND a parola (con una parola formatata in modo opportuno) ottieni come risultato il tuo 333 o 30 che ti serve.

Per tanto dai un occhio al . dello step7

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