Vai al contenuto

Gestire dispositivi 1-Wire

Maxim Integrated, azienda derivata da Dallas Semiconductor, ha sviluppato un sistema di comunicazione seriale a singolo filo denominato 1-Wire bus. Il protocollo è stato progettato per permettere la comunicazione e, in molti casi, anche l’alimentazione dei dispositivi utilizzando un’unica linea di collegamento, riducendo notevolmente il numero di conduttori necessari.

Il bus 1-Wire consente di collegare allo stesso bus numerosi dispositivi, tra cui sensori di temperatura, memorie, convertitori, lettori RFID e altri dispositivi periferici. Ogni dispositivo 1-Wire possiede un codice identificativo univoco a 64 bit (ROM ID), che permette al master di individuarlo e comunicare con esso anche quando sono presenti più dispositivi sullo stesso collegamento.

Topologia di Bus

La comunicazione è di tipo half-duplex e bidirezionale e avviene tra un dispositivo master, che controlla il bus, e uno o più dispositivi slave. Il master gestisce tutte le operazioni di comunicazione, mentre gli slave rispondono ai comandi ricevuti. Sul bus non possono quindi avvenire contemporaneamente trasmissioni nelle due direzioni. Dal punto di vista elettrico, il bus 1-Wire viene normalmente realizzato con una linea dati mantenuta a livello alto mediante una resistenza di pull-up. I dispositivi comunicano portando la linea verso il livello basso secondo precise finestre temporali.

Per ottenere un funzionamento ottimale occorre prestare attenzione al cablaggio del Bus, utilizzare un cavo Cat5e, Cat6 o Cat7, per lunghe distanze e per il passaggio con i cavi di rete meglio utilizzare un cavo schermato, utilizzando sempre un doppino intrecciato per Dati e GND. Collegare un massimo di 20 sensori sul Bus indipendentemente dalla topologia di cablaggio. Sono possibili diverse topologie:

Topologia collegamento Bus 1-Wire
  • 1) Collegamento lineare, senza derivazioni, consigliata. Lunghezza massima del cavo è di 350 metri con un totale di 20 sensori.
  • 2) Collegamento con derivazioni corte. Può dare risultati simili alla topologia lineare, la lunghezza massima del cavo è di 300 metri con un totale di 20 sensori;
  • 3) Collegamento con derivazioni lunghe. Non è consigliata in quanto riduce la lunghezza massima del cavo a 100 metri con un totale di 20 sensori.
  • 4) Collegamento a stella. Tutti i sensori sono riuniti in un punto è consigliata solo per piccole installazioni. La lunghezza massima del cavo è di 100 metri con un totale di 20 sensori.

La topologia lineare è generalmente quella che garantisce i migliori risultati sulle lunghe distanze. Le derivazioni lunghe e la configurazione a stella devono invece essere utilizzate con maggiore attenzione perché possono peggiorare la qualità del segnale.Per installazioni con più sensori si consiglia inoltre di inserire una resistenza da 100÷120 Ω in serie al segnale DATA di ciascun sensore, in modo da ridurre i problemi dovuti al carico complessivo del bus.

Gestione di più dispositivi 1-Wire

Uno dei principali vantaggi del bus 1-Wire è la possibilità di collegare più dispositivi sulla stessa linea di comunicazione. Ogni dispositivo dispone infatti di un identificativo univoco a 64 bit (ROM ID), che permette al master di riconoscere singolarmente ogni dispositivo presente sul bus. L’identificativo è composto da 8 byte:

+--------+--------+--------+--------+--------+--------+--------+--------+
|  CRC   |                  ID Code (6 Bytes)                  | Family |
+--------+--------+--------+--------+--------+--------+--------+--------+

Il byte Family identifica la famiglia del dispositivo, i successivi 6 byte identificano univocamente il dispositivo, mentre l’ultimo byte contiene il CRC utilizzato per verificare la validità del codice. Ad esempio, tutti i sensori DS18B20 appartengono alla famiglia 16#28, ma ogni sensore dispone di un proprio Serial ID. È quindi possibile collegare più DS18B20 allo stesso bus e associare ciascun sensore alla relativa misura

Alimentazione dei dispositivi

I dispositivi 1-Wire possono essere alimentati direttamente dal bus oppure tramite una alimentazione esterna, in funzione del dispositivo utilizzato. Nelle installazioni con più sensori e soprattutto quando il bus raggiunge lunghezze elevate è preferibile verificare attentamente la modalità di alimentazione prevista dal dispositivo e le relative specifiche elettriche.

L’utilizzo dell’alimentazione esterna permette normalmente di ottenere una maggiore affidabilità rispetto all’utilizzo della sola alimentazione disponibile sul bus, soprattutto in presenza di più dispositivi.

Offerta Elsist

