Vai al contenuto

OWSearch, One-Wire search devices

Vai all indice del manuale di programmazione

Ogni dispositivo slave 1-Wire è caratterizzato da un identificatore univoco a 64 bit (8 bytes) utilizzato come indirizzo. L’identificatore è diviso in 3 sezioni. 1o byte (LSB) contiene il codice della famiglia che identifica il tipo di dispositivo; i successivi 6 bytes rappresentano l’indirizzo individuale; l’ultimo byte (MSB) contiene il CRC (Cyclic Redundancy Checksum).

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

Questo blocco funzione esegue la scansione di tutti i dispositivi connessi al bus One-Wire ritornandone gli identificatori univoci. Questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione, vedi protezione funzioni e blocchi funzione. E’ comunque possibile utilizzarlo liberamente in modo test per 15 Min.

Occorre fornire in OWCore l’indirizzo di allocazione del FB OWireCore di gestione convertitore one-wire. Abilitare il blocco funzione attivando Enable, alla attivazione di ISearch inizia la ricerca e viene ritornato l’identificativo del primo dispositivo trovato, se nessun dispositivo connesso si attiva NoDevices. Successivamente ad ogni attivazione di NSearch viengono ritornati in sequenza gli identificativi degli altri dispositivi trovati, trovato l’ultimo dispositivo si attiva LastDevice.

Ad ogni dispositivo trovato si attiva per un loop di programma l’uscita Ok e gli 8 bytes del codice sono trasferiti in IDCode. Disattivando Enable si azzera Done e l’eventuale Fault.

Approfondimenti
Famiglia dispositivi

Come visto l’ultimo byte del codice ritornato indica la famiglia del dispositivo, di seguito un elenco.

FamilyDeviceDescription
05DS2405Addressable Switch
10DS18S20High-Precision 1-Wire Digital Thermometer
12DS2406Dual Addressable Switch Plus 1Kb Memory
1DDS24234kbit 1-Wire RAM with Counter
1FDS2409MicroLAN Coupler
22DS1822Econo 1-Wire Digital Thermometer
26DS2438Smart Battery Monitor
28DS18B20Programmable Resolution 1-Wire Digital Thermometer
29DS24081-Wire 8-Channel Addressable Switch
30DS2760High-Precision Li+ Battery Monitor
3ADS24131-Wire Dual-Channel Addressable Switch
3BDS1825Programmable Resolution 1-Wire Digital Thermometer With 4-Bit ID
42DS28EA001-Wire Digital Thermometer with Sequence Detect and PIO
7EEDS00xx1-Wire Environmental Sensors

Descrizione

Enable (BOOL) Comando abilitazione.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
ISearch (BOOL) Sul fronte di attivazione comanda la ricerca del primo dispositivo.
NSearch (BOOL) Sul fronte di attivazione comanda la ricerca dei dispositivi successivi.
OWCore (@OWireCore_v2) Indirizzo allocazione FB di gestione core one-wire (OWCore).
Done (BOOL) Si attiva al termine della esecuzione comando.
Fault (BOOL) Attivo se errore esecuzione.
Ok (BOOL) Attivo per un loop se lettura codice eseguita correttamente.
IDCode (LWORD) Codice a 64 bits del dispositivo trovato.
OkCount (UDINT) Contatore acquisizioni correttamente eseguite.
Errors (UDINT) Contatore errori di esecuzione si incrementa ad ogni errore.

Immagine FB OWSearch

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, per eseguire l’esempio occorre importare la libreria nel progetto (Articolo).
Collegandosi con un terminale telnet alla porta 3000 viene eseguita la ricerca di tutti i dispositivi collegati al bus One-Wire e ne viene ritornato il codice sul terminale.

