Interpolazione lineare di valori INT discreti
La funzione restituisce il valore y alla posizione x eseguendo un’interpolazione lineare sulla base dei punti di riferimento circostanti Pw(xw, yw) e Pw+1(xw+1, yw+1). In questo esempio, w è il punto di riferimento più vicino, x il cui valore è più piccolo rispetto al valore di ingresso x, vale a dire che la funzione connette i singoli punti di riferimento in serie e restituisce il valore di uscita y sulla base del valore di ingresso x.
Ingresso
Attivazione della funzione (quando EN = TRUE, la funzione viene eseguita ad ogni ciclo del PLC)
Valore di ingresso x
Applicare il primo elemento della DUT definita dall’utente, ovvero il numero di valori xy, a questo ingresso. Vedere di seguito la descrizione della struttura della DUT.
Uscita
Valore di uscita y
ENO viene impostato su TRUE non appena la funzione viene eseguita. Utile in caso di concatenamento di Function Block con funzioni EN.
Anziché utilizzare questa istruzione F, si consiglia di utilizzare l'istruzione FP7 corrispondente: FP_SCALE Eseguire l’interpolazione lineare di valori discreti
La funzione può essere utilizzata per:
linearizzazione di valori misurati, p.es. con sensori non lineari
restituzione della temperatura di flusso di un radiatore y in relazione alla temperatura esterna x
ecc.
se il numero di punti di riferimento non è compreso tra 2 e 100, o i valori x non sono in ordine crescente (x1 < x2 < x3 < ...).
se il numero di punti di riferimento non è compreso tra 2 e 100, o i valori x non sono in ordine crescente (x1 < x2 < x3 < ...).
Se il valore di ingresso x è inferiore rispetto alla coordinata x del primo punto di riferimento (P1: x < x1), l’uscita y è impostata sulla coordinata y del primo punto di riferimento (uscita y = y1, linea tratteggiata orizzontale nell’angolo superiore sinistro del grafico).
Se il valore di ingresso x è superiore rispetto alla coordinata x dell'ultimo punto di riferimento (P8: x > x8), l’uscita y viene impostata sulla coordinata y dell'ultimo punto di riferimento (uscita y= y8, linea tratteggiata orizzontale nell'angolo superiore destro del grafico).
DUT per coppie di valore xy (punti di riferimento P1, P2, ...):
I punti di riferimento (P1, P2, ...) vengono copiati sulla funzione tramite variabile di tipo DUT che contiene il numero di punti di riferimento e le xy coppie di valori (numero; x1, x2, ...; y1, y2; ...).
Elemento: valori x (ARRAY[1..z] OF INT o ARRAY[0..z-1] of INT)
Elemento: valori y (ARRAY[1..z] OF INT o ARRAY[0..z-1] of INT)
Informazioni importanti:
Valori x
I valori x devono essere immessi in ordine crescente (x1 < x2 < x3 < ...). Se i valori x sono identici (p.es. x2 = x3 = x4) i punti di riferimento P2 (x2, y2) e P3 (x3, y3) vengono ignorati.
Per evitare un overflow nel calcolo, i punti di riferimento circostanti devono soddisfare le seguenti condizioni:
|ya - yb| < 32767 |x - xb| < 32767 |(ya - yb)*(x - xb)| < 32767 |xa - xb| < 32767 |
Questa funzione può elaborare solo numeri interi. I numeri che seguono il punto decimale vengono eliminati al momento di calcolare il valore y. Per esempio, se alla posizione x, y = 511,13, la funzione restituisce il valore 511.
Nel pool DUT vengono dichiarati il numero di punti di riferimento e le coppie di valori xy.
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU. La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
VAR
start: BOOL:=FALSE;
(*avtivates the function*)
input_value: INT:=0;
(*input_value x*)
measured_value: Interpolation_8 (X_values := [-5,5,15,20,30,42,45,50],Y_values := [5,-5,10,2,2(5),0,2]);
(*number of reference
points*)
output_value: INT:=0;
(*output_value y*)
@'': @'';
END_VAR
Qui è stata dichiarata la variabile di ingresso measured_value corrispondente al tipo di DUT precedentemente definita. L'allocazione dei valori x e dei valori y è stata eseguita nell'intestazione del POU. In ogni caso è possibile modificare i valori x e i valori y nel corpo allocando un valore alla variabile, p.es. Measuredvalues.X_Values[1] per x.
Quando la variabile start è impostata su TRUE, la funzione viene eseguita. Per il valore di ingresso alla posizione x, il valore di uscita y viene calcolato tramite interpolazione lineare dei punti di riferimento circostanti memorizzati nella variabile measured_value.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,F282_SCAL!,Instance,15,0,22,5,,?DEN?Dx?Dxy_data?AENO?Cy);
B(B_VARIN,,input_value,13,2,15,4,);
B(B_VARIN,,measured_value.referencepoints,13,3,15,5,);
B(B_VAROUT,,output_value,22,2,24,4,);
B(B_CONTACT,,start,6,1,8,3,);
L(8,2,15,2);
L(1,2,6,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F282_SCAL(input_value, measured_value.referencepoints, output_value);
END_IF;