Hallo,

Ich beschäftige mich derzeit mit einer TCP-Verbindung zwischen Festo CPX-Steuerungen. Dabei bin ich auf 3 unterschiedliche Methoden der Socket-Übertragung gestoßen (CoDeSys):


  1. synchron (blocking)
    • Funktionen, wie z. B. accept, send, receive, blockieren.
    • Das Programm bleibt bei der blockierenden Funktion stehen.
    • über select
  2. non-blocking
    • Socket wird mit ioctl auf non-blocking gesetzt.
    • "Fehlermeldung" wouldblock, wenn blockierende Funktionen blockieren würden
    • Programm läuft dann weiter
  3. asynchron

Nummer 3 fällt schon mal weg, da IMHO keine entsprechende Funktion für CoDeSys exisitert.

Die 2. Möglichkeit habe ich integriert, das läuft soweit auch gut.
Meine Frage wäre, ob jemand hier bereits Erfahrungen mit der 1. Möglichkeit gemacht hat.

Meine Erfahrungen:
Bei der Verwendung von select blockiert die Funktion accept nicht:
Code:
sockaddr_size := SIZEOF(sockaddr);
    IF SysSockSelect(SOCKET_FD_SETSIZE, ADR(fdRead), 0, 0, ADR(tvTimeout)) > 0 THEN
        socket := SysSockAccept(server_socket, ADR(sockaddr), ADR(sockaddr_size));
    END_IF
Beim anschließenden Empfangen jedoch blockiert die Funktion receive:
Code:
IF SysSockSelect(SOCKET_FD_SETSIZE, ADR(fdRead), 0, 0, ADR(tvTimeout)) > 0 THEN
        TcpReceiveData:= SysSockRecv(socket, ADR(abyRecv), SIZEOF(abyRecv), 0); (* Returns 0 if gracefully closed or -1 for an error*)
    END_IF
Vielleicht habt ihr noch weitere Tipps im Umgang mit Sockets und TCP-Verbindungen in CoDeSys.

Vielen Dank an alle!