TCPComm
TCPComm Library
The TCPComm library is a wrapper for the AsTCP library provided by B&R. This library both manages and simplifies the TCP communication interface.
TCPComm Data Structures and Enums
Mode Enums
- TCPCOMM_MODE_SERVER - Set CPU as the TCP communication server.
- TCPCOMM_MODE_CLIENT - Set CPU as the TCP communication client.
State Enums
- TCPCOMM_ST_CLOSED - TCP state after a connection has been successfully closed.
- TCPCOMM_ST_OPENING - TCP state while connection is being established.
- TCPCOMM_ST_IOCTL - TCP state that changes or retrieves settings.
- TCPCOMM_ST_LISTEN - TCP state while connection is established and idle.
- TCPCOMM_ST_CLOSING - TCP State while connection is being closed.
- TCPCOMM_ST_ERROR - TCP state when an error has occurred.
Send State Enums
- TCPCOMM_SEND_ST_IDLE - TCP send state while connection is not actively sending.
- TCPCOMM_SEND_ST_SEND - TCP send state while connection is actively sending.
Receive State Enums
- TCPCOMM_RECV_ST_READ - TCP read state.
TCPConnection_typ
This structure is used to establish and monitor a TCP connection.
Commands
- Enable - Boolean that enables the TCP connection.
- AcknowledgeConnection - Boolean that commands the function to initiate a connection.
- AcknowledgeError - Boolean that clears a non persistent error.
Configuration
- Mode - Enum that determines whether the CPU will be a TCP client or server.
- LocalIPAddress - IP Address of the CPU.
- LocalPort - Port of the CPU.
- RemoteIPAddress - IP Address of device intended to connect to CPU.
- RemotePort - Port of device intended to connect to CPU.
- SendBufferSize - Maximum length of data in bytes (length of the data buffer specified).
- UseSSL - Boolean used to signify an SSL connection is required.
- SSLCertificate - Storage for required SSL certificate information.
Outputs
- NewConnectionAvailable -
- Connection - data associated with current connection
- IPAddress - IP Address of connected device.
- Port - Port of connected device.
- Ident - Socket ident.
- UID - Unique identifier for the connection. 0 implies the connection is not valid.
- Error - Boolean used to signify a error has occurred.
- ErrorID - Error ID associated with the error that has occurred.
- ErrorString - Error string to inform the user about the error that has occurred.
Initialization
//Set the IP Address and port of server
TCPServer.IN.CFG.RemoteIPAddress:= '192.168.10.1';
TCPServer.IN.CFG.RemotePort:= 8000;
//Set CPU's Ip Address and port
TCPServer.IN.CFG.LocalIPAddress:= '192.168.10.2';
TCPServer.IN.CFG.LocalPort:= 8001;
//Set the mode to be either Client or Server
TCPServer.IN.CFG.Mode:= TCPCOMM_MODE_CLIENT;
TCPServer.IN.CMD.Enable:= 1;
Cyclic Operation
//cyclically called function
TCPManageConnection(TCPServer);
//Acknowledge a new connection
IF( TCPServer.OUT.NewConnectionAvailable)THEN
TCPServer.IN.CMD.AcknowledgeConnection:= 1;
END_IF
TCPStream_typ
This structure is used to send and receive data via TCP communication.
Commands
- Receive - Command for receiving a new TCP packet.
- Send - Command for sending a new TCP Packet
- Close - Command to close the current connection.
- AcknowledgeData - Command to acknowledge new data has been received.
- AcknowledgeError - Command to acknowledge an error has occurred.
Parameters
- Connection - data associated with current connection
- IPAddress - IP Address of connected device.
- Port - Port of connected device.
- Ident - Socket ident.
- pReceiveData - Pointer to string containing received TCP packet.
- MaxReceiveLength - Maximum length of data in bytes (length of the data buffer specified).
- ReceiveFlags - Flag parameter associated with receiving a TCP packet. See Automation Studio TCPRecv() for list of flags.
- AllowContinuosReceive - Boolean that allows for continuously receiving TCP packets.
- pSendData - Pointer to string containing TCP packet being sent.
- SendLength - Length of the SendData string.
- SendFlags - Flag parameter associated with sending a TCP packet. See Automation Studio TCPSend() for list of flags.
- AllowContinuosSend - Boolean that allows for continuously sending TCP packets.
Outputs
- Connection - data associated with current connection
- IPAddress - IP Address of connected device.
- Port - Port of connected device.
- Ident - Socket ident.
- Active - Boolean signifying an active connection.
- Receiving - Boolean signifying a TCP received packet is being processed.
- DataReceived - Boolean signifying a TCP received packet is has been processed.
- ReceivedDataLength - Length of the TCP packet last received.
- Sending - Boolean signifying a TCP packet is currently being sent.
- DataSent - Boolean signifying A TCP packet was successfully sent.
- SentDataLength - Length of the most recently sent TCP packet.
- Error - Boolean used to signify a error has occurred while sending or receiving TCP packets.
- ErrorID - Error ID associated with the error that has occurred.
- ErrorString - Error string to inform the user about the error that has occurred.
Initialization
//set the send data string to avoid sending garbage
sendData:= 'Hello Server';
Cyclic Operation
//When a new connection is available set the pointers for the send and receive strings and set the commands high
IF( TCPServer.OUT.NewConnectionAvailable )THEN
TCPServer.IN.CMD.AcknowledgeConnection:= 1;
TCPDataManager.IN.PAR.Connection:= TCPServer.OUT.Connection;
TCPDataManager.IN.PAR.pSendData:= ADR(sendData);
TCPDataManager.IN.PAR.pReceiveData:= ADR(recvData);
TCPDataManager.IN.PAR.MaxReceiveLength:= SIZEOF(recvData);
TCPDataManager.IN.CMD.Receive:= TRUE;
TCPDataManager.IN.CMD.Send:= TRUE;
END_IF
//Acknowledge new connection and cyclically check for received data
TCPDataManager.IN.CMD.AcknowledgeData:= 1;
TCPStreamReceive(TCPDataManager);
//When ot sending recalculate the length of the data to be sent.
IF( NOT TCPDataManager.OUT.Sending ) THEN
TCPDataManager.IN.PAR.SendLength:= brsstrlen(ADR(sendData));
END_IF
//Function that performs the TCP sending functionality when the send command is high
TCPStreamSend(TCPDataManager);
//Clean up commands for next cycle
TCPDataManager.IN.CMD.Send:= 0;
TCPDataManager.IN.CMD.Close:= 0;
Snippets
Disconnect handling
// Handle a disconnect error
if (TCPDataManager.OUT.ErrorID == tcpERR_NOT_CONNECTED) {
TCPDataManager.IN.CMD.Send = 0;
TCPDataManager.IN.CMD.Receive = 0;
TCPDataManager.IN.CMD.Close = 1;
TCPDataManager.IN.CMD.AcknowledgeError = 1;
}
Note: In TCP an empty packet is also a disconnect packet
if (TCPDataManager.OUT.DataReceived) {
if (TCPDataManager.OUT.ReceivedDataLength == 0) {
TCPDataManager.IN.CMD.Send = 0;
TCPDataManager.IN.CMD.Receive = 0;
TCPDataManager.IN.CMD.Close = 1;
}
}
Handling config changes
// Handle user changes in Configuration.Connection
IF brsmemcmp(ADR(TCPClient.IN.CFG),ADR(Configuration.Connection),SIZEOF(Configuration.Connection)) <> 0 THEN
TCPClient.IN.CFG:= Configuration.Connection;
TCPClient.IN.CMD.Enable:= FALSE; // Client (or server) needs to restart to accept configuration
END_IF
Keep alive
// Temp variable
sending := TCPDataManager.OUT.Sending OR TCPDataManager.IN.CMD.Send; // Is data being sent or about to be sent
Ping.IN:= connected AND NOT sending AND NOT Ping.Q;
Ping.PT:= Configuration.Ping;
Ping(); // Ping TON
IF Ping.Q AND Configuration.Ping > 0 THEN
FormattedData := 'ok?'; // Ping message
TCPDataManager.IN.PAR.SendLength := 3; // Ping message len (strlen('ok?') == 3)
TCPDataManager.IN.CMD.Send := TRUE;
TCPDataManager.IN.PAR.pSendData := ADR(FormattedData);
END_IF
Errors
- 50000 - TCPCOMM_ERR_INVALIDINPUT
- 50001 - TCPCOMM_ERR_SENDDATATOOLARGE
- 50002 - TCPCOMM_ERR_