Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 27 von 27

Thema: libnodave timeout Problem

  1. #21
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Key Beitrag anzeigen
    Den Timer hab ich in C#.NET

    An der Lib selbst habe ich nichts geändert. Möchte ich ja auch nicht. Es soll auch keine Kritik sein. Meine Frage war nur ob ich in so einem Fall nicht etwas von dem Read bzw. Write zurückerhalten sollte.
    Normalerweise kehrt recv() zurück, wenn die angeforderten Zeichen gelesen wurden.
    Wenn das Kabel am PC gezogen wird, ist der TCP/IP Stack wohl "schlau" genug, um die Verbindung zu beenden, das socket zu schließen und anhängige recv()-Aufrufe zu beenden.
    Libnodave realisiert das timeout wie gesagt mit select(), indem es vorher schaut, ob Zeichen da sind oder innerhalb der Timeout-Zeit verfügbar werden.
    Bleibt zu fragen, was denn passiert, wenn zwar Zeichen da sind, aber nicht so viele wie recv() lesen will.
    Das sollte m.E. nicht passieren können, da der TCP Stack auf jeden Fall nur vollständige Ethernet-Pakete zurückliefert (wenn du das Kabel mitten im Paket ziehst, wird das Paket komplett verworfen).
    Eine andere Frage ist, ob ein ISO-Paket auf mehrere TCP-Pakete aufgeteilt werden könnte...?

  2. #22
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    640
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Zitat Zitat von Zottel Beitrag anzeigen
    Eine andere Frage ist, ob ein ISO-Paket auf mehrere TCP-Pakete aufgeteilt werden könnte...?
    Geht selbstverständlich, das macht aber ausschließlich die CP bzw. der PC.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  3. #23
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard

    Zitat Zitat von Zottel Beitrag anzeigen
    Normalerweise kehrt recv() zurück, wenn die angeforderten Zeichen gelesen wurden.
    Wenn das Kabel am PC gezogen wird, ist der TCP/IP Stack wohl "schlau" genug, um die Verbindung zu beenden, das socket zu schließen und anhängige recv()-Aufrufe zu beenden.
    Libnodave realisiert das timeout wie gesagt mit select(), indem es vorher schaut, ob Zeichen da sind oder innerhalb der Timeout-Zeit verfügbar werden.
    Bleibt zu fragen, was denn passiert, wenn zwar Zeichen da sind, aber nicht so viele wie recv() lesen will.
    Das sollte m.E. nicht passieren können, da der TCP Stack auf jeden Fall nur vollständige Ethernet-Pakete zurückliefert (wenn du das Kabel mitten im Paket ziehst, wird das Paket komplett verworfen).
    Eine andere Frage ist, ob ein ISO-Paket auf mehrere TCP-Pakete aufgeteilt werden könnte...?
    Es besteht die Möglichkeit beim Verbindungsaufbau eine geringere Länge
    der ISO-Pakete auszuhandeln. Allerdings bringt das keine Lösung, denn
    Du weißt nicht ob das alles in ein TCP-Paket passt.

    Eine Möglichkeit für das Timeout sehe ich eigentlich nur darin, dass libnodave NONBLOCKING verwendet; nur dürfte das etwas viel Arbeit sein,
    die ganze Geschichte umzustellen...

  4. #24
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard

    Nach längerer Abstinenz melde ich mich hiermit im Forum zurück ... und hoffe, daß ich für diesen Thread nicht viel zu spät bin.

    Das Problem kenne ich, das hat nichts mit libnodave zu tun, sondern ist ein konzeptbedingtes Problem bei jeder TCP/IP-Kommunikation. Wenn ein Teilnehmer (in diesem Fall libnodave) auf Daten einer Gegenstelle (hier die SPS) wartet, und die Verbindung wird irgendwo unterwegs unterbrochen, dann wird dieser Wartezustand vom TCP/IP-Stack bis zum vielgerühmten "Sankt Nimmerleinstag" aufrecht erhalten. Ein Verbindungsfehler irgendwo "unterwegs" wird nur vom sendenden Teilnehmer erkannt (weil kein ACK zurückkommt), ein Teilnehmer, der nur auf eingehende Daten wartet, ohne zwischendurch selbst etwas zu senden, wartet eben ewig auf das nächste Datenpaket.

    Bei libnodave kommt hinzu, daß beim Übertragen großer Datenmengen per S7-Protokoll der PC relativ lange auf die Antwort der SPC warten muß, aber nach dem Eingang der Antwort relativ schnell die die nächste Anfrage schickt. Dadurch ist die Wahrscheinlichkeit recht hoch, daß libnodave gerade auf Daten von der SPS wartet, wenn die Verbindung unterbrochen wird.

    Soweit die Theorie, jetzt zur praktischen Lösung des Problems:

    Das TCP/IP-Protokoll kennt sogenannte Keep-Alive-Pakete, das sind "leere" Datenpakete, die vom TCP/IP-Stack automatisch verschickt werden, um die Verbindung aufrecht zu halten und zu überwachen. Diese Funktion ist bei Windows per Default deaktiviert, kann aber per Registry-Eintrag aktiviert werden, was man IMHO aber lassen sollte, da davon alle TCP-Verbindungen betroffen sind. Man kann diese Funktion aber auch per API-Aufruf mit der Funktion WSAIoctl in der ws2_32.dll für einen einzelnen TCP-Socket aktivieren. Wird die Funktion mit dem Handle des Sockets, über den libnodave mit der SPS kommuniziert, dem Control-Code SIO_KEEPALIVE_VALS und den entsprechenden Parametern für die Timeouts aufgerufen, wird eine unterbrochene Verbindung vom TCP/IP-Stack korrekt erkannt und der entsprechende Fehlercode an libnodave weitergegeben.

    Sorry, daß ich so spät damit dran bin.


    Gruß Axel
    Man muß sparn wo mn knn!

  5. #25
    Key ist offline Benutzer
    Themenstarter
    Registriert seit
    03.09.2008
    Beiträge
    48
    Danke
    7
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Also wäre eine Möglichkeit libnodave so anzupassen, das man über die Funktion Timeout(), die ja für Serielle Verbindungen funktioniert, das sie ein Keep-Alive abfragt. Muss natürlich für die jeweilige Socketverbindung aktiviert werden. Aber denke ich könnte ganz hilfreich sein.

    Wäre das möglich?

  6. #26
    Registriert seit
    19.09.2005
    Ort
    Freudenstadt
    Beiträge
    811
    Danke
    64
    Erhielt 101 Danke für 64 Beiträge

    Standard

    Möglich wäre das schon, aber da für den KeepAlive noch 2 zusätzliche Timeout-Werte vorgegeben werden müssen, die libnodave so (noch) nicht kennt, geht das genauso gut von "außen", da die libnodave-Funktion OpenSocket ja das Socket-Handle zurückliefert.


    Gruß Axel
    Man muß sparn wo mn knn!

  7. #27
    Key ist offline Benutzer
    Themenstarter
    Registriert seit
    03.09.2008
    Beiträge
    48
    Danke
    7
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke afk.

    Ich glaube ich habe etwas passendes gefunden.

    Socket.IOControl
    http://msdn.microsoft.com/en-us/libr...iocontrol.aspx

    Standradmäßig ist es über die Registry möglich die Werte für das Keep-Alive zu aktivieren. Das gilt dann aber für alle Sockets was ja nicht unbedingt erwünscht ist.

    Als Code Variante habe ich hier einen passenden Artikel in dem es gelöst wird.
    http://social.microsoft.com/Forums/e...-53059de04628/

    Gruß Key

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 09.09.2010, 00:27
  2. S7-Graph Timeout, Unplausible Eingänge, Einzelschritt
    Von element. im Forum Programmierstrategien
    Antworten: 6
    Letzter Beitrag: 11.11.2009, 12:36
  3. libnodave und Timeout
    Von HeizDuese im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 06.01.2009, 15:06
  4. timeout am SEW-Umrichter
    Von Lubro im Forum SEW-EURODRIVE
    Antworten: 7
    Letzter Beitrag: 01.10.2008, 19:29
  5. Libnodave Timeout
    Von Lazarus™ im Forum Hochsprachen - OPC
    Antworten: 7
    Letzter Beitrag: 16.10.2005, 00:41

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •