Ciao Albyjack,
Di primo acchito ho pensato , "beh! non sara' cosi' difficile", esistera' un blocco apposito, ne esiste uno per ogni cosa.
Poi ho visto che il blocco che piu' si adattava alle tue esigenze era il SFB41 , controllo continuo di grandezze.
Ma per adattarlo allo scopo mi sebrava troppo complicato.
Cosi' in quatro e quattro otto, dalla mia mente malata ho creato questo:
Codice: Seleziona tutto
U E 0.0 //se e' presente il segnale di start ....
SPB reg //salto alla regolazione
UN E 0.0 //se non e' presente il segnale di start ....
L 0
T PAW 100 //azzero l'uscita analogica PAW100
T #Step //azzero la variabile Step (real)
T #Reg //azzero la variabile Reg (int)
BE
// Calcolo del divisore per la regolazione
reg: SET //metto RLC ad 1
L DB1.DBW 0 //carico il valore di divisione da 1 a 100
ITD //converto in doppia parola
DTR //converto in reale ,il risultato viene scritto in ACCU1
T #Temp1 //lo scrivo nella variabile Temp1(TEMP,REAL)
L 2.764800e+004 //prendo il valore reale del valore massimo della word
L #Temp1
/R //lo divido con il divisore
T #Step //lo scrivo nella variabile Step (TEMP,REAL), divisore
// regolazione , verifica del raggiungimento valore massimo per fine regolazione
L 27648 //Carico il valore massimo della word
L #Reg //Carico il valore attuale di regolazione
>=I //Se la variabile e' maggiore o uguale a 27648 esco dal blocco
BE //fine della regolazione
// regolazione , esecuzione della rampa
L #Step //prendo il valore del divisore
L #Reg //prendo il valore della variabile Reg
+R //eseguo la somma
RND //converto il reale in intero doppia parola
T #Reg //scrivo il risultato nella variabile #Reg (TEMP,INT) per il controllo raggiungimento massimo
T PAW 100 //scrivo il risultato nell'uscita analogica.
BE //fine del blocco
Il mio blocco si suddivide in quattro parti , la prima , se non e' presente un segnale di start, azzera le variabli pricipali ed esce.
Se invece il segnale e' presente, nella seconda parte , eseguo un calcolo , prendo il valore massimo di una word 27648, prendo un valore che tu inserisci da pannello un numero da 1 a 100 , e la divido , ottenendo cosi' uno step di regolazione.
Diciamo che tu avevi inserito 50 , il risultato sara' 553.
Nella parte quarta, sommo piu' volte 553 , e scrivo il valore nell'analaogica.
Nella terza parte, al raggiungimento di 27648, esco dal blocco e non proseguo con la somma.
Lo scopo e' questo, se questo segmento lo scrivi in OB35 (interrupt ciclico) con una ciclicita' di 100ms , programmabile dal set-up della CPU, ottieni che il blocco ed il segmento verranno elaborati ogni 100ms (1 decimo di S), quindi ogni decimo di secondo sommi 553, partendo da zero.
Ottieni che la tua rampa, avra' gradini di 553 , e dopo 50 volte raggiungera' il suo valore massimo, cioe' dopo 5 secondi.
Quindi il valore da variare nella tua regolazione sara' il numero di divisioni (50), maggiore e' maggiore sara' il tempo.
Prova cosi' , non ti assicuro che il codice sia OK al 100% , lo ho scritto al volo in aereoporto aspettando il mio volo.
Magari Venerdi avro modo di provarlo in ufficio su di una CPU.
Ciao
Ivan