Netzwerkverbindungsabbruch

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Netzwerkverbindungsabbruch

      Hallo,

      ich verwende den Code für die TCP/IP Verbindung.

      BASCOM Source Code

      1. $regfile = "m328PBdef.dat"
      2. $crystal = 16000000
      3. '$baud = 19200
      4. $hwstack = 128
      5. $swstack = 128
      6. $framesize = 128
      7. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
      8. Spiinit
      9. Enable Interrupts
      10. Open "comd.6:19200,8,N,1" For Output As #2
      11. Config Portd.5 = Output
      12. Betriebsled Alias Portd.5
      13. Betriebsled = 1
      14. '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Config für den W5500 RESET-- ----------------
      15. Config Portb.1 = Output
      16. W5500_nreset Alias Portb.1
      17. '----- Zeitinterval für den W5500, damit das W5500 initialisieren kann ---------
      18. Reset W5500_nreset
      19. Waitms 5
      20. Set W5500_nreset
      21. Waitms 400
      22. Config Tcpip = Noint , Mac = 0.8.220.05.80.81 , Ip = 192.168.0.11 , Submask = 255.255.255.0 , Gateway = 192.168.0.254 , Localport = 6545 , Chip = W5500 , Spi = 1 , Cs = Portb.2
      23. Dim Bclient As Byte
      24. Dim Idx As Byte
      25. Dim Flags As Byte
      26. Dim Result1 As Word
      27. Dim S As String * 80
      28. Dim Port_ As Long
      29. Local_port = Port_
      30. Do
      31. For Idx = 0 To 3
      32. Result1 = Socketstat(idx , 0)
      33. Select Case Result1
      34. Case Sock_established
      35. If Flags.idx = 0 Then
      36. Flags.idx = 1
      37. S = "Hallo Welt"
      38. Result1 = Tcpwritestr(idx , S , 255 )
      39. End If
      40. Result1 = Socketstat(idx , Sel_recv)
      41. Case Sock_close_wait
      42. Closesocket Idx
      43. Case Sock_closed
      44. Bclient = Getsocket(idx , Sock_stream , Local_port , 0)
      45. Socketlisten Idx
      46. Flags.idx = 0
      47. Case Sock_listen
      48. Case Else
      49. End Select
      50. Next
      51. Loop
      52. End
      Display All
      Problemstellung:
      Nach einer Betriebsdauer von einigen Tagen kann keine Verbindung mehr zur Hardware hergestellt werden.
      Konkret bedeutet dies, dass sich die PC-Software nicht mehr mit der Hardware verbindet.
      Erst nach einem Neustart der Hardware ist ein erneuter Verbindungsaufbau möglich.
      Hat jemand eine Idee, was die Ursache hierfür sein könnte, oder könnte jemand mögliche Lösungsansätze empfehlen?

      Gruß
      Katip
    • katipefendi wrote:

      Nach einer Betriebsdauer von einigen Tagen
      Glückspilz ;) Meiner gab nach wenigen Minuten auf ;(
      Ich habe ihn nicht brauchbar zum laufen gebracht.
      Er reagiert allergisch auf instabile Versorgung. Mit anderem Netzteil und dicken Kondensator (1000µF Vcc-Gnd) wurden es ein paar Stunden.
      Geschaltete Netzleitungen in seiner Nähe sorgten auch für Abstürze. :cursing:
      Hier wurde er auf 10 Mbps runter gesetzt:

      Source Code

      1. Temp = 66 'Umschalten 10 Mbps
      2. Settcpregs 46 , Temp , 1
      3. Temp = 194
      4. Settcpregs 46 , Temp , 1
      Ich weis nicht mehr ob das half oder nur für den Stromverbrauch drin war :?:
      Dann hat er 8 Sokets. Bei Dir werden nur 4 bearbeitet. Vielleicht probehalber mal 'For Idx = 0 To 7'
      Hier stand nach dem Case Sock_close_wait ein 'Socketdisconnect idx' vor dem 'Closesocket idx'
      das könnte helfen?
    • Das gleiche Problem hatte ich auch mit einem WIZ820io (W5200), als auch einem auf dem W5500 basierendem Nachbau.
      Bei mir trat das Problem allerdings meistens erst nach Wochen, aber sehr unregelmäßig auf.
      Da meine Hardware von außen über das Internet erreichbar war vermutete ich diverse Hackerversuche als Ursache.
      Tatsächlich konnte ich ein einfrieren der TCP/IP Verbindung provozieren, indem ich sinnfreie lange Datenpakete an das
      Interface sendete. Die Anzahl der geöffneten Sockets oder eine Änderung am Code brachten auch bei mir keine Änderung.

      Als Abhilfe baute mein Programm alle 6 Stunden eine TCP Verbindung zum Router auf, wurde der Aufbau mit Fehler beendet
      löste ich einen Reset und Neustart des Controllers aus.


      Gruß Jogi
    • Hallo Zusammen,

      vielen Dank für die ermutienen Beiträge.

      @Pluto25
      was genau meinst du hier mit?
      Hier stand nach dem Case Sock_close_wait ein 'Socketdisconnect idx' vor dem 'Closesocket idx'
      das könnte helfen?


      @Jogi

      Als Abhilfe baute mein Programm alle 6 Stunden eine TCP Verbindung zum Router auf, wurde der Aufbau mit Fehler beendet
      löste ich einen Reset und Neustart des Controllers aus.
      hättest du da evtl. nen code snippets für mich?
    • Source Code

      1. 'Watchdog muss aktiviert sein, sonst Endlosschleife (Do : Loop)
      2. Teste_netzwerk:
      3. 'Client Mode - Socket zu IP-Adresse aufbauen
      4. '===========================================
      5. Hv = Getsocket(3 , Sock_stream , 80 , 0)
      6. Hv = Socketconnect(3 , 192.168.0.1 , 80)
      7. If Hv = 1 Then 'SocketConnect nicht erfolgreich
      8. Do : Loop 'Watchdog auslösen für Reset
      9. End If
      10. Socketdisconnect 3
      11. Socketclose 3
      12. Return
      Display All
    • Zusätzlich sollte angemerkt werden, dass der aktuelle Code eigentlich auf dem zuvor entwickelten Code basiert. Ist es möglich, dass Mark das Problem nicht kennt oder sich der spezifischen Herausforderungen in diesem Zusammenhang nicht bewusst ist?

      BASCOM Source Code

      1. Example
      2. '-----------------------------------------------------------------------------------------
      3. 'name : servertest_SPI.bas
      4. 'copyright : (c) 1995-2021, MCS Electronics
      5. 'purpose : start the easytcp after the chip is programmed
      6. ' and create 2 connections
      7. 'micro : Mega88
      8. 'suited for demo : yes
      9. 'commercial addon needed : no
      10. '-----------------------------------------------------------------------------------------
      11. $regfile = "m88def.dat" ' specify the used micro
      12. $crystal = 8000000 ' used crystal frequency
      13. $baud = 19200 ' use baud rate
      14. $hwstack = 128 ' default use 32 for the hardware stack
      15. $swstack = 128 ' default use 10 for the SW stack
      16. $framesize = 128 ' default use 40 for the frame space
      17. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
      18. 'Init the spi pins
      19. Spiinit ' xram access
      20. Print "Init , set IP to 192.168.1.70" ' display a message
      21. Enable Interrupts ' before we use config tcpip , we need to enable the interrupts
      22. Config Tcpip = Int1 , Mac = 12.128.12.34.56.78 , Ip = 192.168.1.70 , Submask = 255.255.255.0 , Gateway = 192.168.1.1 , Localport = 1000 , Tx = $55 , Rx = $55 , Chip = W5100 , Spi = 1
      23. Dim Bclient As Byte ' socket number
      24. Dim Idx As Byte
      25. Dim Result As Word , Result2 As Word ' result
      26. Dim S As String * 80
      27. Dim Flags As Byte
      28. Dim Peer As Long
      29. Dim L As Long
      30. Do
      31. Waitms 1000
      32. For Idx = 0 To 3
      33. Result = Socketstat(idx , 0) ' get status
      34. Select Case Result
      35. Case Sock_established
      36. If Flags.idx = 0 Then ' if we did not send a welcome message yet
      37. Flags.idx = 1
      38. Result = Tcpwrite(idx , "Hello from W5100A{013}{010}") ' send welcome
      39. End If
      40. Result = Socketstat(idx , Sel_recv) ' get number of bytes waiting
      41. Print "Received : " ; Result
      42. If Result > 0 Then
      43. Do
      44. Print "Result : " ; Result
      45. Result = Tcpread(idx , S)
      46. Print "Data from client: " ; Idx ; " " ; Result ; " " ; S
      47. Peer = Getdstip(idx)
      48. Print "Peer IP " ; Ip2str(peer)
      49. Print "Peer port : " ; Getdstport(idx)
      50. 'you could analyse the string here and send an appropiate command
      51. 'only exit is recognized
      52. If Lcase(s) = "exit" Then
      53. Closesocket Idx
      54. Elseif Lcase(s) = "time" Then
      55. Result2 = Tcpwrite(idx ,"12:00:00{013}{010}") ' you should send date$ or time$
      56. End If
      57. Loop Until Result = 0
      58. End If
      59. Case Sock_close_wait
      60. Print "close_wait"
      61. Closesocket Idx
      62. Case Sock_closed
      63. Print "closed"
      64. Bclient = Getsocket(idx , Sock_stream , 5000 , 64) ' get socket for server mode, specify port 5000
      65. Print "Socket " ; Idx ; " " ; Bclient
      66. Socketlisten Idx
      67. Print "Result " ; Result
      68. Flags.idx = 0 ' reset the hello message flag
      69. Case Sock_listen ' this is normal
      70. Case Else
      71. Print "Socket status : " ; Result
      72. End Select
      73. Next
      74. Loop
      75. End
      Display All
    • katipefendi wrote:

      was genau meinst du hier mit?
      Wie bei Jogi: ein Socketdisconnect vor dem Closesocket

      Source Code

      1. Case Sock_close_wait
      2. Socketdisconnect Idx
      3. Closesocket Idx
      Läuft der Code mit den Prints zur Zeit? Was ist das letzte Print was er ausführt?
      Ich denke nicht das es ein Bascom Problem ist. Es wurde nicht besser als ich seine Register einzeln beschrieben hatte. Das Spi arbeitete auch sauber, keine Bitfehler (bei bis zu 700 Zeichen Strings)

      Jogi wrote:

      löste ich einen Reset und Neustart des Controllers aus
      Das reichte? Hier viel er so ins Koma dass er wirklich kurz von der Versorgung getrennt werden musste.

      Jogi wrote:

      lange Datenpakete an das Interface sendete
      Vielleicht kann es überlaufen? So das die Daten des nächsten Sockets ungültig werden? Für eine interne endlos Loop sorgen können?
    • Hi,
      ich habe den BASCOM-Quellcode mit dem Vorschlag

      BASCOM Source Code

      1. Case Sock_close_wait
      2. Socketdisconnect Idx
      3. Closesocket Idx


      übernommen und die Hardware angeschlossen.
      Ich werde die Hardware nun einfach tage-, wochen- bzw. monatelang eingeschaltet lassen und immer wieder sporadisch versuchen, eine Verbindung aufzubauen, um zu sehen, ob es funktioniert oder nicht.

      Und werde hier dann immer wieder berichten.

      Daqke für alle, die mir gerne geholfen haben.


      Gruß
      Katip

      The post was edited 1 time, last by katipefendi ().

    • Nun, leider muss ich bedauerlicherweise mitteilen, dass seit heute früh keine Netzwerkverbindung mehr aufgebaut werden kann.

      Die Hardware ist in meinem Zimmer auf einer Hutschiene montiert.

      @Pluto25, ja, ein Schaltnetzteil ist vorhanden, es befindet sich etwa 50 cm von der Hardware entfernt und versorgt diese ebenfalls.

      Ich habe keine Ahnung, was ich jetzt noch machen soll.

      Hat jemand eine Idee?

      Gruß
      Katip
      Files
    • Jogi wrote:

      Läuft der Mega328 noch und es hat sich nur der W5500 aufgehängt
      Genau, das wäre jetzt auch meine Idee gewesen.
      Der Mega sendet ja Status-Texte raus.
      Die kannst du ja mal loggen. So lässt sich rausbekommen, wo der Mega steht, wenn das Netz nicht geht.

      Versorgungsspannung (Rippel) wird auch gerne unterschätzt. Das sollte man mit dem Oszi prüfen und ggf. LC-Filter verwenden (100µH mit 100nF z.B.).
      Vielleicht hängt aber wirklich der WS5500, dann kannste vermutlich außer Versorgungsspannung und Signalamplituden prüfen, nicht viel machen.
    • Mitch64 wrote:

      Jogi wrote:

      Läuft der Mega328 noch und es hat sich nur der W5500 aufgehängt
      Genau, das wäre jetzt auch meine Idee gewesen.Der Mega sendet ja Status-Texte raus.
      Die kannst du ja mal loggen. So lässt sich rausbekommen, wo der Mega steht, wenn das Netz nicht geht.

      Versorgungsspannung (Rippel) wird auch gerne unterschätzt. Das sollte man mit dem Oszi prüfen und ggf. LC-Filter verwenden (100µH mit 100nF z.B.).
      Vielleicht hängt aber wirklich der WS5500, dann kannste vermutlich außer Versorgungsspannung und Signalamplituden prüfen, nicht viel machen.
      Nun, die Status-Texte müsste ich erst einmal einbauen.
      Die Versorgungsspannung des W5500 ist stabil und wird vom LM mit 3,3 V versorgt.


      Neulich habe ich gelesen, dass bei einer TCP/IP-Verbindung serverseitig eine sogenannte KeepAlive-Funktion erforderlich ist, um die Netzwerkverbindung aufrechtzuerhalten.
      Ich werde versuchen, diese zu implementieren. Wenn es funktioniert, melde ich mich wieder.