Questa function block da eseguire in task Back, gestisce la comunicazione con protocollo UDP in modalità client. Occorre definire in PeerAdd l’indirizzo IP ed in PeerPort la porta UDP del sistema server a cui ci si vuole connettere.
Attivando il comando Connect viene aperta la connessione con il sistema server, nella connessione UDP non è possibile verificare se il server è presente ed accetta la connessione, pertanto viene sempre attivato Connected e sull’uscita File viene ritornato lo stream da utilizzarsi per lo scambio dati con il sistema server.
In LocalAdd e LocalPort è possibile definire l’indirizzo IP e la porta della interfaccia di rete da cui effettuare la connessione. Se la connessione non è possibile viene generato Fault.
Approfondimenti
- In questo topic invio datagram UDP su variazione ingressi logici.
Descrizione
Connect (BOOL) Comando abilitazione connessione.
PeerAdd (@STRING) Indirizzo IP del sistema server a cui connettersi.
PeerPort (UINT) Numero porta UDP a cui connettersi.
LocalAdd (@STRING) Indirizzo IP della interfaccia di rete da cui effettuare la connessione. Default ‘0.0.0.0’: l’interfaccia è scelta automaticamente in base all’IP a cui connettersi.
LocalPort UINT) Numero porta UDP da cui parte la connessione (0 scelta automaticamente).
FlushTm (UINT)) Tempo di flush dati (mS). Se non sono caricati dati sullo stream dopo il tempo definito i dati presenti vengono automaticamente inviati.
LifeTm (UINT) Tempo di vita socket (S), se non sono ricevuti o inviati dati dopo il tempo definito il socket viene automaticamente chiuso. Se definito tempo “0” il socket non viene mai chiuso.
RxSize (UINT) Dimensione buffer ricezione dati.
TxSize (UINT) Dimensione buffer trasmissione dati.
Connected (BOOL) Attivo se connessione stabilita con server.
Fault (BOOL) Attivo se errore gestione.
File (FILEP) Stream di I/O valorizzato su connessione stabilita con il sistema server. Se connessione non attiva viene ritornato NULL

Esempi
Come utilizzare gli esempi.
FBD_SysUDPClient, ST_SysUDPClient: Nell’esempio è attivata una connessione verso un server UCP in ascolto sulla porta 1000. Eseguita la connessione i caratteri ricevuti dal server sono reinviati in echo. La porta locale viene sceta automaticamente dal sistema.
SyslogClient: Implementa un client Syslog con invio di messaggi verso server.
LogicLab (Ptp116, FBD_SysUDPClient)
PROGRAM FBD_SysUDPClient
VAR
Fp : eFILEP; (* File pointer *)
UDPClient : SysUDPClient; (* UDP client *)
END_VAR

