Typ |
Funktionsbaustein |
Verfügbar ab |
V1.0.4.0 |
Übernommen aus |
- |
Implementiert |
- |
Entspricht einem Endpunkt zum Senden und Empfangen von Nachrichten über das nachrichtenbasierte UDP-Protokoll.
Üblicherweise wird zuerst die Methode Open aufgerufen. Ist dies erfolgreich, können Nachrichten gesendet werden. Wenn ein bestimmter Port abgehört werden soll, muss die Methode Bind zur Verknüpfung des Sockets mit diesem Port und optional mit einer spezifischen Ethernet-Schnittstelle verwendet werden. Sollen Nachrichten an allen verfügbaren Ethernet-Schnittstellen empfangen und die ausgehende Schnittstelle automatisch genutzt werden, müssen Sie als Schnittstellen-Eingang der Methode eine leere Zeichenfolge oder 0.0.0.0 verwenden.
Um Daten an einen anderen Peer zu senden, verwenden Sie die Methode Send. Sie werden beim ersten Senden von einem ungebundenen Socket aus automatisch gebunden. Anschließend kann die Methode Receive verwendet werden. Sofern von der Laufzeitanwendung unterstützt, werden IP und Port des Sockets über die Eigenschaften BoundIPAddress und BoundPort mit „Kann angefordert werden“ (Can be requested) gebunden.
Um zu prüfen, ob Daten zum Lesen vorliegen, werden die Eigenschaften IsReadable und BytesAvailableToRead verwendet.
Für die Methoden Send und Receive muss die Anwendung einen Puffer bereitstellen, der von der Methode Received gefüllt wird und die zu sendenden Daten für die Methode Send enthält.
Broadcasts können ohne Vorbereitung gesendet und empfangen werden. Um Multicast-Nachrichten zu empfangen, ist ein Beitritt zur entsprechenden Multicast-Gruppe erforderlich. Dazu dienen die Methoden JoinMulticastGroup und LeaveMulticastGroup.
Stellen Sie den Wert der Eigenschaft FB_UDPPeer auf die IP-Adresse der Schnittstelle ein, von der Pakete gesendet werden sollen, wenn Sie mithilfe des SockOpt_MulticastDefaultInterface-Funktionsbausteins UDP-Multicast-Pakete senden wollen. Dies muss nach dem Aufruf der Open-Methode und vor dem ersten Aufruf der SendTo-Methode ausgeführt werden.
HINWEIS: Durch die Angabe der Standardschnittstelle für Multicast-Pakete über den Wert der Eigenschaft SockOpt_MulticastDefaultInterface kann vermieden werden, dass die Pakete an alle verfügbaren Netzwerke gesendet werden.
Die Methode Close wird verwendet, um weitere Datenübertragungen zu stoppen und den Socket zu schließen.
Ist die Verarbeitung durch eine Methode nicht erfolgreich verlaufen, wird dies durch den Wert der Eigenschaft Result angegeben. Der Wert von Result muss nach jedem Methodenaufruf geprüft werden. Das Ergebnis kann auf Ok zurückgesetzt werden. Dazu dient die Methode ResetResult.
HINWEIS: Alle Methoden sind blockiert, solange der Wert der Eigenschaft Result ungleich Ok ist. Ein Methodenaufruf in diesem Fall wird ohne Beeinflussung der Informationen der Eigenschaft Result abgebrochen.
Der Funktionsbaustein weist keine Eingänge und Ausgänge auf. Die Funktionalität ist über Methode und Eigenschaften verfügbar. Der Funktionsbaustein muss in der Anwendung nicht direkt aufgerufen werden.
Die folgenden Anwendungsbeispiele ilustrieren den Beitritt zu einer Multicast-Gruppe und das Senden einer Nachricht an die Gruppe:
Peer1:
PROGRAM Peer1
VAR
//Commands
xOpen : BOOL ;
xSend : BOOL ;
xClose : BOOL ;
//UDP peer1 instance
fbUdpPeer1 : TCPUDP.FB_UDPPeer ;
//Peer1 state
etResult : TCPUDP.ET_State ;
etState : TCPUDP.ET_Result ;
//Application parameters
iState : INT ;
sSendMessage : STRING ;
//Connection parameters peer1
sIpAddressLocal : STRING := '120.120.120.13' ; //IP
//Multicast group parameters
sMulticastIP : STRING := '224.0.1.38' ; //Unassigned multicast IP
uiPortPeer2 : UINT := 8002 ; //Port of peer2 joined to multicast group
END_VAR
CASE iState OF
0 : //idle
IF xOpen THEN
fbUdpPeer1.Open ( ) ;
IF fbUdpPeer1.State = TcpUdp.ET_State.Opened THEN
//opened
fbUdpPeer1.SockOpt_MulticastDefaultInterface := sIpAddressLocal ; //IP address of the interface from which the packages should be sent
iState := 20 ;
ELSE
iState := 100 ; //error detected
END_IF
END_IF
20 : //opened
IF xSend THEN //Send from peer1 to multicast group
sSendMessage := 'Hello world!' ;
fbUdpPeer1.SendTo ( i_pbySendBuffer := ADR (sSendMessage ) ,
i_udiNumBytesToSend := INT_TO_UDINT ( LEN ( sSendMessage ) ) ,
i_sPeerIP := sMulticastIP ,
i_uiPeerPort := uiPortPeer2 ) ;
IF fbUdpPeer1.Result <> TcpUdp.ET_Result.Ok THEN
iState := 100 ; //error detected
END_IF
ELSIF xClose THEN
fbUdpPeer1.Close ( ) ;
IF fbUdpPeer1.State = TcpUdp.ET_State.Idle THEN
iState := 0 ; //closed = idle
ELSE
iState := 100 ; //error detected
END_IF
END_IF
100 : //error state
(*your code comes here*)
END_CASE
//check cyclically state
etResult := fbUdpPeer1.State ;
etState := fbUdpPeer1.Result ;
//reset commands
xOpen := xSend := xClose := FALSE ;
Peer2:
PROGRAM Peer2
VAR
//Commands
xOpenAndBind : BOOL ;
xJoinMulticastGroup : BOOL ;
xReceive : BOOL ;
xClose : BOOL ;
//UDP Peer2 instance
fbUdpPeer2 : TCPUDP.FB_UDPPeer ;
//Peer2 state
etResult : TCPUDP.ET_State ;
etState : TCPUDP.ET_Result ;
//Application parameters
iState : INT ;
sReceiveMessage : STRING ;
//Connection parameters Peer2
sIpAddressLocal : STRING ;= '120.120.120.13' ; //IP
uiPortLocal : UINT := 8002 ; //Port
//Multicast group parameters
sMulticastIP : STRING ;= '224.0.1.38' ; //Unassigned multicast IP
END_VAR
CASE iState OF
0 : //idle
IF xOpenAndBind THEN
//open
fbUdpPeer2.Open ( ) ;
IF fbUdpPeer2.State = TcpUdp.ET_State.Opened THEN
fbUdpPeer2.Bind ( i_sLocalIP := '' , i_uiLocalPort := uiPortLocal ) ; //opened... now bind
IF fbUdpPeer2.State = TcpUdp.ET_State.Bound THEN
iState := 20 ; //bound
END_IF
END_IF
IF fbUdpPeer2.Result <> TcpUdp.ET_Result.Ok THEN
iState := 100 ; //error detected
END_IF
END_IF
20 : //bound
IF xJoinMulticastGroup THEN
fbUdpPeer2.JoinMulticastGroup ( i_sInterfaceIP := sIpAddressLocal , i_sGroupIP := sMulticastIP ) ;
IF fbUdpPeer2.Result <> TcpUdp.ET_Result.Ok THEN
iState := 100 ; //error detected
END_IF
ELSIF xReceive THEN
//Receive message
fbUdpPeer2.ReceiveFrom ( i_pbyReceiveBuffer := ADR ( sReceiveMessage ) ,
i_udiReceiveBufferSize := SIZEOF ( sReceiveMessage ) ) ;
IF fbUdpPeer2.Result <> TcpUdp.ET_Result.Ok THEN
iState := 100 ; //error detected
END_IF
ELSIF xClose THEN
fbUdpPeer2.Close ( ) ;
IF fbUdpPeer2.State = TcpUdp.ET_State.Idle THEN
iState := 0 ; //closed = idle
ELSE
iState := 100 ; //error detected
END_IF
END_IF
100 : //error state
(*your code comes here*)
END_CASE
//check cyclically state
etResult := fbUdpPeer2.State ;
etState := fbUdpPeer2.Result ;
//reset commands
xOpenAndBind := xJoinMulticastGroup := xReceive := xClose := FALSE ;