SysGetAnInp, get analog input

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Il blocco funzione esegue l’acquisizione dell’ingresso analogico, sono gestiti vari modi di acquisizione in funzione del modulo analogico a cui fa riferimento. Per acquisire gli ingressi analogici presenti sul modulo CPU occorre definire Address 255.

Impedenza ingresso moduli analogici

Nelle acquisizioni dirette su convertitore A/D (Tipicamente le acquisizioni fino a 3 volt) l’impedenza di ingresso è praticamente infinita.

Nelle acquisizioni 0-10Volt è stato inserito un partitore di tensione in ingresso con resistenze di precisione a basso coefficente di variazione termica. In questo caso l’impedenza varia in funzione del modulo e del tipo di acquisizione.

ModuloModo comuneDifferenziale
MPS054, MPS05613.3 KOhm26,6 KOhm
PCB12237.7 KOhm75.4 KOhm
PCB12611.3 KOhm22.6 KOhm
Acquisizione Pt100/Pt1000

Per acquisire le Pt100/Pt1000 viene utilizzata una corrente bassissima <200uA in modo da non riscaldare l’elemento sensibile. Tutte le sonde devono essere in serie in modo che la corrente le possa attraversare. Il modulo analogico acquisisce la tensione generata dal passaggio della corrente nella resistenza (V=I*R).

  • Pt100: hanno tipicamente una variazione di resistenza di 0.385 Ohm/Grado.
    Per determinare la temperatura dal valore di resistenza sottrarre valore costante del sensore (100 Ohm) e dividere il risultato per 0.385.
    (Resistenza-100)/0.385.
  • Pt1000: hanno tipicamente una variazione di resistenza di 3.85 Ohm/Grado.
    Per determinare la temperatura dal valore di resistenza sottrarre valore costante del sensore (1000 Ohm) e dividere il risultato per 3.85.
    (Resistenza-1000)/3.85.
Suggerimenti

Il blocco funzione Average, permette di eseguire una media sul valore acquisito. Viene utilizzata per migliorare la lettura del valore analogico,  in modo da limitare le fluttuazioni del valore dovuta ai disturbi di crosstalk sulla acquisizione.

La funzione Linearize permette di linearizzare il risultato della acquisizione analogica eseguendo direttamente la conversione del valore acquisito in una unità ingegneristica.

Con la funzione ValueScale è possibile eseguire la messa in scala del valore acquisito. La funzione è particolarmente utile nelle acquisizioni da sensori 4-20 mA.

La funzione VaPotentiometer permette di acquisire il valore di resistenza da un potenziometro.

Information Circle

Blocco funzione

CODESYS: eCDSXUnified12Lib

LogicLab: eLLabS8CoreMng, eLLabXUnified12Lib

Address (USINT) Occorre specificare l’indirizzo di modulo da cui eseguire l’acquisizione degli ingressi analogici (Range da 0 a 15). Il valore 0 indica il primo modulo di estensione, 1 il secondo e così di seguito. L’indirizzo 255 indica il modulo CPU.
Channel (USINT) Occorre specificare l’indirizzo del canale sul modulo (Range da 0x00 a 0x0F). Se viene settato un indirizzo di canale non presente, si interrompe l’esecuzione e viene settato il bit di Fault.
Mode (AI_MODE) Occorre specificare il modo di acquisizione (Definizione).
Done (BOOL) Dato acquisito, viene attivato se acquisizione terminata.
Fault (BOOL) Errore di acquisizione, viene attivato in caso di errore nella sequenza di acquisizione.
Value (REAL) Ritorna il valore di acquisizione espresso nella unità definita dal modo di acquisizione. Potrebbe essere un valore NaN (Not A Number) ad indicare un problema nell’acquisizione, tipicamente sensore rotto.

Immagine FB SysGetAnInp

Esempi

Come utilizzare gli esempi.
Viene acquisito l’ingresso analogico sul canale 0 del modulo 0. Se dato acquisito il valore nel range 0÷10 Volt è trasferito nella variabile Value.

