FB_UDPPeer

Übersicht

Typ

Funktionsbaustein

Verfügbar ab

V1.0.4.0

Übernommen aus

-

Implementiert

-

G-SE-0045960.1.gif-high.gif

 

 

Aufgabe

Entspricht einem Endpunkt zum Senden und Empfangen von Nachrichten über das nachrichten­basierte UDP-Protokoll.

Funktionsbeschreibung

Ü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_MulticastDefaultInt­erface-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.

Schnittstelle

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.

Implementierungsbeispiele

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 ;