Libreria scambio dati su rete (eLLabDataExchLib)

Attenzione! Per utilizzare la libreria occorre importarla nel proprio progetto. Vedere capitolo relativo all”import delle librerie.

Questa libreria permette di gestire lo scambio dati tra due sistemi utilizzando una connessione in rete TCP/IP. Utilizzando questa libreria è possibile scambiare dati tra sistemi (Un master e molti slaves) sfruttando le conessioni di rete esistenti.

TCPDEXCHNODEDEFS, struttura definizione parametri nodo

Questa struttura utilizzata dai blocchi funzione che eseguono lo scambio dati. Nella struttura oltre alle informazioni sui nodi sono definiti anche i buffers dei dati in scambio.

Name Type   Description
NodeID USINT RW Node ID. Numero di nodo del sistema, utilizzato per verificare la corrispondenza dei dati.
AutoTxD BOOL RW Auto Tx data. Se attivato, in caso di variazione, viene forzato l’invio automatico del TxBuffer verso l’altro sistema.
TxData BOOL RW Tx data send. Settandolo da programma utente si forza l’invio del TxBuffer verso l’altro sistema. Il comando rimane attivo fino alla avvenuta trasmissione poi viene automaticamente resettato.
Active BOOL R Data exchange active. Si attiva se scambio dati sul nodo è attivo.
RxOk BOOL R Rx data Ok. Settato su ricezione dati dall’altro sistema, i dati sono stati trasferiti in RxBuffer. Deve essere resettato da programa utente.
TxHeartbeat USINT RW Tempo in secondi di invio frame di heartbeat. Ogni tempo definito viene inviato un frame dati all’altro sistema.
RxHeartbeat USINT R Tempo in secondi di ricezione frame di heartbeat, viene ricevuto il valore di TxHeartbeat inviato dall’altro sistema. Ogni tempo definito deve essere ricevuto un frame dati all’altro sistema.
RxBuffer @BYTE RW Rx buffer address. Indirizzo di allocazione del buffer dati ricevuti dall’altro sistema.
RxLength UDINT RW Rx buffer length. Dimensione del buffer dati ricevuti dall’altro sistema. Deve coincidere con TxLength definito sull’altro sistema.
TxBuffer @BYTE RW Tx buffer address. Indirizzo di allocazione del buffer dati da inviare verso l’altro sistema.
TxLength UDINT RW Tx buffer length. Dimensione del buffer dati da inviare all’altro sistema. Deve coincidere con RxLength definito sull’altro sistema.
RxPackets UDINT R Rx packets. Counter pacchetti dati ricevuti dall’altro sistema.
TxPackets UDINT R Tx packets. Counter pacchetti dati inviati all’altro sistema.
TxTime REAL R Tempo in secondi di invio dati all’altro sistema.
CErrors UDINT R Communication errors. Counter errori di comunicazione con l’altro sistema.

I campi RW devono essere impostati dal programma utente, i campi R non devono essere modificati da programma utente, possono solo essere letti.

TCPDataExchServer, TCP data exchange (Server)

Type Library
FB eLLabDataExchLib_A000

image0

Questo blocco funzione gestisce lo scambio dati su rete TCP agendo come server. 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.

Enable (BOOL) Comando attivazione server.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento.
Port (UINT) Porta TCP su cui porre in ascolto il server.
Connections (USINT) Numero di connessioni contemporanee gestite.
DEDefs (@TCPDEXCHNODEDEFS) Indirizzo allocazione array struttura TCPDEXCHNODEDEFS di definizione nodi client.
Enabled (BOOL) Blocco funzione abilitato.
Fault (BOOL) Attivo per un loop di programma se errore gestione.

Trigger di spy

Se SpyOn attivo viene eseguita la funzione SysSpyData che permette di spiare il funzionamento della FB. Sono previsti vari livelli di triggers.

TFlags Descrizione
16#00000001 Rx: Sequenze ricezione frame.
16#00000002 Tx: Sequenze trasmissione frame.
16#40000000 Er: Errore gestione.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10061020 FB eseguita in una task diversa dalla task di background.
10061025 DEDefs non impostato correttamente.
10061030 Connections non impostato correttamente.
10061050 E” stato modificato il numero di connessioni (Connections) definito.
10061060~1 Errore nella allocazione memoria gestione nodi funzione SysRMAlloc.
10061070 Connections non impostato correttamente.
10061100 Il client ha chiuso la connessione.
10061110 Timeout invio heartbeat.
10061120 Timeout ricezione heartbeat.
10061130 Timeout esecuzione.
10061200 Errore nella allocazione memoria copia buffer Tx funzione SysRMAlloc.
10061210 E” stata modificata la dimensione del buffer di Tx (TxLength).
10061300~3 Errore sequenze ricezione frame dati da client.
10061310 Lunghezza dati ricevuti non corretta (TxLenght del client diverso da RxLength).
10061400 Errore sequenze trasmissione frame dati verso client.
10061900 Errore case gestione.

Esempi

Nell’esempio viene gestito un server che gestisce lo scambio con due sistemi client.

Definizione variabili

VAR
C1RxBuffer : ARRAY[ 0..7 ] OF BYTE; (\* Rx buffer (Client 1) \*)
C1TxBuffer : ARRAY[ 0..7 ] OF BYTE; (\* Tx buffer (Client 1) \*)
C2RxBuffer : ARRAY[ 0..7 ] OF BYTE; (\* Rx buffer (Client 2) \*)
C2TxBuffer : ARRAY[ 0..7 ] OF BYTE; (\* Tx buffer (Client 2) \*)
DEDefs : ARRAY[ 0..1 ] OF TCPDEXCHNODEDEFS; (\* Data exchange node definitions \*)
TCPServer : TCPDataExchServer; (\* TCP data exchange server \*)
END_VAR

Esempio ST

(\* Program initialization \*)
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:=5; (\* 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;
(\* Manage data exchange server. \*)
TCPServer(Enable:=TRUE); (\* Manage the server \*)
(\* [End of file] \*)

TCPDataExchClient, TCP data exchange (Client)

Type Library
FB eLLabDataExchLib_A000

image1

Questo blocco funzione gestisce lo scambio dati su rete TCP agendo come client. Su attivazione l’FB si connette al server definito in SAddress alla porta definita in Sport. In DEDefs occorre definire l’indirizzo della struttura TCPDEXCHNODEDEFS che identifica il nodo slave nella connessione con il server.

La gestione della comunicazione andrà gestita tramite le variabili nella struttura dati. Se la connessione al server viene stabilita (Il NodeID corrisponde con uno di quelli accettati dal server) i due sistemi si “legano” per lo scambio dati ed il bit Active della struttura dati verrà attivato.

Per inviare i dati al sistema server 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 server. Su ricezione dati da un server avremo il bit RxOk attivo per un loop.

Enable (BOOL) Comando attivazione client.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento.
SAddress (@USINT) Indirizzo IP o URL del server a cui connettersi.
SPort (UINT) Porta TCP a cui connettersi sul server.
DEDefs (@TCPDEXCHNODEDEFS) Indirizzo allocazione struttura TCPDEXCHNODEDEFS di definizione nodo.
Enabled (BOOL) Blocco funzione abilitato.
Fault (BOOL) Attivo per un loop di programma se errore gestione.

Trigger di spy

Se SpyOn attivo viene eseguita la funzione SysSpyData che permette di spiare il funzionamento della FB. Sono previsti vari livelli di triggers.

TFlags Descrizione
16#00000001 Rx: Sequenze ricezione frame.
16#00000002 Tx: Sequenze trasmissione frame.
16#40000000 Er: Errore gestione.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10062020 FB eseguita in una task diversa dalla task di background.
10062025 DEDefs non impostato correttamente.
10062100 Manca connessione al server.
10062110 Timeout invio heartbeat.
10062120 Timeout ricezione heartbeat.
10062130 Timeout esecuzione.
10062200 Errore nella allocazione memoria copia buffer Tx funzione SysRMAlloc.
10062210 E” stata modificata la dimensione del buffer di Tx (TxLength).
10062300~1 Errore sequenze ricezione frame dati da server.
10062310 Lunghezza dati ricevuti non corretta (TxLenght del server diverso da RxLength).
10062400 Errore sequenze trasmissione frame dati verso server.
10062900 Errore case gestione.

Esempi

Nell’esempio viene gestito un client che gestisce lo scambio con un sistema server. Come si vede viene definito come indirizzo del serve l’IP 172.0.0.1 che è il localhost, in questo modo è possibile sullo stesso modulo CPU fare dialogare il FB TCPDataExchClient con il TCPDataExchServer.

Definizione variabili

VAR
TxBuffer : ARRAY[ 0..7 ] OF BYTE; (\* Tx buffer address \*)
RxBuffer : ARRAY[ 0..7 ] OF BYTE; (\* Rx buffer address \*)
DEDefs : TCPDEXCHNODEDEFS; (\* Data exchange node definitions \*)
TCPClient : TCPDataExchClient; (\* TCP data exchange client \*)
END_VAR

Esempio ST

(\* Program initialization \*)
IF (SysFirstLoop) THEN
(\* Set the client definitions. \*)
DEDefs.NodeID:=1; (\* Node ID \*)
DEDefs.AutoTxD:=TRUE; (\* Automatic Tx data send \*)
DEDefs.RxBuffer:=ADR(RxBuffer); (\* Rx buffer address \*)
DEDefs.RxLength:=SIZEOF(RxBuffer); (\* Rx buffer length \*)
DEDefs.TxBuffer:=ADR(TxBuffer); (\* Tx buffer address \*)
DEDefs.TxLength:=SIZEOF(TxBuffer); (\* Tx buffer length \*)
DEDefs.TxHeartbeat:=1; (\* Tx heartbeat time (S) \*)
(\* Client configuration. \*)
TCPClient.SpyOn:=TRUE; (\* Spy command \*)
TCPClient.SAddress:=ADR('127.0.0.1'); (\* Server address \*)
TCPClient.SPort:=10000; (\* Server port \*)
TCPClient.DEDefs:=ADR(DEDefs); (\* Client definitions \*) END_IF;
END_IF;
(\* Manage data exchange client. \*)
TCPClient(Enable:=TRUE); (\* Manage the client \*)
(\* [End of file] \*)