LogicLab (Ptp116)
PROGRAM ST_SysGetAnInp
VAR
    Value : REAL; (* Analog input value *)
    AInp : SysGetAnInp; (* Analog input acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetAnInp"
// *****************************************************************************
// This program acquires an analog input by the module with address 0.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // ANALOG INPUT ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires analog input 0 by module with address 0.

    AInp.Address:=0; //Module address
    AInp.Channel:=0; //Module channel
    AInp.Mode:=AI_MODE#AD_VOLT_0_10_COMMON; //Acquisition mode
    AInp(); //Analog input acquisition
    IF (AInp.Done) THEN Value:=AInp.Value; END_IF;

// [End of file]

CODESYS (Ptp161)
PROGRAM ST_SysGetAnInp
VAR
    Value : REAL; //Analog input value
    AInp : SysGetAnInp; //Analog input acquisition
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetAnInp"
// *****************************************************************************
// This program acquires an analog input by the module with address 0.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // ANALOG INPUT ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires analog input 0 by module with address 0.

    AInp.Address:=0; //Module address
    AInp.Channel:=0; //Module channel
    AInp.Mode:=AI_MODE.AD_VOLT_0_10_COMMON; //Acquisition mode
    AInp(); //Analog input acquisition
    IF (AInp.Done) THEN Value:=AInp.Value; END_IF;

// [End of file]

Multiplexing acquisizione

L’accesso al modulo di acquisizione analogica sul bus di estensione richiede un tempo variabile tra i 300-500uS. Quando si esegue l’acquisizione di molti canali (Abbiamo un modulo con 10 canali), se l’acquisizione è eseguita nello stesso loop di programma si impegnano fino a 5mS di tempo. Siccome il tempo di conversione del modulo è al minimo 32mS è inutile eseguirne più velocemente l’acquisizione, quindi consiglio di eseguire la funzione SysGetAnInp nella task di back e di multiplexare l’acquisizione di molti canali.

LogicLab (Ptp116, ST_AnInpMultiplexing)
PROGRAM ST_AnInpMultiplexing
VAR
    CIDx : USINT; (* Channel index *)
    i : UDINT; (* Auxiliary variable *)
    Value : ARRAY[0..9] OF REAL; (* Analog input value *)
    AInp : ARRAY[0..9] OF SysGetAnInp; (* Analog input acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_AnInpMultiplexing"
// *****************************************************************************
// In this program the analog input acquisitions are multiplexed to avoid loss
// of time in peripheral bus accessing.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZAZTION
    // -------------------------------------------------------------------------
    // Module and channel FB parametrization.

    IF (SysFirstLoop) THEN
        FOR i:=0 TO 9 DO
            AInp[i].Address:=0; //Module address
            AInp[i].Channel:=TO_USINT(i); //Module channel

            // If all channels have same acquisition mode it's set here.

            AInp[i].Mode:=AI_MODE#AD_VOLT_0_10_COMMON; //Acquisition mode
        END_FOR;

        // Set acquisition mode for every channel.

        AInp[0].Mode:=AI_MODE#AD_VOLT_0_10_COMMON; //Acquisition mode
        AInp[1].Mode:=AI_MODE#AD_PT100_DIFFER; //Acquisition mode
        AInp[2].Mode:=AI_MODE#AD_CURR_4_20_COMMON; //Acquisition mode
        AInp[3].Mode:=AI_MODE#AD_THERMOCOUPLE_J; //Acquisition mode
        AInp[4].Mode:=AI_MODE#AD_VOLT_0_1_COMMON; //Acquisition mode
        AInp[5].Mode:=AI_MODE#AD_VOLT_0_10_DIFFER; //Acquisition mode
        AInp[6].Mode:=AI_MODE#AD_PT100_DIFFER; //Acquisition mode
        AInp[7].Mode:=AI_MODE#AD_VOLT_0_10_COMMON; //Acquisition mode
        AInp[8].Mode:=AI_MODE#AD_CURR_4_20_DIFFER; //Acquisition mode
        AInp[9].Mode:=AI_MODE#AD_RESISTOR_5000_OHM; //Acquisition mode
    END_IF;

    // -------------------------------------------------------------------------
    // ANALOG INPUT ACQUISITION
    // -------------------------------------------------------------------------
    // Analog input multiplexing.

    CIDx:=CIDx+1; //Channel index
    IF (CIDx > 9) THEN CIDx:=0; END_IF;
    AInp[CIDx](); //Analog input acquisition
    IF (AInp[CIDx].Done) THEN Value[CIDx]:=AInp[CIDx].Value; END_IF;

// [End of file]

Acquisizione resistenza

Alcuni moduli di acquisizione analogica permettono di acquisire direttamente valori resistivi ma è comunque possibile ricavare un valore resistivo tramite la lettura della tensione ai capi della resistenza in un circuito partitore.

Se prendiamo ad esempio il circuito a destra vediamo che conoscendo il valore di alimentazione VPower ed il valore della resistenza serie RSerie possiamo determinare il valore della resistenza Resistor.

Se il convertitore A/D ha elevata impedenza di ingresso (Esempio modulo PCB126 con acquisizione a 1 V) si può trascurare. Se invece il convertitore ha una bassa impedenza di ingresso (Esempio modulo PCB126 con acquisizione a 10 V con impedenza ~11.3KOhm) occorrerà tenerne conto nel calcolo.

Schema acquisizione resistenza
LogicLab (Ptp116, ST_ResistorValue)
PROGRAM ST_ResistorValue
VAR
    RSerie : REAL; (* Resistor serie value (Ohm) *)
    VPower : REAL; (* Power voltage (Volt) *)
    ZIn : REAL; (* A/D input impedance *)
    Resistor : ARRAY[0..1] OF REAL; (* Resistor value (Ohm) *)
    AInp : SysGetAnInp; (* Analog input acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_ResistorValue"
// *****************************************************************************
// By using an analog input it's read a resistor value. It's used a circuit with
// resistor in serie connected to power, the AD reads voltage at resistor pins.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // ANALOG INPUT ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires analog input 0 by module with address 0.

    AInp.Address:=1; //Module address
    AInp.Channel:=0; //Module channel
//  AInp.Mode:=AI_MODE#AD_VOLT_0_1_DIFFER; //Acquisition mode
    AInp.Mode:=AI_MODE#AD_VOLT_0_10_DIFFER; //Acquisition mode
    AInp(); //Analog input acquisition
    IF NOT(AInp.Done) THEN RETURN; END_IF;

    // -------------------------------------------------------------------------
    // RESISTOR VALUE READ
    // -------------------------------------------------------------------------
    // If set acquisition 1 volt, the A/SD has an high input impedance, so it
    // can be ignored.

    Resistor[0]:=AInp.Value/((VPower-AInp.Value)/RSerie); //Resistor value (Ohm)

    // If set acquisition 10 volt, the A/D has a low input impedance, so it
    // must be considered as in parallel to the resistor. Use the formula:
    // (1/Resistor):=(1/RTotal)-(1/ZIn)

    Resistor[1]:=1.0/((1.0/Resistor[0])-(1.0/ZIn));

// [End of file]
Was this article helpful?