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
- In questo articolo informazioni sul bus 1-Wire.
- In questo topic sono riportate informazioni sul bus 1-Wire.
Famiglia dispositivi
Come visto l’ultimo byte del codice ritornato indica la famiglia del dispositivo, di seguito un elenco.
Family | Device | Description |
---|---|---|
05 | DS2405 | Addressable Switch |
10 | DS18S20 | High-Precision 1-Wire Digital Thermometer |
12 | DS2406 | Dual Addressable Switch Plus 1Kb Memory |
1D | DS2423 | 4kbit 1-Wire RAM with Counter |
1F | DS2409 | MicroLAN Coupler |
22 | DS1822 | Econo 1-Wire Digital Thermometer |
26 | DS2438 | Smart Battery Monitor |
28 | DS18B20 | Programmable Resolution 1-Wire Digital Thermometer |
29 | DS2408 | 1-Wire 8-Channel Addressable Switch |
30 | DS2760 | High-Precision Li+ Battery Monitor |
3A | DS2413 | 1-Wire Dual-Channel Addressable Switch |
3B | DS1825 | Programmable Resolution 1-Wire Digital Thermometer With 4-Bit ID |
42 | DS28EA00 | 1-Wire Digital Thermometer with Sequence Detect and PIO |
7E | EDS00xx | 1-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.

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, 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]