ABB机器人socket通讯和数据提取及转换

ABB机器人创建socket,需要有616-1 PC-INTERFACE选项
同时需要新建socketdev类型的变量
套接字可分为客户端和服务端,这里一般把ABB作为客户端
PROC TCP_Socket()

	VAR socketdev client_socket;
	VAR num found;
    VAR num default_val;
    VAR num start;
    VAR bool sTOn_True;
    VAR num angelx1:=0;
    VAR num angely1:=0;
    VAR num angelz1:=0;
   
    SocketClose client_socket;
   	! 创建客户端连接
    SocketCreate client_socket;
    ! 连接至本机ip,端口8080
    SocketConnect client_socket,"127.0.0.1",8080;
    TPWrite "socket client connect successful";
    ! 发送客户端消息至服务器"I'm Robot"
    SocketSend client_socket\Str:="I'm Robot";
    ! 接收服务端发送过来的数据,数据为字符串类型
    SocketReceive client_socket\Str:=received_string;
    ! 初始化变量
    start:=0;
    default_val:=1;
    ! 通过for循环,解析出一组deltaX,deltaY,和thetaZ值
    FOR i FROM 1 TO 3 DO
        start:=found+1;
        ! 通过StrFind字符串查找函数,查询逗号在字符串的第几位
        found:=StrFind(received_string,start,",");
        ! StrPart函数,截取字符串所提供末尾值,start为截取开始值
        default_val:=found-start;
        ! strtoval函数把字符串转换为整数num类型,把截取的数据放至数组vision_data中
        sTOn_True:=strtoval(StrPart(received_string,start,default_val),vision_data{i});
        ! 判断转换是否成功
        IF sTOn_True THEN
            TPWrite ""\Num:=vision_data{i};
        ELSE
            TPWrite "vision_data error!";
        ENDIF
    ENDFOR
   ! 把解析出来的数据,转化为机器人四元数  
    p10:=Ppick_base;
    p10.trans.x := vision_data{1};
    p10.trans.y := vision_data{2};
    angelx1:=EulerZYX(\X, p10.rot);
    angely1:=EulerZYX(\Y, p10.rot);
    !angelz1:=EulerZYX(\Z, p10.rot);
    angelz1:=vision_data{3};
    p10.rot := OrientZYX(angelz1, angely1, angelx1);
    MoveJ p10,v1000,z1,MyTool\WObj:=Workobject_1;
ENDPROC
服务器端可以用调试工具发送数据,当然可以自己写个小程序,自动发送数据给机器人,测试时使用还是很方便的。

这里使用Python编程语言,来实现服务器端程序,实现起来比较简单方便。

import socket, threading, random
import re

# 要发送的机器人坐标数据,用数组保存起来,随机发送
send_recv = ["72.12,100,100", "-127.12,78,60", "50.12,121,50", "100.12,90,56", "133.12,60,47"]


def recv_data(new_socket):
    while True:
        try:
            new_data = new_socket.recv(1024).decode("utf-8")
        except:
            pass
        else:
            if new_data != "Bye":
                print(new_data)
                index1 = random.randint(0, 4)
                print(f"随机第{index1}个数")
                send_to = send_recv[index1]
                new_socket.send(send_to.encode("utf-8"))
            else:
                break
    new_socket.close()


def main():
    socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    socket_server.bind(('', 8080))
    socket_server.listen(128)
    while True:
        try:
            new_socket, ip_port = socket_server.accept()
        except:
            pass
        else:
            a, b = ip_port
            print(f"连线成功,客户端IP:{a} 端口:{b}")
            t = threading.Thread(target=recv_data, args=(new_socket,))
            t.start()

    # socket_server.close()


if __name__ == "__main__":
    main()

服务端运行效果,接收数据如下图:
ABB机器人socket通讯和数据提取及转换_第1张图片
客户端机器人运行效果,如下图所示:
ABB机器人socket通讯和数据提取及转换_第2张图片
ABB机器人socket通讯和数据提取及转换_第3张图片

你可能感兴趣的:(ABB机器人socket通讯和数据提取及转换)