La libreria fornisce due versioni del blocco funzione FB_TCPClient. Il FB_TCPClient2 è una versione ottimizzata che supporta connessioni che utilizzano TLS (Transport Layer Security).
L'eventuale supporto di una connessione che utilizza TLS dipende dal controller dove si usa il FB_TcpClient2. Consultare il manuale specifico del controller per verificare se è supportata la comunicazione tramite TCP.
Il principio di funzionamento di entrambi i blocchi funzione è lo stesso. Vi sono alcune differenze per metodi e proprietà forniti descritti nei rispettivi capitoli.
Il normale ordine di comando è quello di chiamare prima il metodo Connect o ConnectTls, specificando l'IP del server e la porta TCP a cui collegarsi. Successivamente, recuperare ciclicamente il valore della proprietà State fino a quando è diversa da Connecting. Se lo stato non è Connected (collegato), la connessione non potrà essere stabilita. Verificare il valore della proprietà Result per determinare il motivo. Il metodo Close deve essere richiamato prima di avviare un altro tentativo di connessione.
Una volta che lo stato è Connected e che il valore della proprietà IsWritable è TRUE, i dati possono essere scambiati utilizzando i metodi Send e Receive.
Per verificare se vi sono dati pronti da leggere, è possibile utilizzare la proprietà IsReadable.
Il metodo Peek può essere utilizzato analogamente al metodo Receive. La differenza è che una chiamata a Peek lascia i dati nel buffer di ricezione dello stack TCP e i dati possono essere letti più volte. Ciò può essere utilizzato per determinare se sono arrivati dati sufficienti per l'elaborazione quando non è possibile determinare la lunghezza prima di avere effettivamente i dati disponibili. Se sono arrivati abbastanza dati per essere elaborati adeguatamente, utilizzare il metodo Receive per rimuovere i dati dal buffer di ricezione in modo da lasciare spazio ad altri dati in arrivo.
Per rilevare lo scollegamento del sito remoto, leggere il valore della proprietà PeerHasDisconnected. Il valore di State cambia automaticamente in Shutdown se la connessione viene chiusa dal server. Se si verifica questo, i dati rimanenti non trattati possono ancora essere letti ma non possono più essere inviati.
Per chiudere una connessione in modo appropriato, richiamare il metodo Shutdown. Lo stato della connessione passa a Shutdown e questo permette ai dati in arrivo di essere letti, ma non sarà possibile inviare altri dati. Quando i dati in entrata sono stati letti, elaborati, o non sono di interesse, può essere richiamato il metodo Close per chiudere la connessione.
Se l'elaborazione in un metodo non riesce, questo viene indicato nel valore della proprietà Result. Il valore di Result deve essere verificato dopo ogni chiamata di un metodo. Il risultato può essere reimpostato a Ok utilizzando il metodo ResetResult.
Il blocco funzione non ha ingressi e uscite. La funzionalità è disponibile attraverso i metodi e le proprietà. Non è necessario richiamare il blocco funzione direttamente nell'applicazione.
PROGRAM LibDocu_TcpClient2
VAR
xConnect : BOOL;
xConnectTls : BOOL;
xClose : BOOL;
etResult : TCPUDP.ET_Result;
etState : TCPUDP.ET_State;
iState : INT;
fbTcpClient : TCPUDP.FB_TCPClient2;
stTlsSettings : TCPUDP.ST_TlsSettingsClient;
sIp : STRING(15) := '192.168.1.2';
uiPort : UINT := 12345;
END_VAR
CASE iState OF
0: // idle
IF xConnect OR xConnectTls THEN
IF xConnect AND_THEN fbtcpclient.Connect(sIp, uiPort) THEN
iState := 10;
ELSIF xConnectTls AND_THEN fbtcpclient.ConnectTls(sIp, uiPort, stTlsSettings) THEN
iState := 10;
ELSE
iState := 100; // error state
END_IF
xConnect := xConnectTls := FALSE;
END_IF
10: // connecting
CASE fbtcpclient.State OF
TCPUDP.ET_State.Connecting:
iState := 10; // stay in connecting
TCPUDP.ET_State.Connected:
iState := 20; // connected
ELSE
iState := 100; // unexpected state
END_CASE
20: // connected
IF xClose OR fbTcpClient.State = TCPUDP.ET_State.Shutdown THEN
xClose := FALSE;
fbTcpClient.Close();
END_IF
IF fbTcpClient.State = TCPUDP.ET_State.Closing THEN
;
ELSIF fbTcpClient.State = TCPUDP.ET_State.Idle THEN
iState := 0;
ELSIF fbTcpClient.State <> TCPUDP.ET_State.Connected THEN
iState := 100;
END_IF
(* your code comes here, e.g send data to the connected server *)
100: // error state
(* your code comes here*)
END_CASE
etResult := fbTcpClient.Result;
etState := fbTcpClient.State;