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.
Descrizione
Enable (BOOL) Comando abilitazione.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
IsPowered (BOOL) Settare se il sensore di temperatura è alimentato.
OWCore (@OWireCore_v2) Indirizzo allocazione FB di gestione core one-wire.
IDCode (LWORD) Definizione identificativo sensore da acquisire. Se 0 viene acquisito qualsiasi device connesso.
ADelay (REAL) Impostazione riatrdo tra acquisizioni (S). L’acquisizione di temperatura viene eseguito ogni tempo definito.
Done (BOOL) Si attiva al termine della esecuzione comando.
Ok (BOOL) Attivo per un loop se temperatura acquisita correttamente.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Temperature (REAL) Valore 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.
CTime (REAL) Tempo conversione temperatura (S).
OkCount (UDINT) Contatore conversioni eseguite.
Errors (UDINT) Contatore 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#10000000 | Lg: Messaggi di log funzionamento. |
16#40000000 | Er: 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, 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]