Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Impulsi Di Clock Per Rampa Su Uscita Analogica.


Messaggi consigliati

Inserito:

Buongiorno a tutti,

vorrei creare una rampa su un'uscita analogica 0-10V su una CPU 1212C (S7-1200)

Userò questa rampa per fare un effetto dissolvenza su una lampada.

Sono riuscito a creare una rampa con i clock di sistema (byte M0), ma vorrei che la dissolvenza fosse più veloce......

Non esiste un blocco rampa già costruito in S7-1200 con tempo rampa impostabile ?

Come faccio a crearmi una rampa con un clock prefissato ma più veloce dei merker di clock di sistema ?

Grazie mille.

Saluti.


Inserita:

OB a tempo (Cyclic interrupt).

Il nuovo OB a tempo ha di defualt un tempo di 100 ms, ma sei libero di cambiarlo.

Io non scenderei comunque a meno di 10 ms.

Una funzione "Rampa" già pronta non esiste, ma crearne una, passando in ingresso lo step di incremento (oppure il tempo totale e calcolare all'interno della funzione lo step) è questione di un minuto.

Inserita:

La parte dell' OB è chiara e ti ringrazio per la risposta.

Nella mia applicazione però dovrò avere una rampa di dissolvenza il cui tempo totale (partendo da luce = 0 per arrivare alla luce MAX.) potrà variare in base ad una variabile impostabile da HMI.

Per questo credo sia meglio andare sulla Seconda soluzione......

Potresti gentilmente farmi un esempio relativo alla seconda soluzione ?

Grazie mille.

Livio Orsini
Inserita:

Se fissi l'incremento minimo della rampa come un count del D/A è abbastanza semplice.

Consderamo 4096 passi, 12 bit + segno, con clock di 10 ms ha una rampa di durata pari a 40" se la durata minima della rampa deve essere inferiore devi impostare il quanto minimo maggiore.

Con questi dati ad ogni impostazione del valore di rampa decidi se ridurre iol valore del quanto o aumentare il tempo di clock.

Facciamo un esempio pratico. Fissi un tempo minimo di rampa in 4", quindi il quanto mino è pari a 10 counts.

ogni volta che imposti il tempo di rampa verifichi se è < = 41". Se la condizione è vera dividi il tempo imostato per il tempo minimo, arrotondi ed ottieni il numero di counts per passo.

Se è maggiore la complicazione dell'algoritmo dipende da quanto vuoi che sia preciso il tuo tempo di rampa. Nel modo più semplice basta dividere il tempo di rampa, in millisecondi, per 4096 ed arrotondare all'inreo più vicino. in questo modo hai il moltiplicatore di clock necessario: 1 clock, 2 clock, etc.

Poi ci sono sistemi un po' più complessi come stabilre un moltiplicatore variabile come, ad esempio, 3 passi con un clock più uno con 2 clock.

Inserita:

Grazie per la risposta ........

sinceramente non è che abbia capito molto ..... ma è un problema mio ..... per il momento non credo di essere in grado di comprendere.

Magari con un esempio in KOP .......

Grazie comunque della risposta.

Ciao.

Livio Orsini
Inserita:

In Kop diventa difficile, sarebbe da fare in AWL, solo che son almeno 10 anni che ho abbandonato i PLC (du palle... :smile: )

Inserita: (modificato)

Ecco un esempio di come si potrebbe fare in SCL

#Step := 100.0 * #ClockTime / #RampTime;

// Aumenta
IF #Up THEN
    #ActVal := #ActVal + #Step;
// Diminuisce    
ELSIF #Dw THEN
    #ActVal := #ActVal - #Step;
END_IF;

// Controllo limiti rampa
IF #ActVal > 100.0 THEN
    #ActVal := 0.0;
ELSIF #ActVal < 0.0 THEN
    #ActVal := 0.0;
END_IF;

// Calcolo riferimento per uscita analogica 0..27648
#Ref := REAL_TO_INT(#ActVal * 276.48);

Le variabili da dichiarare sono:

INPUT

Up - Bool - Richiesta incremento

Dw - Bool - Richiesta decremento

ClockTime - Real - Tempo ciclo richiamo funzione in secondi (se il richiamo è in OB di interrupt ciclico con tempo di 10 ms, impostare 0.01)

RampTime Real - Tempo totale rampa in secondi (deve assolutamente essere > 0.0)

OUTPUT

Ref - Int - Valore per uscita analogica

INOUT

ActVal - Real - Valore attuale in % della rampa

Modificato: da batta
Inserita:

Grazie per le vostre risposte,

per il momento ho fatto, in maniera forse poco elegante ma funziona, attraverso un blocco IN RANGE (da 0 a 27000), seguito da un blocco ADD che somma 1 al valore di rampa stesso e quindi lo incrementa fino a 27000 (10Vdc).

Per il clock, ho usato 2 timer TON uno interbloccato all'altro in maniera che si autoresettino a vicenda e quindi si comportino come un flip flop SR.

Il parallelo tra il fronte di salita ed il fronte di discesa del TON1, mi darà il mio clock.

Ho inserito questa FC in un OB Cyclic Interrupt ad 1ms per avere maggiore precisione.

Devo dire che funziona per l'applicazione che devo fare ....... però se avete qualche suggerimento o "tirata di orecchie", sono ben accetti ....... si impara anche così :smile:

Grazie ancora.

Inserita:

1 ms? Mi sembra un pó tirato... Forse volevi dire 10?

Livio Orsini
Inserita:

Se lo hai inserito in OB ad interrupt (1 ms sembran pochi anche a me) non hai necessità deigli altri 2 timer, è già lui il clock. Se non hai raggiunto il valore prefissato ad ogni interrupts incrementi/decrementi di uno o più counts; se la rampa deve essere più lunga fai un secondo contatore, ad ogni interrupts decrementi, arrivato a 0 fai l'incremento-decremento dl riferimento e ricarichi il contatore. Con questo modo puoi fare anche rampe di giorni. :smile:

Inserita:

però se avete qualche suggerimento o "tirata di orecchie", sono ben accetti

Mi pareva di averti dato qualcosa di più di un suggerimento: la soluzione con 12 righe di codice.

Se non vuoi usare il linguaggio strutturato, le stesse cose le puoi fare anche in KOP.

Per le tirate di orecchi...

- già nel post #2 ti consigliavo di non scendere sotto ai 10 ms (al limite anche 5, ma per la tua applicazione non avrebbe alcun senso) per il richiamo dell'OB ciclico, e tu subito vai ad impostare 1 ms.

- chiedevi di poter impostare il tempo della rampa, e poi fai un incremento a tempo fisso fino ad un numero fisso. Numero che, tra l'altro, è anche sbagliato, perché se vuoi i 10 V devi arrivare a 27648, e non a 27000.

- utilizzi un OB a tempo e poi vai a complicarti inutilmente la vita con i timer. Questo proprio non ha alcun senso.

Inserita:

Ciao Batta .....

più che delle tirate di orecchie direi che mi hai fatto mettere addirittura in ginocchio sui ceci :roflmao:

Ho fatto in quel modo perchè sono agli inizi e dovrò sbatterci diverse volte il viso ......

In ogni caso farò tesoro dei vostri consigli e proverò a metterli in pratica per avere soluzioni sicuramente più ottimizzate.

Vi farò sapere........

Per il momento grazie.

Ciao.

Inserita: (modificato)

Non volevo essere cattivo. Certo che, se io fossi un insegnante (cosa tra l'altro che mi sarebbe sempre piaciuta), non sarei di quelli teneri ;)

Apprezzo che tu cerchi di arrivare da solo ad una soluzione, ma anche studiare le soluzioni proposte serve per imparare.

Magari, leggendo il codice del mio post, avresti potuto accorgerti che c'è un banale errore (nel controllo del superamento del valore massimo), a darmi tu una tiratina d'orecchi.

Inoltre ho usato il linguaggio strutturato perché, secondo ma, vale la pena scegliere per ogni problema il linguaggio più comodo e, in questo caso, sicuramente non è il KOP.

Se il tuo obiettivo è prendere padronanza nell'uso dei timer, si potrebbe studiare un esercizio diverso.

Modificato: da batta
Inserita:

la funzione rampa non esiste , pero' se usi il pid con opportune parametrizzazioni puoi ottenere una rampa .

Io comunque la rampa l'ho fatta da me e usa il tempo di scansione prelevato nel OB_main

Inserita:

e usa il tempo di scansione prelevato nel OB_main

Nel 1200 non c'è il tempo di ciclo nelle variabili dell'OB.

Inserita:

puoi farla in modo asincrono usando un timer oppure sotto interrupt in modo sincrono

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