LogicLab (Ptp120, ST_OWSearch)
PROGRAM ST_OWSearch
VAR
    Fp : eFILEP; (* File pointer array *)
    CaseNr : USINT; (* Program case *)
    Devices : USINT; (* Number of devices *)
    STime : REAL; (* Search time (S) *)
    TimeBf : UDINT; (* Time buffer (mS) *)
    DBuffer : STRING[ 64 ]; (* Data buffer *)
    Sp : SysSerialPort; (* Serial port management *)
    TCPServer : SysTCPServer; (* TCPServer management *)
    OWCore : OWireCore_v2; (* FB One-Wire core *)
    OWSrc : OWSearch; (* FB One-Wire search *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_OWSearch"
// *****************************************************************************
// Connecting a telnet client to port 3000 a search of devices are started and
// all codes found are returned on the client.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // First program execution loop initializations.

    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_ON; //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 TCP server parameters.

        TCPServer.FilesArr:=ADR(Fp); //Files array
        TCPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPServer.LocalPort:=3000; //Local port
        TCPServer.MaxConn:=1; //Accepted connections
        TCPServer.FlushTm:=50; //Flush time (mS)
        TCPServer.LifeTm:=30; //Life time (S)
        TCPServer.RxSize:=128; //Rx buffer size
        TCPServer.TxSize:=128; //Tx buffer size

        // Set One-Wire core parameters.

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

        // Set One-Wire search parameters.

        OWSrc.SpyOn:=TRUE; //Spy active
        OWSrc.OWCore:=ADR(OWCore); //One-Wire core management
    END_IF;

    // -------------------------------------------------------------------------
    // MANAGE THE FBs
    // -------------------------------------------------------------------------
    // Manage the serial port and TCP server.

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

    // One-Wire core management

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

    // Search devices. Please note that the "Enable" must be managed after FB
    // execution in order to allow the program to read "Done" output.

    OWSrc(); //FB One-Wire search
    OWSrc.Enable:=OWCore.Done; //One-Wire management ID

    // On search error terminate the finding.

    IF (OWCore.Fault) THEN CaseNr:=0; END_IF;
    IF NOT(SysFIsOpen(Fp)) THEN OWSrc.ISearch:=FALSE; OWSrc.NSearch:=FALSE; CaseNr:=0; RETURN; END_IF;

    // -------------------------------------------------------------------------
    // DEVICES FINDING LOOP
    // -------------------------------------------------------------------------
    // Execute a device finding loop.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // Bus not ready message.

        0:
        IF (OWCore.OWBSts <> OW_BSTATUS#OW_BOK) THEN
            eTO_JUNK(SysVfprintf(Fp, ADR('%s$r$n'), STRING_TYPE, ADR('One-Wire bus not ready')));
            CaseNr:=200; //Program case
            RETURN;
        END_IF;

        // Start searching

        eTO_JUNK(SysVfprintf(Fp, ADR('%s$r$n'), STRING_TYPE, ADR('Welcome, searching start')));
        TimeBf:=SysTimeGetMs(); //Time buffer (mS)
        OWSrc.ISearch:=TRUE; //Init search
        Devices:=0; //Number of devices
        CaseNr:=10; //Program case

        // ---------------------------------------------------------------------
        // Wait search sequence end.

        10:
        IF NOT(OWSrc.Done) THEN RETURN; END_IF;
        OWSrc.ISearch:=FALSE; //Init search
        OWSrc.NSearch:=FALSE; //Next search
        CaseNr:=CaseNr+1; //Program case

        // If no devices terminate sequence.

        IF (OWSrc.NoDevices) THEN
            eTO_JUNK(SysVfprintf(Fp, ADR('%s$r$n'), STRING_TYPE, ADR('No devices on One-Wire bus')));
            CaseNr:=200; //Program case
            RETURN;
        END_IF;

        // ---------------------------------------------------------------------
        // Reports the device IDCode found.

        11:
        eTO_JUNK(SysVfprintf(Fp, ADR('IDCode:%016llX$r$n'), LWORD_TYPE, ADR(OWSrc.IDCode)));
        Devices:=Devices+1; //Number of devices

        // If last device go to final report otherwise start next device search.        

        IF (OWSrc.LastDevice) THEN CaseNr:=20; RETURN; END_IF;
        OWSrc.NSearch:=TRUE; //Next search
        CaseNr:=10; //Program case

        // ---------------------------------------------------------------------
        // FINAL REPORT
        // ---------------------------------------------------------------------
        // Final search report.

        20:
        STime:=TO_REAL(SysTimeGetMs()-TimeBf)/1000.0; //Search time (S)
        eTO_JUNK(SysVfprintf(Fp, ADR('Found: %d devices$r$n'), USINT_TYPE, ADR(Devices)));
        eTO_JUNK(SysVfprintf(Fp, ADR('Search time: %5.1f (S)$r$n'), REAL_TYPE, ADR(STime)));
        CaseNr:=200; //Program case

        // ---------------------------------------------------------------------
        // CLOSE CONNECTION
        // ---------------------------------------------------------------------
        // WAit all characters has been sent and close the TCP connection,

        200:
        IF (TO_UDINT(SysFGetOSpace(Fp)) <> SysFGetOBfSize(Fp)) THEN RETURN; END_IF;
        eTO_JUNK(Sysfclose(Fp)); //Close the TCP connection
        CaseNr:=0; //Program case
    END_CASE;

// [End of file]
Was this article helpful?