W5500 (Hardware)Netzwerkfehler erkenne

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    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!

    • W5500 (Hardware)Netzwerkfehler erkenne

      Hallo!

      Ich verwende ein W5500-Netzwerkshield (diesen hier.....) und einen ATMega32 (aktuell auf 'nem Steckbrett, später wird er uC kleiner, Mega??). Die beiden Kommunizieren via SPI.
      Geht alles, ist ja dank einer Libary und Beispielcodes nicht sonderlich schwer.

      BASCOM-Quellcode

      1. $regfile = "m32def.dat"
      2. $crystal = 12000000
      3. $hwstack = 200
      4. $swstack = 220
      5. $framesize = 250
      6. Config Portb.4 = Output
      7. Wiz5500_cs Alias Portb.4
      8. Wiz5500_cs = 1
      9. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
      10. Spiinit
      11. Config Tcpip = Noint, Mac = 0.8.220.65.31.44, Ip = 192.168.0.253, Submask = 255.255.255.0, Gateway = 192.168.0.1, Localport = 5000, Chip = W5500, Spi = 1, Cs = Wiz5500_cs
      12. Const SocketID = 1
      13. Dim Result As Word
      14. Dim SocketStatus As Word
      15. Dim Befehl As String * 100
      16. Do
      17. SocketStatus = Socketstat(SocketID , 0)
      18. Select Case SocketStatus
      19. Case Sock_established
      20. Result = Tcpread(SocketID , Befehl)
      21. if Result = 0 then PRINT "FRAGE" ; Befehl ; "ENDE" ; Result
      22. Result = Tcpwritestr(SocketID , Befehl , 255)
      23. Case Sock_close_wait
      24. Closesocket SocketID
      25. Case Sock_closed
      26. Result = Getsocket(SocketID , Sock_stream , 5000 , 0) ' get socket for server mode, specify port 5000
      27. Socketlisten SocketID
      28. End Select
      29. Loop
      Alles anzeigen

      Wie gesagt, läuft gut, stabil und macht genau das, was es soll!
      (Aktuell sendet er das, was er empfangen hat, zurück)

      Das Problem:
      Nehmen wir an, dass der Switch o.ä. mit dem der W5500 verbunden ist, kurz ausfällt. Der Link als verloren geht. Meint wegen, weil jemand was umpatcht oder der Strom ausfällt oder, oder, oder....
      Wie erkenne ich dies? Die Kommunikation kommt nämlich nicht mehr zustande.
      Gleiches gilt, wenn der Link nicht bereits beim "einschalten" steht. Auch hier kommt keine Kommunikation zustande.

      Die Frage ist also
      1. Wie erkenne ich einen aktiven Link zu einem Switch oder ähnlichem
      2. Was genau muss bei oder nach dem linken initialisiert oder aktiviert werden?

      Vielen Dank, schönen Sonntag

      p.s.:
      Ja, ich habe die Suche benutzt und ja, ich habe google benutzt :P :P Hat mich aber nicht weiter gebracht.
      Evt weil ich nicht weiß, wonach ich suchen soll....
    • Welchen Status der Socket einnimmt, wenn die Verbindung abreißt kann ich dir nicht sagen.

      Du kannst aber in deiner Select-Case Struktur noch einen Else Fall einfügen und dir dort den SocketStatus anzeigen lassen.
      Das liefert bestimmt einn Hinweis, wie es weiter geht.

      Grundsätzlich würde ich aber behaupten, wenn eine Verbindung abreist, sollte man sen Socket schließen und dann neu Öffnen.
    • Mitch64 schrieb:

      Welchen Status der Socket einnimmt, wenn die Verbindung abreißt kann ich dir nicht sagen.

      Du kannst aber in deiner Select-Case Struktur noch einen Else Fall einfügen und dir dort den SocketStatus anzeigen lassen.
      Das liefert bestimmt einn Hinweis, wie es weiter geht.

      Grundsätzlich würde ich aber behaupten, wenn eine Verbindung abreist, sollte man sen Socket schließen und dann neu Öffnen.
      Ja, dachte ich auch!
      Nein, der Status ändert sich nicht, wenn die der Link abreist. Und beim Reconnect macht er immer "irgendwas". Es ist KEIN eindeutiger Status weder beim Abriss noch beim Reconnect.

      Ich habe mir über UART alles in "Klartext" ausgeben lassen und konnte so recht gut mitlesen, wann was passiert...

      In der Hilfe kann man die unterschiedlichen Status (Statusse??) nachlesen. Aber einen "no link" gibt es dort nicht
    • Wenn sich der Status nicht ändert wirds schwierig.
      Wie lange hast de denn nach dem Abriss gewartet, ob sich noch was tut?

      Vielleicht kann man mit Timeout-Überwachung was machen oder Pings senden.

      Irgend einen Weg wird es wohl geben.

      Um den Socken neu zu starten, muss man vielleicht eine Sequenz an Befehlen durchführen, so dass die Initialisierung korrekt abläuft (nach Abriss)
    • Ja......
      ich habe tatsächlich nicht wirklich lange gewartet. Ich sag' mal <60 Sekunden
      Da könnte ich mal abwarten, ob sich noch was ändert. Wobei ein kurzen "umpatchen" sollte auch erkannt werden / erkennbar sein.

      Ping senden und auf Response warten....
      Ich will's nicht übertreiben, aber wenn das jedes Gerät so machen würde.....
      (und im Endausbau spreche ich hier von ca. 30 Sensoren/Aktoren)
      Die Lösung fände ich unbefriedigend......

      Ich hatte gehofft, dass evt etwas "nicht dokumentiertes" gibt, werde mir den Status aber mal etwas "länger" ansehen.

      Danke dir schonmal!!
    • Monkye....
      habe ich auch eben gefunden

      Ich habe in der Dokumentation tatsächlich jetzt was gefunden. Nachdem ich bisher NUR japanische Dokumentationen gefunden habe (Sorry, ich kann das nicht lesen) habe ich nun eine englische gefunden. Dort steht etwas vom PHYCFGR (W5500 PHY Configuration Register). Da gibt es das BIT Link. Wie ich da dran komme, ist mir noch nicht klar, aber es gibt es immerhin schonmal

      Netterweise war das erste Suchergebnis nach diesem Register ein Eintrag, der auf einen Fehler in Bascom hinwies. Dazu soll es zwar ein Patch geben, wo das aber wiederum zu finden ist, schrieb dort keiner :( Aber ich bin einen (kleine) Schritt weiter....
    • Leute, danke für eure Hilfen....

      Ich fange gerade an, an Gespenster zu glauben! Oder Kobolde oder irgend sowas....

      Vor einigen Tagen habe ich den Code geschrieben und bekam am Anfang jeder Verbindung nur Müll gesendet. Das legte sich nach drei, vier abfragen. Ich habe gerätselt, wo das herkommt, bin dann aber schlafen gegangen...
      Am nächsten Tag habe ich Spannung auf das Board gegeben und seit dem bekomme ich immer sofort ordentliche Antworten OHNE (!!), das ich am Code was geändert habe!

      Dann habe ich angefangen Test zu machen und stieß auf das oben beschriebene Link/Unlink Problem. Ich komme gerade von der Arbeit nach Hause und will versuchen dieses Register zu lesen und ..... Der W5500 verbindet sich sauber mit dem Socket, nachdem ich das Kabel kurz abgezogen habe und es wieder aufgesteckt habe.

      Ich glaube, ich werde verarscht.....


      Danke euch, vielen Dank!
    • Schadeng schrieb:

      Der W5500 verbindet sich sauber mit dem Socket, nachdem ich das Kabel kurz abgezogen habe und es wieder aufgesteckt habe.
      Genau das soll er ja auch.
      10 Sekunden bei 30Stück wären 3 pro Sekunde. Da könnte der Master vielleicht noch mal fragen wenn sich einer nicht meldet und dann den als fehlend melden bzw sich selber wenn keiner mehr antwortet.
      Die einzelnen Aktoren könnten nach 15 Sekunden mal ein Ping abgeben zum erkennen ob sie noch in Netz sind und ggf einen "ungefährlichen Mode" anfahren oder beginnen selber Sensoren abzufragen um automon "das richtige" zu tun. Welche Art Maschine werden sie steuern?
    • Es gibt ja ein Socket-Status-Register, dazu ein „SEND_KEEP“ Command (zum ständigen prüfen der Verbindung, im Fehlerfall dann im Timeout endend), also Möglichkeiten die Hardware notfalls komplett zu resetten...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Nee, das ist zum offenhalten der TCP-Verbindung gedacht, macht nicht der Switch - zumindest kenne ich es nur so. Der W5500 sendet dann alle n Sekunden ein Byte, lässt sich zeitlich einstellen.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Pluto25 schrieb:

      Schadeng schrieb:

      Der W5500 verbindet sich sauber mit dem Socket, nachdem ich das Kabel kurz abgezogen habe und es wieder aufgesteckt habe.
      Genau das soll er ja auch.10 Sekunden bei 30Stück wären 3 pro Sekunde. Da könnte der Master vielleicht noch mal fragen wenn sich einer nicht meldet und dann den als fehlend melden bzw sich selber wenn keiner mehr antwortet.
      Die einzelnen Aktoren könnten nach 15 Sekunden mal ein Ping abgeben zum erkennen ob sie noch in Netz sind und ggf einen "ungefährlichen Mode" anfahren oder beginnen selber Sensoren abzufragen um automon "das richtige" zu tun. Welche Art Maschine werden sie steuern?
      Hat er nur leider zunächst nicht gemacht. Ich hätte das ja auch erwartet. Wer weiß wo da wieder was schiefgelaufen ist. Bestimmt irgendwo zwischen meinen Ohren!

      Ja, geplant ist natürlich, dass sich der Master "meldet", wenn er von jemandem keine Rückmeldung erhält. Das soll nicht beim ersten Mal passieren, aber doch so nach dem 5x in Folge.
      Die Aktoren werden auch mit einer gewissen Intelligenz ausgestattet, sodass keine gefährlichen Situationen entstehen. Gefährlich ist eh "nichts" da es sich um eine Hausautomation handelt. Die existiert bereits, aber "nur" mit RS485 und da gerate ich seit längerem an Grenzen. Ich verspreche mir da etwas mehr Flexibilität, insbesondere, da sich die Automation nicht auf eine kleine Wohnung, sondern auf mehrere Gebäude erstreckt. Die Infrastruktur eines Ethernets steht bereits und ich arbeite teilweise mit RS485-Ethernet-Umsetzern, was nur mäßig funktioniert.

      Außerdem stellt es sich als schwierig heraus den RS485 (oder RS232) im "Multiclient-Verbund" über Funk zu übertragen. Hier kommt es zu vielen "Kollisionen".
      Dafür würde ich gerne WLAN nutzen.....

      Hierzu direkt 'ne Frage: Welches WLAN-Shield würdet ihr nutzen? Aktuell mache ich Versuche mit dem ESP8266. Das ist aber sagen wir mal nicht sooo schön zu programmieren und geht den "Umweg" über UART. Ich habe jetzt gesehen, dass es dieses ESP8266 auch als ESP12F gibt. Diese Version hat zumindest schonmal eine SPI Schnittstelle. Ob und wie das zu programmieren ist, ob es dafür auch eine LIB gibt wie für das W5500 weiß ich nicht. Das W5500 ist dank der Lib einfach unschlagbar einfach zu nutzen!

      monkye schrieb:

      Es gibt ja ein Socket-Status-Register, dazu ein „SEND_KEEP“ Command (zum ständigen prüfen der Verbindung, im Fehlerfall dann im Timeout endend), also Möglichkeiten die Hardware notfalls komplett zu resetten...
      Die Hardware komplett zu resetten empfinde ich immer als Holzhammermethode. Zumal dann einige Parameter nicht mehr stimmen. ZB wäre die Position des Rollladen unbekannt und müsste auch hier durch einen Reset ermittelt werden (also einmal komplett auf oder zu um die Endposition zu ermitteln). Alle Triaks würden "abfallen" und es würde zB plötzlich dunkel werden. Von einem sicheren Zustand kann man hier wohl kaum sprechen....

      Danke, Danke für euren Input, Ideen und Hilfe!
      Oliver
    • Auf der Socket-Clientseite (also beim System-Master) gibt es bereits von mir programmierte Errorhandling (Unter anderem Timeout beim Aufbau der Verbindung und Lesen sowie Schreiben vom bzw auf den Server). Das alles wird protokolliert, damit ich es im Fehlerfall auswerten kann. Der Server (also W5500) scheint (mittlerweile) auch stabil ein Fehlerhandling zu machen. Ich konnte zumindest noch keinen Fehler erzeugen, bei dem nicht richtig reagiert wurde und spätestens nach Fehlerbehebung die Verbindung wieder zustande kam.

      .....und ich habe mich wirklich angestrengt Fehler zu erzeugen ;)

      Eine Frage habe ich noch zum W5500....
      Mich wundert es ein bisschen, dass ich ihm eine MAC zu weisen soll. Klar, weiß ich, dass man MAC-Adressen ändern (fälschen) kann, aber sollte nicht jedes Gerät von Haus aus eine haben? Und die sollte (muss) dazu noch eindeutig sein?
      Ich weiß auch um den Aufbau der MAC-Adresse und das die ersten 3 Bytes die Herstellerkennung sind (Wiznet (W5500) hat 00:08:DC).
      Ähnliches wurde hier schon diskutiert, aber nicht wirklich zu Ende gebracht...
      "Meine" Mac-Adressen fangen also mit 00:08:DC an, aber wie komme ich denn an den gültigen Rest? Ich kann mir jetzt für "zu Hause" welche ausdenken: Ich betreibe eine Netzwerkklasse C mit 254 möglichen Teilnehmern (wie wohl die meisten). Dies ist aber schon recht voll und ich überlege noch, ob ich die Haussteuerung (auch für ggf VLAN und Traffic-Management) in einen anderen Netzwerkbereich (192.168.0.XXX, 192.168.1.XXX) verschiebe. Bei 254 Geräten und einem Pool aus ~16,5 Mio MAC-Adressen ist zwar die Wahrscheinlichkeit klein, dass ich irgendwann eine Adresse doppelt vergeben habe. Dennoch oder gerade deswegen sollte ich irgendwie gültige (einmalige) MAC vergeben.