Vai al contenuto
PLC Forum


Estrapolare una curva... Veramente Dura!


Messaggi consigliati

Inserito:

Salve ragazzi mi trovo alle prese con un problemone "almeno per me"....

In pratica sono in possesso di una curva di taratura di una valvola.

Premessa: Devo regolare la portata di un canale azionando opportunamente una valvola. L'acqua viene presa da un bacino naturale chiuso da una paratoia azionata da una valvola motorizzata.

Le variabili in gioco sono : Livello del bacino, portata istantanea canale, posizione valvola, comando valvola.

La curva è composta da:

Asse X:Livello bacino

Asse Y:Portate canale

Asse Z:Posizionamento valvola

Se io riuscissi a rappresentare queste curve, sottoforma di formule matematiche, sul PLC, mi basterebbe semplicemente puntare al posizionamento opportuno una volta letto in ingresso il livello del bacino, e impostato come setpoint la portata predefinita da raggiungere.

Sono consapevole della difficoltà della cosa ma confido in voi visto la professionalità di alcuni utenti.


Inserita:

Non credo ci sia una risposta univoca: dipende da quanto è "complessa" la curva, da "quanta" ne devi utilizzare, ed eventualmente dal fatto che ci possa essere o meno una regola fisica/matematica che lega almeno due degli assi.

Ultimamente mi è capitato un problema simile, e dopo un pomeriggio passato a trovare la funzione che mi descriveva la curva, ho scoperto che nel mio caso specifico veniva utilizzata solo una piccola parte di questa curva, che per gli scopi prefissati poteva essere tranquillamente assimilata ad un banale gradino in 3 step.

ciao

Inserita: (modificato)
Devo regolare la portata di un canale azionando opportunamente una valvola. L'acqua viene presa da un bacino naturale chiuso da una paratoia azionata da una valvola motorizzata.

Dunque, cosa sarebbe, uno esercizio scolastico od una applicazione vera?

Perche col FB41, CONT_C , contunuos controller potresti regolare subito questo processo.

Livello del bacino : segnale di consenso ed allarme.

Posizione valvola : per il monitoraggio della posizione e fine corsa.

Portata istantanea canale : PV_PER , variabile di processo

Comando valvola : LMN, valore d'uscita, grandezza regolante.

Valore impostato: SP_INT, Set point

Semplice.

Modificato: da Savino
Inserita:

Caro Savino bisogna puntare al grafico per avvicinarsi immediatamente al punto più vicino di set point poi al massimo con il regolatore che consigli tu si può fare la regolazione fine per raggiungere il set point. Ma quando parti da tutto chiuso puntando alla curva giusta del grafico eviti tutte le pendolazioni iniziali di un regolatore... sai questo è un processo molto delicato che necessita di precisioni e rapidità assolute, sono in ballo dei MW che costano, quindi ogni secondo risulta "ORO".

Questo è il motivo perchè devo puntare al grafico cartesiano!!!!!

del_user_27683
Inserita:

Se non riesci a calcolare la funzione della curva puoi pensare ad una normale tabella a doppia entrata precompilata, in pratica crei un array bidimensionale su DB e ci scrivi a mano i valori risultanti dalla funzione, magari scopri che l'area d'impiego non è l'intera scala.

E' un lavoro da "scimmia" ma può essere piuttosto rapido, una volta precompilata il PLC in base alla portata e al livello incrocia la tabella (riga/colonna) e ottiene la posizione della valvola da cui partire con una PID che potrebbe addirittura trasformarsi in una PI vista la particolarità della regolazione.

Se non trovi di meglio pensaci...

Inserita:

Credo sarebbe importante anche conoscere il tempo di risposta della paratia motorizzata: si sa?

Inserita: (modificato)
Ma quando parti da tutto chiuso puntando alla curva giusta del grafico eviti tutte le pendolazioni iniziali di un regolatore.

Questo e' relativo e dipendera' anche della risposta del sistema. Perche' mai la grandezza regolante dovrebbe far pendolare?

Casomai, monitorando la risposta del sistema con impostazioni manuali sui valori del PID, potresti abilitare la grandezza regolante appartire di una soglia (finestra) determinata. Prima o dopo questa soglia, sganci l'uscita automatica ed applichi una grandezza regolante manuale massima.

che potrebbe addirittura trasformarsi in una PI vista la particolarità della regolazione

Se l'attuatore e analogico ( penso sia quello adatto ), allora utilizzi l'FB41, CONT_C , regolatore PID.

La curva è composta da:

Asse X:Livello bacino

Asse Y:Portate canale

Asse Z:Posizionamento valvola

Ed il SP ?

Cosa ti serve la curva del Livello bacino ?

Modificato: da Savino
  • 2 weeks later...
Inserita:

ricavare i vari set point dalla curva sarebbe il meno , e' mantenerli nella realta che diventa difficile .

se la curva e' una spezzata e le risposte del sistema da regolari sono abbastanza veloci o retroazionate direttamente dalla scheda servovalvola e' una cosa , se invece devi mantenere la curva tu con un regolare sw che sia PI o PD o PID allora e' dura se non impossibile .

La tua valvola deve avere una scheda che la pilota e normalmente nei pressi della valvola c'e' il feedback che va direttamente alla scheda.

Tu da plc passi i set point da raggiungere e non sara mai un curva ma una spezzata .

Inserita: (modificato)

Se hai l'SCL potresti provare a modificare questa funzione che avevo realizzato per linearizzare delle valvole in base alla pressione letta.

In pratica specifichi un array di punti a piacere (in questo esempio sono 100) dove metti il valore impostato ed il valore letto ; quando indichi un valore intermedio , ti viene ritornato un punto approssimato tra i due valori noti in cui è compreso (trovati con un algoritmo di ricerca lineare).