LogicLab (Ptp116, ST_SysUDPClient)
PROGRAM ST_SysUDPClient
VAR
i : UDINT; (* Auxiliary variable *)
Fp : eFILEP; (* File pointer *)
UDPClient : SysUDPClient; (* UDP client *)
END_VAR
// *****************************************************************************
// PROGRAM ST_SysUDPClient"
// *****************************************************************************
// A UDP client is instantiated, it connects to the UDP server IP and port
// defined. Data received are echoed.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// First program execution loop initializations.
IF (SysFirstLoop) THEN
UDPClient.PeerAdd:=ADR('192.168.0.77'); //Peer address
UDPClient.PeerPort:=1000; //Peer port
UDPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
UDPClient.LocalPort:=0; //Local port
UDPClient.FlushTm:=50; //Flush time (mS)
UDPClient.LifeTm:=30; //Life time (S)
UDPClient.RxSize:=128; //Rx buffer size
UDPClient.TxSize:=128; //Tx buffer size
END_IF;
// Manage the UDP client.
UDPClient(Connect:=TRUE); //TCPClient management
Fp:=UDPClient.File; //File pointer
// -------------------------------------------------------------------------
// ECHO LOOP
// -------------------------------------------------------------------------
// Execute the echo loop.
IF (SysFIsOpen(Fp)) THEN
IF (TO_BOOL(SysFGetIChars(Fp)) AND TO_BOOL(SysFGetOSpace(Fp))) THEN
i:=Sysfputc(Sysfgetc(Fp), Fp); //Character echo
END_IF;
END_IF;
// [End of file]
LogicLab (SyslogClient
)
PROGRAM SyslogClient
VAR
Cmd : BOOL; (* Send command *)
i : UDINT; (* Auxiliary variable *)
Facility : USINT; (* Facility number *)
Severity : USINT; (* Severity number *)
CaseNr : USINT; (* Program case *)
Months : @STRING; (* Month definitions *)
UDPClient : SysUDPClient; (* UDP client *)
DateTime : SysETimeToDate; (* Date time conversion *)
END_VAR
// *****************************************************************************
// PROGRAM "SyslogClient"
// *****************************************************************************
// This program forward information as syslog messages to a syslog server.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// First program execution loop initializations.
IF (SysFirstLoop) THEN
UDPClient.PeerAdd:=ADR('192.168.0.184'); //Peer address
UDPClient.PeerPort:=514; //Peer port
UDPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
UDPClient.LocalPort:=0; //Local port
UDPClient.FlushTm:=50; //Flush time (mS)
UDPClient.LifeTm:=30; //Life time (S)
UDPClient.RxSize:=128; //Rx buffer size
UDPClient.TxSize:=512; //Tx buffer size
END_IF;
// -------------------------------------------------------------------------
// SENDING SEQUENCES
// -------------------------------------------------------------------------
// Manages the UDP Client and sending sequences.
UDPClient(); //UDPClient management
CASE (CaseNr) OF
// ---------------------------------------------------------------------
// Wait command.
0:
UDPClient.Connect:=FALSE; //TCPClient management
IF NOT(Cmd) THEN RETURN; END_IF;
Cmd:=FALSE; //Send command
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Connect to Syslog server.
1:
UDPClient.Connect:=TRUE; //TCPClient management
IF NOT(SysFIsOpen(UDPClient.File)) THEN RETURN; END_IF;
// ---------------------------------------------------------------------
// SEND THE MESSAGE TO SERVER
// ---------------------------------------------------------------------
// Send the message to server, here an message example.
// <19>Feb 26 17:36:42 SlimLine Prova messaggio
// ---------------------------------------------------------[PRI Part]--
// The Priority value is calculated by first multiplying the Facility
// number by 8 and then adding the numerical value of the Severity.
i:=(Facility*8)+Severity; //Priority value
i:=SysVfprintf(UDPClient.File, ADR('<%u>'), UDINT_TYPE, ADR(i));
// ------------------------------------------------------[HEADER Part]--
// Contains two fields called the TIMESTAMP and HOSTNAME.
Months:=ADR('JanFebMarAprMayJunJulAugSepOctNovDec');
DateTime(EpochTime:=SysDateTime); //Date time conversion
i:=SysVfprintf(UDPClient.File, ADR('%.3s '), STRING_TYPE, Months+(DateTime.Month*3));
i:=SysVfprintf(UDPClient.File, ADR('%2u '), USINT_TYPE, ADR(DateTime.Day));
i:=SysVfprintf(UDPClient.File, ADR('%02u:'), USINT_TYPE, ADR(DateTime.Hour));
i:=SysVfprintf(UDPClient.File, ADR('%02u:'), USINT_TYPE, ADR(DateTime.Minute));
i:=SysVfprintf(UDPClient.File, ADR('%02u '), USINT_TYPE, ADR(DateTime.Second));
i:=SysVfprintf(UDPClient.File, ADR('%s '), STRING_TYPE, ADR('SlimLine'));
// ---------------------------------------------------------[MSG Part]--
// The CONTENT contains the details of the message.
i:=SysVfprintf(UDPClient.File, ADR('%s'), STRING_TYPE, ADR('This is a message'));
// Eseguo invio messaggio di Log.
i:=SysFOBfFlush(UDPClient.File); //Flush output characters
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Waits until the message is sent.
2:
IF (TO_INT(SysFGetOBfSize(UDPClient.File)) <> SysFGetOSpace(UDPClient.File)) THEN RETURN; END_IF;
CaseNr:=0; //Program case
END_CASE;
// [End of file]