Steuerungen übers Internet mit Elexol Ether IO2...

Steuerungen über Internet mit Elexol Ether IO24 TCP - Teil 2

Hinweis: Sie finden unsere Tutorials interessant und hilfreich? Das freut uns sehr und wir haben lange überlegt, wie wir sie noch besser und professioneller unterstützen können. Aber das geht leider nicht ganz kostenlos. Deshalb werden wir die Tutorials in der bisherigen Form nicht weiterführen, sondern sie als umfangreiche und attraktive Videokurse auf der Lernplattform Udemy anbieten. Der Anfang ist gemacht und der „Große Arduino-Lehrgang: vom Anfänger zum Profi“ steht jetzt zur Verfügung.


Steuerungen, Messungen und Überwachungen über das lokale Netzwerk oder das Internet haben einen großen Reiz, denn Sie haben praktisch von jedem Punkt der Welt Zugriff darauf. Solche Systeme waren allerdings früher nur den absoluten Spezialisten vorbehalten, denn der Hardware- und vor allem der Software-Aufwand war enorm. Ganz anders sieht das mit einem modernen Control-Server wie mit dem EtherIO24 von Elexol aus.

 

Nachdem wir im 1. Teil dieser Tutorial-Reihe die Inbetriebnahme und die Konfiguration des Netzwerk-Interfaces EtherIO24 von Elexol über das integrierte Web-Interface durchgeführt haben, wollen wir uns jetzt die Programmierung des Boards in Java anschauen. Damit ist es uns möglich, eigene Anwendungen zu erstellen, die auf das Netzwerk-Interface schreibend und lesend zugreifen. 

 

Für die Software-Entwicklung nutze ich die kostenlose Java-IDE "Netbeans". Sie können allerdings jede beliebige Entwicklungsumgebung einsetzen, denn es werden keine spezifischen Funktionen genutzt. Damit Sie sich ausschließlich auf die Netzwerk-Problematik konzentrieren können, werde ich auch keine Buttons oder sonstige Steuerelemente einbauen. Es geht auch nicht um eine besonders elegante oder sichere Programmierung, sondern lediglich um die Vermittlung der funktionalen Zusammenhänge. 

 

Die simple Aufgabenstellung lautet: 

 

Das Programm soll über das lokale Netzwerk einen bestimmten Wert an das EtherIO24 TCP senden und so eine Ausgabe erzeugen. Durch die Reduzierung auf lediglich die notwendigsten Schritte erhalten Sie ein Gefühl dafür, wie die Kommunikation über TCP/IP abläuft. 

IP- und Port-Adresse 

 

(Falls Sie sich mit den Grundlagen der Netzwerk-Kommunikation über TPC/IP auskennen, können Sie dieses Kapital überspringen.)

Die Kommunikation (Adresssierung)  innerhalb eines Netzwerkes mit TCP/IP-Protokoll (also auch im Internet) läuft generell über IP-Adressen ab. Auch wenn der Teilnehmer (z. B. Server) über einen Klartextnamen verfügt (z. B. www.boecker-systemelektronik.de) wird letztendlich dieser Name von einem DNS-Server in eine IP-Adresse gewandelt. Jeder Netzwerkteilnehmer hat somit eine eindeutige IP-Adresse. In einem Computer können sich allerdings mehrere Netzwerkadapter (Teilnehmer) befinden, somit kann er auch über mehrere IP-Adressen verfügen. Außerdem kann ein Teilnehmer wiederum mehrere Anwendungen ausführen. So kann ein Server unter einer bestimmten IP-Adresse evtl. einen Web-Server zur Verfügung stellen, aber auch einen FTP- oder Mail-Server oder beliebige andere Programme. Welche Anwendung angesprochen wird, bestimmen sogenannte Port-Adressen, die mit der IP-Adresse aufgerufen werden.

 

So läuft auf dem EtherIO24 TCP z. B. ein kleiner Web-Server, den wir im 1. Teil des Tutorials angesprochen haben. Den erreichen wir über die Port-Adresse "80", die allgemein für Web-Server genutzt wird. Korrekt würde der Aufruf des Web-Servers im EtherIO24 TCP also nicht "192.168.1.10" lauten, sondern "192.168.1.10:80". Die Portadresse wird der IP-Adresse nach einem Doppelpunkt angehängt. Wir müssen das nur explizit nicht tun, weil der Browser standardmäßig davon ausgeht, dass es sich beim Aufruf einer IP-Adresse um eine Web-Server-Anwendung handelt, die 80 wird automatisch angehängt. Um die Funktionen der Firmware in unserem EtherIO24 TCP aufrufen zu können, steht uns der Port "2424" zur Verfügung.

