只给出逻辑流程,具体收发数据评论区回复。
客户端
FUNCTION_BLOCK ClientInit
VAR_INPUT
bEnable : BOOL;
serverAddr : SOCKADDRESS;
END_VAR
VAR_OUTPUT
bConnected : BOOL; //连接完成
bDone : BOOL; //置TRUE,指令执行完成
bBusy : BOOL; //置TRUE,指令执行中
bError : BOOL; //置TRUE发生错误
udiErrorID : UDINT; //错误代码
END_VAR
VAR
bInit : BOOL := TRUE;
iCount : INT;
bConnect : BOOL;
pResult : ARRAY[0..9] OF SysTypes.RTS_IEC_RESULT;
hEvent : RTS_IEC_HANDLE;
eErrorID : RTS_IEC_RESULT;
callBack : XiCS_FB_SockCallBack;
END_VAR
//*************************代码************************************//
//******************************回调(复位后结束资源占用)************************************//
IF bInit THEN
bInit := FALSE;
//回调
hEvent := EventOpen(EventId:= CmpApp.EVT_PrepareStop, CmpIdProvider:= CMPID_CmpApp, Result:= eErrorID);
IF hEvent <> RTS_INVALID_HANDLE THEN
EventRegisterCallback(hEvent:= hEvent, pICallback:= callBack, Result:= eErrorID);
END_IF
GVL_Status.hSocket := SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM,SOCKET_IPPROTO_TCP,ADR(pResult[0]));
callback.hToFree := GVL_Status.hSocket;
callback.phToInvalidate := ADR(GVL_Status.hSocket);
IF (pResult[0] = CmpErrors.Errors.ERR_OK)AND(GVL_Status.hSocket <> SM3_Basic.NULL) THEN
bConnect := TRUE;
END_IF
END_IF
//******************************与控制器建立连接************************************//
IF bConnect THEN
serverAddr.sin_family := SOCKET_AF_INET;
pResult[1] := SysSockConnect(hSocket:= GVL_Status.hSocket, pSockAddr:= ADR(serverAddr), diSockAddrSize:= SIZEOF(serverAddr));
bConnect := FALSE;
IF (pResult[1] = CmpErrors.Errors.ERR_OK) THEN
GVL_Status.gBConnect := TRUE;
ELSIF(pResult[1] = CmpErrors.Errors.ERR_SOCK_TIMEDOUT) THEN
bError := TRUE;
GVL_Status.gBConnect := FALSE;
udiErrorID := GVL_Error.ERR_CONNECT_TIMEOUT;
XiCS_Fun_GetInfo(0);
END_IF
END_IF
//******************************判断与控制器连接、获取配置信息************************************//
//判断是否连接
IF (GVL_Status.hSocket <> SM3_Basic.NULL) AND (bConnected = FALSE) AND (udiErrorID = GVL_Error.ERR_OK) THEN
//数据的解析;
//获取包头数据
liRecvSize := SysSockRecv(
hSocket:= GVL_Status.hSocket,
pbyBuffer:= ADR(GVL_ReadData.gByReadBuffer),
diBufferSize:= SIZEOF(GVL_ReadData.gByReadBuffer),
diFlags:= 0,
pResult:= ADR(pResult));
////反馈处理数据
iActSendSize := SysSockSend(
hSocket:= GVL_status.hSocket,
pbyBuffer:= ADR(GVL_WriteData.gByWriteBuffer),
diBufferSize:= LINT_TO_DINT(liNeedSendSize),
diFlags:= 0,
pResult:= ADR(pResult));
end_if
测试代码
PROGRAM Prg
VAR
bInit : BOOL;
tcpInit : ClientInit;
bEnable : BOOL;
sockAddress : SysSocket_Interfaces.SOCKADDRESS;
END_VAR
IF NOT bInit THEN
bInit := NOT bInit;
sockAddress.sin_addr.S_un_b.s_b1 := 192;
sockAddress.sin_addr.S_un_b.s_b2 := 18;
sockAddress.sin_addr.S_un_b.s_b3 := 8;
sockAddress.sin_addr.S_un_b.s_b4 := 8;
sockAddress.sin_port := SysSocket_Implementation.SysSockHtons(7007);
//设置PLC通讯模式
GVL_PLCCfg.gUiComMode := 1;
END_IF
//连接
tcpInit(
bEnable:= bEnable,
serverAddr:= SockAddress,
bConnected=> ,
bDone=> ,
bBusy=> ,
bError=> ,
udiErrorID=> );