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

前言

本文采取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.实现效果

运行时先让服务端程序跑起来,再让客户端程序跑起来去连接服务端。运行效果如下:
在这里插入图片描述

  • 6
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-今晚打老虎-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值