Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Ethernet.lib

Oberchefe
2007-01-04
2007-01-08
  • Oberchefe - 2007-01-04

    Ich versuche mich gerade an der Ethernet Kommunikation. Empfangen funktioniert soweit ganz gut. Nun wollte ich an eine andere IP-Adresse was senden. Hier scheitert's aber am "ETHERNET_CLIENT_OPEN". Fehlernummer 32790, ENOTCONN 0x8016 Socket nicht verbunden. Muß ich vor "ETHERNET_CLIENT_OPEN" noch was anderes machen? Ich mache noch vorsichtshalber ein "ETHERNET_GET_NETWORK_CONFIG", bekomme da auch die IP-Adresse des Controllers zurück. Oder sind schon alle Sockets belegt? Dank Closed Source weiß ich wieder mal nicht was die verwendeten vorgefertigten Libraries alles offen lassen (wie z.B. der E-Mail Versand der eigentlich nur sporadisch mal gestartet wird).

     
  • Oberchefe - 2007-01-05

    Danke für Deine Hilfe,

    aber genau dieses Beispiel von Wago bzw. eigentlich die Ethernet_Client habe ich im Moment in Verwendung und immer noch das Problem, bei Status 4 bzw. 5 bekomme ich die o.a. Fehlermeldung. Die Ethernet_Server von diesem Beispiel funktioniert problemlos.

    Es dürfte doch nicht daran liegen daß ich eine Verbindung über's www aufbauen will? Mein Router und mein Controller sollten richtig konfiguriert sein, E-Mail Versand zu GMX funktioniert ja schließlich auch.

     
  • Erik Böhm - 2007-01-05

    Hast du's denn schonmal intern versucht ?

    Ein Cross-Connect Kabel zwischen Wago und Laptop und dann Verbindung aufbauen.

    Dann kannst du wenigstens Router / Firewall Probleme ausschliessen.

    Die Firewall auf dem Laptop kannst du ja solange deaktivieren.

    Ich hab noch ein Client / Server Progrämmchen mit angehängt zum Testen.

    Gruss

    Erik

    mymsocs.zip [7.75 KiB]

     
  • Oberchefe - 2007-01-05

    Der Fehler tritt auch bei einer IP-Adresse vom lokalen Netzwerk, hätte ich eigentlich auch nicht anders erwartet, die IP sollte auch noch nicht interessieren solange kein Socket geöffnet werden kann.

    Da ich davon ausgehe daß das Wago Beispiel schon mal irgendwo funktioniert hat denke ich eher daß die Anzahl möglicher Sockets begrenzt ist, in irgendeinem PDF meinte ich was von 2 gelesen zu haben. Wäre dann interessant, wie man herausfinden kann welche im Moment offen sind und von welchem Programmteil sie angesprochen werden.

    Das komische ist allerdings daß ich auch die Ethernet_Server vom Wago Beispiel benutze, diese bei mir im Programm aber nach der Ethernet_Client verwendet wird, da würde ich erwarten, wenn es an den begrenzten Resourcen liegen sollte, daß eher die Ethernet_Server nicht mehr funktioniert?

    Das Beispiel schaue ich ir mal an, Danke erst mal.

     
  • Oberchefe - 2007-01-05

    Ergänzung:

    Ethernet_Client macht den Fehler nur wenn xTCP_PROTOCOL True ist, wenn dieser Eingangsparameter FALSE ist (also UDP gewünscht wird), gibt's keine Fehlermeldung und ein Socket wird geöffnet.

    Ändere ich im Wago Beispiel das folgende ab```

    IF xTCP_PROTOCOL THEN
                Protocol      := IPPROTO_TCP; (TCP)
             ProtocolType   := SOCK_STREAM;

    in

    IF xTCP_PROTOCOL THEN
                Protocol      := IPPROTO_TCP; (TCP)
                ProtocolType   := SOCK_DGRAM;

    ``` dann verschwindet die Fehlermeldung und es scheint zumindest irgendwas zu kommunizieren, ob es das ist was ich brauche kann ich im Moment noch nicht sagen.

     
  • Oberchefe - 2007-01-05

    und außerdem steht eigentlich in der Ethernet.lib Doku von Wago bei SEL_PROTOCOL (Datentyp) drin:

    IPPROTO_TCP 6 Transport Control Protocol. Die

    Kommunikationssemantik muss

    SOCK_STREAM sein. Es wird das im

    Hintergrund laufende TCP-Protokoll

    verwendet.

     
  • Erik Böhm - 2007-01-08

    Moin

    Mal ne ganz blöde Frage: Läuft denn der Server und gibt ne Antwort auf den Verbindungsversuch des Clients ?

    Bei UDP gibts keine 'automatische' Antwort des Servers, UDP ist ein Verbindungsloses Protokoll.

    Gruss

    Erik

     
  • Oberchefe - 2007-01-08

    Zitat:
    Mal ne ganz blöde Frage: Läuft denn der Server

    Natürlich, ich habe mehrere probiert, gibt ja genügend im www außerdem sollte meinem Verständnis nach zuerst der Socket geöffnet werden bevor der Server von außen angesprochen werden kann.

    Habe mich dann an der "WagoLibEthernet_01_client_v1" versucht. Hatte da einen Teilerfolg, Daten kamen an, allerdings nicht alle, am Anfang fehlten welche, am Ende auch und mittendrin bin ich mir auch nicht sicher ob es alle waren (waren auch mehr als die 1500 Bytes die pro Zyklus gehen).

    Habe mich dann am Ende selber mit den Sockets beschäftigt. Glücklicherweise geht "Aufrufbaum ausgeben" auch mit Closed Source Libraries, dann konnte ich zumindest feststellen, welche Funktionsbausteine und Funktionen aus anderen Libraries da verwendet werden, hauptsächlich "Syssocketxxxxx". Gebremst hat mich dann allerdings wieder die Codesys Hilfe, bei allen "SysSocketxxxxx" liest man in der Hilfe "Zur Beschreibung der xxxxx Funktion sehen Sie bitte die Hilfe zum Betriebssystem. "

    Ich weiß ja nicht, welches Betriebssystem gemeint ist, mein Windows oder das Betriebssystem auf der SPS.

    Mit der Methode "Trial and Error" und Google (irgendwelche C-Konstrukte von Linux Rechnern)habe ich es letztendlich doch gebacken bekommen.

    Geholfen hat mir dabei Deine Exe. Wäre allerdings noch einfacher gewesen wenn an der exe zwei Dinge anders wären:

    • Portbegrenzung nach unten (ja ich weiß, die unterhalb 1024 sind normalerweise nicht für den Endanwender)

    • Socket Öffnen und Senden an der Serverversion auch möglich ohne daß der Client vorher angefragt hat.

    Jetzt muß ich noch etwas optimieren (einen wiederverwendbaren Funktionsbaustein draus machen und die Scantime noch etwas reuzieren)

    Am Ende bin ich wieder etwas schlauer und habe mir wieder etwas Closed Source erspart. Recht herzlichen Dank für Deine Hilfe!

     

Log in to post a comment.