W&T collega
Adattatori per TCP/IP, Ethernet, RS-232, RS-485, USB, 20 mA, Fibra ottica di vetro e plastica, http, SNMP, OPC, Modbus TCP, I/O digitale, I/O analogico, ISA, PCI

Applicazione:

Accesso all’interfaccia seriale con PHP


Qui di seguito viene spiegato come potete accedere con un semplice script PHP all’interfaccia seriale pure.box per controllare ad es. una stazione meteorologica.

In molti casi durante il funzionamento di un terminale seriale è necessaria una comunicazione permanente con un PC su cui è installato il software di controllo. Ad esempio per una stazione meteorologica con collegamento seriale, nella quale deve essere impiegato un PC 24 ore su 24 come datalogger, per registrare una sequenza di misurazioni continua. Questa struttura impiegata in molti luoghi può essere realizzata in modo decisamente più economico, efficiente dal punto di vista energetico e meno ingombrante con la pure.box.

Ad esempio per interrogare e ricevere la temperatura attuale una volta al minuto è necessario solo questo piccolo script PHP che deve essere avviato ciclicamente mediante la pure.box:

						
						<?php
						$fd = dio_open( '/dev/ttyS1', O_RDWR );
						dio_tcsetattr( $fd, array(
												'baud'         => 9600,
												'bits'         => 8,
												'stop'         => 1,
												'parity'       => 0,
												'flow_control' => 0,
												'is_canonical' => 0	));
						dio_write( $fd, 'temperatur?' );
						$input = '';
						while( strlen( $input ) <= 10 )
							{
							$input .= dio_read( $fd, 1 );
							}
						echo $input;
						dio_close( $fd );
						?>
					
				

Dopo l’avvio dello script vengono eseguite le seguenti attività:

  • l’interfaccia seriale della pure.box 2 viene aperta per l’accesso di lettura e di scrittura.
  • Il formato seriale viene impostato su 9600 baud, 8 bit di dati, 1 bit di stop, nessuna parità, nessun handshake hardware.
  • Fissando il parametro is_canonical su 0 ogni simbolo ricevuto sull’interfaccia virtuale viene trasferito direttamente al PHP. Se questo parametro viene fissato su 1, l’inoltro avviene solo dopo la ricezione di un segnale di interruzione di linea.
  • Per richiedere la temperatura attuale viene inviata la catena di simboli "temperatura?" mediante l’interfaccia seriale all’apparecchio collegato.
  • Vengono ricevuti e in seguito emessi 10 simboli.
  • Infine l’interfaccia seriale viene nuovamente chiusa.

Il valore della temperatura ricevuto può essere in seguito salvato nella banca dati MySQL o SQLite interna al box oppure può essere trasferita attraverso la rete ad un server di elaborazione.

Caricando questo script via FTP o SMB nella cartella websites della pure.box, potete eseguirlo in prova anche dal browser:

http://<IP der pure.box 2>/websites/<Dateiname des Skriptes>

Potete configurare l’esecuzione ciclica attraverso la pure.box dopo l’upload nella gestione basata sul web del box. Navigate a questo scopo nel menu ad albero in File propri e impostate nelle Proprietà del file un’esecuzione temporizzata.

Nello script eseguito sopra si presume che la risposta abbia una lunghezza fissa. Se così non è, si può abbandonare la routine di lettura dopo la ricezione di un ultimo carattere prestabilito.

Per evitare anche l’eventualità che non venga inviata nessuna risposta o solo una risposta incompleta, occorre inserire un timeout che interrompa il processo di lettura al termine.

					
						<?php
						$TIMEOUT = 10;
						$fd = dio_open( '/dev/ttyS1', O_RDWR | O_NONBLOCK );
						dio_tcsetattr( $fd, array(
												'baud'       => 9600,
												'bits'       => 8,
												'stop'       => 1,
												'parity'     => 0,
												'flow_control' => 0,
												'is_canonical' => 0	));
						dio_write( $fd, 'tempertur?' );
						$input = '';
						$time_start = time();
						while($time_start + $TIMEOUT > time())
							{
							$input .= dio_read( $fd );
							usleep( 100000 );
							}
						echo $input;
						dio_close( $fd );
						?>
					
				

Contrariamente al primo esempio di script l’interfaccia qui viene aperta in modo non bloccante. Mentre l’esecuzione dello script nel primo esempio permane nella riga $input .= dio_read($fd, 1); finché non viene letto un simbolo, nel secondo esempio la riga $input .= dio_read($fd);viene saltata, se non c’è nessun segno ricevuto in modo seriale nel buffer d’ingresso. L’uscita dal loop di lettura avviene in modo temporizzato. La durata del processo di lettura è fissata nelle variabili $TIMEOUT.

L’uscita garantita dal loop while consente di correggere eventuali errori e garantisce prestazioni costanti.