基于socket操作ABB机器人

基于socket操作ABB机器人

这里我用Java语言搭了一个socket客户端,在这个客户端中可以输入1,2,3,4,5,6操控六个轴指令通过socket发送到abb机器人,继续解析指令从而操控每个轴的角度。

java客户端实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class SimpleServer {  
public static void main(String[] args) {
int port = 8080; // 设置服务器端口
Scanner scanner = new Scanner(System.in);
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服务器已启动,等待连接...");

// 循环等待客户端连接
while (true) {
Socket socket = serverSocket.accept(); // 阻塞直到有客户端连接
System.out.println("客户端已连接,IP地址:" + socket.getInetAddress().getHostAddress());
int i = scanner.nextInt();
int rax_1 = 0;
int rax_2 = 0;
int rax_3 = 0;
int rax_4 = 0;
int rax_5 = 0;
int rax_6 = 0;
switch (i) {
case 1:
rax_1+=45;break;
case 2:
rax_2+=45;break;
case 3:
rax_3+=45;break;
case 4:
rax_4+=45;break;
case 5:
rax_5+=45;break;
case 6:
rax_6+=45;break;
}
//将rax_1,rax_2,rax_3,rax_4,rax_5,rax_6赋值给转化为三位数的值并带上正负号
String rax1 = formatRAXValue(rax_1);
String rax2 = formatRAXValue(rax_2);
String rax3 = formatRAXValue(rax_3);
String rax4 = formatRAXValue(rax_4);
String rax5 = formatRAXValue(rax_5);
String rax6 = formatRAXValue(rax_6);
//socket发送形如MoveAbsJ/+000/+000/+000/+000/+090/+000/
// 获取输出流,用于向服务器发送数据
OutputStream outputStream = socket.getOutputStream();

// 构建命令字符串
String command = "MoveAbsJ/"+rax1+"/"+rax2+"/"+rax3+"/"+rax4+"/"+rax5+"/"+rax6+"/";
// 发送命令到服务器
outputStream.write(command.getBytes());
outputStream.flush(); // 刷新输出缓冲区确保数据被发送

System.out.println("Command sent: " + command);

// 处理客户端的请求
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("收到客户端消息: " + line);
}

// 注意:这里简单地关闭了连接而没有发送响应。在实际应用中,你可能需要发送一个响应并优雅地关闭连接。
socket.close();
}

} catch (IOException e) {
e.printStackTrace();
}
}
public static String formatRAXValue(int value) {
String sign = value >= 0 ? "+" : "-";
String absValueStr = String.format("%03d", Math.abs(value));
return sign + absValueStr;
}
}

ABB机器人端代码

总体来说就是开启socket等待连接之后将指令解析为机械臂运动参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
MODULE Module1  
VAR string rax_mode:="";
VAR string rax_sum_num:="";
VAR string rax_numBer{6}:=[" "," "," "," "," "," "];
VAR num r{6}:=[0,0,0,0,0,0];
VAR bool judge;
VAR jointtarget p10:=[[0,0,0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
VAR socketdev socket1;
VAR string rax_sum:="";
PROC main()
WHILE TRUE DO
rIni;
rRun;
ENDWHILE
ENDPROC
PROC rIni()
VAR num n;
!TPErase;
SocketClose socket1;
WaitTime 0.3;
SocketCreate socket1;
SocketConnect socket1,"127.0.0.1",8080;
SocketSend socket1\Str:="hello PC";
SocketReceive socket1\Str:=rax_sum\Time:=WAIT_MAX;
rax_mode:=StrPart(rax_sum,1,8);
rax_sum_num:=StrPart(rax_sum,9,StrLen(rax_sum)-8);
TPWrite rax_mode;
TPWrite rax_sum_num;
FOR i FROM 1 TO 6 DO
rax_numBer{i}:=StrPart(rax_sum_num,2+n,4);
r{i}:=StrToNum(rax_numBer{i});
add n,5;
TPWrite rax_numBer{i};
ENDFOR
ENDPROC
PROC rRun()
IF rax_mode="MoveAbsJ" THEN
p10.robax.rax_1:=r{1};
p10.robax.rax_2:=r{2};
p10.robax.rax_3:=r{3};
p10.robax.rax_4:=r{4};
p10.robax.rax_5:=r{5};
p10.robax.rax_6:=r{6};
MoveAbsJ p10\NoEOffs, v100,fine,tool0;
ENDIF
ENDPROC
FUNC num StrToNum(string str)
VAR num rax_numBer:=0;
judge:=strToVal(str,rax_number);
IF judge=true THEN
RETURN rax_numBer;
ELSEIF judge=FALSE THEN
TPWrite "string erro";
ENDIF
ENDFUNC
ENDMODULE