需求:
PC需要将几万个点传递到PLC上。测试过传递文件发到PLC的FLASH中,然后解析文件内容。在进行行数据的类型转换时,出现PLC内存不足的情况。于是采用TCP通信方式。
步骤1:添加TCPUDPC
步骤2:定义变量
创建GVL
{
attribute 'qualified_only'}
VAR_GLOBAL
Path :ARRAY [0..c_uiNumOfPoints] OF DUT_PT; //存访路径点的数组
END_VAR
VAR_GLOBAL CONSTANT
c_uiNumOfPoints :UDINT:= 100000; //点的个数
END_VAR
定义结构体
TYPE DUT_PT :
STRUCT
IDX:UINT; //点的编号
X:UINT; //点的X坐标
Y:UINT; //点的Y坐标
Z:UINT; //点的Z坐标
A:UINT; //点的A坐标
B:UINT; //点的B坐标
C:UINT; //点的C坐标
END_STRUCT
END_TYPE
步骤3: 定时任务程序
创建一个程序单元(POU)
PROGRAM POU_TCP_SERVER
VAR
fbTcpServer : TCPUDP.FB_TCPServer2; //定义TCP服务器对象
sServerIp: STRING(15) := '0.0.0.0'; //服务器IP
uiServerPort : UINT := 12345; //服务器端口
xOpen: BOOL; //打开TCP连接成功标志
xClose: BOOL; //是否要关闭(TRUE-关闭)
etServerResult: TCPUDP.ET_Result; //执行行结果
etCurrentConnetionState: TCPUDP.ET_State; //连接状态
dwCurrentClientIP:DWORD;
sCurrentClientIP : STRING(15) ; //客户端IP
uiCurrentClientPort:UINT; //客户端端口
pbyReceiveBuffer: ARRAY[1..10] OF DUT_PT; //接收缓存区
udiReceiveFillLevel: UDINT; // 接收缓存区偏移
udiReceiveBufferSize: UDINT; //接收缓存区字节
currentPoint : DUT_PT;
uiCurrentNumberOfConnectedClients:UINT; // 连接数
uiMaxClientNumber:UINT:=1; //最多连接数
pbySendBuffer: DUT_PT; // 发送缓存区
udiSendFillLevel: UDINT; // 接收缓存区偏移
xAccepted:bool;
udiSend:UDINT; //发送的字节
uiState:UINT;
uiReceivedByteSize:UDINT; //收到的字节
uiReceived:ULINT;
indexPoint: UINT;
astConnectedClients :ARRAY [1..TCPUDP.GPL