Sul nostro sito trovate i prodotti HW-group una vasta gamma di dispositivi con protocollo 1-Wire, come sensori di temperatura, lettori TAGs, lettori RFiD, ecc. tutti i dispositivi sono collegabili a dispositivi master commerciali.

Il gateway ADA-401WP CEL-MAR permette di utilizzare i sensori 1-Wire in ambienti industriale rendendoli accessibili tramite protocollo Modbus RTU in RS485. Per acquisire i sensori con i nostri sistemi SlimLine con protocollo Modbus RTU è possibile utilizzare il FB ModbusMaster. Il programma ST_Gateway_ADA_401WP, esegue la lettura da un gateway a cui sono connessi 4 sensori, il valore acquisito viene scalato e convertito in variabili REAL.

Molti dei nostri moduli CPU SlimLine hanno nativa la gestione del protocollo 1-Wire master, è quindi possibile collegare direttamente i dispositivi al modulo. In alternativa è possibile utilizzare l’Adattatore 1-Wire a RS232 collegandolo ad una delle porte RS232. Nella libreria eLLab1WireLib forniamo i blocchi funzione per la gestione dei dispositivi 1-Wire, il FB OWireCore esegue la gestione del Bus, FB specifici permettono la gestione dei vari dispositivi connessi al Bus.

LogicLab (Ptp114)
PROGRAM ST_Gateway_ADA_401WP
VAR
    Sp : SysSerialPort; (* Serial port *)
    Mdb : ModbusMaster; (* Modbus master FB *)
    RxData : ARRAY[ 0..3 ] OF INT; (* Rx data buffer *)
    Temperature : REAL; (* Temperature (°C) *)
    Sunlight : REAL; (* Sunlight (% SLux) *)
    TSet : REAL; (* Temperature set ((TA)°C) *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_Gateway_ADA_401WP"
// *****************************************************************************
// By using Modbus RTU over a serial line are readed 4 registers from ADA-401WP
// with node 64, 4 sensors are connected to the ADA-401WP gateway, the acquired
// value is scaled and converted into REAL variables.
//
// Channel 0: DES-300 temperature setting switch
// Channel 1: DES-216 solar light sensor
// Channel 2: DES-216 temperature sensor
//
// All the measurement value from measuring channels are presented by a 16-bit
// register. The registers with measuring value are in the format of 16-bit
// signed integer (C/C++ type short int).
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN

        // Serial port settings.

        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_AUTO_WO_TIMES; //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

        // Modbus master settings.

        Mdb.SpyOn:=TRUE; //Spy On    
        Mdb.Type:=0; //Modbus type    
        Mdb.Node:=64; //Device modbus node    
        Mdb.FCode:=16#03; //Modbus function code    
        Mdb.Address:=1; //Modbus register address    
        Mdb.Points:=SIZEOF(RxData)/SIZEOF(RxData[0]); //Modbus register points    
        Mdb.Buffer:=ADR(RxData); //Memory buffer address    
        Mdb.IFTime:=286; //Interframe time (uS)    
        Mdb.Timeout:=500; //Timeout time (mS)    
        Mdb.Delay:=100; //Delay time (mS)    
    END_IF;

    // -------------------------------------------------------------------------
    // MODBUS MANAGEMENT
    // -------------------------------------------------------------------------
    // Manage the modbus master communication.

    Sp(Open:=TRUE); //Serial port management
    Mdb.File:=Sp.File; //File pointer    
    Mdb(); //Modbus master
    Mdb.Enable:=Sp.Opened AND NOT(Mdb.Done); //Modbus enable    

    // -------------------------------------------------------------------------
    // TEMPERATURE ADJUSTER CONVERSION
    // -------------------------------------------------------------------------
    // Sensor on channel 0 is a DES-300 temperature adjuster.
    // The actual value of temperature set by the use of temperature adjuster in
    // °C (5 To 40 [TA(°C)]) is obtained from register value diveded by 100.

    TSet:=TO_REAL(RxData[0])/100.0; //Temperature set ((TA)°C)

    // -------------------------------------------------------------------------
    // SUNLIGHT CONVERSION
    // -------------------------------------------------------------------------
    // Sensor on channel 1 is a DES-216 sunlight sensor.
    // The actual value of sunlight in percent % (0 To 100 [%SLux]) is obtained
    // from register value diveded by 10.

    Sunlight:=TO_REAL(RxData[1])/10.0; //Sunlight (% SLux)

    // -------------------------------------------------------------------------
    // TEMPERATURE CONVERSION
    // -------------------------------------------------------------------------
    // Sensor on channel 2 is a DES-216 temperature sensor.
    // The actual value of temperature in °C (-55 To +125 [°C]) is obtained from
    // register value diveded by 100.

    Temperature:=TO_REAL(RxData[2])/100.0; //Temperature (°C)

// [End of file]

Was this article helpful?