文章目录
一、建立机器人模型
【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客户端拥有写权限