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