Quick Start
Das folgende Kapitel ermöglicht einen Schnelleinstieg in das Produkt TwinCAT TCP/IP. Die Anleitung basiert auf dem entsprechenden Download in unseren Beispielen und kann als fertiges TwinCAT-Projekt heruntergeladen werden. Im folgenden werden die einzelnen Bestandteile der Applikation näher erläutert.
Das TwinCAT-Projekt implementiert eine TCP/IP Client/Server Applikation, welche als Client eine Nachricht an den Server sendet und die gleiche Nachricht entsprechend zurück erhält. Das TwinCAT-Projekt kann direkt aktiviert werden und startet sofort seinen Programmablauf. Die Kommunikation zwischen Client und Server erfolgt über localhost.
MAIN
Im MAIN Programm werden zunächst einmal die entsprechenden Variablendeklarationen für den Client und den Server vorgenommen. Client und Server sind durch zwei Funktionsbausteine gekapselt, welche die entsprechenden Funktionsbausteine aus der Tc2_TcpIp Bibliothek verwenden, um die Socket-Funktionen (Send, Receive, Listen, Connect, usw.) aufzurufen.
Für den Client werden die folgenden Variablen deklariert:
fbTcpClient1: FB_TCPClient;
sClient1SendData : STRING(255);
nServer1Port : UDINT := 12000;
sServer1Host : T_IPv4Addr := '';
bStartClient1Communication : BOOL := TRUE;
tClient1CycleTime : TIME := T#0.5S;
bClient1SendTrigger : BOOL;
bClient1Connected : BOOL;
sClient1ReceivedData : STRING(255);
bClient1Busy : BOOL;
bClientError1 : BOOL;
nClient1ErrorID1 : UDINT;
Für den Server werden die folgenden Variablen deklariert:
fbTcpEchoServer1 : FB_TCPServer;
sServerReceivedData : STRING(255);
bStartServer1Communication : BOOL := TRUE;
bServer1Connected : BOOL;
sServerData : STRING(255);
bServer1Busy : BOOL;
bServer1Error : BOOL;
nServer1ErrorID : UDINT;
Die zu verschickende Nachricht wird in der Variablen sClient1SendData gespeichert. Im späteren Ablauf des Programms wird der Wert dieser Variablen zyklisch verändert. Konkret wird durch String-Konkatenation ein Counter-Wert an die Variable angehängt.
IF bAutogenerateData AND bClient1Connected THEN
fbTimer1(IN:= NOT fbTimer1.Q, PT:= tClient1CycleTime, Q=> , ET=> );
IF fbTimer1.Q THEN
sClient1SendData := Concat('TestString No.', UDINT_TO_STRING(nCnt));
fbTcpClient1.bSendTrigger := TRUE;
nCnt := nCnt + 1;
ELSE
fbTcpClient1.bSendTrigger := FALSE;
END_IF
END_IF
Der Takt in dem der Variablenwert gesetzt und versendet wird, wird durch den Timer fbTimer1 definiert. Durch das Setzen der Variablen fbTcpClient1.bSendTrigger wird der Sendevorgang gestartet.
Die Server-Applikation wird durch die Funktionsbaustein-Instanz fbTcpEchoServer1 repräsentiert. Diese wird zyklisch im Programmablauf angesteuert, damit über die State Machine des Servers entsprechend Nachrichten empfangen werden können.
fbTcpEchoServer1(
sLocalHost := '',
nLocalPort := nServer1Port,
bStartCommunication := bStartServer1Communication,
bConnected => bServer1Connected,
sSendData => sServerData,
bBusy=> bServer1Busy,
bError=> bServer1Error,
nErrorID=> nServer1ErrorID);
Über den Eingang nLocalPort wird der eingehende TCP-Port des Servers definiert. Der Client verbindet sich mit diesem Port, um Daten mit dem Server auszutauschen. Wenn Sie dieses Beispiel dahingehend modifizieren, dass die Kommunikation zwischen Client und Server über das Netzwerk durchgeführt werden soll, so stellen Sie sicher, dass der Server-Port in der Firewall Ihres Systems geöffnet ist.
![]() | Schließen der Sockets Beim Neustart des TwinCAT-Projekts wird über die Variable bInit das Schließen aller aktiven Socketverbindungen veranlasst. Dies erfolgt am Anfang des Programmablaufs. |
FB_TCPServer
Dieser Funktionsbaustein kapselt die Serveranwendung und verwendet die Funktionsbausteine aus der Bibliothek Tc2_TcpIp, um eine Socket-Verbindung für den Server einzurichten, auf eingehende Nachrichten zu lauschen und eine entsprechende Antwort zurück zu schicken. Konkret werden hierfür die Funktionsbausteine FB_SocketAccept, FB_SocketListen, FB_SocketReceive, FB_SocketSend, FB_SocketClose und FB_SocketCloseAll verwendet.
Die interne State Machine des Funktionsbausteins basiert auf den folgenden Schritten:
State | Beschreibung |
---|---|
0 | Initial-Zustand. Über die Variable bStartCommunication wird der Ablauf gestartet. |
10 | In diesem Zustand wird der Socket Listener gestartet, d.h. die Serveranwendung bindet sich an den definierten TCP-Port. |
20 | In diesem Zustand wird eine eingehende Socket-Verbindung akzeptiert. |
30 | In diesem Zustand wird eine Nachricht von dem verbundenen Client empfangen. |
35 | In diesem Zustand wird eine Nachricht an den verbundenen Client zurückgesendet. |
40-42 | In diesen Zuständen werden die Socket-Verbindungen geschlossen. |
FB_TCPClient
Dieser Funktionsbaustein kapselt die Client-Anwendung und verwendet die Funktionsbausteine aus der Bibliothek Tc2_TcpIp, um eine Verbindung zum Server aufzubauen, eine Nachricht an den Server zu senden und eine entsprechende Rückantwort zu erhalten. Konkret werden hierfür die Funktionsbausteine FB_SocketConnect, FB_SocketSend, FB_SocketReceive und FB_SocketClose verwendet.
Die interne State Machine des Funktionsbausteins basiert auf den folgenden Schritten:
State | Beschreibung |
---|---|
0 | Initial-Zustand. Über die Variable bStartCommunication wird der Ablauf gestartet. |
10 | In diesem Zustand wird eine Verbindung mit dem Server aufgebaut. |
15 | In diesem Zustand wird eine Nachricht an den Server gesendet und die Rückantwort verarbeitet. |
20 | In diesem Zustand wird die Verbindung zum Server geschlossen. |