Passa al contenuto principale

OWRdTemperature, One-Wire read temperature

Il modo più semplice ed economico per acquisire temperature è utilizzare sensori one-wire basati sul chip DS18B20 come questo. Ogni dispositivo ha un proprio identificatore a 64 bit univoco così più dispositivi possono essere connessi in configurazione multidrop.

Questo blocco funzione da eseguire in task Back utilizzabile con modello a cascata, esegue l'acquisizione di un sensore one-Wire di temperatura basato sul chip DS18B20, occorre fornire in OWCore l’indirizzo di allocazione del FB OWireCore di gestione convertitore one-wire. Attivando Enable, viene eseguita la lettura del valore di temperatura dal dispositivo connesso al bus, terminata l'acquisizione si attiva l'uscita Done, se acquisizione corretta si attiva per un loop l'uscita Ok e su Temperature, sarà riportato il valore di temperatura acquisito.

L'uscita Fault si attiva in caso di errori di gestione. Disattivando Enable si azzera Done, per eseguire una nuova lettura occorre riabilitare l'ingresso Enable. In IDCode occorre definire il codice identificativo del dispositivo che si vuole acquisire. Se sul bus è connesso un unico dispositivo, si può forzare a 0.

Approfondimenti
  • In questo articolo informazioni sul sistema di comunicazione a singolo filo noto con il nome di 1-Wire bus.
  • In questo topic informazioni sulla gestione del bus 1-Wire con i ns sistemi programmabili.In questo topic informazioni sulla lettura di più sonde di temperatura one-wire.

Descrizione​

Immagine FB OWRdTemperature

ParametroTipoDescrizione
EnableBOOLComando abilitazione.
SpyOnBOOLSe attivo permette di spiare il funzionamento della FB (Vedi articolo).
IsPoweredBOOLSettare se il sensore di temperatura è alimentato.
OWCore@OWireCore_v2Indirizzo allocazione FB di gestione core one-wire.
IDCodeLWORDDefinizione identificativo sensore da acquisire. Se 0 viene acquisito qualsiasi device connesso.
ADelayREALImpostazione riatrdo tra acquisizioni (S). L'acquisizione di temperatura viene eseguito ogni tempo definito.
DoneBOOLSi attiva al termine della esecuzione comando.
OkBOOLAttivo per un loop se temperatura acquisita correttamente.
FaultBOOLAttivo per un loop se errore esecuzione.
TemperatureREALValore di temperatura acquisito (°C). Range di lettura da -55 (°C) a +125 (°C). Precisione ±0.5 (°C) tra -10 (°C) e +85 (°C). Risoluzione di lettura 0.0625 (°C). OkCount (UDINT) Contatore acquisizioni correttamente eseguite.
CTimeREALTempo conversione temperatura (S).
OkCountUDINTContatore conversioni eseguite.
ErrorsUDINTContatore errori di esecuzione.

Spionaggio funzionamento​

Se SpyOn attivo è possibile utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.

Trigger di spionaggio

16#10000000Lg: Messaggi di log funzionamento.
16#40000000Er: Errori di esecuzione.

Esempi​

Come utilizzare gli esempi.
FBD_OWRdTemperature, ST_OWRdTemperature: Viene eseguita la lettura del valore di temperatura da due dispositivi DS18B20 connessi al bus 1-Wire. Selezionare la porta COM alla quale è connesso il bus. Occorre definire nelle variabili IDCode i codici identificativi dei due dispositivi da acquisire. E' possibile definire LWORD#16#0000000000000000 se vi è un unico dispositivo connesso al bus, in questo caso entrambe le istanze leggeranno lo stesso dispositivo.

LogicLab (Ptp120, FBD_OWRdTemperature)
PROGRAM FBD_OWRdTemperature
VAR
Serial : SysSerialPort; (* Serial port management *)
OWCORE : OWireCore_v2; (* FB One-Wire core *)
OWTemp_1 : OWRdTemperature_v1; (* FB read temperature *)
OWTemp_2 : OWRdTemperature_v1; (* FB read temperature *)
END_VAR

Immagine POU FBD_OWRdTemperature

LogicLab (Ptp120, ST_OWRdTemperature)
PROGRAM ST_OWRdTemperature
VAR
Sp : SysSerialPort; (* Serial port management *)
OWCore : OWireCore_v2; (* FB One-Wire core *)
OWTemp : ARRAY[0..1] OF OWRdTemperature_v1; (* FB read temperature *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_OWRdTemperature"
// *****************************************************************************
// Is acquired the temperature value from two DS18B20 devices.
// -----------------------------------------------------------------------------

// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------

IF (SysFirstLoop) THEN

// Set serial port parameters.

Sp.COM:=ADR('PCOM255.0'); //COM port definition
// Sp.COM:=ADR('COM0'); //COM port definition
Sp.Baudrate:=9600; //Baudrate
Sp.Parity:='N'; //Parity
Sp.DataBits:=8; //Data bits
Sp.StopBits:=1; //Stop bits
Sp.DTRManagement:=DTR_OFF; //DTR management
Sp.DTRComplement:=FALSE; //DTR complement
Sp.EchoFlush:=FALSE; //Received echo flush
Sp.DTROnTime:=0; //DTR On time delay (mS)
Sp.DTROffTime:=0; //DTR Off time delay (mS)
Sp.FlushTm:=0; //Flush time (mS)
Sp.RxSize:=0; //Rx buffer size
Sp.TxSize:=0; //Tx buffer size

// Set One-Wire core parameters.

OWCore.SpyOn:=TRUE; //Spy active
// OWCore.IType:=OW_ITYPE#OW_ITDS2480B; //Interface type
OWCore.IType:=OW_ITYPE#OW_ITDS2484; //Interface type

// Set One-Wire read temperature parameters.

OWTemp[0].SpyOn:=TRUE; //Spy active
// OWTemp[0].IsPowered:=TRUE; //Sensor is powered
OWTemp[0].ADelay:=5.0; //Acquisition delay (S)
OWTemp[0].OWCore:=ADR(OWCore); //One-Wire core management
// OWTemp[0].IDCode:=LWORD#16#5600000499167428; //ID code
OWTemp[0].IDCode:=LWORD#16#0000000000000000; //ID code

OWTemp[1].SpyOn:=TRUE; //Spy active
// OWTemp[1].IsPowered:=TRUE; //Sensor is powered
OWTemp[1].ADelay:=5.0; //Acquisition delay (S)
OWTemp[1].OWCore:=ADR(OWCore); //One-Wire core management
// OWTemp[1].IDCode:=LWORD#16#520000027F3C1A28; //ID code
OWTemp[1].IDCode:=LWORD#16#0000000000000000; //ID code
END_IF;

// -------------------------------------------------------------------------
// READ TEMPERATURE
// -------------------------------------------------------------------------
// One-Wire core management

Sp(Open:=TRUE); //Serial port management
eTO_JUNK(SysSetSerialDTR(OWCore.CPower, Sp.File)); //Manage DTR signal

OWCore.Enable:=NOT(OWTemp[1].Done); //Enable
OWCore.Power:=Sp.Opened; //Converter power
OWCore(File:=Sp.File); //FB One-Wire core

// Acquire the temperature.

OWTemp[0].Enable:=OWCore.Done; //Enable
OWTemp[0](); //Read temperature

OWTemp[1].Enable:=OWTemp[0].Done; //Enable
OWTemp[1](); //Read temperature

// [End of file]