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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: TCP erbindung mit SCL

  1. #1
    Registriert seit
    10.08.2010
    Beiträge
    774
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo
    ich habe Arduino mit dem ich eine TCP Verbindung aufbauen möchte.
    Mit dem Siemens Beispiel funktioniert die Verbindung .
    http://support.automation.siemens.co...ard&viewreg=WW

    Nun wollte ich in SCL eine Programm mit TCP Verbindung erstellen. Hierzu habe ich das vorhandnen NET_IO Programm abgeändert.
    Leifer Funktioniert die Verbindung hiermit nicht. Kann mir jemand sagen was ich falsch mache ?
    Code:
    TYPE UDT_ARDUINO_IO 
    NAME    : Arduino
    FAMILY  : ''
    AUTHOR  : xxx
    VERSION : 1.0
       
     STRUCT
      VALVE :ARRAY[1..19] OF INT;
                 
     END_STRUCT
    END_TYPE
    
    
    //**********************************************FB ARDUINO*******************************************************************************
    FUNCTION_BLOCK ARDUINO
    TITLE = 'Arduino'
    NAME    : Arduino
    FAMILY  : ''
    AUTHOR  : Zehe
    VERSION : '1.0'
    
    VAR_INPUT
      CONNECT : BOOL;
      ID : WORD;  
      DEV_ID : BYTE;  
      IP_ADDR1 : INT;  
      IP_ADDR2 : INT;  
      IP_ADDR3 : INT;  
      IP_ADDR4 : INT;  
      LOC_PORT :DINT;
      REM_PORT :DINT;
    END_VAR
    VAR_IN_OUT
      ARDUINO_IO : UDT_ARDUINO_IO;
    END_VAR  
    VAR_OUTPUT
      CONNECTED : BOOL;
    END_VAR    
    VAR_TEMP
      TempPointer : ANY;
      AnyPointer AT TempPointer : STRUCT
        BYTE0 : BYTE; //10h
        TYP : BYTE;   //Daten/Parametertyp
        ANZ : WORD;   //Länge
        DBNr : WORD;  //DB-Nummer
        BZ : DWORD;   //Bereichszeiger
      END_STRUCT;
      i : INT;
      BCD_Code : DWORD;
    END_VAR
    VAR
      TCON : TCON;
      TSEND : TSEND;
      TRCV : TRCV;
      TDISCON : TDISCON;
      TCON_PAR : TCON_PAR;
      TON_CON : TON;
      TON_SEND : TOF;
      PulsePosConn : BOOL;   
      PulseNegConn : BOOL;   
      EdgeFlagPos : BOOL;
      EdgeFlagNeg : BOOL;
      Count : INT;
      RcvData : ARRAY[0..23] OF CHAR;
      GETVALVE: ARRAY[0..12] OF CHAR :=  'G','E','T','V','A','L','V','E',' ','X','X','$L', '$R';
    
    END_VAR
    
    BEGIN
    
    (*********************************************************)    
    (* Get the positive pulse                                *)
    (*********************************************************)    
    
      PulsePosConn := CONNECT AND NOT EdgeFlagPos;
      EdgeFlagPos := CONNECT;
    
    (*********************************************************)    
    (* Get the negative pulse                                *)
    (*********************************************************)    
    
      PulseNegConn := NOT CONNECT AND EdgeFlagNeg;
      EdgeFlagNeg := CONNECT;
    
    (*********************************************************)    
    (* Set ID of the specified connection                    *)
    (*********************************************************)
    
      TCON_PAR.id := ID;
      TCON_PAR.local_device_id := DEV_ID;
    
    (*********************************************************)    
    (* Set IP address values                                 *)
    (*********************************************************)    
    
      TCON_PAR.rem_staddr[1] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR1));
      TCON_PAR.rem_staddr[2] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR2));
      TCON_PAR.rem_staddr[3] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR3));
      TCON_PAR.rem_staddr[4] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR4));
      //Port local Port
      TCON_PAR.local_tsap_id[2] :=B#16#0;//WORD_TO_BYTE(DINT_TO_WORD(LOC_PORT));
      TCON_PAR.local_tsap_id[1] :=B#16#0;//WORD_TO_BYTE(SHR(IN:=DINT_TO_WORD(LOC_PORT),N:=8));
      TCON_PAR.local_tsap_id_len:=B#16#0;//B#16#2;
     //Port REM Port
      TCON_PAR.rem_tsap_id[2] :=WORD_TO_BYTE(DINT_TO_WORD(REM_PORT));
      TCON_PAR.rem_tsap_id[1] :=WORD_TO_BYTE(SHR(IN:=DINT_TO_WORD(REM_PORT),N:=8));
      TCON_PAR.rem_tsap_id_len:=B#16#2;
      // Set leagth of the IP address
      TCON_PAR.rem_staddr_len := B#16#4;
      
    
    (*********************************************************)    
    (* Establish connection                                  *)
    (*********************************************************)    
    
      IF PulsePosConn THEN
        TCON.REQ := TRUE;
      END_IF;  
      
      TCON(REQ     := TCON.REQ,
           ID      := TCON_PAR.id,
           CONNECT := TCON_PAR);
          
      IF TCON.DONE THEN
        CONNECTED := TRUE;
        TCON.REQ := FALSE;
      END_IF;
      
      TON_CON(IN := CONNECTED,
              PT := T#2s); 
       
    (*********************************************************)
    (*********************************************************)
    
      CASE Count OF
          1..9:    GETVALVE[9]  := INT_TO_CHAR(0 + 48);
                   GETVALVE[10] := INT_TO_CHAR(Count + 48);
                   TempPointer := GETVALVE;
    
          10..19:
                   GETVALVE[9]  := INT_TO_CHAR(1 + 48);
                   GETVALVE[10] := INT_TO_CHAR(Count-10 + 48);
                   TempPointer := GETVALVE;
    
        
         
      ELSE
        Count := 1;
      //  TempPointer := GETSTATUS;
      END_CASE;      
    
    (*********************************************************)
    (* Send data over existing connection                    *)    
    (*********************************************************) 
    
      TSEND.LEN := WORD_TO_INT(AnyPointer.ANZ);
    
      IF TON_CON.Q THEN
        
        TON_SEND(IN := NOT TSEND.REQ,
                 PT := T#50ms);
                  
        TSEND.REQ := TON_SEND.Q; 
        
        TSEND(REQ  := TSEND.REQ,
              ID   := TCON_PAR.id,
              LEN  := TSEND.LEN, 
              DATA := TempPointer);
    
      END_IF; 
    
    (*********************************************************)
    (* Receive data over existing connection                 *)    
    (*********************************************************)    
    
      IF CONNECTED THEN
    
        TRCV(EN_R := TRUE,
             ID   := TCON_PAR.ID,
             LEN  := TRCV.LEN,
             DATA := RcvData); 
         
      END_IF;
      
      BCD_Code := 0;
      
      IF TRCV.NDR THEN
        CASE Count OF
            
                    
        
          1..19: IF CHAR_TO_INT(RcvData[0]) >= 48 AND CHAR_TO_INT(RcvData[0]) <= 57 THEN
                    BCD_Code := WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[0]) - 48)); 
                  END_IF;
                  IF CHAR_TO_INT(RcvData[1]) >= 48 AND CHAR_TO_INT(RcvData[1]) <= 57 THEN
                    BCD_Code := SHL(IN:=BCD_Code, N:=4);
                    BCD_Code := BCD_Code OR WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[1]) - 48));
                  END_IF;  
                  IF CHAR_TO_INT(RcvData[2]) >= 48 AND CHAR_TO_INT(RcvData[2]) <= 57 THEN
                    BCD_Code := SHL(IN:=BCD_Code, N:=4);
                    BCD_Code := BCD_Code OR WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[2]) - 48));
                  END_IF;  
                  IF CHAR_TO_INT(RcvData[3]) >= 48 AND CHAR_TO_INT(RcvData[3]) <= 57 THEN
                    BCD_Code := SHL(IN:=BCD_Code, N:=4);
                    BCD_Code := BCD_Code OR WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[3]) - 48));
                  END_IF;  
                  ARDUINO_IO.VALVE[Count] := DINT_TO_INT(DWORD_BCD_TO_DINT(BCD_Code));
                       
                  
                  
        END_CASE;
        
        Count := Count + 1;
        
        FOR i := 0 TO 23 DO
          RcvData[i] := ' ';
        END_FOR;      
      END_IF;
      
    (*********************************************************)    
    (* Existing connection end                               *)
    (*********************************************************)    
    
      IF PulseNegConn AND CONNECTED THEN
        TDISCON.REQ := TRUE;
      END_IF;  
      
      TDISCON(REQ := TDISCON.REQ,
              ID  := TCON_PAR.id); 
          
      IF TDISCON.DONE THEN
        CONNECTED := FALSE;
        TDISCON.REQ := FALSE;
        Count := 1;
      END_IF;
    
    END_FUNCTION_BLOCK
    Geändert von emilio20 (24.01.2014 um 00:27 Uhr)
    Zitieren Zitieren TCP erbindung mit SCL  

  2. #2
    Registriert seit
    10.08.2010
    Beiträge
    774
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo habe den fehler gefunden actic war nicht auf True.

    kann mir jemand erklären was im Char $L und $R Bedeuten ?

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.311
    Danke
    932
    Erhielt 3.321 Danke für 2.683 Beiträge

    Standard

    Das sind die ASCII-Zeichen
    $L = B#16#0A = Linefeed (LF)
    $R = B#16#0D = Carriage Return (CR)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.262
    Danke
    537
    Erhielt 2.707 Danke für 1.956 Beiträge

    Standard

    Ich sehe keinerlei Fehlerbehandlung in deinem Baustein.
    Was macht der Baustein, wenn Done nicht kommt, sondern Error, weil z.Bsp. die Verbindung getrennt wurde?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #5
    Registriert seit
    10.08.2010
    Beiträge
    774
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo
    ich bin kein TCP Fachmann. Habe bis jetzt nur mit dem Siemens Beispiel und dem AVR net io Programm gearbeitet.

    Was müsste deiner Meinung nach noch eingebaut werden?


    Habe folgendes Problem über das Simatic Beispiel TCP erhalte ich am Arduino immer einen sauber empfangenen String. (siehe Bild TCP 1)
    Über mein Programm erhalte ich Fehler( siehe Bild TCP 2)
    Angehängte Grafiken Angehängte Grafiken
    Geändert von emilio20 (24.01.2014 um 18:00 Uhr)

  6. #6
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    Über mein Programm erhalte ich Fehler( siehe Bild TCP 2)
    "Fehler" ist gut. Was fehlt denn? Die Verbindung wird aufgebaut und der RECV empfängt auch etwas? Kein ERROR Bit an SEND/RECV?
    Wenn doch, STATUS damit umkopieren.

    So spontan behaupte ich, dass Zeile 180 ein Problem ist:
    Code:
    LEN  := TRCV.LEN
    TRCV.LEN ist nicht initialisiert und müsste hier 24 sein, so groß wie der Empfangsbereich ist.
    (Die echte Empfangslänge liegt in TRCV.TRCV_LEN)
    There are two kinds of fools. One says, “This is old, and therefore good.” And one says, “This is new, and therefore better.”

  7. #7
    Registriert seit
    10.08.2010
    Beiträge
    774
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo
    Verbindung OK
    kein Fehler siehe Anhang

    Am len liegt es nicht wenn ich 24 rein schreibe müssen 24 Byte zurück kommen bis der conter weiter läuft. Senn also eine char '0' die Antwort ist dauert es bis TRCV.NDR = TRUE
    Mir ist aufgefallen wenn ich den Sendezyklus schnelle als 1s mache geht garnichts mehr.
    Angehängte Grafiken Angehängte Grafiken
    Geändert von emilio20 (24.01.2014 um 23:17 Uhr)

  8. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.262
    Danke
    537
    Erhielt 2.707 Danke für 1.956 Beiträge

    Standard

    TSend hat u.a. einen Ausgang "Busy", und ein "Done". Senden wird gestartet, wenn am Req-Eingang ein Signalwechsel von False auf True erkannt wird. Du darfst erst wieder ein Send-Request auslösen, wenn der vorherige Sendevorgang fertig ist. Schau dir noch einmal das Siemens-Beispiel an, da wird ein Send-Request gesetzt und der wird erst wieder zurückgesetzt, wenn "Done" oder "Error" vom Send-Baustein zurückkommt. Erst dann wir ein neues Send ausgelöst.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. #9
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard

    Am len liegt es nicht wenn ich 24 rein schreibe müssen 24 Byte zurück kommen bis der conter weiter läuft.
    //edit
    Im DB wirst du niemals einen Fehlerstatus sehen, weil der nur einen einzigen Zyklus lang ansteht.
    > Mit dem Error Bit STATUS umkopieren.
    Geändert von Pipboy (25.01.2014 um 20:53 Uhr)
    There are two kinds of fools. One says, “This is old, and therefore good.” And one says, “This is new, and therefore better.”

  10. #10
    Registriert seit
    10.08.2010
    Beiträge
    774
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo das mit dem empfangspuffer ist glaube ich nicht das Problemm. Ist im Siemens Beispiel auch so. Es kann sein das ich 2 Byte 4 Byte oder 10 Byte emfangen. Woher weiß ich wieviel grade gesendet werden ?

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 24.05.2012, 10:52
  2. Antworten: 1
    Letzter Beitrag: 23.01.2012, 17:06
  3. SCL: FB Aufruf unter SCL mit Variablen DB
    Von ThorstenK im Forum Programmierstrategien
    Antworten: 32
    Letzter Beitrag: 10.02.2011, 19:15
  4. Antworten: 6
    Letzter Beitrag: 19.07.2010, 11:05
  5. Antworten: 10
    Letzter Beitrag: 17.06.2008, 18:30

Lesezeichen

Berechtigungen

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