Questa funzione esegue la linearizzazione di un valore mediante una serie di rette spezzate. Occorre fornire alla funzione in VinReference l’indirizzo dell’array di definizione valore da linearizzare, in VOutReference l’indirizzo dell’array definizione del corrispondente valore in uscita linearizzato ed in ReferenceNr il numero di valori presenti nei due arrays, i due arrays devono avere lo stesso numero di elementi. E’ importante definire i dati negli array in modo crescente, quindi a partire dal valore più piccolo.
La funzione ritorna un valore (REAL) che rapprresenta il valore di VIn linearizzato, viene eseguita la ricerca nell’array VinReference del valore immediatamente superiore a Vin interpolando linearmente tra il valore trovato e quello precedente. Il valore in uscita è calcolato in base ai due valori presenti nelle stesse posizioni dell’array VOutReference.
Descrizione
VIn (REAL) Valore da linearizzare.
RInReference (@REAL) Puntatore all’array definizione valore in ingresso da linearizzare.
VOutReference (@REAL) Puntatore all’array definizione valore in uscita linearizzato.
ReferenceNr (UDINT) Numero di valori negli arrays di definizione linearizzazione.
La funzione ritorna un REAL che rappresenta il valore di VIn linearizzato.
Esempi
Come utilizzare gli esempi.
Un esempio pratico è il calcolo del volume di liquido contenuto in un serbatoio, durante il riempimento misuriamo il volume di liquido immesso a diversi valori di livello h. Salviamo i valori di livello nell’array VInReference ed i corrispettivi valori di volume nell’array VOutReference. Fornendo il valore di livello in VIn avremo in VOut il volume corrispettivo.

LogicLab (Ptp114, ST_Linearize)
PROGRAM ST_Linearize
VAR
AInp : SysGetAnInp; (* Analog input acquisition *)
VInRefs : ARRAY[0..12] OF REAL := [0.0, 25.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0, 900.0, 1000.0]; (* Tank level array (mm) *)
VOutRefs : ARRAY[0..12] OF REAL := [0.0, 10.46, 29.36, 81.75, 223.65, 396.34, 586.74, 785.4, 984.06, 1174.46, 1347.15, 1489.05, 1570.8]; (* Tank volume array (lt) *)
Volume : REAL; (* Tank volune (lt) *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_Linearize"
// *****************************************************************************
// Supposing a cylinder tank with diameter of 1000mm and length of 2000 mm. The
// program acquires the level with linear transducer and calculates the volume.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Configure the analog input acquisition.
IF (SysFirstLoop) THEN
AInp.Address:=255; //Module address
AInp.Channel:=0; //Module channel
AInp.Mode:=AD_VOLT_0_10_COMMON; //Acquisition mode
END_IF;
// -------------------------------------------------------------------------
// VOLUME CALCULATION
// -------------------------------------------------------------------------
// Level acquisition, supposing a linear acquisition from 0 to 10 volt
// correspond to a level from 0 to 1000 mm.
AInp(); //Analog input acquisition
Volume:=Linearize(AInp.Value*100.0, ADR(VInRefs), ADR(VOutRefs), SIZEOF(VInRefs)/SIZEOF(VInRefs[0]));
// [End of file]