QT与ABB(robotstudio)通讯及ABB机器人基本指令


一、建立机器人模型

【1】机器人模型导入
在这里插入图片描述
【2】创建机器人系统
在这里插入图片描述
【3】直接下一步两次
在这里插入图片描述

在这里插入图片描述
【4】系统配置
在这里插入图片描述
【5】socket专用,过滤器输入【PC】,选择616-1 PC interface
在这里插入图片描述
在这里插入图片描述
【6】建立机器人坐标系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以查看坐标系建立成功
在这里插入图片描述
选择自己建立的坐标系
在这里插入图片描述
移动机器人
快捷指令:
【1】CTRL+鼠标左键 移动整体机器人
【2】CTRL+鼠标中键\右键 放大/缩小整体机器人
【3】CTRL+SHIFT+鼠标左键 旋转整体机器人
在这里插入图片描述
建立第一个目标点
在这里插入图片描述
同理建立第二个坐标点,并且将第一个点添加到路径,同理将第二个点添加到路径等
在这里插入图片描述
路径建立成功
在这里插入图片描述
选中路径,右键可以修改指令
在这里插入图片描述
同步点坐标到rapid文件
在这里插入图片描述
将坐标点同步到rapid代码文件中
在这里插入图片描述
在这里插入图片描述

可以看到点的数据已经出现
在这里插入图片描述
点击仿真就可以看见机器人运动
在这里插入图片描述
点击坐标点数据,然后点击rapid数据编辑器,可以看到数据点的具体含义
在这里插入图片描述
在这里插入图片描述
最初下位机代码

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;
!没超时则发送客户端 1
      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;
!没超时则发送客户端 2
      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;
!没超时则发送客户端 3
      ELSE
	    SocketSend client,\Str:="3";
      ENDIF
    
      
!     SocketSend client,\Str:="Task Finished";     !任务结束
      
     !close cmmunication  关闭通讯
      SocketClose server;
!清除数据
      TPErase; 
!任务结束
      TPWrite "Task Finished";
!      WaitTime 10;

		GOTO a;    !回到节点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



























