Questo blocco funzione da eseguire in task Back, gestisce lo scambio dati su rete TCP agendo come server accettando le connessioni dai nodi client gestiti dal FB TCPDataExchClient. Attivando l’FB si pone in ascolto il server sulla sulla porta definita in Port, il server accetta il numero contemporaneo di connessioni dai client definite in Connections. In DEDefs occorre definire l’indirizzo dell’array di strutture TCPDEXCHNODEDEFS che identificano i nodi slave che possono connettersi al server.
La gestione della comunicazione andrà gestita tramite le variabili nella struttura dati. Alla connessione di un client viene cercato nell’array indicato da DEDefs il NodeID del messaggio ricevuto ed i due sistemi si “legano” per lo scambio dati, il bit Active verrà attivato.
Per inviare i dati al sistema client occorre attivare il bit TxData, il bit è automaticamente resettato a fine trasmissione. Se è attivo il bit AutoTxD su variazione dei dati nel buffer Tx, i dati sono automaticamente inviati al client. Su ricezione dati da un client avremo il bit RxOk attivo per un loop.
Approfondimenti
- In questo topic informazioni su scambio dati tra sistemi via connessione LTE.
Descrizione
Enable (BOOL) Comando attivazione server.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB.
Port (UINT) Porta TCP su cui porre in ascolto il server.
Connections (UDINT) Numero di connessioni da FB TCPDataExchClient contemporanee gestite.
DEDefs (@TCPDEXCHNODEDEFS) Indirizzo allocazione array struttura TCPDEXCHNODEDEFS di definizione nodi client.
Enabled (BOOL) Blocco funzione abilitato.
Fault (BOOL) Attivo per un loop se errore gestione.

Trigger di spy
Se SpyOn attivo è possibile utilizzare utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.
Livelli di trigger
Trigger | Descrizione |
---|---|
16#00000001 | Rx: Sequenze ricezione frame. |
16#00000002 | Tx: Sequenze trasmissione frame. |
16#40000000 | Er: Errori di esecuzione. |
Esempi
Come utilizzare gli esempi.
Il programma gestisce lo scambio dati agendo come server ponendosi in ascolto sulla porta 10000, è possibile connettere fino a 2 dispositivi client (Vedi programma di esempio in questo articolo) e scambiare dati tra di loro. I sistemi client dovranno inviare dati identificandosi con i numeri di nodo 1 e 2.
LogicLab (Ptp171, ST_TCPDataExchServer)
PROGRAM ST_TCPDataExchServer
VAR
C1RxBuffer : ARRAY[0..7] OF UINT; (* Rx buffer (Client 1) *)
C1TxBuffer : ARRAY[0..7] OF UINT; (* Tx buffer (Client 1) *)
C2RxBuffer : ARRAY[0..7] OF UINT; (* Rx buffer (Client 2) *)
C2TxBuffer : ARRAY[0..7] OF UINT; (* Tx buffer (Client 2) *)
DEDefs : ARRAY[0..1] OF TCPDEXCHNODEDEFS; (* Data exchange node definitions *)
TCPServer : TCPDataExchServer; (* TCP data exchange server *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_TCPDataExchServer"
// *****************************************************************************
// The program instantiates a "TCPDataExchServer" FB. Up to 2 connections are
// accepted.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// Set the client 1 definitions.
DEDefs[0].NodeID:=1; //Node ID
DEDefs[0].AutoTxD:=TRUE; //Automatic Tx data send
DEDefs[0].RxBuffer:=ADR(C1RxBuffer); //Rx buffer address
DEDefs[0].RxLength:=SIZEOF(C1RxBuffer); //Rx buffer length
DEDefs[0].TxBuffer:=ADR(C1TxBuffer); //Tx buffer address
DEDefs[0].TxLength:=SIZEOF(C1TxBuffer); //Tx buffer length
DEDefs[0].TxHeartbeat:=10; //Tx heartbeat time (S)
// Set the client 2 definitions.
DEDefs[1].NodeID:=2; //Node ID
DEDefs[1].AutoTxD:=TRUE; //Automatic Tx data send
DEDefs[1].RxBuffer:=ADR(C2RxBuffer); //Rx buffer address
DEDefs[1].RxLength:=SIZEOF(C2RxBuffer); //Rx buffer length
DEDefs[1].TxBuffer:=ADR(C2TxBuffer); //Tx buffer address
DEDefs[1].TxLength:=SIZEOF(C2TxBuffer); //Tx buffer length
DEDefs[1].TxHeartbeat:=10; //Tx heartbeat time (S)
// Server configuration.
TCPServer.SpyOn:=TRUE; //Spy command
TCPServer.Port:=10000; //Peer port
TCPServer.Connections:=2; //Accepted connections
TCPServer.DEDefs:=ADR(DEDefs); //Data exchange definitions
END_IF;
// -------------------------------------------------------------------------
// DATA EXCHANGE SERVER
// -------------------------------------------------------------------------
// Manage data exchange server.
TCPServer(Enable:=TRUE); //Manage the server
// [End of file]