Linearize, linearize a non linear value

Home / Knowledge Base / Manualistica / Programmazione IEC 61131-3 / Libreria utilità generale / Linearize, linearize a non linear value

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.

Function
CODESYS: Non disponibile
LogicLab: eLLabUtyLib

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.

Calcolo volume serbatoio
LogicLab (Ptp114)
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]

Ti è stato utile questo articolo ?