Tipo: |
Bloque de funciones |
Disponible desde: |
V1.0.4.0 |
Hereda de: |
- |
Implementa: |
- |
Representa un punto final para enviar y recibir mensajes mediante el protocolo UDP basado en mensajes.
El orden habitual del comando es llamar primero al método Open. Si es correcto, los mensajes se pueden enviar. Si desea escuchar en un puerto específico, debe usar el método Bind para vincular el socket a este puerto y de manera opcional a una interfaz Ethernet específica. Si se van a recibir mensajes en todas las interfaces Ethernet disponibles y se utiliza automáticamente la interfaz de salida, utilice una cadena nula o 0.0.0.0 como la entrada de interfaz del método.
Para enviar datos a otros interlocutores, utilice el método Send. En el primer envío desde un socket no vinculado, se vincula automáticamente y el método Receive se puede utilizar acto seguido. Si es compatible con el tiempo de ejecución, mediante las propiedades BoundIPAddress y BoundPort se puede solicitar la IP y el puerto a los que el socket se ha vinculado.
Para comprobar si hay datos listos para su lectura, se pueden utilizar las propiedades IsReadable y BytesAvailableToRead.
Para los métodos Send y Receive, la aplicación debe proporcionar un búfer que se llena mediante el método Received y contiene los datos que se van a enviar para el método Send.
Las difusiones se pueden enviar y recibir sin necesidad de preparación. Se debe unir un grupo de multidifusión para poder recibir mensajes de multidifusión. Por lo tanto, se proporcionan los métodos JoinMulticastGroup y LeaveMulticastGroup.
Si va a enviar paquetes de multidifusión UDP utilizando el bloque de funciones FB_UDPPeer, establezca el valor de la propiedad SockOpt_MulticastDefaultInterface en la dirección IP de la interfaz desde la que se deben enviar los paquetes. Esto se debe llevar a cabo después de llamar al método Open y antes de la primera llamada del método SendTo.
NOTA: Especificar la interfaz predeterminada para los paquetes de multidifusión mediante el valor de la propiedad SockOpt_MulticastDefaultInterface ayuda a evitar que los paquetes se envíen a toda la red disponible.
Se puede utilizar el método Close para detener la transferencia de más datos y cerrar el socket.
Si un proceso de un método no se realiza correctamente, se indica en el valor de la propiedad Result. El valor de Result se debe comprobar después de cada llamada de método. El resultado se puede restablecer a Ok mediante el método ResetResult.
NOTA: Todos los métodos estarán bloqueados mientras el valor de la propiedad Result sea distinto a Ok. En este caso se interrumpe una llamada de método sin que ello afecte a la información de la propiedad Result.
El bloque de funciones no tiene entradas ni salidas. La funcionalidad está disponible a través de métodos y propiedades. No es necesario llamar al bloque de funciones directamente en la aplicación.
En los siguientes ejemplos de aplicación se indica cómo unirse a un grupo de multidifusión y enviar un mensaje a dicho grupo:
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 ;