W&T verbindet
Interfaces für TCP/IP, Ethernet, RS-232, RS-485, USB, 20mA, Glas- und Kunststoff-LWL, http, SNMP, OPC, Modbus TCP, I/O digital, I/O analog, ISA, PCI

Applikation:

Zugriff auf die serielle Schnittstelle mit PHP


Im Folgenden ist erläutert, wie Sie mit einem einfachen PHP-Skript auf die serielle Schnittstelle der pure.box zugreifen können, um beispielsweise eine Wetterstation zu steuern:

In vielen Fällen ist beim Betrieb eines seriellen Endgerätes eine permanente Kommuniktion mit einem PC erforderlich, auf dem die steuernde Software installiert ist. Zum Beispiel bei einer Wetterstation mit einem seriellem Anschluß, bei der rund um die Uhr ein PC als Datenlogger eingesetzt werden muss, um eine kontinuierliche Messreihe aufzunehmen. Dieser vielerorts eingesetzte Aufbau kann mit der pure.box deutlich kosten-, energie- und platzsparender gestaltet werden.

Um zum Beispiel einmal pro Minute die aktuelle Temperatur anzufragen und zu empfangen ist lediglich dieses kleine PHP-Skript erforderlich, welches durch die pure.box zyklisch gestartet werden muss:

						
						<?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 );
						?>
					
				

Nach dem Starten des Skriptes werden folgende Aktionen durchgeführt:

  • Die serielle Schnittstelle der pure.box 2 wird für Lese- und Schreibzugriff geöffnet.
  • Das serielle Format wird auf 9600Baud, 8 Datenbits, 1 Stoppbit, keine Parität, kein Hardware-Handshake eingestellt.
  • Durch das Setzen des Parameters is_canonical auf 0 wird jedes an der seriellen Schnittstelle empfangene Zeichen direkt an das PHP übergeben. Ist dieser Parameter auf 1 gesetzt, erfolgt die Übergabe erst nach dem Empfang eines Zeilenumbruch-Zeichens.
  • Zum Anfordern der aktuellen Temperatur wird die Zeichenkette "temperatur?" über die serielle Schnittstelle an das angeschlossene Gerät gesendet.
  • Es werden 10 Zeichen empfangen und anschließend ausgegeben.
  • Abschließend wird die serielle Schnittstelle wieder geschlossen.

Der empfangene Temperaturwert kann im Anschluss z.B. in der boxinternen MySQL- oder SQLite-Datenbank gespeichert werden, oder über das Netzwerk an einen verarbeitenden Server weitergeleitet werden.

Laden Sie dieses Skript per FTP oder SMB in den Ordner websites der pure.box, können Sie es zum Testen auch aus dem Browser ausführen:

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

Die zyklische Ausführung durch die pure.box konfigurieren Sie nach dem Upload im Web-based Management der Box. Navigieren Sie dazu im Menübaum zu Eigene Dateien und stellen Sie in den Eigenschaften der Datei eine zeitgesteuerte Ausführung ein.

Im oben aufgeführten Skript wird davon ausgegangen, dass die Antwort eine fest Länge hat. Sollte das nicht der Fall sein, kann die Leseroutine nach dem Empfang eines festgelegten Endezeichen verlassen werden.

Um auch den Fall abzufangen, dass keine oder eine unvollständige Antwort gesendet wird, muss ein Timeout integriert werden, der nach Ablauf den Lesevorgang automatisch beendet:

					
						<?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 );
						?>
					
				

Im Gegensatz zum ersten Skriptbeispiel wird die Schnittstelle hier nicht-blockierend geöffnet. Während die Skriptausführung im ersten Beispiel in der Zeile $input .= dio_read($fd, 1); jeweils solange verharrt, bis ein Zeichen eingelesen wurde, wird im zweiten Beispiel die Zeile $input .= dio_read($fd);übersprungen, wenn kein seriell empfangenes Zeichen im Eingangspuffer liegt. Der Ausstieg aus der Leseschleife findet hier zeitgesteuert statt. Die Dauer des Lesevorgangs ist in der Variablen $TIMEOUT festgelegt.

Der garantierte Ausstieg aus der while-Schleife ermöglicht die Behandlung von Fehlern und sichert eine gleichbleibende Performance.

nach oben