Typ |
Funktionsbaustein |
Verfügbar ab: |
V1.0.4.0 |
Übernommen aus |
- |
Implementiert |
- |
Verbindung mit einem TCP-Server, um Daten auszutauschen.
Die Bibliothek stellt zwei Versionen des FB_TCPClient-Funktionsbausteins zur Verfügung. Der FB_TCPClient2 ist eine verbesserte Version, die Verbindungen über TLS (Transport Layer Security) unterstützt.
Ob eine Verbindung über TLS unterstützt wird, richtet sich nach der Steuerung, in der der FB_TcpClient2 verwendet wird. Im Handbuch zu Ihrer Steuerung finden Sie Informationen dazu, ob die TCP-Kommunikation über TLS unterstützt wird.
Das Funktionsprinzip für die beiden Funktionsbausteine ist identisch. Es gibt einige Unterschiede bei den angegebenen Eigenschaften und Methoden, die in den jeweiligen Kapiteln erläutert werden.
Üblicherweise wird zuerst die Methode Connect oder ConnectTls aufgerufen, dabei werden die Server-IP und der TCP-Port für die Verbindung angegeben. Anschließend wird der Wert der Eigenschaft State solange zyklisch abgerufen, bis er von Connecting abweicht. Lautet der Status nicht Connected, konnte die Verbindung nicht hergestellt werden. Prüfen Sie den Wert der Eigenschaft Result, um den Grund dafür zu ermitteln. Die Methode Close muss aufgerufen werden, bevor andere Verbindungsversuche gestartet werden.
Wenn der Status Connected ist und der Wert der Eigenschaft IsWritable TRUE ist, können Daten über die Methoden Send und Receive ausgetauscht werden.
Um zu prüfen, ob Daten zum Lesen vorliegen, kann die Eigenschaft IsReadable verwendet werden.
Die Methode Peek wird genau wie die Methode Receive eingesetzt. Der Unterschied besteht darin, dass die Daten beim Aufruf von Peek im Empfangspuffer des TCP-Stapels bleiben und mehrfach gelesen werden können. Auf diese Weise kann festgestellt werden, ob ausreichend Daten zur Verarbeitung angekommen sind, wenn die Länge nicht bestimmt werden kann, bevor die Daten tatsächlich verfügbar sind. Sind genügend Daten für eine ordnungsgemäße Verarbeitung eingegangen, entfernen Sie sie mithilfe der Methode Receive aus dem Empfangspuffer, damit ausreichend Platz für weitere eingehende Daten zur Verfügung steht.
Um zu erkennen, ob die Verbindung zum dezentralen Standort getrennt wurde, lesen Sie den Wert der Eigenschaft PeerHasDisconnected. Der Wert von State wird automatisch auf Shutdown geändert, wenn die Verbindung vom Server geschlossen wurde. In diesem Fall können vorhandene, nicht verarbeitete Daten weiterhin gelesen, aber keine Daten mehr gesendet werden.
Um die Verbindung ordnungsgemäß zu trennen, wird die Methode Shutdown aufgerufen. Der Verbindungsstatus wird auf Shutdown geändert, sodass eingehende Daten zwar gelesen, aber keine weiteren Daten gesendet werden können. Nachdem die eingehenden Daten gelesen und verarbeitet oder als nicht relevant eingestuft wurden, kann die Verbindung durch Aufrufen der Methode Close beendet werden.
Ist die Verarbeitung durch eine Methode nicht erfolgreich verlaufen, wird dies durch den Wert der Eigenschaft Result angegeben. Der Wert von Result muss nach jedem Methodenaufruf geprüft werden. Das Ergebnis kann auf Ok zurückgesetzt werden. Dazu dient die Methode ResetResult.
HINWEIS: Alle Methoden sind blockiert, solange der Wert der Eigenschaft Result ungleich Ok ist. Ein Methodenaufruf in diesem Fall wird ohne Beeinflussung der Informationen der Eigenschaft Result abgebrochen.
Der Funktionsbaustein weist keine Eingänge und Ausgänge auf. Die Funktionalität ist über Methode und Eigenschaften verfügbar. Der Funktionsbaustein muss in der Anwendung nicht direkt aufgerufen werden.
Implementierungsbeispiel für FB_Client2
PROGRAM LibDocu_TcpClient2
VAR
xConnect: BOOL;
xConnectTls: BOOL;
xClose: BOOL;
etResult: TCPUDP.ET_Result;
etState: TCPUDP.ET_State;
iState: INT;
fbTcpClient : TCPUDP.FB_TCPClient2;
stTlsSettings : TCPUDP.ST_TlsSettingsClient;
sIp: STRING(15) := '192.168.1.2';
uiPort : UINT := 12345;
END_VAR
CASE iState OF
0: // idle
IF xConnect OR xConnectTls THEN
IF xConnect AND_THEN fbtcpclient.Connect(sIp, uiPort) THEN
iState := 10;
ELSIF xConnectTls AND_THEN fbtcpclient.ConnectTls(sIp, uiPort, stTlsSettings) THEN
iState := 10;
ELSE
iState := 100; // error state
END_IF
xConnect := xConnectTls := FALSE;
END_IF
10: // connecting
CASE fbtcpclient.State OF
TCPUDP.ET_State.Connecting:
iState := 10; // stay in connecting
TCPUDP.ET_State.Connected:
iState := 20; // connected
ELSE
iState := 100; // unexpected state
END_CASE
20: // connected
IF xClose OR fbTcpClient.State = TCPUDP.ET_State.Shutdown THEN
xClose := FALSE;
fbTcpClient.Close();
END_IF
IF fbTcpClient.State = TCPUDP.ET_State.Closing THEN
;
ELSIF fbTcpClient.State = TCPUDP.ET_State.Idle THEN
iState := 0;
ELSIF fbTcpClient.State <> TCPUDP.ET_State.Connected THEN
iState := 100;
END_IF
(* your code comes here, e.g send data to the connected server *)
100: // error state
(* your code comes here*)
END_CASE
etResult := fbTcpClient.Result;
etState := fbTcpClient.State;