Questo blocco funzione esegue lo scambio dati tra due streams di comunicazione. Definendo uno stream come socket TCP e l’altro come seriale è possibile realizzare un convertitore Ethernet/Seriale.
In FpA ed FpB occorre indicare i file pointer degli streams di comunicazione. Il FB riceve i dati da uno stream e li invia sull’altro. Per il trasferimento dei dati viene allocato dinamicamente un buffer di memoria che può raggiungere al massimo la dimensione definita in DBMax (Si consiglia 2048 bytes).
Se non c’è comunicazione tra gli streams dopo il tempo definito in DBLife (Si consiglia 5 secondi) il buffer di memoria viene disallocato liberando risorse di sistema. Se valore impostato è 0 il buffer non viene mai disallocato.
Approfondimenti
- In questo articolo un programma gratuito di virtualizzazione seriale per realizzare con il FB un convertitore Ethernet/Seriale.
- In questo topic un’idea di come realizzare il pass-through tra connessione TCP/IP e porta seriale per comnunicare con inverter.
Descrizione
Enable (BOOL) Abilitazione blocco funzione.
FpA (eFILEP) Flusso dati stream di comunicazione.
FpB (eFILEP) Flusso dati stream di comunicazione.
DBMax (UDINT) Dimensione massima allocazione buffer dati (Bytes). Valore massimo 4096.
DBLife (REAL) Tempo di vita buffer dati (S).
Enabled (BOOL) Blocco funzione abilitato.
Fault (BOOL) Attivo per un loop se errore esecuzione.

Esempi
Come utilizzare gli esempi.
Semplice convertitore Ethernet/Seriale, accetta una connessione TCP su porta 2000, i dati ricevuti dalla connessione TCP sono inviati in uscita sulla porta seriale COM0 e viceversa.
LogicLab (Ptp114, FBD_DataStreamExch)
PROGRAM FBD_DataStreamExch
VAR
FP : eFILEP; (* File pointer *)
Sp : SysSerialPort; (* Serial port management *)
Sk : SysTCPServer; (* Socket server *)
DExch : DataStreamExch_v1; (* Data exchange *)
END_VAR

LogicLab (Ptp114, ST_DataStreamExch)
PROGRAM ST_DataStreamExch
VAR
Fp : eFILEP; (* File pointer *)
Sp : SysSerialPort; (* Serial port management *)
Sk : SysTCPServer; (* Socket server *)
DExch : DataStreamExch_v1; (* Data exchange *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_DataStreamExch"
// *****************************************************************************
// This program acts as a Ethernet to serial converter, the data received from
// the ethernet connection are forwarded to serial and vice versa.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// Initialize serial port.
Sp.COM:=ADR('COM0'); //Serial port
Sp.Baudrate:=115200; //Baud rate
Sp.Parity:='E'; //Parity
Sp.DataBits:=8; //Data bits
Sp.StopBits:=1; //Stop bits
Sp.DTRManagement:=DTR_AUTO_WO_TIMES; //DTR management
// Initialize socket server.
Sk.FilesArr:=ADR(Fp); //File array
Sk.MaxConn:=1; //Number of connections accepted
Sk.LocalAdd:=ADR('0.0.0.0'); //Local address
Sk.LocalPort:=2000; //Local port
Sk.LifeTm:=60; //TSocket life time (S)
Sk.FlushTm:=10; //Socket flush time (mS)
Sk.RxSize:=1024; //Rx size buffer
Sk.TxSize:=1024; //Tx size buffer
// Initialize data stream exchange.
DExch.DBMax:=2048; //Data buffer maximum size
DExch.DBLife:=5.0; //Data buffer life (S)
END_IF;
// -------------------------------------------------------------------------
// DATA STREAM EXCHANGE
// -------------------------------------------------------------------------
// Execute the data stream exchange.
Sp(Open:=TRUE); //Serial port management
Sk(Enable:=TRUE); //TCP server management
DExch.FpA:=Fp; //File pointer
DExch.FpB:=Sp.File; //File pointer
DExch(Enable:=(Sk.ConnPeers <> 0)); //Data exchange
// [End of file]