Übersicht
Das folgende Beispiel zeigt eine beispielhafte Implementierung eines „Echo“-Client/Server-Systems. Der Client sendet in bestimmten Abständen (z. B. jede Sekunde) einen Test-String zum Server. Der Remote-Server sendet diesen String wieder zurück an den Client.
In diesem Beispiel ist der Client sowohl in der SPS implementiert als auch in einer .NET-Anwendung, die in C# geschrieben wurde. Der SPS-Client kann verschiedene Kommunikationsinstanzen erzeugen, die mehrere TCP-Verbindungen gleichzeitig simulieren. Der unter .NET entwickelte Beispiel-Client stellt nur eine Verbindung her. Der Server in der SPS kann mit mehreren Clients kommunizieren.
Vom Server können zusätzlich mehrere Instanzen angelegt werden. Jede Server-Instanz wird dann über eine eigene Portnummer angesprochen, die der Client zum Aufbau einer Verbindung zu einer spezifischen Instanz nutzen kann. Die Server-Implementierung ist schwieriger, wenn der Server mit mehr als nur einem Client kommunizieren soll.
Sie können das Beispiel beliebig nutzen und für Ihre Zwecke anpassen.
Systemvoraussetzungen
- TwinCAT 3 Build 3093 oder höher
- TwinCAT 3 Function TF6310 TCP/IP
- Wird das Beispiel auf zwei Computern ausgeführt (ein Client und ein Server), muss die Function TF6310 auf beiden installiert sein.
- Wird das Beispiel auf einem Computer ausgeführt (z. B. Client und Server laufen in zwei separaten SPS-Laufzeiten), müssen beide SPS-Laufzeiten in separaten Tasks laufen.
- Zum Ausführen des .NET-Beispielclient ist nur .NET Framework 4.0 nötig.
Projektdownloads
https://github.com/Beckhoff/TF6310_Samples/tree/master/PLC/TCP/Sample01
https://github.com/Beckhoff/TF6310_Samples/tree/master/C%23/SampleClient
Projektbeschreibung
Für jede der erwähnten Komponenten ist eine Dokumentation verfügbar, welche im Folgenden verlinkt wurde. Ein separater Artikel erklärt Schritt für Schritt, wie die SPS- Beispiele eingerichtet und gestartet werden.
- Integration in TwinCAT und Test (Start der SPS Beispiele)
- SPS-Client (SPS-Client-Dokumentation: FB_LocalClient function block)
- SPS-Server (SPS-Server-Dokumentation: FB_LocalServer function block)
- .NET-Client (.NET-Client-Dokumentation: .NET sample client)
Zusätzliche Funktionen der SPS-Beispielprojekte
In den Beispielprojekten werden einige Funktionen, Konstanten und Funktionsbausteine benutzt, die im Folgenden kurz beschrieben werden sollen:
LogError-Funktion
FUNCTION LogError : DINT

Die Funktion schreibt eine Meldung mit dem Fehlercode in das Logbuch des Betriebssystems (Event Viewer). Die globale Variable bLogDebugMessages muss zuerst auf TRUE gesetzt werden.
LogMessage-Funktion
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 zuerst auf TRUE gesetzt werden.
SCODE_CODE-Funktion
FUNCTION SCODE_CODE : DWORD

Die Funktion maskiert die niederwertigsten 16 Bits eines Win32-Fehlercodes aus und liefert diese zurück.
Globale Variablen
Name | Default-Wert | Beschreibung |
---|---|---|
bLogDebugMessages | TRUE | Aktiviert/deaktiviert das Schreiben von Nachrichten ins Logbuch des Betriebssystems |
MAX_CLIENT_CONNECTIONS | 5 | Max. Anzahl der Remote-Clients, die eine Verbindung zum Server gleichzeitig aufbauen können; |
MAX_PLCPRJ_RXBUFFER_SIZE | 1000 | Max. Länge des internen Empfangspuffers |
PLCPRJ_RECONNECT_TIME | T#3s | Nach Ablauf dieser Zeit versucht der Local-Server den Listener-Socket neu zu öffnen |
PLCPRJ_RECEIVE_POLLING_TIME | T#1s | In diesem Zyklus liest (pollt) der Server Daten |
PLCPRJ_RECEIVE_TIMEOUT | T#50s | Nach Ablauf dieser Zeit bricht der Server den Empfang ab, wenn keine Datenbytes empfangen werden konnten |
PLCPRJ_ACCEPT_POLLING_TIME | T#1s | In diesen Zeitabständen versucht der Local-Server die Verbindungsanforderungen des Remote-Clients anzunehmen (akzeptieren); |
PLCPRJ_ERROR_RECEIVE_BUFFER_OVERFLOW | 16#8101 | Fehlercode Beispielprojekt: Zu viele Zeichen ohne Nullterminierung empfangen |
PLCPRJ_ERROR_RECEIVE_TIMEOUT | 16#8102 | Fehlercode Beispielprojekt: Bis zum Timeout konnten keine neuen Daten empfangen werden (PLCPRJ_RECEIVE_TIMEOUT) |