Kommunikation in 3 Schritten  

 

Ganz allgemein und nahezu unabhängig von der eingesetzten Programmiersprache werden bei einer Kommunikation über TCP/IP die folgenden Schritte notwendig:

 

1. Wir erzeugen ein Socket-Objekt. Dieses Objekt liefert uns alle notwendigen Methoden und Variablen für die Kommunikation.

 

2. Wir erzeugen einen Output- und einen Input-Stream, die wir mit dem Socket-Objekt verbinden.

 

3. Wir führen die "write"- bzw. "read"-Funktionen des jeweiligen Datenstroms (Input- oder Output) aus.

 

Nachdem wir die Kommunikationsschnittstelle nicht mehr benötigen, schließen wir das Socket-Objekt wieder, um die Ressourcen freizugeben. Hört sich eigentlich ganz einfach an und genau das ist es auch! Setzen wir das Ganze nun in ein konkretes Programm um. 

 

Legen Sie ein neues Projekt an und vergeben Sie einen package-Namen. In unserem Fall ist das "elexol-test". In diesem Package befindet sich lediglich eine Klasse, die den Namen "Elexol-Test" bekommt. Das Programm wird also als "Elexol-Test.java" abgespeichert, falls Sie mit einem einfachen Text-Editor arbeiten.

 

Code_1

 

Zeile 2 +3: Zunächst brauchen wir 2 Importe, nämlich: "java.net.*" und "java.io.*" in denen sich alle Klassen befinden, die wir einsetzen wollen.

 

Zeile 9: Um Daten auszugeben, benötigen wir einen Puffer, in dem wir die Werte speichern und dann der Ausgabefunktion übergeben können. Dieses Byte-Array wird in Zeile 9 definiert.

 

Zeile 13: Nun erzeugen wir unseren Socket, den wir sock nennen. Es gibt diverse Konstruktoren, um einen Socket zu erzeugen, da wir die IP-Adresse und den Port kennen, wählen wir diese Variante. Hier kommt nun auch unser Port 2424 zum Einsatz.

 

Zeile 14: Da wir lediglich einen Wert ausgeben wollen, genügt uns ein Output-Stream, den wir "out" nennen und mit dem Output-Stream unseres sock-Objektes verbinden. 

 

Zeile 16 + 17: Nun schreiben wir die Werte "A" und 0x55 in unseren Puffer. Bei der Zeichenvariable "A" handelt es sich um einen Befehl, den wir der Firmware übergeben. Die Auflistung aller Befehle für den EtherIO24 TCP finden Sie im Handbuch. "A" bedeutet Ausgabe auf Port A und der hexadezimale Wert "0x55" bedeutet binär: 0101.0101 (jede 2. LED müsste also leuchten).

Auszug aus der Befehlsliste des EtherIO24 TCP:

Befehle_klein

 

Zeile 18: Wir schreiben den Puffer in den Output-Stream und damit senden wir ihn über das TCP/IP-Protokoll an den definierten Internet-Endpunkt "192.168.1.10:2424".

 

Zeile 20: Wir schließen den Socket wieder und geben die Ressourcen frei. 

Falls noch nicht geschehen, schließen Sie nun das Elexol EtherIO24 TCP wie im 1. Tutorial beschrieben an, compilieren das Programm und starten es. Nun sollten Sie das folgende Bild sehen:

Status_Board_1

 

Falls dies nicht der Fall ist, kann es den folgenden Grund haben: 

Wir haben in diesem Programm lediglich einen Ausgabebefehl ausgeführt ohne jede Konfiguration vorzunehmen. Damit das Programm auch wie gewünscht funktioniert, muss der Port als Ausgang konfiguriert werden.  Diese Einstellungen können Sie in der Web-Konfiguration unter "Power-Up-Options" vornehmen. Danach sollte das Programm funktionieren. Wir können die Konfiguration natürlich auch programmtechnisch vornehmen und das werden wir im folgenden tun. 

 

Kommandostruktur des EtherIO23 TCP 

 

Ein erstes Kommando haben wir gerade schon genutzt, nämlich des Befehl "A" gefolgt von dem Parameter 0x55. Natürlich ist das "A" auch nichts anderes als ein Byte, das hexadezimal einer 0x41 entspricht. Elexol hat für die Befehle einfach nur die ASCII-Schreibweise gewählt, weil man sich die Bedeutung so leichter merken kann. So entspricht der Befehl "A" dem Schreiben auf Port A, der Befehl "B" schreibt Daten an den Port BIn Kleinschreibweise wiederum führen die Befehle a, b und c Lesebefehle für die jeweiligen Ports aus. 

 

