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

Ergebnis 1 bis 8 von 8

Thema: Mit Codesys TCP Verbindung aufbauen

  1. #1
    Registriert seit
    10.08.2010
    Beiträge
    18
    Danke
    3
    Erhielt 2 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hey Leute,
    ich brauch mal wieder eure Hilfe. Ich soll eine Wago SPS mit Codesys so Programmieren, dass sie die von einem Sensor über TCP gesendete Daten empfängt und aufarbeitet. Ich habe es inzwischen hinbekommen, dass ich den vom Sensor gesendeten String bei telnet in der Konsole bekomme.
    Die SPS soll jetzt die Daten empfangen, den String aufteilen und die Werte in verschiedene Variablen speichern.
    Ich kriegs nur nicht mal hin, dass die SPS ne Verbindung zum Sensor aufbaut.
    Wenn ihr helfen könntet oder jemand allgmeinen Krams hat, der mir helfen könnte, wäre das super.
    Vielen Dank,
    Gruß J4CK
    Zitieren Zitieren Mit Codesys TCP Verbindung aufbauen  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Hast du eine Bibo mit TCP/IP Funktionen? Keine Ahnung wie das bei Codesys aussieht, aber bei Beckhoff muss man diese Bibliothek extra kaufen, da sind dann alle Bausteine drin die man für die TCP Kommunikation braucht.

  3. #3
    J4CK ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.08.2010
    Beiträge
    18
    Danke
    3
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Also ich habe die SysLabSockets.lib, die Ethernet.lib und die WagoSysSockets.lib. Alle drei sehen so aus, als könnten sie nützlich sein. Haben funktionen wie Connect, Create, Close, Send, Listen...
    Für die SysLabSockets hab ich sogar ne Doku, allerdings verstehe ich schon nicht, wie ich einen neuen Socket erstelle. Was ist eine Adressfamilie (dint) und was für ein Protocol (dint) muss ich nehmen...
    Geändert von J4CK (16.09.2010 um 07:42 Uhr)

  4. #4
    J4CK ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.08.2010
    Beiträge
    18
    Danke
    3
    Erhielt 2 Danke für 1 Beitrag

    Standard

    So, gute Nachricht. Habs geschafft. Jedenfalls den Verbindungsaufbau.
    Falls das mal jemand sucht, hab ich den Code mal am Ende eingefügt.

    Ich hab nur noch ein Problem. Ich muss ein Triggerbefehl an den Sensor schicken (0001t) das funktioniert noch nicht. Ich weiß nicht, ob das an diesem diFlag zusammenhängt oder der den String irgendwie umkonvertiert und der Sensor darauf nicht mehr reagiert. Wenn einer von euch weiter weiß...

    Vielen Dank,
    Gruß J4CK



    Code:
    --- bei mir Global ---
    VAR_GLOBAL
     addressPointer:POINTER TO SOCKADDRESS;
     address:SOCKADDRESS;
     ip:STRING:='192.168.1.5';
     send:STRING:='0001t';
     receive:STRING;
     port: WORD:=50010;
     objectArray:ARRAY[0..6] OF REAL;
    END_VAR
     
    --- Programmvariablen ---
    VAR
     result: BOOL;
     socketId: DINT;
     terminate: BOOL;
    END_VAR
     
    --- Das Programm ---
    address.sin_addr:=SysSockInetAddr(ip);
    address.sin_family:=SOCKET_AF_INET;
    address.sin_port:=SysSockHtons(port);
    addressPointer:=ADR(address);
    IF socketId =0 AND terminate = FALSE THEN (* Verbindung aufbauen *)
      socketId := SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM,0);
      result := SysSockConnect(socketId,addressPointer,SIZEOF(address));
    ELSE
     IF terminate = TRUE THEN (* Verbindung abbauen *)
      SysSockClose(socketId);
      socketId := 0;
      result := FALSE;
     END_IF (* Verbunden *)
     (* SysSockSend(socketId,ADR(send),SIZEOF(send),1); *)     <--- das da geht noch nicht
     SysSockRecv(socketId,ADR(receive),SIZEOF(receive),1);
     objectArray := split(receive); 
    END_IF
     
    --- Splitfunktionsvariablendefinition ---
    FUNCTION split :ARRAY[0..6] OF REAL
    VAR_INPUT
     input:STRING;
    END_VAR
    VAR
     inputSize: INT;
     rest: STRING;
     restSize: INT;
     i: INT;
     findR: INT;
     detail: STRING;
     detailSize: INT;
     detailArray:ARRAY[0..6] OF REAL;
    END_VAR
     
    --- Und die Funktion ---
    inputSize := LEN(input);
    rest := MID(input,inputSize-9,10);
    FOR i := 0 TO 6 DO
     findR := FIND(rest,'#');
     detail := MID(rest,findR-1,1);
     restSize := LEN(rest);
     detailSize := LEN(detail);
     rest := MID(rest,restSize-detailSize,detailSize+2);
     detailArray[i] := STRING_TO_REAL(detail);
     IF i = 0 AND detail = 'PASS' THEN
      detailArray[i] := 1;
     END_IF
     IF i = 0 AND detail = 'FAIL' THEN
      detailArray[i] := 0;
     END_IF
    END_FOR
    split:=detailArray;
    Geändert von J4CK (16.09.2010 um 16:00 Uhr)

  5. #5
    Registriert seit
    10.05.2005
    Beiträge
    1.996
    Danke
    219
    Erhielt 231 Danke für 203 Beiträge

    Standard

    Hi

    Mal eine dumme Frage.


    Wie läßt du den Code "Das Programm" ablaufen ?


    Ist dieser Code wie abgebildet unter z.b. plc_prog geschrieben und wird permanent durchlaufen ?


    Falls ja, eine SPS ist KEIN "Von Neumann" - Rechner.

    Für diese anweisungen solltest du dir eine Art "Sate"-Maschine schreiben.


    Gruß Karl
    Karl

  6. #6
    J4CK ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.08.2010
    Beiträge
    18
    Danke
    3
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Hey Karl,

    ich schäme mich ja fast das zu sagen, aber ja. Ich hab das an einer Beispieldatei, die ich im 3S-Forum gefunden habe, orientiert. Könntest du mir kurz den Unterschied zwischen SPS und von-Neumann erklären (is mehr ne Interessenfrage)!?
    Wie baue ich eine State-Machine? Gibt ja noch AWL oder wie das heißt, meinste das? Also quasi Strart -> Verbindung herstellen -> result is Übergangsbedingung zu -> Verbindung hergestellt, empfangsbereit...

    Gruß J4CK

  7. #7
    Registriert seit
    10.05.2005
    Beiträge
    1.996
    Danke
    219
    Erhielt 231 Danke für 203 Beiträge

    Standard

    Hi
    Zitat Zitat von J4CK Beitrag anzeigen
    ich schäme mich ja fast das zu sagen, aber ja.
    Ich hab das an einer Beispieldatei, die ich im 3S-Forum gefunden habe, orientiert.
    Ich such dir mal was raus.

    Derzeit habe ich keine Zeit.


    Grundsätzlich:
    Das öffnen macht du in jeden SPS-Zyklus.

    So sollte es sein.
    Öffnen von TCP-Zugriff.
    Warten auf das Ergebnis.
    Zugriff erfolgreich --> Daten lesen und schreiben.

    Öffnen NICHT mehr aufrufen ! ! !


    Wenn alles erledigt ist, Handle schliessen.
    Wieder nur einmalig !
    NIcht jeden Zyklus neu !


    Also mit einer State-Maschine.



    Ich werde dir mal bei gelegenheit einen Code raussuchen.





    Zitat Zitat von J4CK Beitrag anzeigen
    Könntest du mir kurz den Unterschied zwischen SPS und von-Neumann erklären (is mehr ne Interessenfrage)!?

    Wie baue ich eine State-Machine? Gibt ja noch AWL oder wie das heißt, meinste das? Also quasi Strart -> Verbindung herstellen -> result is Übergangsbedingung zu -> Verbindung hergestellt, empfangsbereit...

    Gruß J4CK




    Zitat Zitat von J4CK Beitrag anzeigen
    Könntest du mir kurz den Unterschied zwischen SPS und von-Neumann erklären (is mehr ne Interessenfrage)!?
    Siehe hier.
    http://de.wikipedia.org/wiki/Von-Neumann-Architektur

    Von Prinzip her wartet der Rechner bis er den Befehl erfolgreich abgearbeitet hat.

    Möglicherweise benötigt er z.b. 2 Sekunden um ein Ethernetverbindung aufzubauen.
    In diesen 2 Sekunden würden die Abfrage des nachfolgenden Befehls NICHT mehr abgearbeitet werden.


    Für einen Rechner O.K.

    Für eine SPS ein NoGo. !



    Zitat Zitat von J4CK Beitrag anzeigen
    Wie baue ich eine State-Machine? Gibt ja noch AWL oder wie das heißt, meinste das? Also quasi Strart -> Verbindung herstellen -> result is Übergangsbedingung zu -> Verbindung hergestellt, empfangsbereit...
    So in etwa.
    Zum Grundgedanken.

    Zyklus der SPS hat als Beispiel 100 ms


    1. Es kommt der TCP-öffnen Befehl.
    (Diesr kann mehrere Zyklen benötigen)
    2. Lesen der ankommenden Informationen
    (Möglicherweise noch gar nicht verbunden)
    3. Schreiben der Informationen
    (Möglicherweise noch gar nicht verbunden)
    4. Zyklus ende nach 100 ms --> Mache weiter mit 1.



    Jetzt weisst du was ich meine ?

    P.S:
    Auch beim Dateizugriff hast du das selbe Problem.
    Insofern deine Hardware das erlaubt.



    Gruß Karl
    Karl

  8. #8
    J4CK ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.08.2010
    Beiträge
    18
    Danke
    3
    Erhielt 2 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke für die ausführliche Antwort.

    Ich dachte eig, dass ich das mehrmalige öffnen durch die Abfrage, ob die SocketId = 0 ist, verhindere. Wie könnte ich das denn sonst machen, wenn der Verbindungsaufbau länger als ein Zyklus dauert (SocketId ist ja erst != 0 wenn die Verbindung steht). Sollte ich noch ein Timeouttimer oder so etwas mit einbauen, so dass min. 5 Sek vergehen müssen, bevor die SPS den create-Befehl wieder ausführt!?

    Hast du zufällig eine Ahnung, warum der Sensor nicht auf das gesendete reagiert!? Ich hab da gerade sonne Befürchtung, dass das auch mit der Zykluszeit zusammen hängt und der Sensor gar nicht zum auswerten kommt. Mh, muss ich Montag auf Arbeit mal ausprobieren :-/

    Danke, Gruß J4CK
    Geändert von J4CK (17.09.2010 um 18:28 Uhr)

Ähnliche Themen

  1. VM Ware & MPI Verbindung aufbauen
    Von ross im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 05.11.2010, 17:36
  2. Antworten: 6
    Letzter Beitrag: 11.09.2009, 10:23
  3. Antworten: 4
    Letzter Beitrag: 07.05.2009, 09:53
  4. Wie eine Verbindung aufbauen?S7 200/Cpu 224
    Von Plentman im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 15.07.2008, 14:51
  5. Kann keine Verbindung zu CP 343-1 aufbauen
    Von Sascha Klein im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 26.05.2008, 09:08

Lesezeichen

Berechtigungen

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