Ce bloc fonction de exécuter dans la tâche Retour, gère l'échange de données sur le réseau TCP en agissant comme un serveur en acceptant les connexions des nœuds clients gérés par le FB TCPDataExchClient. En activant le FB, le serveur écoute sur le port défini dans Port, le serveur accepte le nombre simultané de connexions des clients définis dans Connections. En DEDefs il faut définir l'adresse du tableau de structures TCPDEXCHNODEDEFS qui identifient les nœuds esclaves qui peuvent se connecter au serveur.
La gestion de la communication sera gérée par les variables de la structure de données. Lorsqu'un client se connecte, il est recherché dans le tableau indiqué par DEDefs il NodeID du message reçu et les deux systèmes "se lient" à l'échange de données, le bit Active sera activé.
Pour envoyer des données au système client, le bit doit être activé TxData, le bit est automatiquement réinitialisé à la fin de la transmission. Si le bit est actif AutoTxD lors de la variation des données dans le tampon Tx, les données sont automatiquement envoyées au client. Lors de la réception des données d'un client, nous aurons le bit RxOk actif pour une boucle.
Verrouillage de fonction
CODESYS : indisponible
LogicLab : eLLabDataExchLib
Description
Enable (BOOL) Commande d'activation du serveur.
SpyOn (BOOL) S'il est actif, il permet d'espionner le fonctionnement du FB.
Port (UINT) Port TCP sur lequel écouter le serveur.
Connections (UDINT) Nombre de connexions depuis FB TCPDataExchClient projets contemporains.
DEDefs (@TCPDEXCHNODEDEFS) Adresse d'allocation de tableau de structure TCPDEXCHNODEDEFS définition des nœuds clients.
Enabled (BOOL) Verrouillage de fonction activé.
Fault (BOOL) Actif pour une boucle si erreur de gestion.
Déclencheur d'espion
Se SpyOn actif, vous pouvez utiliser la console espion pour vérifier le fonctionnement du FB. Il existe différents niveaux de déclencheurs.
Niveaux de déclenchement
Gâchette | Description |
---|---|
16 # 00000001 | Rx: Séquences de réception de trames. |
16 # 00000002 | Tx: Séquences de transmission de trame. |
16 # 40000000 | Er: Erreurs d'exécution. |
Exemples
Comment utiliser les exemples.
Le programme gère l'échange de données en agissant comme un serveur écoutant le port 10000, il est possible de se connecter à des appareils clients 2 (voir l'exemple de programme dans cet article) et échanger des données entre eux. Les systèmes clients devront envoyer des données s'identifiant avec les numéros de nœuds 1 et 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]