FB_UDPPeer

Descripción general

Tipo:

Bloque de funciones

Disponible desde:

V1.0.4.0

Hereda de:

-

Implementa:

-

G-SE-0045960.1.gif-high.gif

 

 

Tarea

Representa un punto final para enviar y recibir mensajes mediante el protocolo UDP basado en mensajes.

Descripción funcional

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.

Interfaz

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.

Ejemplos de implementació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 ;