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.
Modulo | Modo comune | Differenziale |
---|---|---|
MPS054, MPS056 | 13.3 KOhm | 26,6 KOhm |
PCB122 | 37.7 KOhm | 75.4 KOhm |
PCB126 | 11.3 KOhm | 22.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.
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.
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.
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]