Um den Port A des EtherIO24 PIC als Ausgang zu schalten, müssen alle Bits im Datenrichtungsregister auf 0 gesetzt werden. Wir benötigen also einen Befehl zum Schreiben ins Datenrichtungsregister von Port A, das ist der Befehl "!A" und dorthin schreiben wir das Byte 0x00

outBuf[0] = '!';

outBuf[1] = 'A';

outBuf[2] = 0x00;

out.write(outBuf);

Den obigen Code müssen Sie vor dem Schreiben der Daten (also vor Zeile 16) ins Programm einfügen. Nach diesem Prinzip funktioniert die gesamt Kommunikation:

Entsprechende Daten im Ausgabespeicher eingeben und dann den Speicherinhalt schreiben. 

 

Schauen wir uns noch an, wie das Lesen vom EtherIO24 TCP funktioniert. Im Grunde ist es der gleiche Ablauf und für einen kleinen Test gibt es auch einen passenden Befehl, nämlich den ASCII-Code "IO24". Wird dieser Befehl ans Board gesendet, antwortet das EtherIO24 mit dem gleichen Befehlscode "IO24" gefolgt von 8 Datenbyte, die die MAC-Adresse des EtherIO24-Moduls enthalten und 2 Byte, in der sich die Firmware-Version befindet. Der Java-Code des vollständigen Programms sieht folgendermaßen aus:

 

Prog2_Teil1

 

Im 1. Teil des Programms hat sich im  Vergleich zum ersten Beispiel nicht sehr viel geändert:

 

Zeile 10: Zusätzlich zum Ausgangspuffer definieren wir noch einen Eingangspuffer. Das wäre im Prinzip nicht notwendig, denn wir könnten einen Puffer für beide Aufgaben nutzen, da wir die Speicher nacheinander einsetzen.

 

Zeile 18: Neben dem Output-Stream holen wir uns jetzt auch den Input-Stream des Socket-Objekts "sock" und initialisieren damit das Objekt "in". 

 

Zeile 20 - 23: Die Zeichenfolge "IO24" wird in den Ausgangspuffer geschrieben.

 

Zeile 24: Senden des Ausgangspuffers über den Output-Stream "out".

 

Das Elexol-Board hat nun das entsprechende Kommando erhalten und sollte entsprechend antworten. Das prüfen wir wie folgt:

 

Prog2_Teil2

 

Zeile 26: Wir lesen den Input-Stream, der ja mit unserem Socket verbunden ist,  in den Eingangspuffer. 

Zeile 28 - 54: Nun folgen die formatierten Ausgaben. Zunächst werden die 4 ersten Byte ausgegeben, die den zurück gegebenen Befehl beinhalten, danach folgt in hexadezimaler Schreibweise und durch Doppelpunkt getrennt die MAC-Adresse und am Schluss noch die Firmware-Version.

Prog2_Teil3

 

Zeile 56 - 58: Bleibt nur noch, die beiden Streams und den Socket wieder zu schließen. 

 

Wenn wir das Programm jetzt so übersetzen und dann z. B. auf der Kommandozeilenebene aufrufen, erhalten wir die folgende Ausgabe:

 

Prog2_Start 

 

Ein Blick auf das Typenschild unter dem Elexol-Board beweist, dass die Angabe der MAC-Adresse korrekt ist. Wir haben also erfolgreich einen Befehl zum Board gesendet und das Ergebnis eingelesen. In der beschriebenen Art und Weise können Sie von jedem Punkt Ihres Netzwerks das Elexol-Board ansprechen und von dort Sensordaten einlesen oder Informationen ans Board senden und entsprechende Aktionen ausführen. 

 

Sagen Sie uns Ihre Meinung zu diesem Tutorial, damit wir noch besser auf Ihre Wünsche eingehen können. Das Feedback-Formular finden Sie hier. 

 

Für weitere Informationen und Bestellungen einfach auf nachfolgende Links klicken:

Elexol EtherIO24 TCP

Elexol I/O Port-Status Board

 

Falls Sie Fragen zum Thema haben, wenden Sie sich einfach an uns.

Wir helfen Ihnen gern weiter!

 

Ihr Team von Böcker Systemelektronik

 

Hinweis: Unser Tutorialangebot wird in unregelmäßigen Abständen erweitert. Wenn Sie sofort über eine Neuerscheinung informiert werden möchten, tragen Sie sich bitte hier in unsere Benachrichtigungsliste "Tutorials" ein. Sie können diesen unverbindlichen Service jederzeit in Ihrem Kundenkonto oder per E-Mail wieder abbestellen.  

 

 

Copyright © Böcker Systemelektronik