文章目录
前言
本文采取TCP/IP中Socket的方式实现ABB与上位机的通信。其中上位机做为客户端,机器人作为服务端,此方法可以为ABB机器人的二次开发的网络通信部分提供一点参考。客户端相关部分可以查看ABB机器人与PC进行Windows下的Socket通信的C代码实现(客户端)
1.实现的功能
上位机先给机器人发送字符串,机器人收到后开始向第一个目标点移动,当到达目标位置后,机器人自动给上位机返回一个字符串,上位机可以利用返回的这个字符串作为其他设备开始工作的标志,例如安装在机械臂上的焊枪,喷枪或者扫描相机。
当然也不一定是接发字符串,也可以是数字,指令或者文件。
本文采用的是字符串的形式让服务端和客户端互相传输信息。
2.建立Socket通信
SocketCreate server;
SocketBind server,"127.0.0.1",55000;
SocketListen server;
SocketAccept server,client,\Time:=WAIT_MAX;
2.1 ABB机器人的IP地址:
(如果使用RobotStudio连接上位机则IP使用127.0.0.1)
2.2 SocketAccept的说明
连接的等待时间可以自己设定,可以将等待时间设为一个变量WAIT_MAX,后续需要修改时间直接修改该变量即可。
3.服务端接发信息
3.1 核心代码
SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
MoveJ p10, v1000, z50, tool0;
WaitUntil CurrentPos(p10, tool0)=True\MaxTime:=120\TimeFlag:=timeout;
IF timeout THEN
TPWrite "Robot did not reach designated position within expected time";
Stop;
ELSE
SocketSend client,\Str:="1";
ENDIF
这部分代码首先是机器人一直在等待上位机给它发信息,直到超过最大等待时间,如果收到则往下执行,否则超时报错。其中SocketReceive的时间参数说明如下:
3.2 CurrentPos函数
机器人收到信息后,往下执行MoveJ指令,程序在WaitUntil函数处等待机器人到位,自己设定最大等待时间。
自己写了一个判断是否到达目标位置的bool类型函数CurrentPos,详解可以进主页查看利用ABB机器人的CRobT写一个判断机器人是否移动至目标位置的函数,代码如下:
!function,judge if robot reach expected position
FUNC bool CurrentPos(robtarget ComparePos, INOUT tooldata TCP)
!local varibles
VAR num Counter:=0;
VAR robtarget ActualPos;
!compare actual position and expected position
ActualPos:=CRobT(\Tool:=tool0\WObj:=wobj0);
IF ActualPos.trans.x>ComparePos.trans.x-25 AND ActualPos.trans.x<ComparePos.trans.x+25 Counter:=Counter+1;
IF ActualPos.trans.y>ComparePos.trans.y-25 AND ActualPos.trans.y<ComparePos.trans.y+25 Counter:=Counter+1;
IF ActualPos.trans.z>ComparePos.trans.z-25 AND ActualPos.trans.z<ComparePos.trans.z+25 Counter:=Counter+1;
IF ActualPos.rot.q1>ComparePos.rot.q1-0.1 AND ActualPos.rot.q1<ComparePos.rot.q1+0.1 Counter:=Counter+1;
IF ActualPos.rot.q2>ComparePos.rot.q2-0.1 AND ActualPos.rot.q2<ComparePos.rot.q2+0.1 Counter:=Counter+1;
IF ActualPos.rot.q3>ComparePos.rot.q3-0.1 AND ActualPos.rot.q3<ComparePos.rot.q3+0.1 Counter:=Counter+1;
IF ActualPos.rot.q4>ComparePos.rot.q4-0.1 AND ActualPos.rot.q4<ComparePos.rot.q4+0.1 Counter:=Counter+1;
RETURN Counter=7;
ENDFUNC
4.完整代码
MODULE moudle1
!define variables
VAR socketdev server;
VAR socketdev client;
VAR string string1:="";
VAR bool timeout; !robot movement max waittime(s)
VAR num WAIT_MAX:= 3600; !socket receive message max waittime(s)
VAR robtarget p10:=[[-1609.73,-1330.24,32.35],[0.133529,-0.93591,0.289425,-0.149922],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
VAR robtarget p20:=[[-1122.95,-1370.87,24.21],[0.13023,0.458991,-0.870854,-0.11824],[0,-2,2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
VAR robtarget p30:=[[-810.98,-872.11,-75.77],[0.409639,0.829162,-0.379438,0.0267105],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
PROC main()
a:
!create communication
SocketCreate server;
SocketBind server,"127.0.0.1",55000;
SocketListen server;
SocketAccept server,client,\Time:=WAIT_MAX;
!send a meassage to the client
SocketSend client,\Str:="Start Move,Plesae send instuction";
!receive a message from the client and move
SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
MoveJ p10, v1000, z50, tool0;
WaitUntil CurrentPos(p10, tool0)=True\MaxTime:=120\TimeFlag:=timeout;
IF timeout THEN
TPWrite "Robot did not reach designated position within expected time";
Stop;
ELSE
SocketSend client,\Str:="1";
ENDIF
SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
MoveJ p20, v1000, z50, tool0;
WaitUntil CurrentPos(p20, tool0)=True\MaxTime:=120\TimeFlag:=timeout;
IF timeout THEN
TPWrite "Robot did not reach designated position within expected time";
Stop;
ELSE
SocketSend client,\Str:="2";
ENDIF
SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
MoveJ p30, v1000, z50, tool0;
WaitUntil CurrentPos(p30, tool0)=True\MaxTime:=120\TimeFlag:=timeout;
IF timeout THEN
TPWrite "Robot did not reach designated position within expected time";
Stop;
ELSE
SocketSend client,\Str:="3";
ENDIF
! SocketSend client,\Str:="Task Finished";
!close cmmunication
SocketClose server;
TPErase;
TPWrite "Task Finished";
! WaitTime 10;
GOTO a;
ENDPROC
!function,judge if robot reach expected position
FUNC bool CurrentPos(robtarget ComparePos, INOUT tooldata TCP)
!local varibles
VAR num Counter:=0;
VAR robtarget ActualPos;
!compare actual position and expected position
ActualPos:=CRobT(\Tool:=tool0\WObj:=wobj0);
IF ActualPos.trans.x>ComparePos.trans.x-25 AND ActualPos.trans.x<ComparePos.trans.x+25 Counter:=Counter+1;
IF ActualPos.trans.y>ComparePos.trans.y-25 AND ActualPos.trans.y<ComparePos.trans.y+25 Counter:=Counter+1;
IF ActualPos.trans.z>ComparePos.trans.z-25 AND ActualPos.trans.z<ComparePos.trans.z+25 Counter:=Counter+1;
IF ActualPos.rot.q1>ComparePos.rot.q1-0.1 AND ActualPos.rot.q1<ComparePos.rot.q1+0.1 Counter:=Counter+1;
IF ActualPos.rot.q2>ComparePos.rot.q2-0.1 AND ActualPos.rot.q2<ComparePos.rot.q2+0.1 Counter:=Counter+1;
IF ActualPos.rot.q3>ComparePos.rot.q3-0.1 AND ActualPos.rot.q3<ComparePos.rot.q3+0.1 Counter:=Counter+1;
IF ActualPos.rot.q4>ComparePos.rot.q4-0.1 AND ActualPos.rot.q4<ComparePos.rot.q4+0.1 Counter:=Counter+1;
RETURN Counter=7;
ENDFUNC
ENDMODULE
5.实现效果
运行时先让服务端程序跑起来,再让客户端程序跑起来去连接服务端。运行效果如下: