-> 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:
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):
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!
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!