Für das Erstellen von Windows-Anwendungen
war Visual C++ bis vor kurzem eine der meistgenutzten Entwicklungsplattformen.
Inzwischen arbeiten aber immer mehr Programmierer mit dem .Net Framework
und erstellen ihre Anwendungen in C# (C Sharp).
Mit dem folgenden C# Programmbeispiel können Sie Ihr Web-IO Digital
mit seinen Inputs und Outputs in einer Windows-Anwendung abbilden. Darüber
hinaus können Sie die Outputs des Web-IO schalten.
Sie haben noch kein Web-IO® und möchten das vorgestellte Beispiel
einfach mal ausprobieren?
Kein Problem: Wir stellen Ihnen das Web-IO Digital 2xInput, 2xOutput
gerne kostenlos für 30 Tage zu Verfügung. Einfach Musterbestellung
ausfüllen, wir liefern das Web-IO zum Test auf offene Rechnung.
Wenn Sie das Gerät innerhalb von 30 Tagen zurück schicken,
schreiben wir die Rechnung komplett gut.
mit einer IP-Adresse versehen - mit WuTility
kein Problem
1. Zusammenstellen der verschiedenen Bedienelemente und Anzeigeobjekte
im Form
2. Importieren von Ressourcen und Deklaration von Membervariablen
Als erstes werden alle für die Netzwerkverbindung und die GUI(Graphical
User Interface) benötigten Klassen importiert.
using
System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net; using System.Net.Sockets; using System.Text;
Anschließend werden die Komponenten der Applikation und wichtige
Variablen für eine TCP-Verbindung als Membervariablen der Klasse
deklariert und somit den Methoden der Klasse zugänglich gemacht.
Einrichten der Bedienelemente
Die Gruppe mit den Bedienelementen für das Web-IO wird zunächst
für die Bedienung gesperrt. Sobald eine Verbindung zu Stande kommt,
werden alle Elemente freigeschaltet, welche eine sinnvolle Ausführung
besitzen.
Der Name des jeweiligen Bedienelementes ist dem Kontext nach vom Element
selbst abgeleitet. Die beiden ersten Zeichen im Namen stehen für
den Typ des Elementes (cb -> Checkbox, bt -> Button, gb ->
Groupbox und
tb-> TextBox).
Einleiten der Verbindung
Nach Eingabe der IP-Adresse des Web-IO in das Textfeld tb_IP und dem
Port 80 in das Textfeld tb_Port kann durch Betätigung des Buttons
bt_Connect eine Verbindung aufgebaut werden. Falls keine IP-Adresse
oder kein Port eingetragen wird, erfolgt eine Meldung durch die Applikation
in der Statusleiste.
Verbindungsaufbau
Um nun eine TCP-Verbindung aufbauen zu können, wird die bereits
deklarierte Socketvariable initialisiert. Dabei wird ihr ein Stream
und die Art der Verbindung übergeben. Zudem wird eine Variable
erzeugt, welche den Port und die IP-Adresse speichert.
Damit das Programm asynchron arbeiten kann, wartet es nicht auf Ereignisse,
sondern arbeitet mit Callback-Routinen. Callback-Methoden werden iniealisiert,
wenn ein Prozess gestartet wird und aufgerufen, wenn das entsprechende
Ereignis eintritt, also z.B. beim Verbindungsaufbau, beim Senden oder
Empfangen.
private void bt_Connect_Click(object
sender, System.EventArgs e)
{ try
{ if((tb_IP.Text != "")
&& (tb_Port.Text == "80"))
{
client = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipep = new
IPEndPoint(IPAddress.Parse(tb_IP.Text), int.Parse(tb_Port.Text));
client.BeginConnect(ipep,
new AsyncCallback(connectCallback), client);
} else
statusBar.Text = "IP
and Port needed!";
} catch(SocketException)
{ statusBar.Text = "Connection not possible!";
}
}
Im Folgenden wird die Callback-Routine dargestellt,
die bei Zustandekommen der Verbindung aufgerufen wird.
Nach erfolgreichem Verbindungsaufbau werden alle nützlichen Bedienelemente
der Applikation freigschalten und der Connect Button deaktiviert.
Ausserdem beginnt die Applikation sofort damit, sich empfangsbereit
zu stellen. Dafür wird die Callback-Routine "receiveCallback"
initialisiert, welche weiter unten näher erläutert wird.
Trennen der Verbindung
Die Verbindung bleibt solange bestehen, bis sie vom Benutzer durch
Klick auf den Disconnect-Button oder durch das Web-IO beendet wird.
Nach Betätigung des Buttons wird eine Meldung ausgegeben, dass
die Verbindung beendet wird.
Wenn die Verbindung abgebaut wird, müssen alle
Elemente wieder in ihre Ausgangsstellung gebracht werden. Es soll
dann nicht mehr möglich sein, den Disconnect-Button zu betätigen.
gb_ioControlBox.Enabled = false; bt_Disconnect.Enabled = false; bt_Connect.Enabled = true; } catch(Exception) { statusBar.Text = "Not able to disconnect!";
}
}
Nun ist die Verbindung wieder beendet und die Applikation
auf ihren Ausgangszustand zurückgesetzt.
5. Bedienung und Kommunikation von Client-Seite
Sobald eine Verbindung mit dem Web-IO zustande gekommen ist, kann
der Anwender durch Bedienung der entsprechenden Programmelemente Kommandos
an das Web-IO senden.
Beim Senden einer Nachricht an das Web-IO wird genauso
wie beim Empfang eine Callback-Routine aufgerufen.
Setzen der Outputs
Die Outputs des Web-IO können mit Hilfe der beiden Checkboxen
cb_Output0 und cb_Output1 geschaltet werden. Die Checkbox löst,
wenn sie geklickt wird eine Aktion aus. Abhängig davon, ob die
Checkbox bereits gesetzt ist, wird der Output entweder auf On oder
auf OFF gesetzt.
Da alle Counterzustände mit einem Kommando
gelesen oder zurückgesetzt werden können, muss noch eine
Methode implementiert werden, welche den Antwortstring des Web-IO
bearbeitet und jedem Counter in der Applikation seinen spezifischen
Zustand zuordnet.
Alle Kommandos und Anfragen an das Web-IO werden mit einem Antwort-String
quittiert. Die Antworten haben je nach Type einen spezifischen Aufbau:
Für die Outputs: output;<Binärwert des Outputstatus im
hexadezimalen Format>
Für einen speziellen Output: outputx;<ON oder OFF>
Für die Inputs: input;<Binärwert des Outputstatus im hexadezimalen
Format>
Für einen speziellen Input: inputx;<ON oder OFF>
Dann gibt es noch den Antwortstring für einen Counter der folgendermassen
aussieht.
Counter: counterx;<dezimaler Zählerstand>
oder counter;<dezimaler Zählerstand 0 >; <dezimaler Zählerstand
0 >; ... wenn alle Counter auf einmal gelesen werden sollen.
Alle Antwort-Strings sind mit einem 0-Byte abgeschlossen.
In unserer Applikation wird zum Empfang einer solchen Nachricht die
Methode receiveCallback() aufgerufen. In dieser Methode wird der Antwortstring
gelesen und verarbeitet. Das besondere an diese Funktion ist der eventgesteuerte
Aufruf., der erfolgt sobald das Web-IO Daten an die Anwendung sendet.
Zyklisches Abfragen bestimmter Werte
Es ist wünschenwert, dass sich der Status einer einzelnen Komponente
von selbst aktualisiert und somit die Applikation immer den aktuellen
Stand aufweist. Dazu wird in diesem Progamm ein Timer verwendet, der
in einem vom User betimmten Zeitintervall zyklisch Abfragen an das Web-IO
schickt.
Das Zeitintervall kann im Feld IDC_POLLINGTEXT festgelegt werden.
Natürlich wird auch abgefangen falls der Nutzer eine unsinnige
Angabe, wie z.B. einen negativer Zeitwert macht.
Um auch das zyklische Abfragen der Zustände des
Web-IO durchzuführen, was auch als Polling bezeichnet wird, besteht
die Auswahlmöglichkeit zwischen dem Polling der Outputs, der
Inputs oder der Counter.
Je Polling-Variante wird je ein eigener Timer initialisiert.
Betätigt man die Checkbox cb_Polling_Outputs ,wird das Polling
auf die Outputs angewendet. Dazu wird der entsprechende Timer initialisiert.
Das Beispiel Programm unterstützt
alle gängigen Funktionen des Web-IO im Kommando-String Modus, optimiert
für das Web-IO 2x
Digital Input, 2x Digital Output. Für die anderen Web-IO Modelle
müssen ggf. Anpassung am Programm vorgenommen werden. Weitere Programmbeispiele
zur Socket-Programmierung finden Sie auf den Tool-Seiten
zum Web-IO. Eine Detaillierte Beschreibung zur Socketschnittstelle der Web-IO
Digital Modelle finden Sie im Referenzhandbuch.