codesys 通讯协议代码2(TCP/IP客户端)

只给出逻辑流程,具体收发数据评论区回复。

客户端

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=> );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值