ABB机器人与PC进行Windows下的Socket通信的C代码实现(客户端)

前言

ABB机器人的二次开发中,如果需要开发能让机器人与PC通信的上位机,可以采取TCP/IP、UDP或者串口通信的方式。
本文采取TCP/IP中Socket的方式实现两者的通信。其中PC做为客户端,机器人作为服务端,至于两者谁做客户端谁做服务端视具体情况而定。

编译器选项

本文采用DevC++来编译,编译前需要在编译器选项中加入如下命令:
-lwsock32
在这里插入图片描述

建立Socket连接

本文采取的是本地网络IP:127.0.0.1,在PC的ABB机器人虚拟软件RobotStudio上进行通信,端口号自定。
去到现场则需要根据ABB机器人的实际地址进行更改,一般为192.168.125.1

struct sockaddr_in serAddr;
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(55000);//目标地址端口号 
	serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");/*目标地址IP,这里设为本机*/
	if (connect(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)/*建立socket*/
	{
		printf("connect error !");
		closesocket(sclient);
		return 0;
	}
	else
	{
		printf("connect success\n");
		//将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。
		recv(sclient, buf1, MAX_DATA, 0);
		printf("Received:%s\n",buf1);			
	}

通信成功验证

建立Socket通信后,可以让服务端和客户端互相发信息,验证通信是否成功,或者采用抓包软件wireshark抓包,检查TCP/IP的三次握手。
本文由PC给机器人发送字符串,机器人收到后便开始移动,当到达指定位置后,给PC发送Arrive Pisition-i的字符串。PC再给机器人发送移到下一位置的字符串。实现机器人的自动化作业,并且PC可以开发相应的上位机控制机器人。本文只提供了客户端的代码,至于服务端的代码,可以进入主页查看ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)

//开始发命令,接受机器人反馈 
	for(int i=1;i<12;i++) 
	{
		send(sclient, "move", strlen("move"), 0);
		//wsprintf(str1,"%s%d",pos,i);//拼接str1="Arrive Pisition-i"
		//printf("%s\n",str1);
		ret = recv(sclient, buf2,strlen("10"), 0); 
		if(ret == 0)
		{		 
			break; 
		}
		else if (ret == SOCKET_ERROR)
		{
			printf("recv() 失败: %d\n" , WSAGetLastError());
            break;
		}
		else
		{
			//机器人到达指定位置,扫描相机开始工作 
			printf("Received:\t%s\n",buf2);
			//Sleep(5000);	
			//在此处插入发给扫描相机的信号 
		}
		 
	}

客户端完整代码

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX_DATA 100//接收到的数据最大程度

int main(int argc, char* argv[])
{
	WORD sockVersion = MAKEWORD(2, 2);/*加载Winsock DLL*/ 
	WSADATA data;
	int ret;
	char buf1[MAX_DATA];//储存接收数据 
	char buf2[2];
	char str1[100];//储存"Arrive Pisition-i" 
	char pos[]="Arrive Pisition-";
	
	if (WSAStartup(sockVersion, &data) != 0)
	{
		printf("Winsock 初始化失败!\n");
		return 0;
	}
 
	SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sclient == INVALID_SOCKET)
	{
		printf("invalid socket !");
		return 0;
	}
 
	struct sockaddr_in serAddr;
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(55000);//目标地址端口号 
	serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");/*目标地址IP,这里设为本机*/
	if (connect(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)/*建立socket*/
	{
		printf("connect error !");
		closesocket(sclient);
		return 0;
	}
	else
	{
		printf("connect success\n");
		//将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。
		recv(sclient, buf1, MAX_DATA, 0);
		printf("Received:%s\n",buf1);			
	}
	
	//开始发命令,接受机器人反馈 
	for(int i=1;i<12;i++) 
	{
		send(sclient, "move", strlen("move"), 0);
		//wsprintf(str1,"%s%d",pos,i);//拼接str1="Arrive Pisition-i"
		//printf("%s\n",str1);
		ret = recv(sclient, buf2,strlen("10"), 0); 
		if(ret == 0)
		{		 
			break; 
		}
		else if (ret == SOCKET_ERROR)
		{
			printf("recv() 失败: %d\n" , WSAGetLastError());
            break;
		}
		else
		{
			//机器人到达指定位置,扫描相机开始工作 
			printf("Received:\t%s\n",buf2);
			//Sleep(5000);	
			//在此处插入发给扫描相机的信号 
		}
		 
	}
	closesocket(sclient);
	WSACleanup();
	return 0;
} 


实现效果

在这里插入图片描述
客户端端接受服务端的反馈:
在这里插入图片描述
服务端收到客户端的指令后开始执行程序:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-今晚打老虎-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值