ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)

文章目录

    • 前言
    • 1.实现的功能
    • 2.建立Socket通信
      • 2.1 ABB机器人的IP地址:
      • 2.2 SocketAccept的说明
    • 3.服务端接发信息
      • 3.1 核心代码
      • 3.2 CurrentPos函数
    • 4.完整代码
    • 5.实现效果

前言

本文采取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)

ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)_第1张图片

2.2 SocketAccept的说明

ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)_第2张图片
连接的等待时间可以自己设定,可以将等待时间设为一个变量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的时间参数说明如下:
ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)_第3张图片

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.实现效果

运行时先让服务端程序跑起来,再让客户端程序跑起来去连接服务端。运行效果如下:

你可能感兴趣的:(ABB机器人,socket,tcpip,网络通信)