TCP Beispiel
Das folgende Beispiel zeigt eine Implementierung eines "Echo"-Clients/-Servers. Der Local-Client soll lediglich einen Test-String zum Remote-Server in bestimmten Abständen (z.B. jede Sekunde) senden. Der Remote-Server soll darauf sofort den gleichen String unverändert an den Client zurücksenden.
Der Client soll als Funktionsbaustein implementiert werden, von dem mehrere Instanzen angelegt werden können. Zudem soll der Server mit mehreren Clients kommunizieren können.
Von dem Server können auch mehrere Instanzen angelegt werden. Jede Server-Instanz wird dann über eine andere Portnummer angesprochen. Die Serverimplementierung ist schwieriger, wenn der Server mit mehr als nur einem Client kommunizieren soll. Außerdem wird eine Implementierung eines passenden Clients in .NET vorgestellt. Das Beispiel kann als Ansatz benutzt werden um eigene, komplexere Implementierungen realisieren zu können.
Systemvoraussetzungen
- TwinCAT v2.8 oder höher. Level: Mindestens TwinCAT PLC.
- Installierter TwinCAT TCP/IP Connection Server. Wenn Sie für den Test zwei PCs benutzen, dann sollte der TwinCAT TCP/IP Connection Server auf beiden PCs installiert werden. Auf einem CX-Sytem muss das entsprechende CAB-File installiert werden.
Projektsourcen
Projektbeschreibung
Hilfsfunktionen im Beispielprojekt
Im Beispiel werden einige Funktionen, Konstanten und Funktionsbausteine benutzt, die im Folgenden kurz beschrieben werden müssen:
FUNCTION LogError : DINT
Die Funktion schreibt eine Meldung mit dem Fehlercode in das Logbuch des Betriebssystems (Event Viewer). Die globale Variable bLogDebugMessages muss vorher auf TRUE gesetzt werden.
FUNCTION LogMessage : DINT
Die Funktion schreibt eine Meldung in das Logbuch des Betriebssystems (Event Viewer), wenn ein neuer Socket geöffnet oder geschlossen wurde. Die globale Variable bLogDebugMessages muss vorher auf TRUE gesetzt werden.
FUNCTION SCODE_CODE : DWORD
Die Funktion maskiert die niederwertigsten 16Bits eines Win32 Fehlercodes aus und liefert diese zurück.
Globale Konstanten/Variablen
Name | Default value | Description |
---|---|---|
bLogDebugMessages | TRUE | Aktiviert/Deaktiviert das Schreiben der Meldungen in das Logbuch des Betriebssystems; |
MAX_CLIENT_CONNECTIONS | 5 | Maximale Anzahl der Remote-Clients, die eine Verbindung zum Server gleichzeitig aufbauen können; |
MAX_PLCPRJ_RXBUFFER_SIZE | 1000 | Maximale Länge des internen Empfangspuffers; |
PLCPRJ_RECONNECT_TIME | T#3s | SERVER: Nach Ablauf dieser Zeit versucht der Local-Server den Listener-Socket neu zu öffnen; CLIENT: Nach Ablauf dieser Zeit versucht der Local-Client die Verbindung zum Remote-Server wiederherzustellen; |
PLCPRJ_SEND_CYCLE_TIME | T#1s | In diesen Abständen wird der Test-String vom Local-Client zum Remote-Server zyklisch gesendet; |
PLCPRJ_RECEIVE_POLLING_TIME | T#1s | SERVER und CLIENT: In diesem Zyklus werden die Empfangsdaten gelesen (gepollt); |
PLCPRJ_RECEIVE_TIMEOUT | T#10s (CLIENT) | SERVER: Nach dieser Zeit bricht der Local-Server den Empfang ab, wenn in dieser Zeit keine Datenbytes empfangen werden konnten; CLIENT: Nach dieser Zeit bricht der Local-Client den Empfang ab, wenn in dieser Zeit keine Datenbytes empfangen werden konnten; |
PLCPRJ_ACCEPT_POLLING_TIME | T#1s | In diesen Zeitabständen versucht der Locale-Server die Verbindungsanforderungen des Remote-Clients anzunehmen (akzeptieren); |
PLCPRJ_ERROR_RECEIVE_BUFFER_OVERFLOW | 16#8101 | Interner Beispielprojekt-Fehlercode: Es wurden zu viele Zeichen ohne Nullterminierung empfangen; |
PLCPRJ_ERROR_RECEIVE_TIMEOUT | 16#8102 | Interner Beispielprojekt-Fehlercode: Es konnten keine neue Daten innerhalb der Timeoutzeit (PLCPRJ_RECEIVE_TIMEOUT) empfangen werden. |