(一)区分
PLC作为服务器(接受Accept):只要开放端口号(客户端会自己来连接对应的端口)
PLC作为 客户端(连接 Connect)开放自己的端口并且需要知道服务器的IP与端口号
(二)通讯需要用到的数据处理指令
(三) TCP Scokets通讯
Socket功能块
IF mLink = TRUE THEN
Link := mLink;
ELSE
Link:=FALSE;
END_IF;
SendStr :=mSendStr;//要发送的数据
count :=LEN(SendStr); //数据 的长度
ToAryByte(SendStr,_LOW_HIGH,SendSocketDat[0]);//把要 发送的数据传送到SendSocketDat数组中,从低到高
sTon( IN:=(mLinkDone = TRUE),PT :=T#100ms, Q =>sTonQ);// mLinkDone:=(SktTCPAccept_instance.Done = TRUE) OR (SktTCPConnect_instance.Done = TRUE);
IF mServerOrClient = 'Server' THEN
// 建立服务器
SktTCPAccept_instance(
Execute :=(Link=TRUE) AND (_Eip_EtnOnlineSta=TRUE),
SrcTcpPort :=mPort, // 本机 TCP 端口编号
TimeOut :=mTimeOut, // 超时时间
Socket =>WkSocket // Socket
);
ELSIF mServerOrClient = 'Client' THEN
// 建立客户端
SktTCPConnect_instance(
Execute :=(Link=TRUE) AND (_Eip_EtnOnlineSta=TRUE),
//SrcTcpPort :=0, // 本机端口编号 自动分配
DstAdr :=mIp, // 服务器 IP 地址
DstTcpPort :=mPort, // 服务器 TCP 端口编号
Socket =>WkSocket
); // Socket
END_IF;
IF (mLinkDone = TRUE) THEN//连接上后,开始动作
//状态查询
SktGetTCPStatus_instance(
Execute :=(SktGetTCPStatus_instance.Done = FALSE) AND sTonQ,
Socket :=WkSocket,
TcpStatus =>TcpStatus,
DatRcvFlag =>DatRcvFlag
);
// 接收数据
SktTCPRcv_instance(
Execute :=(SktGetTCPStatus_instance.Done = TRUE) ,//接收数据是实时的,只要通信没有问题
Socket :=WkSocket, // Socket
TimeOut :=mTimeOut, // 超时时间
Size :=UINT#2000, // 接收数据大小
RcvDat :=RcvSocketDat[0],
RcvSize =>mRcvSize
);
// 发送请求
SktTCPSend_instance(
Execute :=mSendStart,//发送数据需要触发
Socket :=WkSocket, // Socket
SendDat :=SendSocketDat[0], // 发送数据
Size :=count // 发送数据大小
);
// 清除接收缓存
SktClearBuf_instance(
Execute :=(SktClearBuf_instance.Done = FALSE),
Socket :=WkSocket
); // Socket
// 关闭请求
SktClose_instance(
Execute :=mClose,
ocket :=WkSocket
);
END_IF;
AryByteTo(RcvSocketDat[0],mRcvSize,_LOW_HIGH,mReceiveStr);//把接收到的数据数组转换成多个字节(连续寄存器中)
mLinkDone:=(SktTCPAccept_instance.Done = TRUE) OR (SktTCPConnect_instance.Done = TRUE);
IF (SktTCPSend_instance.Done = TRUE) THEN//数据发送完成后,复位发送完成信号
mSendDone :=TRUE;
ELSE
mSendDone :=FALSE;
END_IF;
IF (SktTCPRcv_instance.Done = TRUE) THEN
mReceDone :=TRUE;
ELSE
mReceDone :=FALSE;
|