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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Socket vs. Modbus

  1. #11
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke,
    funktioniert super. Beim Client ging es komischerweise ohne, aber habe es generell in meinem FB drin.
    Schade, dass man bei den SysCallbacks keine Adresse von einer Methode des FBs angeben kann,
    dann wäre alles in einer Instanz. Habe schon einen Callback über ein Interface, wenn Daten gelesen, bzw. geschrieben werden. So kann ch nicht nur stumpf auf den Rx & TxBuffer schauen, sondern kann direkt wenn Daten beim Server empfangen werden drauf reagieren und direkt eine passend verarbeitete Antwort im gleichen Zyklus zurücksenden.
    Die Adresse der Callbackfunktion wird als Eingangsparameter übergeben und auf ungleich 0 geprüft.
    Geändert von SY50 (26.03.2016 um 01:49 Uhr)

  2. #12
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Habe noch folgenden Trick angewendet:
    Habe den Callback auf eine Funktion gesetzt, welche dann eine Aktion meiner Bausteininstanz aufruft
    So habe ich wenigstens das kompletter Handling der Socket in dem FB.

  3. #13
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    Bist auf einem guten Weg, ich sehe das schon. Wie ich anfangs schon gesagt habe. Das die beiden Teilnehmer mal mit einander kommunizieren geht schnell. Dann kommt der riesen Rattenschwanz an zusätzlichen Dingen die man beachten muss wie dieses Systemverhalten beim Onlinechange,... Wenn man überlegt wie simpel das Ganze in C# ist.

    Hast du bei der Socket Erstellung auch div. Optionen gesetzt? Ich habe mich damals mal eingearbeitet und einen eigenen SysSockcreat geschrieben der auch die Options setzt. Ich poste dir einfach mal meinen Code. Der ist nicht fertig. Habe irgendwann keinen Bock mehr gehabt aber es sind viele Kommentare drin ich ich mir aus div. C++ Dokus zusammengesucht habe. Vielleicht ist der eine oder andere Tipp drin der dir noch hilft. Geht um die Optionen: SOCKET_SO_SNDBUF, SOCKET_SO_RCVBUF, SOCKET_SO_REUSEPORT, SOCKET_SO_KEEPALIVE und SOCKET_SO_KEEPALIVE

    Achso: Hier habe ich das mit den Async FBs aufgezogen. Mit den synchronen FCs hatte ich irgendwann wegen irgendwas Probleme und habe alles auf FB umgestellt. Kannst du natürlich verwenden wie du willst, also auch bei FC

    Code:
    FUNCTION_BLOCK FB_SocketCreate
    VAR_INPUT
        xExecute                    : BOOL                     := FALSE;
        bServer                        : BOOL                     := FALSE;
        eProtocolType                : ENUM_EthProtocolType    := ENUM_TCP;
        nEthComInstNo                : INT                     := 0;
    END_VAR
    VAR_OUTPUT
        xDone                        : BOOL                     := FALSE;
        xError                        : BOOL                     := FALSE;
        wErrorID                    : WORD                     := 16#0;
    END_VAR
    VAR
        nState                        : INT                     := 0;
        (* Create Socket *)
        lOptLinger                    : SOCKET_LINGER;
        dwValue                        : DWORD                    := 1;
        nValue                        : DINT                     := 1;
        (* Verwendete FBs aus SysSockAsync.lib *)
        mySysSockCreateAsync        : SysSockCreateAsync;
        mySysSockSetOptionAsync        : SysSockSetOptionAsync;
    
    
    END_VAR
    
    
    
    
    IF NOT xExecute THEN    nState := 0;
    END_IF;
    
    
    
    
    CASE nState OF
    0:
        xDone := FALSE;
        xError := FALSE;
        wErrorID := 16#0;
        nState := 10;
    
    
    10:
        IF xExecute THEN
            nState :=20;
        END_IF;
    (* ---------------------------------------------------------- *)
    20:(* create socket *)
        mySysSockCreateAsync(bEnable := FALSE);
        IF NOT mySysSockCreateAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    30:
        IF eProtocolType = ENUM_TCP THEN
            mySysSockCreateAsync.diType := SOCKET_STREAM;
            mySysSockCreateAsync.diProtocol := SOCKET_IPPROTO_IP;
        ELSE
            mySysSockCreateAsync.diType := SOCKET_DGRAM;
            mySysSockCreateAsync.diProtocol := SOCKET_IPPROTO_UDP;
        END_IF;
    
    
        FUN_EthComRegisterCallbacks();
    
    
        mySysSockCreateAsync(
            bEnable                := TRUE,
            diAddressFamily        := SOCKET_AF_INET,    (* AF_INET: IPv4 basierete Internet-Protokolle. TCP und UDP sind allgemein gebräuchliche Protokolle dieser Familie *)
            diType                := ,(* SOCK_STREAM: Stellt zuverlässige, sequentielle verbindungsorientierte Byte-Streams im Vollduplexmodus zur Verfügung.
                                    Auch bandexterne Mechanismen zur Datenübertragung können unterstützt werden. Das TCP-Protokoll beruht auf diesem Socket.Typ.  *)
            diProtocol            := ,(* IPPROTO_IP is for raw IP packets. IPPROTO_TCP and IPPROTO_UDP are protocols based on IP. If you open an raw IP socket,
                                    you're responsible for assembling all the IP bytes yourself. You may need privileged access to open a raw IP socket. *)
            sSocket                => my_ST_EthCommunication[nEthComInstNo].diSocket (* erzeugten Socket in gobale Instanz übernehmen *)
        );
    
    
        IF         mySysSockCreateAsync.bDone
            AND NOT mySysSockCreateAsync.bError
        THEN
            (* Die Callbacks werden benötigt um den Socket bei Reset oder Onlinechange zu schließen sonst kann es zum Crash der PLC führen *)
    
    
            nState := nState + 10;
    
    
        ELSIF     mySysSockCreateAsync.bError
            AND mySysSockCreateAsync.bDone
        THEN
            mySysSockCreateAsync(
            bEnable                := FALSE);(*nState := 1000 + nState + 2; (* Socket konnte nicht erzeugt werden *)*)
        END_IF;
    40:
        (* Callback Funktionen registrieren und Socket Optionen setzen *)
        (*
        SO_DEBUG         Gibt an, ob Debug-Informationen mitgeschrieben wurden
        SO_BROADCAST     Gibt an, ob die Übermittlung von Rundsende-Nachrichten unterstützt wird.
        SO_REUSEADDR     Gibt an, ob die lokale Adresse wiederverwendet werden kann.
        SO_KEEPALIVE     Gibt an, ob Verbindungen durch periodische Aussendungen von Nachrichten aufrecht erhalten werden.
                        Falls der verbundene Socket nicht auf diese Nachrichten antworten kann, wird die Verbindung unterbrochen
                        und Prozesse, die auf diesen Socket schreiben, erhalten ein SIGPIPE Signal.
        SO_LINGER         Gibt an, ob der socket einen Aufruf von socket_close() verzögert, falls noch Daten
                        vorhanden sind. In der Standardeinstellung versucht ein Socket vor dem Schließen, alle noch nicht
                        gesendeten Daten zu übermitteln. Im Falle eines verbindungsorientierten Sockets, wartet socket_close() auf die
                        Empfangsbestätigung seiner Gegenstelle. Falls l_onoff von 0 verschieden und l_linger ist 0, werden bei einem
                        verbindungsorientierten Socket alle noch nicht gesendeten Daten verworfen und das Signal RST (Reset) an
                        die Gegenstelle gesendet. Andererseits, falls sowohl l_onoff als auch l_linger von 0 verschieden sind,
                        blockiert der Aufruf von socket_close() den Socket so lange, bis entweder alle Daten gesendet sind oder
                        das Zeitlimit erreicht ist, das in l_linger gesetzt wurde. Wenn der Socket auf nicht-blockieren gesetzt ist,
                        schläGT socket_close() fehl und gibt einen Fehler zurück. ARRAY. Das ARRAY enthäLT zwei Schlüssel: l_onoff AND l_linger.
        SO_OOBINLINE     Gibt an, ob socket die Übertragung von bandexternen Daten in der Reihenfolge überträGT, wie sie auftreten.
        SO_SNDBUF         Gibt die Grösse des Sendepuffers zurück.
        SO_RCVBUF         Gibt die Grösse des Empfangspuffers zurück.
        SO_ERROR         Gibt den Fehlerstatus zurück und löscht ihn. INT (dieser Wert kann nicht von socket_set_option() gesetzt werden.)
        SO_TYPE         Gibt den Typ von socket zurück (z. B. SOCK_STREAM). INT (dieser Wert kann nicht von socket_set_option() gesetzt werden.)
        SO_DONTROUTE     Gibt an, ob ausgehende Nachrichten das standardmässige Routing umgehen.
        SO_RCVLOWAT     Gibt die Mindestanzahl Bytes an, die socket bei einer Empfangsoperation verarbeiten soll.
                        (Der Vorgabewert ist 1.)
        SO_RCVTIMEO     Gibt den Wert der Zeitspanne bis zu einer Zeitüberschreitung bei Empfangsoperationen an. ARRAY. Das ARRAY
                        enthäLT zwei Schlüssel: sec, den Sekunden-Anteil der Zeitspanne und usec, den Mikrosekunden-Anteil der Zeitspanne
                        bis zu einer Zeitüberschreitung. SO_SNDTIMEO Gibt die Zeitspanne an, nach der eine Zeitüberschreitung bei
                        Sendeoperationen ausgelöST wird. Eine Ausgabefunktion darf während der angegebenen Zeitspanne blockieren,
                        falls die Ablaufsteuerung den Versand der Daten verhindert. ARRAY. Das ARRAY enthäLT zwei Schlüssel: sec
                        den Sekunden-Anteil der Zeitspanne und usec den Mikrosekunden-Anteil der Zeitspanne bis zu einer Zeitüberschreitung.
        SO_SNDLOWAT     Gibt die Mindestanzahl Bytes an, die socket bei einer Ausgabeoperation verarbeiten soll.
        *)
    
    
        mySysSockSetOptionAsync(bEnable := FALSE);
        IF NOT mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    
    
    50: (* Socketoption setzen: Sendepuffergröße einstellen *)
        mySysSockSetOptionAsync(
            bEnable            := TRUE,
            diSocket        := my_ST_EthCommunication[nEthComInstNo].diSocket,     (* Socket übergeben *)
            diLevel            := SOCKET_SOL,                (* Der Parameter level gibt die Protokollebene an, auf der diese Option gilt. Um beispielsweise Optionen auf dem Socket-Level abzufragen
                                                                    würde man den Parameter level auf den Wert SOL_SOCKET setzen. Andere Ebenen, wie etwa TCP können benutzt werden, indem man die 
                                                                    Protokollnummer dieser Ebene benutzt. *)
            diOption        := SOCKET_SO_SNDBUF,        (* Setzt die Größe des Sendepuffers fest *)
            pOptionValue    := ADR(ETH_COM_MAX_DATA_SIZE_SEND),
            diOptionLength    := SIZEOF(ETH_COM_MAX_DATA_SIZE_SEND)
        );
        IF mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        ELSIF mySysSockSetOptionAsync.bError THEN
            nState := 1000 + nState + 2;
        END_IF;
    
    
    60:
        mySysSockSetOptionAsync(bEnable := FALSE);
        IF NOT mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    
    
    70: (* Socketoption setzen: Empfangspuffergröße einstellen *)
        mySysSockSetOptionAsync(
            bEnable            := TRUE,
            diSocket        := my_ST_EthCommunication[nEthComInstNo].diSocket,     (* Socket übergeben *)
            diLevel            := SOCKET_SOL,                (* Der Parameter level gibt die Protokollebene an, auf der diese Option gilt. Um beispielsweise Optionen auf dem Socket-Level abzufragen
                                                                    würde man den Parameter level auf den Wert SOL_SOCKET setzen. Andere Ebenen, wie etwa TCP können benutzt werden, indem man die 
                                                                    Protokollnummer dieser Ebene benutzt. *)
            diOption        := SOCKET_SO_RCVBUF,        (* Setzt die Größe des Sendepuffers fest *)
            pOptionValue    := ADR(ETH_COM_MAX_DATA_SIZE_RECV),
            diOptionLength    := SIZEOF(ETH_COM_MAX_DATA_SIZE_RECV)
        );
        IF mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        ELSIF mySysSockSetOptionAsync.bError THEN
            nState := 1000 + nState + 2;
        END_IF;
    80:
        mySysSockSetOptionAsync(bEnable := FALSE);
        IF NOT mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    90: (* Socketoption setzen: Adresse darf wiederverwendet werden nach Schließen des Sockets *)
        dwValue := 1;
        mySysSockSetOptionAsync(
            bEnable            := TRUE,
            diSocket        := my_ST_EthCommunication[nEthComInstNo].diSocket,     (* Socket übergeben *)
            diLevel            := SOCKET_SOL,                (* Der Parameter level gibt die Protokollebene an, auf der diese Option gilt. Um beispielsweise Optionen auf dem Socket-Level abzufragen
                                                                    würde man den Parameter level auf den Wert SOL_SOCKET setzen. Andere Ebenen, wie etwa TCP können benutzt werden, indem man die 
                                                                    Protokollnummer dieser Ebene benutzt. *)
            diOption        := SOCKET_SO_REUSEADDR,        (* Gibt an, dass Adresse wieder genutzt werden darf nach Schließen des Sockets! *)
            pOptionValue    := ADR(dwValue),
            diOptionLength    := SIZEOF(dwValue)
        );
        IF mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        ELSIF mySysSockSetOptionAsync.bError THEN
            nState := 1000 + nState + 2;
        END_IF;
    
    
    100: mySysSockSetOptionAsync(bEnable := FALSE);
        IF NOT mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    
    
    110: (* Socketoption setzen: Beim Schließen des Sockets kann durch Linger gewartet werden falls noch Daten im Sendepuffer vorliegen ==> Deaktivieren *)
        lOptLinger.l_onoff    := 0; (* Lingerfunktion deaktivieren! ==> Socket schließen bei SysSockClose auch wenn noch Daten im Ausgangspuffer vorliegen!  *)
        lOptLinger.l_linger    := 0; (* Kein Linger nutzten! *)
    
    
        mySysSockSetOptionAsync(
            bEnable            := TRUE,
            diSocket        := my_ST_EthCommunication[nEthComInstNo].diSocket,     (* Socket übergeben *)
            diLevel            := SOCKET_SOL,                (* Der Parameter level gibt die Protokollebene an, auf der diese Option gilt. Um beispielsweise Optionen auf dem Socket-Level abzufragen
                                                                    würde man den Parameter level auf den Wert SOL_SOCKET setzen. Andere Ebenen, wie etwa TCP können benutzt werden, indem man die 
                                                                    Protokollnummer dieser Ebene benutzt. *)
            diOption        := SOCKET_SO_LINGER,        (* Gibt an, dass Adresse wieder genutzt werden darf nach Schließen des Sockets! *)
            pOptionValue    := ADR(lOptLinger),
            diOptionLength    := SIZEOF(lOptLinger)
        );
        IF mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        ELSIF mySysSockSetOptionAsync.bError THEN
            nState := 1000 + nState + 2;
        END_IF;
    
    
    120:
        mySysSockSetOptionAsync(bEnable := FALSE);
        IF NOT mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    
    
    130:
        nValue := 1;
        mySysSockSetOptionAsync(
            bEnable            := TRUE,
            diSocket        := my_ST_EthCommunication[nEthComInstNo].diSocket,     (* Socket übergeben *)
            diLevel            := SOCKET_SOL,        (* Gibt an, ob Verbindungen durch periodische Aussendungen von Nachrichten aufrecht erhalten werden.
                                                        Falls der verbundene Socket nicht auf diese Nachrichten antworten kann, wird die Verbindung unterbrochen
                                                        und Prozesse, die auf diesen Socket schreiben, erhalten ein SIGPIPE Signal. *)
            diOption        := SOCKET_SO_KEEPALIVE,        (* Gibt an, dass Adresse wieder genutzt werden darf nach Schließen des Sockets! *)
            pOptionValue    := ADR(nValue),
            diOptionLength    := SIZEOF(nValue)
        );
        IF mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        ELSIF mySysSockSetOptionAsync.bError THEN
            nState := 1000 + nState + 2;
        END_IF;
    
    
    140:
        mySysSockSetOptionAsync(bEnable := FALSE);
        IF NOT mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        END_IF;
    
    
    150:
        dwValue := 1;
        mySysSockSetOptionAsync(
            bEnable            := TRUE,
            diSocket        := my_ST_EthCommunication[nEthComInstNo].diSocket,     (* Socket übergeben *)
            diLevel            := SOCKET_SOL,        (* Gibt an, ob Verbindungen durch periodische Aussendungen von Nachrichten aufrecht erhalten werden.
                                                        Falls der verbundene Socket nicht auf diese Nachrichten antworten kann, wird die Verbindung unterbrochen
                                                        und Prozesse, die auf diesen Socket schreiben, erhalten ein SIGPIPE Signal. *)
            diOption        := SOCKET_SO_REUSEPORT,        (* Gibt an, dass Adresse wieder genutzt werden darf nach Schließen des Sockets! *)
            pOptionValue    := ADR(dwValue),
            diOptionLength    := SIZEOF(dwValue)
        );
    
    
        IF mySysSockSetOptionAsync.bDone THEN
            nState := nState + 10;
        ELSIF mySysSockSetOptionAsync.bError THEN
            nState := 1000 + nState + 2;
        END_IF;
    
    
    160:
        xDone := TRUE;
    1000..1999:
        ;
    END_CASE;
    PS: Endlich mal wieder ein interessantes Thema und nicht nur irgendwer der einen Syntaxfehler im Programm hat
    Geändert von excelite (26.03.2016 um 15:26 Uhr)

  4. #14
    Registriert seit
    29.03.2004
    Beiträge
    5.803
    Danke
    144
    Erhielt 1.712 Danke für 1.242 Beiträge

    Standard

    Wieso muss man denn mit so kruden Callbacks hantieren, wenn einem die Fuktionen in ihrem Rückgabewert sagen, dass der Handle ungültig ist? Damit muss man übrigens immer rechnen.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  5. #15
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    Die Fkt sagt zwar, dass der Handle gültig ist wenn man den Socket erzeugt. Anschließend gibt es allerdings keine Fkt die einem prüft ob der Handle noch gültig ist. Der Wert des Handles wird ja nur einmalig geschrieben von SysSockCreate. Anschließend prüft man diesen. Wenn man aber einen Onlinechange macht reagiert Codesys hier so, dass der Handle nach wie vor gültig ist zumindest das was man prüfen kann. Ist ja nur ein DWORD. Dieser wird aber beim Onlinechange nicht auf 0 gesetzt o.ä. wenn man das nicht über SocketClose tut. Das heißt: In der Applikation kann man nach dem Onlinechange nicht herausfinden ob der Socket noch zu verwenden ist. Einzige Lösung: den Socket VOR dem Onlinechange schließen. Dies kann man machen in dem man immer vorher von Hand den Socket schließt durch "Verbindungsabbau" oder einfach automatisiert über CALLBACKs.

    Selbst wenn man nach dem Onlinechange prüfen könnte ob der Handle noch gültig ist kann man damit nix mehr machen also auch kein nachträgliches schließen denn das erfordert natürlich einen gültigen Socket. Ungültige Sockets/Handles kann man nicht schließen.

    Meiner Meinung nach sollten die Sockets Onlinechangesicher von 3s gestaltet werden. Ich habe keine Ahnung wieso sie das nicht sind.

  6. #16
    Registriert seit
    29.03.2004
    Beiträge
    5.803
    Danke
    144
    Erhielt 1.712 Danke für 1.242 Beiträge

    Standard

    Mit einem ungültigen Handle kann ich auch bei Windows nichts mehr machen außer als diesen wegzuwerfen, und ggf. die eigenen Ressourcen aufzuräumen.
    Was machen denn die Codesys-Funktionen zum Lesen und Schreiben über einen Socket, wenn der Handle ungültig ist? Da muss es doch eine Fehlermeldung geben. Und wenn nicht, dann ist es ein Fehler in den Codesys-Bibliotheken.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  7. #17
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also mein Problem bestand nicht beim onlinechange.
    Ich hatte das Problem nur nach einem Download. Und zwar folgendes:
    Wenn ich einen Socket geöffnet hatte und dann einen Programmdownload gemacht habe, dann war nach dem Neustart der Steuerung (Nur bei der Win V3) kein öffnen des Sockets auf dem gleichen Port mehr möglich, weil der wohl noch geöffnet war. Das Programm kannte aber ja den Handle nicht mehr, deswegen konnte ich ihn nicht mehr benutzen oder schließen. Mit dem callback wird einfach alles vor dem Download geschlossen und somit kann ich danach den Socket wieder öffnen.

  8. #18
    Registriert seit
    29.03.2004
    Beiträge
    5.803
    Danke
    144
    Erhielt 1.712 Danke für 1.242 Beiträge

    Standard

    Also für mich ist das eindeutig ein Fehler in Codesys, wenn da irgendwas im Hintergrund unkontrolliert vor sich hin vagabundiert. Wenn ich Systemressourcen anfordere, muss ich diese kontrollieren können. Wenn bei einem Online-Change irgendwas zurückgesetzt werden muss, dann muss Codesys dafür sorgen dass die Dienste die davon beeinflusst werden zurückgesetzt werden. Ansonsten ist es kein Online-Change.

    Ich verstehe nicht warum die Codesys-Anwender solche Bugs einfach so hinnehmen. Bei Siemens würde ich umgehend einen Fall aufmachen, und ich bin mir sicher, dass Siemens so etwas (zumindest irgendwann) korrigieren würde.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  9. #19
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    Es ist wie es ist,.. war schon in V2 so und wird sich auch nicht ändern, denken ich. Eine Grundsatzdiskussion S7 vs Codesys fange ich jetzt nicht an - das ist müssig. Vielleicht kann HausSPSler hier ein abschließenden Kommentar geben.

  10. #20
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also nochmal beim Onlinechange passiert garnichts. Die Verbindung läuft einwandfrei weiter.
    Naja und zu dem Kommentar mit SIEMENS kann ich nur sagen, dass SIEMENS sich in Sachen Support einen Sch... um die Kunden kümmert naja egal.

Ähnliche Themen

  1. TIA SPS Daten Abfrage über Socket
    Von Shatex im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 25.08.2015, 16:27
  2. Daten zu BC9050 über Socket Interface schicken
    Von ranni im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 17.06.2014, 21:23
  3. Socket Kommunikation
    Von Dust80 im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 04.11.2013, 19:38
  4. TCP-SOCKET Kommunikation mit WinAC RTX
    Von rostiger Nagel im Forum Simatic
    Antworten: 97
    Letzter Beitrag: 11.02.2013, 16:15
  5. Wie funktioniert ein Kamerasystem Socket
    Von Bensen83 im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 20.01.2013, 23:44

Lesezeichen

Berechtigungen

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