Universal Robots Forum

在进行tcp/ip通讯时数据接收/发送的问题

我的服务端的程序为
char sendBuf[80] = “(0.46, 0.1, 0.4, 3.14, 0, 0 )”;
send(sClient, sendBuf, strlen(sendBuf), 0);
现在发送出的数据,在机械臂端不能接受(识别)
机械臂端的使用socket_read_ascii_float()进行接收。
在程序的服务端向机械臂(客户端)发送数据时(机械手的位置)的格式是什么?

Hi @1428588386 ,

请参阅Script手册与经销商提供的训练课程, 把你要的float数据以Ascii code方式放入刮号(), 每个float数据间以**逗号,**隔开

Thanks

我尝试将数值1转换成ascii码值,但是在UR5端依然接收不到发送的数据。
char sendBuf[58] = “(00110001, 00110001,00110001, 00110001,00110001,00110001)”;
send(sClient, sendBuf, strlen(sendBuf), 0);
在UR5端显示:
类型错误:表达式左边应为类型‘int’,但却出现类型‘List’
期待您的回复!
谢谢

Hi @1428588386 ,

这个socket_read_ascii_float()进行接收功能确定是正常的, 因为使用socket test软件于PC(Server)传送给Robot(Client)都能正确, 你的PC端使用的是C++语言?你尝试看看是否这么做就好了

String sendBuf= “(0.46, 0.1, 0.4, 3.14, 0, 0 )”

不过我不是很确定这个部分

我尝试了一下,但并不好用。
我想请问一下,socket_read_ascii_float()能接收的发送格式是什么?(在C++端)
之前尝试了一下发送功能是好用的,但是socket_read_ascii_float()就是接收不到数据。
期待您的回复!
谢谢

Hi @1428588386

我确定socket_read_ascii_float()是没问题的, 你尝试下面的

string sendBuf= “(1,2,3 )”作法了吗?

你的Robot端会收到四个元素List为 [3,1,2,3]

您好,我试了您的方案,但是ur的示教器任显示错误。
(表达式左边应为类型‘int’,但却出现类型‘List’)
下面是我在vs上写的语句
string sendBuf = “(1, 2, 3)”;
send(sClient, (const char *)&sendBuf, strlen((const char *)&sendBuf), 0);
您可以把邮箱给我吗,我将我的整个程序发给您。
期待您的回复

Hi @1428588386

Sorry, 我无法以这样的方式协助你, 建议你直接找当地经销商会比较有效率或者在这里贴上你的程序代码, 看看其他的人是否能协助, 我比较好奇你的Robot程序是否有错, 建议你先贴上你的Robot端接收的程序代码

Thanks

UR机器人端的程序如下:
开始前
var_2=p[0.115,-0.408,0.245,3.145,-0.271,-0.008]
open=socket_open(“172.16.17.7”,30003)
循环 open=False
open=socket_open(“172.16.17.7”,30003)
rv=[0,0,0]
机器人程序
Movej
var_2
循环5次数
pos3=get_actual_tcp_pose()
socket_send_string(pos)
receive_grip=socket_read_ascii_float(6)
循环 receive_grip[0]不等于6
等待0.1
receive_grip=socket_read_ascii_float(6)
Xgrip=receivepos_grip[1]
Ygrip=receivepos_grip[2]
Zgrip=receivepos_grip[3]
RXgrip=receivepos_grip[4]
RYgrip=receivepos_grip[5]
RZgrip=receivepos_grip[6]
rv=[RXgrip,RYgrip,RZgrip]
pos2=get_actual_tcp_pose()
Movej
pose2
pose1_2=p[Xgrip,Ygrip,Zgrip,RXgrip,RYgrip,RZgrip]

PC端的程序如下:
#include “winsock2.h”

#include
using namespace std;
//特定的端口
#include <stdlib.h>
#pragma comment(lib,“ws2_32.lib”)
int main(int argc, char* argv)
{
const int BUF_SIZE = 64;
WSADATA wsd;//WSADATA变量
SOCKET sServer; //服务器套接字
SOCKET sClient; //客户端套接字
SOCKADDR_IN addrServ; //服务器地址
char buf[BUF_SIZE];//接收数据缓冲区
//char sendBuf[60];//返回给客户端得数据
int retVal;//返回值
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
cout << “WSAStartup failed!” << endl;
return 1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sServer)
{
cout << “socket failed!” << endl;
WSACleanup();//释放套接字资源;
return -1;
}
//服务器套接字地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(30003);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == retVal)
{
cout << “bind failed!” << endl;
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
//开始监听
retVal = listen(sServer, 1);
if (SOCKET_ERROR == retVal)
{
cout << “listen failed!” << endl;
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
//接受客户端请求
sockaddr_in addrClient;
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer, (sockaddr FAR*)&addrClient, &addrClientlen);
if (INVALID_SOCKET == sClient)
{
cout << “accept failed!” << endl;
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
ZeroMemory(buf, BUF_SIZE);
retVal = recv(sClient, buf, BUF_SIZE, 0);//接受数据,char类型,格式为p[x,y,z,rx,ry,rz]
if (SOCKET_ERROR == retVal)
{
cout << “recv failed!” << endl;
closesocket(sServer);//关闭套接字
closesocket(sClient);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
//char sendBuf[80];

//char sendBuf[87]="movej([00110001, 00110001, 00110001, 00110001, 00110001,00110001])";

//char sendBuf[80] = "(006A,006A,006A,006A,006A,006A)";//后三个为旋转矢量,可以写欧拉角转旋转矢量函数,然后赋值

string sendBuf = "(1, 2, 3,4,5,6)";

//char sendBuf[60] = “(0.001,0.2,0.5,0.8,0.9,0.2)”;
send(sClient, (const char *)&sendBuf, strlen((const char *)&sendBuf), 0);
//send(sClient, sendBuf, 29, 0);
cout << "客户端发送的数据: " << (const char *)&sendBuf << endl;
cout << "向客户端发送数据: " << buf << endl;;

closesocket(sServer);//关闭套接字
closesocket(sClient);//关闭套接字
WSACleanup();//释放套接字资源;
return 0;
}

Hi @1428588386

open=socket_open(“172.16.17.7”,30003), 这里的port 30003是client interface使用的, 你是否应该要改成其他的port使用? 比如5000

另外receive_grip要不要在”开始前”给定初值, receive_grip=[0,0,0,0,0,0,0]看看(共七个元素)

Thanks

感谢您的回复,相关问题已解决!
祝您生活工作愉快!

Hi @1428588386 ,

所以問題點是什麼呢?請分享一下

Thanks

在UR机器人端,我听取了您的建议,申明了receive_grip=[0,0,0,0,0,0,0];
在计算机端,我将数据的格式先定义为float在将其发出。
ZeroMemory(buf, 4096);
float X = 12.4;
float Y = 456;
float Z = 900.87;
float RX = 3.14;
float RY = 0.0;
float RZ = 0.0;
sprintf_s(buf, “(%lf,%lf,%lf,%lf,%lf,%lf)”, X, Y, Z,RX ,RY,RZ);
size_t buf_len = strlen(buf);
send(clientSocket, buf, buf_len, 0);
这样做之后,在UR端使用socket_read_ascii_float()实现数据的接收。