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()

服务端运行效果,接收数据如下图:
在这里插入图片描述
客户端机器人运行效果,如下图所示:
在这里插入图片描述
在这里插入图片描述

  • 25
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
以下是ABB器人使用socket通讯的Rapid代码示例: ! 定义全局变量 VAR socketHandle : num ipAddress : STRING := "192.168.1.100" ! 目标设备的IP地址 port : num := 5000 ! 连接的端口号 ! 创建并连接socket PROC connectSocket() socketHandle := SocketCreate() ! 创建socket IF socketHandle >= 0 THEN SocketConnect(socketHandle, ipAddress, port) ! 连接到目标设备 IF SocketIsConnected(socketHandle) THEN Print("Socket连接成功") ELSE Print("Socket连接失败") ENDIF ELSE Print("Socket创建失败") ENDIF ENDPROC ! 发送数据到目标设备 PROC sendData(data : STRING) IF SocketIsConnected(socketHandle) THEN SocketSendString(socketHandle, data) ! 发送字符串数据 Print("发送数据:" + data) ELSE Print("Socket未连接,无法发送数据") ENDIF ENDPROC ! 接收数据 PROC receiveData() VAR receivedData : STRING IF SocketIsConnected(socketHandle) THEN receivedData := SocketReceiveString(socketHandle) ! 接收字符串数据 IF receivedData <> "" THEN Print("接收到数据:" + receivedData) ELSE Print("未接收到数据") ENDIF ELSE Print("Socket未连接,无法接收数据") ENDIF ENDPROC ! 关闭socket连接 PROC closeSocket() IF SocketIsConnected(socketHandle) THEN SocketClose(socketHandle) ! 关闭socket连接 Print("Socket连接已关闭") ELSE Print("Socket未连接") ENDIF ENDPROC 上述代码演示了ABB器人使用socket进行通信的过程。首先,通过connectSocket()过程创建并连接socket。然后,使用sendData()过程发送数据到目标设备,接收数据则使用receiveData()过程。最后,通过closeSocket()过程关闭socket连接。 请根据实际需求修改IP地址、端口号,并在sendData()和receiveData()过程中添加相应的数据发送和接收逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值