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

Ergebnis 1 bis 3 von 3

Thema: Problem mit UDP_Send

  1. #1
    Registriert seit
    14.01.2013
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Community,

    mit UDP_Receive habe ich schon gearbeitet. Nun wollte ich den Baustein UDP_Send zum Verschicken von Werten verwenden, aber irgendwie bekomme ich keine Daten aus der SPS.

    Mein Code:

    Code:
    FUNCTION_BLOCK FB_UDP_Erzeuge_Daten_Master
    VAR_INPUT
        uint_Zargen_Nr: UINT;
        int_Stellgroesse_Antrieb1_rechts: INT;
        int_Stellgroesse_Antrieb2_links: INT;
        int_Stellgroesse_Antrieb3_rechts: INT;
        int_Stellgroesse_Antrieb4_links: INT;
        int_Stellgroesse_Antrieb5_rechts: INT;
        int_Stellgroesse_Antrieb6_links: INT;
        int_Stellgroesse_Antrieb7_rechts: INT;
        int_Stellgroesse_Antrieb8_links: INT;
    END_VAR
    
    VAR_OUTPUT
    END_VAR
    
    VAR
        inst_UDP_Peer: nbs.UDP_Peer;        // FB zum initialisieren des UDP-Sendens
        inst_UDP_Send: NBS.UDP_Send;        // Empfangsbaustein für UDP-Daten
        hConnection: caa.handle;            // Handle der UDP-Verbindung
        array_byte_UDP_Send_Data: ARRAY[0..glob_c_uint_Buffergroesse_UDP] OF BYTE;    // Sendebuffer UDP
        
        word_temp: WORD;
    END_VAR
    
    ---------------------------------------------------------------------------------------------------------------------------------
    
    // Array zum Versenden aufbereiten
        // Antrieb 1
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb1_rechts);
    array_byte_UDP_Send_Data[0] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[1] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 2
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb2_links);
    array_byte_UDP_Send_Data[2] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[3] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 3
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb3_rechts);
    array_byte_UDP_Send_Data[4] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[5] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 4
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb4_links);
    array_byte_UDP_Send_Data[6] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[7] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 5
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb5_rechts);
    array_byte_UDP_Send_Data[8] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[9] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 6
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb6_links);
    array_byte_UDP_Send_Data[10] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[11] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 7
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb7_rechts);
    array_byte_UDP_Send_Data[12] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[13] := WORD_TO_BYTE(word_temp / 16#100);
        // Antrieb 8
    word_temp := INT_TO_WORD(int_Stellgroesse_Antrieb8_links);
    array_byte_UDP_Send_Data[14] := WORD_TO_BYTE(word_temp AND 16#00FF);
    array_byte_UDP_Send_Data[15] := WORD_TO_BYTE(word_temp / 16#100);
    
    // Array per UDP versenden
    inst_UDP_Peer(
        ipAddr:= FU_IP_ADDR_aus_Zargen_Nr(uint_Zargen_Nr:= uint_Zargen_Nr), 
        uiPort:= glob_c_uint_UDP_Port, 
    );
    inst_UDP_Peer.xEnable := TRUE;
    IF inst_UDP_Peer.xError = TRUE THEN
        inst_UDP_Peer.xEnable := FALSE;
        RETURN;
    END_IF
    
    IF inst_UDP_Peer.xActive = TRUE AND inst_UDP_Peer.hPeer <> nbs.Errors.ERR_INVALID_HANDLe THEN
        hConnection := inst_UDP_Peer.hPeer;
    
        inst_UDP_Send(
            xExecute:= TRUE, 
            udiTimeOut:= 20000, 
            xDone=> , 
            xBusy=> , 
            xError=> , 
            hPeer:= hConnection, 
            ipAddr:= FU_IP_ADDR_aus_Zargen_Nr(uint_Zargen_Nr:= uint_Zargen_Nr), 
            uiPort:= glob_c_uint_UDP_Port, 
            szSize:= glob_c_uint_Buffergroesse_UDP, 
            pData:= ADR(array_byte_UDP_Send_Data), 
            eError=> );
        
        IF (inst_UDP_Send.xDone AND NOT inst_UDP_Send.xBusy) OR inst_UDP_Send.xError THEN
            inst_UDP_Send.xExecute := FALSE;
        END_IF
            
    END_IF
    
    RETURN;
    Zur Erläuterung:
    Der Port ist global als 1301 definiert.
    FU_IP_ADDR_aus_Zargen_Nr liest aus einem Array die lokale IP der Steuerung, da die Software auf mehreren SPS'n paralell laufen soll (hier: 192.168.0.50):
    Code:
    FUNCTION FU_IP_ADDR_aus_Zargen_Nr : nbs.ip_addr
    VAR_INPUT
        uint_Zargen_Nr: UINT;
    END_VAR
    
    VAR
    END_VAR
    
    --------------------------------------------------------------------------------------------------------------------
    
    FU_IP_ADDR_aus_Zargen_Nr.sAddr := glob_c_array_strint_IP_ADDR_Zarge[uint_Zargen_Nr];
    
    RETURN;
    UDP_Peer läuft ohne Fehler durch und erzeugt einen gültigen Handle und auch UDP_Send läuft ohne Fehler durch. Allerding sehe ich mit Wireshark keine passenden UDP-Frames.


    Hardware: Berghof ECC2250
    Codesys V3.5 SP5 Patch 3

    Kann jemand helfen?

    Vielen Dank!
    Zitieren Zitieren Problem mit UDP_Send  

  2. #2
    Registriert seit
    08.10.2010
    Beiträge
    107
    Danke
    6
    Erhielt 15 Danke für 15 Beiträge

    Standard

    Hallo,

    kann es sein, dass der FB Aufruf einfach falsch platziert ist? Dein Execute bekommt so wie Du es programmiert hast, nie einen Flankenwechsel mit.
    Bei Aufruf ist es immer TRUE.

  3. Folgender Benutzer sagt Danke zu KvT für den nützlichen Beitrag:

    RamonR (27.05.2015)

  4. #3
    RamonR ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.01.2013
    Beiträge
    5
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von KvT Beitrag anzeigen
    Hallo,

    kann es sein, dass der FB Aufruf einfach falsch platziert ist? Dein Execute bekommt so wie Du es programmiert hast, nie einen Flankenwechsel mit.
    Bei Aufruf ist es immer TRUE.
    Du hast recht, manchmal sieht man den Wald vor lauter Bäumen nicht. UDP_Send hat nie einen Flankenwechsel gesehen. Habe es jetzt so gelöst:

    Code:
    IF inst_UDP_Peer.xActive = TRUE AND inst_UDP_Peer.hPeer <> nbs.Errors.ERR_INVALID_HANDLe THEN
        hConnection := inst_UDP_Peer.hPeer;
    
        inst_UDP_Send(
            xExecute:= TRUE, 
            udiTimeOut:= 20000, 
            xDone=> , 
            xBusy=> , 
            xError=> , 
            hPeer:= hConnection, 
            ipAddr:= FU_IP_ADDR_aus_Zargen_Nr(uint_Zargen_Nr:= uint_Zargen_Nr), 
            uiPort:= glob_c_uint_UDP_Port, 
            szSize:= glob_c_uint_Buffergroesse_UDP, 
            pData:= ADR(array_byte_UDP_Send_Data), 
            eError=> );
        
        IF (inst_UDP_Send.xDone AND NOT inst_UDP_Send.xBusy) OR inst_UDP_Send.xError THEN
            inst_UDP_Send.xExecute := FALSE;
            inst_UDP_Send();   // <- :-)
        END_IF
            
    END_IF
    
    RETURN;
    Und prompt funktioniert es!

    Wireshark.jpg

    Danke!!!

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 14.11.2014, 13:07
  2. Antworten: 11
    Letzter Beitrag: 24.01.2013, 13:28
  3. Antworten: 10
    Letzter Beitrag: 13.09.2012, 07:31
  4. Antworten: 1
    Letzter Beitrag: 25.01.2010, 15:57
  5. Antworten: 3
    Letzter Beitrag: 31.10.2008, 07:34

Lesezeichen

Berechtigungen

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