MODULE Module1
    
     !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)     !最大等待时间

	CONST robtarget Target_10:=[[533.940234239,425.123107115,287.499355015],[0.069888029,0.052074776,0.798824073,0.595217592],[-1,1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_20:=[[533.940210787,485.46173723,498.284090196],[0.069888108,0.052074815,0.798824072,0.59521758],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_30:=[[533.940202071,746.599511312,377.133281939],[0.069888149,0.052074829,0.798824079,0.595217564],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_40:=[[-48.20888022,744.97353314,304.501401156],[0.069888443,0.052074933,0.798824042,0.595217571],[1,-1,2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    !***********************************************************
    !
    ! Module:  Module1
    !
    ! Description:
    !   <Insert description here>
    !
    ! Author: Administrator
    !
    ! Version: 1.0
    !
    !***********************************************************
    
    
    !***********************************************************
    !
    ! Procedure main
    !
    !   This is the entry point of your program
    !
    !***********************************************************
    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;      !接收上位机通讯
a:
		MoveJ Target_10,v1000,z100,Mynewpen\WObj:=Workobject_1;
		MoveJ Target_20,v1000,z100,Mynewpen\WObj:=Workobject_1;
		MoveJ Target_30,v1000,z100,Mynewpen\WObj:=Workobject_1;
		MoveJ Target_40,v1000,fine,Mynewpen\WObj:=Workobject_1;
        !Add your code here
        GOTO a;    !回到节点a
    ENDPROC
ENDMODULE



















MODULE Module1
     !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:=[[533.940322685,610.754098349,208.289663053],[0.087155755,0.00000001,0.996194697,-0.000000009],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget p20:=[[533.940326774,310.935468198,208.289661042],[0.087155777,0.000000007,0.996194695,-0.000000036],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget p30:=[[533.940332498,173.479012869,226.373653911],[0.087155798,-0.000000004,0.996194693,0.000000016],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    !CONST robtarget Target_40:=[[423.37009569,173.478977064,226.373653154],[0.087155823,0.000000023,0.996194691,0.000000004],[-1,0,-1,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;      !接收上位机通讯
      Movel p10, v10, z50, Mynewpen;                            !机器人移动
      WaitUntil CurrentPos(p10, Mynewpen)=True\MaxTime:=120\TimeFlag:=timeout;
!如果超时,机器人端发送超时
      IF timeout THEN
	    TPWrite "Robot did not reach designated position within expected time";
	    Stop;
!没超时则发送客户端 1
      ELSE
	    SocketSend client,\Str:="1";
      ENDIF
      
      SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
      Movel p20, v10, z50, Mynewpen;
      WaitUntil CurrentPos(p20, Mynewpen)=True\MaxTime:=120\TimeFlag:=timeout;
!如果超时,机器人端发送超时
      IF timeout THEN
	    TPWrite "Robot did not reach designated position within expected time";
	    Stop;
!没超时则发送客户端 2
      ELSE
	    SocketSend client,\Str:="2";
      ENDIF
      
      SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
      MoveJ p30, v10,fine, Mynewpen;
      WaitUntil CurrentPos(p30, Mynewpen)=True\MaxTime:=120\TimeFlag:=timeout;
!如果超时,机器人端发送超时
      IF timeout THEN
	    TPWrite "Robot did not reach designated position within expected time";
	    Stop;
!没超时则发送客户端 3
      ELSE
	    SocketSend client,\Str:="3";
      ENDIF
    
      
!     SocketSend client,\Str:="Task Finished";     !任务结束
      
     !close cmmunication  关闭通讯
      SocketClose server;
!清除数据
      TPErase; 
!任务结束
      TPWrite "Task Finished";
!      WaitTime 10;

		GOTO a;    !回到节点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:=Mynewpen\WObj:=Workobject_1);
	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

二、RobotStudio和QT联系

RobotStudio做服务器,QT作为上位机,作为客户端,然后两者进行通讯
实现功能:QT点击按钮,机器人沿几个点进行运动

2.1 RobotStudio代码(非循环/非子程序)

MODULE Module1
         !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)     !最大等待时间
    CONST robtarget Target_10:=[[533.940326759,685.243008511,208.289652583],[0.087155751,0.000000013,0.996194697,-0.000000009],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_20:=[[533.940323931,387.138956704,208.289658065],[0.087155765,0.000000018,0.996194696,-0.000000007],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_30:=[[533.940322979,387.138957672,354.855991771],[0.087155775,0.000000021,0.996194695,-0.000000004],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    PROC main()
    !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;      !接收上位机通讯
     
        MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
        MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
        MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
        !Add your code here
        !move3;
        
    ENDPROC
    !PROC move3()
     !    MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
      !  MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
      !  MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
     ! ENDPROC   
ENDMODULE

2.2 RobotStudio代码(循环/非子程序)

MODULE Module1
         !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)     !最大等待时间
    CONST robtarget Target_10:=[[533.940326759,685.243008511,208.289652583],[0.087155751,0.000000013,0.996194697,-0.000000009],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_20:=[[533.940323931,387.138956704,208.289658065],[0.087155765,0.000000018,0.996194696,-0.000000007],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_30:=[[533.940322979,387.138957672,354.855991771],[0.087155775,0.000000021,0.996194695,-0.000000004],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    PROC main()
    !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;      !接收上位机通讯
       a:
        
        MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
        MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
        MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
        !Add your code here
        !move3;
        GOTO a;    !回到节点a
    ENDPROC
    !PROC move3()
     !    MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
      !  MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
      !  MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
     ! ENDPROC   
ENDMODULE

2.3 RobotStudio代码(循环/子程序)

MODULE Module1
         !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)     !最大等待时间
    CONST robtarget Target_10:=[[533.940326759,685.243008511,208.289652583],[0.087155751,0.000000013,0.996194697,-0.000000009],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_20:=[[533.940323931,387.138956704,208.289658065],[0.087155765,0.000000018,0.996194696,-0.000000007],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_30:=[[533.940322979,387.138957672,354.855991771],[0.087155775,0.000000021,0.996194695,-0.000000004],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    PROC main()
    !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;      !接收上位机通讯
       a:
        
        !MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
        !MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
        !MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
        !Add your code here
        move3;
        GOTO a;    !回到节点a
    ENDPROC
    PROC move3()
    MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
    MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
    MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
    ENDPROC   
ENDMODULE

2.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)     !最大等待时间
  
 !定义机器人坐标点
  CONST robtarget p10:=[[533.940326759,685.243008511,208.289652583],[0.087155751,0.000000013,0.996194697,-0.000000009],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
  CONST robtarget p20:=[[533.940323931,387.138956704,208.289658065],[0.087155765,0.000000018,0.996194696,-0.000000007],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
  CONST robtarget p30:=[[533.940322979,387.138957672,354.855991771],[0.087155775,0.000000021,0.996194695,-0.000000004],[-1,0,-1,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;     !通讯握手
      WHILE TRUE DO 
!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, v100, fine, Mynewpen\WObj:=Workobject_1;                            !机器人移动
      WaitUntil CurrentPos(p10, Mynewpen)=True\MaxTime:=120\TimeFlag:=timeout;
!如果超时,机器人端发送超时
      IF timeout THEN
	    TPWrite "Robot did not reach designated position within expected time";
	    Stop;
!没超时则发送客户端 1
      ELSE
	    SocketSend client,\Str:="1";
      ENDIF
      
      SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
      MoveJ p20, v100, fine, Mynewpen\WObj:=Workobject_1;
      WaitUntil CurrentPos(p20, Mynewpen)=True\MaxTime:=120\TimeFlag:=timeout;
!如果超时,机器人端发送超时
      IF timeout THEN
	    TPWrite "Robot did not reach designated position within expected time";
	    Stop;
!没超时则发送客户端 2
      ELSE
	    SocketSend client,\Str:="2";
      ENDIF
      
      SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;
      MoveJ p30, v100, fine, Mynewpen\WObj:=Workobject_1;
      WaitUntil CurrentPos(p30, Mynewpen)=True\MaxTime:=120\TimeFlag:=timeout;
!如果超时,机器人端发送超时
      IF timeout THEN
	    TPWrite "Robot did not reach designated position within expected time";
	    Stop;
!没超时则发送客户端 3
      ELSE
	    SocketSend client,\Str:="3";
      ENDIF
    
      
    SocketSend client,\Str:="Task Finished";     !任务结束
      
     !close cmmunication  关闭通讯
    !  SocketClose server;
!清除数据
      TPErase; 
!任务结束
    !  TPWrite "Task Finished";
!      WaitTime 10;

		!GOTO a;    !回到节点a
      ENDWHILE
ERROR
    SocketClose server;
    SocketClose client;
  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:=Mynewpen\WObj:=Workobject_1);
	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

2.5 QT代码

参考链接:https://blog.csdn.net/weixin_39383155/article/details/119255107

在.pro文件添加network

QT  +=core gui network

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAbstractSocket>
#include <QDebug>

class QTcpSocket;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    void Sleep(int msec);
    void CloseSocket();
    void ConnectSocket();
    void SendMessage();

    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //static QTcpSocket *clientSocket;
private:
    Ui::MainWindow *ui;
    QTcpSocket *clientSocket;

private slots:

    void on_pushButton_clicked();

};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

//    w.ConnectSocket();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QTime>
#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ConnectSocket();

    connect(clientSocket, &QTcpSocket::readyRead, [=]()
    {
        //获取服务端发送的内容
        QByteArray array = clientSocket->readAll();
        qDebug()<<array.toInt()<<endl;
        qDebug()<<array;
    }
    );

   // for(int i=1;i<13;i++)
  //  {
    //    SendMessage();
    //   Sleep(5000);//延时5秒发送一次指令
  // };
//    CloseSocket();
}

void MainWindow::ConnectSocket()
{
    QString ip = "127.0.0.1";
    int port = 55000;
    clientSocket = new QTcpSocket(this);
    clientSocket->connectToHost(ip, port);//连接服务端

    if(!clientSocket->waitForConnected(3600000))//连接服务器等待
    {
        qDebug()<<"连接服务端失败!"<<endl;
        return;
    }
    else
    {
        qDebug()<<"连接服务端成功!"<<endl;
    }
}

void MainWindow::CloseSocket()
{
    //主动和对方断开连接
    clientSocket->disconnectFromHost();
    clientSocket->close();//这里释放连接,前面connect的时候会建立连接
}

void MainWindow::SendMessage()
{
    //发送数据
    clientSocket->write(" MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;");//发送字符串给服务端
    clientSocket->flush();//刷新缓存区
}

void MainWindow::Sleep(int msec)//延时函数
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    SendMessage();//点下按钮,发送信息给服务端
}

实现效果
手动发送指令:
在这里插入图片描述

在这里插入图片描述

2.5 判断选择路径(两个按钮)

2.5.1 RobotStudio代码

两个坐标系

	PERS tooldata Mynewpen:=[TRUE,[[70.093,39.998,167.816],[0.906307787,0,0.422618262,0]],[1,[0,0,1],[1,0,0,0],0,0,0]];
	TASK PERS wobjdata Workobject_1:=[FALSE,TRUE,"",[[-59.3,-406.8,241.1],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
MODULE Module1
         !define variables
 !定义通讯函数的全局变量
  VAR socketdev server;
  VAR socketdev client;
  VAR string string1:="";    !定义一个字符串
   VAR string string2:="move";    !定义一个字符串
    VAR string string3:="move1";    !定义一个字符串
  VAR string received_string:="";    !定义一个字符串
 
  VAR bool timeout; !robot movement max waittime(s)     !超时变量
  VAR num WAIT_MAX:= 3600; !socket receive message max waittime(s)     !最大等待时间
  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;

    CONST robtarget Target_10:=[[533.940326759,685.243008511,208.289652583],[0.087155751,0.000000013,0.996194697,-0.000000009],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_20:=[[533.940323931,387.138956704,208.289658065],[0.087155765,0.000000018,0.996194696,-0.000000007],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget Target_30:=[[533.940322979,387.138957672,354.855991771],[0.087155775,0.000000021,0.996194695,-0.000000004],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    PROC main()
    !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   从客户端收到信息并移动
      a:
     SocketReceive client,\Str:=string1,\Time:=WAIT_MAX;      !接收上位机通讯
IF string1=string2 THEN
    MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
    MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
ELSEIF string1=string3 THEN
   MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
  MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
    ELSE
    MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
ENDIF
GOTO a; 
      ! a:
        
        !MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
        !MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
        !MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
        !Add your code here
       ! move3;
       ! GOTO a;    !回到节点a
    !ENDPROC
   ! PROC move3()
  !  MoveL Target_10,v50,z100,Mynewpen\WObj:=Workobject_1;
   ! MoveJ Target_20,v50,z100,Mynewpen\WObj:=Workobject_1;
  !  MoveJ Target_30,v50,fine,Mynewpen\WObj:=Workobject_1;
    ENDPROC   
ENDMODULE

2.5.2 QT两个按钮代码

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QTime>
#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ConnectSocket();

    connect(clientSocket, &QTcpSocket::readyRead, [=]()
    {
        //获取服务端发送的内容
        QByteArray array = clientSocket->readAll();
        qDebug()<<array.toInt()<<endl;
        qDebug()<<array;
    }
    );

   // for(int i=1;i<13;i++)
  //  {
    //    SendMessage();
    //   Sleep(5000);//延时5秒发送一次指令
  // };
//    CloseSocket();
}

void MainWindow::ConnectSocket()
{
    QString ip = "127.0.0.1";
    int port = 55000;
    clientSocket = new QTcpSocket(this);
    clientSocket->connectToHost(ip, port);//连接服务端

    if(!clientSocket->waitForConnected(3600000))//连接服务器等待
    {
        qDebug()<<"连接服务端失败!"<<endl;
        return;
    }
    else
    {
        qDebug()<<"连接服务端成功!"<<endl;
    }
}

void MainWindow::CloseSocket()
{

三、ABB基本指令

3.1 ABB机器人常见的几大数据类型

ABB机器人数据存储描述了机器人控制器内部的各项属性,ABB机器人控制器数据类型多达100余种,其中常见的数据类型包括基本数据、i/o数据、运动相关数据。
参考了解:ABB机器人常见的几大数据类型

3.1.1 基本数据

bool 逻辑值:逻辑状态下赋予的真或者假。逻辑值有两种情况:成立和不成立则逻辑值为真使用true或1表示不成立则逻辑值为假使用false或0表示

byte 字节值:用于计量存储容量的一种计量单位,取值范围为(0-255)

num 数值:变量、可存储整数或小数整数取值范围(-8388607~8388608)

dnum 双数值:可存储整数和小数,整数取值范围(-4503599627370495~+4503599627370496)

string 字符串:字符串是由数字、字母、下划线组成的一串字符。他在编程语言中表示文本的数据类型。

stringdig 只含数字的字符串:可处理不大于4294967295的正整数

3.1.2 i/o 数 据

dionum 数字值:取值为0或1用于处理数字i/o信号,数字i/o信号中0作为低电平00.7v,1作为高电平3.45.0v
signaldi/do 数字输入/输出信号:二进制值输入、输出 如开关接通是1,断开是0 signalgi/go
数字量输入/输出信号组:多个数字量输入或输出组合配合使用。 signalai
模拟量输入:例通过温度采样器采集到一个温度值,就要经过变送器转换,转换成PLC能够识别的二进制数 signalao
模拟量输出:数据-变送器-执行机构

3.1.3 运 动 相 关 数 据

robtarget 位置数据:定义机械臂和附加轴的位置

robjoint 关节数据:定义机械臂各关节位置

speeddate 速度数据:定义机械臂和轴移动速率,包含四个参数:

v_tcp 表示工具中心点速率,单位mm/s;

v_ori 表示TCP重定位速率,单位(°)/s;

v_leax 表示线性外轴的速率,单位mm/s;

v_reax 表示旋转外轴速率,单位(°)/s

zonedata 区域数据:一般也称为转弯半径,用于定义机器人轴在朝向下一个移动位置前如何接近编程位置

tooldata 工具数据:用于定义工具的特征,包含工具中心点(TCP)的位置和方向,以及工具的负载

wobjdata 工件数据:用于定义工件的位置及状态

loaddata 负载数据:用于定义机械臂安装界面的负载

3.1.4 数据存储类型

ABB机器人数据存储类型分为三种

CONST 常量:数据在定义时已赋予了数值,不能在程序中进行修改,除非手动修改

VAR 变量:数据在程序执行过程中停止时,会保持当前的值。但如果程序指针被移动到主程序后,数据就会丢失

PERS
可变量:无论程序的指针如何,数据都会保持最后赋予的值。在机器人执行的rapid程序中也可以对可变量存储类型进行赋值操作,在程序执行后,赋值的结果会一直保持,直到对其进行重新赋值。

3.2 常用指令

   WaitTime 10; !等待1

I/O指令
复位I/O
在这里插入图片描述
开I/O
在这里插入图片描述

3.3 技术注意点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 ABB机器人的系统指令

系统输入信号

Backup               机器人执行备份操作
Disable Backup     禁止机器人备份
Enable Energy Saving    使控制器进入节能状态
Interrupt    机器人执行一次中断程序
Limit Speed    限制机器人运行速度
Load    载入程序文件
Load and Start    载入程序文件并且启动
Motors Off    电机下电
Motors On    电机上电
Motors On and Start    电机上电并且启动
PP to Main    程序指针移至主程序
Quick Stop    快速停止
Reset Emergency Stop    急停复位
Reset Execution Error Signal    执行错误信号复位
SimMode    机器人进入模拟状态
Soft Stop    缓停止
Start    机器人启动
Start at Main    从主程序启动
Stop    机器人停止
Stop at End of Cycle    在执行完当前循环后停止
Stop at End of Instruction    在执行完当前指令后停止
System Restart    复位系统运行状态
Write Access    请求写权限

系统输出信号:

Absolute Accuracy Active    绝对精度已启用
Auto On    机器人在自动模式
Backup Error    备份错误
Backup in progress    正在备份
CPU Fan not Running    风扇转动不正常
Emergency Stop    机器人处于急停状态
Energy Saving Blocked    机器人正处于节能状态
Execution Error    机器人执行发生错误
Limit Speed    机器人处于限速状态
Mechanical Unit Active    机械单元已激活
Mechanical Unit Not Moving    机械单元处于停止状态,未移动
Motion Supervision Triggered    动作监控触发
Motion Supervision On    动作监控启用
Motors Off    安全链未关闭机器人电机关闭脉
Motors On    机器人电机开启但处于保护停止状态
Motors Off State    机器人电机关闭
Motors On State    机器人电机开启
Path Return Region Error    机器人离编程路径太远
Power Fail Error    上电失败程序无法启动
Production Execution Error    程序执行、碰撞、系统错误
Robot Not On path    机器人停止后离编程路径太远
Run Chain OK    运行链正常
SimMode    机器人已进入模拟状态
Simulated I/O    I/O信号处于模拟状态
SMB Battery Charge Low    SMB电池即将耗尽
System Input Busy    系统输入繁忙
TaskExecuting    任务正在执行
TCP Speed    TCP当前的实际速度
TCP Speed Reference    TCP当前的编程速度
Temperature Warning    温度报警
Write Access     相关I/O客户端拥有写权限
  • 44
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值