Eseguire l’interpolazione lineare di valori discreti
Questa istruzione FP restituisce il valore y alla posizione x eseguendo un’interpolazione lineare basata sui 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 s1_x, vale a dire che la funzione connette i singoli punti di riferimento in serie e restituisce il valore di uscita d_y sulla base del valore di ingresso s1_x.
Ingresso
Valore di ingresso
Su tipi di PLC a 16 bit: (INT, DINT, REAL)
Su tipi di PLC a 32 bit: (INT, DINT, UINT, UDINT, REAL, LREAL)
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
Risultato
Su tipi di PLC a 16 bit: (INT, DINT, REAL)
Su tipi di PLC a 32 bit: (INT, DINT, UINT, UDINT, REAL, LREAL)
Esempi di applicazione:
Linearizzazione di valori misurati, p.es. con sensori non lineari
Restituzione dell’andamento temperatura di un radiatore y in relazione alla temperatura esterna x
se l'area specificata utilizzando il registro indice eccede il limite.
se il numero dei punti di riferimento è fuori dall’intervallo di 2–256.
se s2_xyData è fuori dall’intervallo.
se i valori x dei punti di riferimento non sono in ordine crescente.
se l'area specificata utilizzando il registro indice eccede il limite.
se il numero dei punti di riferimento è fuori dall’intervallo di 2–256.
se s2_xyData è fuori dall’intervallo.
se i valori x dei punti di riferimento non sono in ordine crescente.
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è maggiore rispetto alla coordinata x dell’ultimo punto di riferimento (P8: x > x8), l’uscita y è 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: Variabile del tipo di dato ARRAY[1..z] OF INT (su tipi di PLC a 16 bit: INT, DINT, REAL; su tipi di PLC a 32 bit: (INT, DINT, UINT, UDINT, REAL)) o ARRAY[0..z-1] of INT (su tipi di PLC a 16 bit: INT, DINT, REAL; su tipi di PLC a 32 bit: (INT, DINT, UINT, UDINT, REAL)) che contiene i x valori. Qui z rappresenta il marcatore di posizione per il numero di punti di riferimento (vedere voce 1).
Elemento: Variabile del tipo di dato ARRAY[1..z] OF INT (su tipi di PLC a 16 bit: INT, DINT, REAL; su tipi di PLC a 32 bit: (INT, DINT, UINT, UDINT, REAL)) o ARRAY[0..z-1] of INT (su tipi di PLC a 16 bit: INT, DINT, REAL; su tipi di PLC a 32 bit: (INT, DINT, UINT, UDINT, REAL)) che contiene i y valori. Qui z rappresenta il marcatore di posizione per il numero di punti di riferimento (vedere voce 1).
FP_SCALE supporta i seguenti tipi di dati:
Su tipi di PLC a 16 bit (FP-Sigma, FP-X): INT, DINT, REAL
Su tipi di PLC a 32 bit (FP7): INT, DINT, REAL, UINT, UDINT
Istruzioni F corrispondenti: F282_SCAL, F283_DSCAL, F354_FSCAL
Con un tipo unità dati (DUT) è possibile definire un tipo unità dati composto da altri tipi di dati. Una DUT è definita prima di tutto nel gruppo DUT e poi elaborata come i tipi di dati standard (BOOL, INT, ecc.) nella lista delle variabili globali o nell'intestazione del POU.
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
bStart: BOOL:=FALSE;
iInput: INT:=50;
xy_data: xy_data_dut;
iScaledOutput: INT:=0;
@'': @'';
END_VAR
Quando la variabile bStart è impostata su TRUE, la funzione viene eseguita.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bStart,4,2,6,4,);
B(B_F,FP_SCALE!,,17,1,25,6,,?DEN?Ds1_x?Ds2_xyData?AENO?Cd_y);
B(B_VARIN,,iInput,15,3,17,5,);
B(B_VAROUT,,iScaledOutput,25,3,27,5,);
B(B_VARIN,,xy_data.iNumberOfValues,15,4,17,6,);
L(1,0,1,6);
L(1,3,4,3);
L(6,3,17,3);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (bStart) then
FP_SCALE(s1_x := iInput,
s2_xyData := xy_data.iNumberOfValues,
d_y => iScaledOutput);
END_IF;