FB_TCPClient/FB_TCPClient2

Panoramica

Tipo:

Blocco funzione

Disponibile a partire da:

V1.0.4.0

Ereditato da:

-

Implementa:

-

Task

Collega a un server TCP per consentire lo scambio di dati.

Descrizione funzionale

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.

NOTA: Tutti i metodi sono bloccati finché il valore della proprietà Result è diverso da Ok. Una chiamata di metodo in questo caso viene interrotta senza toccare le informazioni della proprietà Result.

Interfaccia

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.

Esempio di implementazione per FB_Client2

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;