Passa al contenuto principale

SysTCPServer, accepts TCP/IP connections

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

Attivando il comando Enable il server TCP 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. Sullo stream aperto è possibile utilizzare le funzioni di TermIO per gestire la comunicazione.

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

Approfondimenti

Descrizione​

Immagine FB SysTCPServer

ParametroTipoDescrizione
EnableBOOLComando abilitazione server.
FileArreFILEPPointer 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@STRINGRange 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.
LocalPortUINTNumero di porta cui viene posto in ascolto il server, verificare che la porta non sia già utilizzata da un'altro servizio.
MaxConnUSINTNumero massimo di connessioni contemporanee accettate dal server. Deve essere uguale al numero di files definiti.
FlushTmUINTTempo di flush dati (mS). Se non sono caricati dati sullo stream dopo il tempo definito i dati presenti vengono automaticamente inviati.
LifeTmUINTTempo di vita socket (S), se non sono ricevuti o inviati dati dopo il tempo definito il socket viene automaticamente chiuso. Se definito tempo "0" il socket non viene mai chiuso.
RxSizeUINTDimensione buffer ricezione dati.
TxSizeUINTDimensione buffer trasmissione dati.
EnabledBOOLAttivo se TCP server correttamente impostato e pronto.
FaultBOOLAttivo se errore gestione.
ConnPeersUSINTNumero di clients connessi al server.

Esempi​

Come utilizzare gli esempi.
Nell'esempio è attivato un server TCP 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_SysTCPServer)
PROGRAM FBD_SysTCPServer
VAR
Fp : ARRAY[ 0..1 ] OF eFILEP; (* File pointer array *)
TCPServer : SysTCPServer; (* TCPServer management *)
END_VAR

Immagine programma FBD_SysTCPServer

LogicLab (Ptp116, ST_SysTCPServer)
PROGRAM ST_SysTCPServer
VAR
IDx : USINT; (* Auxiliary variable *)
COk : ARRAY[0..1] OF BOOL; (* Connection Ok *)
Fp : ARRAY[0..1] OF eFILEP; (* File pointer array *)
TCPServer : SysTCPServer; (* TCPServer management *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysTCPServer"
// *****************************************************************************
// A UDP server is instantiated on defined port and configured to accept up to 2
// concurrent connections. When a client connects, a welcome message is returned
// and all successive data is echoed back.
// -----------------------------------------------------------------------------

// -------------------------------------------------------------------------
// INITIALIZATIONS
// -------------------------------------------------------------------------
// First loop initializations.

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

// Manage the TCP server.

TCPServer(Enable:=TRUE); //TCPServer management

// -------------------------------------------------------------------------
// ECHOE LOOP
// -------------------------------------------------------------------------
// Execute the echoes loop on all opened connections.

FOR IDx:=0 TO (TCPServer.MaxConn-1) DO

// Check if connection is opened.

IF NOT(SysFIsOpen(Fp[IDx])) THEN COk[IDx]:=FALSE; END_IF;
IF (SysFIsOpen(Fp[IDx])) THEN

// Send a welcome message.

IF NOT(COk[IDx]) THEN
COk[IDx]:=TRUE; //Connection Ok
eTO_JUNK(SysVfprintf(Fp[IDx], ADR('%s$r$n'), STRING_TYPE, ADR('Welcome!')));
END_IF;

// Echo each character received.

IF (TO_BOOL(SysFGetIChars(Fp[IDx])) AND TO_BOOL(SysFGetOSpace(Fp[IDx]))) THEN
eTO_JUNK(Sysfputc(Sysfgetc(Fp[IDx]), Fp[IDx])); //Character echo
END_IF;
END_IF;
END_FOR;

// [End of file]

CODESYS (Ptp161, ST_SysTCPServer)

PROGRAM ST_SysTCPServer
VAR
i : UDINT; //Auxiliary variable
j : USINT; //Auxiliary variable
Fp : ARRAY[ 0..1 ] OF eFILEP; //File pointer array
FirstLoop : BOOL := TRUE; //First execution loop
TCPServer : SysTCPServer; //TCPServer management
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysTCPServer"
// *****************************************************************************
// A TCP 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 (FirstLoop) THEN
FirstLoop:=FALSE; //First execution loop
TCPServer.FilesArr:=ADR(Fp); //Files array
TCPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
TCPServer.LocalPort:=3000; //Local port
TCPServer.MaxConn:=2; //Accepted connections
TCPServer.FlushTm:=50; //Flush time (mS)
TCPServer.LifeTm:=30; //Life time (S)
TCPServer.RxSize:=128; //Rx buffer size
TCPServer.TxSize:=128; //Tx buffer size
END_IF;

// Manage the TCP server.

TCPServer(Enable:=TRUE); //TCPServer management

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

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

// Check if TCP connection is opened.

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

// [End of file]