Vai al contenuto

OWRdTemperature, One-Wire read temperature

Vai all indice del manuale di programmazione

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.

Immagine FB OWRdTemperature

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]
Was this article helpful?