SysUDPServer, accepts UDP connections

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Questa function block da eseguire in task Back, gestisce la comunicazione con protocollo UDP in modalità server. Occorre definire in FilesArr l’indirizzo di un array di flussi dati streams, in LocalPort la porta UDP da porre in ascolto, in MaxConn il numero di connessioni contemporanee accettate.

Attivando il comando Enable il server UDP viene posto in ascolto sulla porta indicata, alla connessione di un client viene incrementato il numero di ConnPeers ed uno degli stream definiti in FileArr viene valorizzato ed aperto. Il peer viene considerato connesso se si continuano a ricevere caratteri entro il tempo definito in LifeTm.

Per modificare i parametri occorre disattivare e poi riabilitare il comando Enable.

Information Circle

Blocco funzione

CODESYS: Non disponibile

LogicLab: eLLabXUnified12Lib

Descrizione

Enable (BOOL) Comando abilitazione server.
FileArr (@FILEP) Pointer ad array streams di I/O. I vari file streams saranno valorizzati alla connessione dei clients. Occorre definire un numero di streams pari al numero di connessioni contemporanee accettate.
LocalAdd (@STRING) Range indirizzi IP da cui è accettata la connessione. La connessione è accettata se indirizzo IP del peer in AND con il valore non viene modificato. Default ‘0.0.0.0’: connessione accettata da tutti gli indirizzi IP.
LocalPort UINT) Numero di porta a cui viene posto in ascolto il server, verificare che la porta non sia già utilizzata da un’altro servizio.
MaxConn (USINT) Numero massimo di connessioni contemporanee accettate dal server. Deve essere uguale al numero di files definiti.
FlushTm (UINT)) Tempo di flush dati (mS). Se non sono caricati dati sullo stream dopo il tempo definito i dati presenti vengono automaticamente inviati.
LifeTm (UINT) Tempo di vita socket (S), se non sono ricevuti o inviati dati dopo il tempo definito il socket viene considerato chiuso. Se definito tempo “0” alla ricezione del primo carattere il socket viene considerato aperto e continuerà a restare tale anche se non vi è più comunicazione.
RxSize (UINT) Dimensione buffer ricezione dati.
TxSize (UINT) Dimensione buffer trasmissione dati.
Enabled (BOOL) Attivo se TCP server correttamente impostato e pronto.
Fault (BOOL) Attivo se errore gestione.
FlushTm (UINT) Tempo di flush dati, se non sono caricati dati sullo stream dopo il tempo definito i dati presenti vengono automaticamente inviati (mS) (Impostare 0).
ConnPeers (USINT) Numero di clients connessi al server. Si considera client connesso alla ricezione del primo carattere e si considera disconnesso se non c’è comunicazione per un tempo superiore al LifeTm.

IImmagine FB SysUDPServer

Esempi

Come utilizzare gli esempi.
Nell’esempio è attivato un server UDP in ascolto sulla porta 3000. Il server accetta massimo 2 connessioni contemporanee, connettendosi in telnet alla porta inviando un carattere se ne riceve l’echo.

LogicLab (Ptp116, FBD_SysUDPServer)
PROGRAM FBD_SysUDPServer

VAR
    Fp : ARRAY[0..1] OF eFILEP; (* File pointer array *)
    UDPServer : SysUDPServer; (* UDP server *)
END_VAR
Immagine FBD SysUDPServer
LogicLab (Ptp116, ST_SysUDPServer)
PROGRAM ST_SysUDPServer
VAR
    i : INT; (* Auxiliary variable *)
    j : USINT; (* Auxiliary variable *)
    Fp : ARRAY[0..1] OF eFILEP; (* File pointer array *)
    UDPServer : SysUDPServer; (* UDP server *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysUDPServer"
// *****************************************************************************
// A UDP server is instantiated on port 3000 and configured to accept up 2
// concurrent connections. When client connects and send data, data are echoed.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // First program execution loop initializations.

    IF (SysFirstLoop) THEN
        UDPServer.FilesArr:=ADR(Fp); //Files array
        UDPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
        UDPServer.LocalPort:=3000; //Local port
        UDPServer.MaxConn:=2; //Accepted connections
        UDPServer.FlushTm:=50; //Flush time (mS)
        UDPServer.LifeTm:=0; //Life time (S)
        UDPServer.RxSize:=128; //Rx buffer size
        UDPServer.TxSize:=128; //Tx buffer size
    END_IF;

    // Manage the UDP server.

    UDPServer(Enable:=TRUE); //UDP server

    // -------------------------------------------------------------------------
    // ECHOES LOOP
    // -------------------------------------------------------------------------
    // Execute the echoes loop on opened connections.

    FOR j:=0 TO (UDPServer.MaxConn-1) DO

        // Check if UDP connection is opened.

        IF (SysFIsOpen(Fp[j])) THEN
            IF (TO_BOOL(SysFGetIChars(Fp[j])) AND TO_BOOL(SysFGetOSpace(Fp[j]))) THEN
                i:=Sysfputc(Sysfgetc(Fp[j]), Fp[j]); //Character echo
            END_IF;
        END_IF;
    END_FOR;

// [End of file]
Was this article helpful?