Problem mit UDP_Send

RamonR

Level-1
Beiträge
8
Reaktionspunkte
0
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!
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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;
       [COLOR=#ff0000] inst_UDP_Send();   [/COLOR][COLOR=#008000]// <- :-)[/COLOR]
    END_IF
        
END_IF

RETURN;

Und prompt funktioniert es!

Wireshark.jpg

Danke!!!
 
Zurück
Oben