UR5机器人学习之TCP/IP通讯

最近因为项目原因在研究UR机器人,主要是通过PC上位机与UR通讯,采用TCP/IP通讯的方式,PC上位机通过发送UR脚本指令实现控制机器人和操作机器人。

IP地址:可以根据UR机器人控制终端读取到IP地址

端口:端口取30001或者30002或者30003,(本实验使用的是30002端口)

脚本指令可以直接从官网下载,也可以从相关CSDN帖子材料中获得,或者联系我QQ:476596998

服务器:UR5

客户端:PC上位机

注意事项:

1、连接好时,URScript 程序或命令以清晰文本形式在每一个 socket 端口发送。每行均以“\n”结束。在编程的时候务必确定最终发送的文本中的格式为:命令(参数)\n

本人是以QT5.6来编写的上位机程序:如下所示:

界面:

mainwindow.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qmessagebox.h"
#include "qhostaddress.h"
#include "qbytearray.h"
#include "qpalette.h"

#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Init();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Init()
{
    mysocket = new QTcpSocket(this);
    ui->comboBox_Protocol->insertItem(0,"TCPSever");
    ui->comboBox_Protocol->insertItem(1,"TCPClient");
    ui->pushButton_DisLink->setDisabled(true);


    connect(ui->pushButton_Link,SIGNAL(clicked(bool)),this,SLOT(do_pushButtonLink_clicked(bool)));
    connect(ui->pushButton_DisLink,SIGNAL(clicked(bool)),this,SLOT(do_pushButtonDisLink_clicked(bool)));
    connect(ui->pushButton_SendData,SIGNAL(clicked(bool)),this,SLOT(do_pushButtonSendData_clicked(bool)));
    connect(ui->pushButton_ClearReceive,SIGNAL(clicked(bool)),this,SLOT(do_pushButtonClearReceive_clicked(bool)));
    connect(ui->pushButton_ClearSend,SIGNAL(clicked(bool)),this,SLOT(do_pushButtonClearSend_clicked(bool)));
}


void MainWindow::do_pushButtonClearSend_clicked(bool)
{
    ui->textEdit_SendField->clear();
}

void MainWindow::do_pushButtonClearReceive_clicked(bool)
{
    ui->textEdit_ReceiveField->clear();
}


void MainWindow::do_pushButtonSendData_clicked(bool)
{
    if(ui->textEdit_SendField->toPlainText().isEmpty())
    {
        return;
    }

    QString sendText = ui->textEdit_SendField->toPlainText()+"\n";
    mysocket->write(sendText.toLocal8Bit());

    ui->textEdit_ReceiveField->append(sendText);
    ui->textEdit_SendField->clear();
}


void MainWindow::do_pushButtonDisLink_clicked(bool)
{
    mysocket->disconnect();
    mysocket->close();
    ui->pushButton_DisLink->setDisabled(true);
    ui->pushButton_Link->setDisabled(false);
}

void MainWindow::do_pushButtonLink_clicked(bool)
{
    if(ui->lineEdit_IPAddr->text().isEmpty())
    {
        QMessageBox::information(this,"提示:","IP地址不能为空");
        return;
    }
    if(ui->lineEdit_Port->text().isEmpty())
    {
        QMessageBox::information(this,"提示","端口号不能为空");
        return;
    }

    myIPAddress = (QHostAddress)ui->lineEdit_IPAddr->text();
    myIPPort = ui->lineEdit_Port->text().toUInt();

    mysocket->connectToHost(myIPAddress,myIPPort);
    if(!mysocket->waitForConnected())
    {
        QMessageBox::information(this,"提示:","连接失败,请重新连接》》》");
        return;
    }

    ui->pushButton_Link->setDisabled(true);
    ui->pushButton_DisLink->setDisabled(false);
    connect(mysocket,SIGNAL(readyRead()),this,SLOT(do_mysocket_readyRead()));
    connect(mysocket,SIGNAL(connected()),this,SLOT(do_mysocket_connected()));

}

void MainWindow::do_mysocket_connected()
{
    ui->pushButton_Link->setBackgroundRole(QPalette::Window);
}

void MainWindow::do_mysocket_readyRead()
{
    QByteArray receiveText = mysocket->readAll();
    ui->textEdit_ReceiveField->append(QString("获得的字节数:%1").arg(mysocket->bytesAvailable()));
    ui->textEdit_ReceiveField->append(QString("所获得的数据:"+receiveText.toHex().toUpper()));

    //QByteArray receiveLine = mysocket->readLine(1024);
    //ui->textEdit_ReceiveField->append((QString)receiveLine.toHex());
    //ui->textEdit_ReceiveField->append("\n");
}

mainwindow.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qtcpsocket.h"
#include "qhostaddress.h"



#pragma execution_character_set("utf-8")

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public://设定全局变量:
    QTcpSocket *mysocket;
    QHostAddress myIPAddress;
    quint16 myIPPort;


public://设定全局函数:
    void Init();



public slots:
    void do_pushButtonLink_clicked(bool);
    void do_mysocket_readyRead();
    void do_pushButtonDisLink_clicked(bool);
    void do_pushButtonSendData_clicked(bool);
    void do_pushButtonClearSend_clicked(bool);
    void do_pushButtonClearReceive_clicked(bool);
    void do_mysocket_connected();


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

main.cpp文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

工程文件:URClient.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-09-06T15:53:17
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = URClient
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

发送的命令实例:

movej([0.244,-2.25,-0.89,-3.19,0,0],a=0.1,v=0.1,t=0,r=0)

注意:以上实例中“\n”已经被内嵌入程序中,可以去程序中查找。

UR(Universal Robots)机器人是一种灵活的工业机器人,它们可以利用TCP/IP网络接口与其他设备或系统进行通信。在使用Python进行UR机器人与外部系统通信时,通常需要通过网络发送或接收数据。数据转换涉及到将数据打包成TCP/IP协议能发送的格式,然后在接收端再将数据解析出来。 Python中,可以使用套接字(sockets)来进行网络通信。以下是一个简单的数据转换和网络通信的过程示例: 1. 创建套接字并连接到机器人或服务器。 2. 将需要发送的数据转换成字节流。如果数据是复杂的数据结构(如字典或列表),需要先将其序列化为字节流。 3. 发送字节流数据到对方机器。 4. 在接收端,监听套接字并接收数据。 5. 将接收到的字节流数据解析成原始数据结构。 在Python中,可以使用`json`模块来序列化和反序列化数据,这对于发送文本数据非常方便。对于二进制数据,可以使用`struct`模块来打包和解包数据。 一个简单的数据发送和接收的例子如下: ```python import socket import json # 假设我们有一个要发送的字典数据 data_to_send = { 'command': 'move_to', 'position': [100, 200, 300], 'orientation': [0, 0, 1, 0] } # 创建TCP/IP客户端套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接到服务器(假设机器人监听在本机的12345端口) client_socket.connect(('localhost', 12345)) # 将数据序列化为JSON格式并发送 json_data = json.dumps(data_to_send) client_socket.send(json_data.encode('utf-8')) # 接收返回的数据,这里假设返回的也是JSON格式 response = client_socket.recv(1024).decode('utf-8') response_data = json.loads(response) # 打印返回的数据 print(response_data) # 关闭套接字 client_socket.close() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值