Ricordati che per funzionare i punti devono essere ordinati in maniera crescente.

Ciao :)

(*

IFACH Software - Calpe , Costa Blanca

-------------------------------------

Program Name : CURVA_PRESSIONE

Language ... : Step 7 SCL

Edit by .... : Claudio Rossi ... Rouge

(I Love when a software comes together)

Features ... : Linearizzazione valvola proporzionale di

pressione

Calibra = True ossia manda in uscita direttamente il dato impostato in ingresso

False manda in uscita il dato linearizzato

*)

FUNCTION_BLOCK FB60

TITLE = 'FB LINEARIZZAZIONE CURVA PRESSIONE'

VERSION : '1.0'

AUTHOR : IFACH

NAME : CURV_PRE

FAMILY : CURV_PRE

VAR_INPUT // *** Varibili in Ingresso ***

IN_BAR : REAL; // Pressione da impostare [bar]

CALIBRA : BOOL; // True = Procedura di calibrazione False = Trasmette i dati linearizzati

BAR_MAX : REAL; // Valore da usare in calibrazione pari al 100% dei Bar impostabili per avere 10V in uscita

END_VAR

VAR_IN_OUT // Varibili in Ingresso/Uscita

N_PUNTI : INT; // Numero di punti inseriti Effettivamente [punti]

END_VAR

VAR_OUTPUT // *** Variabili in Uscita ***

OUT_BAR : REAL; // Pressione da mandare alla valvola [bar]

MAX_VAL : REAL; // Ritorna la massima pressione impostabile con la tabella

END_VAR

VAR_TEMP // *** Varibili Temporanee ***

Alto : INT;

Basso : INT;

Meta : INT;

Diff_Set : REAL;

Diff_Read : REAL;

Perc : REAL;

END_VAR

VAR

aDATI : ARRAY [1..100] OF STRUCT

SET_BAR : REAL := 0.0; // Pressione impostata in calibrazione

READ_BAR : REAL := 0.0;

END_STRUCT;

END_VAR

LABEL

ESCI;

END_LABEL

// **************************

// **** Inizio Programma ****

// **************************

BEGIN

IF N_PUNTI < 1 THEN // Testo limite inferiore indice

N_PUNTI := 1;

END_IF;

IF N_PUNTI > 100 THEN // Testo limite superiore indice

N_PUNTI := 100;

END_IF;

IF CALIBRA THEN // In calibrazione mando in uscita direttamente il dato letto in ingresso

MAX_VAL := BAR_MAX; // In calibrazione ritorno come Max_Val il fondoscala impostato

IF IN_BAR > MAX_VAL THEN

OUT_BAR := MAX_VAL;

ELSE

OUT_BAR := IN_BAR;

END_IF;

RETURN;

ELSE

MAX_VAL := aDATI[N_PUNTI].READ_BAR;

END_IF;

IF IN_BAR <= aDATI[1].READ_BAR THEN // Testa Overflow Negativo

OUT_BAR := aDATI[1].SET_BAR;

RETURN;

END_IF;

IF IN_BAR >= aDATI[N_PUNTI].READ_BAR THEN // Testa Overflow verso il massimo

OUT_BAR := aDATI[N_PUNTI].SET_BAR;

RETURN;

END_IF;

// Effettua una ricerca binaria

Basso := 1;

Alto := N_PUNTI;

WHILE Basso <= Alto DO

Meta := (Basso + Alto) / 2;

IF Meta < 1 THEN

Meta := 1; // Usato per prevenire errori

END_IF;

IF(IN_BAR < aDATI[Meta].READ_BAR) THEN

Alto := Meta - 1;

ELSE

IF(IN_BAR > aDATI[Meta].READ_BAR) THEN

Basso := Meta + 1;

ELSE

EXIT;

END_IF;

END_IF;

END_WHILE ;

// Ritrovo in Meta l'indice al primo valore >= a quello trovato

// Ritorna l'approssimazione nella curva del valore trovato

Diff_Read := aDATI[Meta].READ_BAR - aDATI[Meta - 1].READ_BAR;

Perc := ((IN_BAR - aDATI[Meta - 1].READ_BAR) * 100.0) / Diff_Read;

Diff_Set := aDATI[Meta].SET_BAR - aDATI[Meta - 1].SET_BAR;

OUT_BAR := aDATI[Meta - 1].SET_BAR + ((Diff_Set * Perc) / 100.0);

END_FUNCTION_BLOCK

Modificato: da ifachsoftware
  • 2 weeks later...
Inserita:

Tentando di semplificarla(concedimi di chiederti la simulazione con PLCSIM):

liv1 =ingresso analogico livello bacino (0= bacino vuoto; 16384 =bacino pieno)

Perc_livb=percentesimi di bacino pieno = (liv*10000)/16384

liv2=ingresso analogico livello canale(0= canale vuoto a 16384 =canale pieno)

Perc_reqH2O=percentesimi di richiesta acqua da canale= 10000-((liv2*10000)/16384)

KLim= Costante limite apertura valvola a bacino pieno(0 a 10000 percentesimi) pultroppo non ho le dimensioni della serranda ed altre svariate misure.

Knc= Costante di soppressione apertura massima = 10000-klim

BacLim= massima apertura consentita dal bacino =10000-((Knc*Perc_livb)/10000)

PercOpen=percentuale proporzionale limitata apertura serranda in percentesimi = (Perc_reqH2O*BacLim)/10000

monta pressostati subacquei da alta profondità per evitare i picchi di curva

ciao

sch

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