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()服务端运行效果,接收数据如下图: 客户端机器人运行效果,如下图所示: