当今的现代工业机器人可用于许多不同的应用。由于能够连接各种不同的末端执行器,机器人几乎可以执行任何任务。工业机器人现在被用于世界上几乎所有的制造业;甚至出现了机器人餐厅,机器人可以在你面前为你准备食物。
对于一个示例任务,我将使用工业自动化中使用的一个常见应用程序,从传送带上挑选一个零件并将其放在旋转表盘上。输送机用于将组件和组件转移到机器的不同部分进行加工。
增加一个旋转表盘表,表盘的一个分度位置将有一个准备加载的空夹具,一个当前准备处理的组件,以及一个待卸载的成品组件。机器人应用是将未完成的组件从传送带送到表盘装载夹具。
主模块是我们将保存所有处理整个机器人功能和任何全局变量的过程或 PROC 的地方。从上到下,我喜欢将相似的数据类型组合在一起并在这里定义它们。在此处声明工具数据和夹具数据,但不声明机器人位置 - 将其保存为运动模块。
while 循环本质上是一个无限循环,它使用来自PLC的一系列程序编号调用不同的机器人功能,如 PICK 或 PLACE 。循环首先将数字输入程序执行变量 (diExe) 视为是/否条件语句。如果编号为零,则我们从 PLC 检索正确的程序编号。一旦程序执行变量不再为零,我们就可以检索并调用特定的机器人函数。
WHILE diExe = 0 DO
! Code to retrieve program # from PLC
ENDWHILE
如果满足条件,另一种循环方法是使用从最后一行到第一行的 GOTO 跳转 - 在这种情况下,条件为 diExe 为假。
LoopStart:
! Code to retrieve program # from PLC
If NOT(diExe) GOTO LoopStart;
现代工业机器人具有以太网/IP、PROFINET 甚至 EtherCAT 选项,向机器人发送程序编号是一项非常简单的任务。我们只需要将现场总线映射中的位、整数甚至浮点数映射到变量。出于错误检查的目的,我喜欢回显 PLC 发送给机器人的值,并有一个执行标志来启动该过程。
当从 PLC 捕获程序编号时,我们想要验证是否获得了正确的编号,因此我们设置了 WHILE 循环以将 PLC 编号保存到变量中,然后将该变量发送回 PLC。然后我们检查execute变量,如果还是0,就再次跳回到循环的开头。当回显与程序编号匹配时,PLC 将执行标志设置为 1。一旦设置了该标志,机器人就可以通过在主 while 循环中创建的状态机调用特定任务。
一些感兴趣的关键命令包括 gi 和 go,指的是组输入和输出,它们是来自 PLC 的离散数字信号组合成一个整数- 当只有几个数字通道可用时,这是命令信号的完美配方。'Command' 是来自 PLC 的输入,而 SetGo 是将 CmdEcho 回复作为组输出发送回 PLC 以供确认的功能。
WHILE diExe = 0 DO
nCmd:=giCommand;
SetGo goCmdEcho, nCmd;
ENDWHILE
或使用 GOTO 的替代示例:
LoopStart:
nCmd:=giCommand;
SetGo goCmdEcho, nCmd;
If NOT(diExe) GOTO LoopStart;
使用 CASE 语句是一种通过程序编号轻松有效地组织各种功能以及在调用无效程序编号时设置故障或示教信息的方法。
TEST nCmd
CASE 1 :
FuncFirst();
CASE 2 :
FuncSecond();
DEFAULT ;
TPWrite('Invalid Program')\Num:=diExe;
ENDTEST
在主模块的底部,我喜欢放置所有的世界区域声明和函数调用。世界区域是在不中断程序流程的情况下告诉 PLC机器人位置的好方法。这些声明也可用于将机器人恢复到已知的安全位置。每个世界区域都需要两种数据类型:wzstationary(机器人允许工作范围的声明)和 shapedata(允许区域的大小)。
一旦定义了区域变量,您需要创建一个调用区域形状函数的过程。区域有三种不同的形状;球体、长方体和圆柱体,每个形状都有一个事件调用。在定义区域并且机器人进入该区域后,可以将输出或变量设置为 true。如果机器人超出允许范围,运动会停止和/或信号会反转。
!****************************************************************
! World Zones
!****************************************************************
! Called by Power_On Event
PROC WorldZones()
WZDOSet\Stat,wzHome\Inside,shpwzHome,doAtHome,1;
WZBoxDef\Outside,shpwzDial,poswzDialLow,poswzDialHigh;
WZDOSet\Stat,wzClearDial\Inside,shpwzClearDial,doClearDial,1;
ENDPROC
ABB 能够定义模块在运行时的行为方式。您可以将模块设置为“无步骤”模块,这意味着用户不能在示教器上一次一行地通过程序。我通常将这种类型的模块用于计算或将返回一些值的函数 - 尽量不要将它用于包含运动的函数。必须测试此模块中的任何代码以确保正确操作,因为您将无法单步调试代码。
!*****************************************************************
! Get Pick Position
!*****************************************************************
FUNC robtarget GetPosition(\switch Pick,\switch Place)
IF Present(Pick) THEN
TEST nPartType
CASE 1:
RETURN pPick_5S3H_RH;
CASE 2:
RETURN pPick_5S5H_RH;
CASE 3:
RETURN pPick_6S5H_RH;
DEFAULT:
BitSet dnFltPend1,2;
SetGO go03FaultBits1,dnFltPend1;
TPWrite('Wrong Part type')\num:=nPartType;
ENDTEST
ENDIF
这是处理移动机器人的所有程序将驻留的地方。运动模块将从初始化程序开始,例如将机器人送回家或服务位置,并根据零件是否在夹具中确保夹具处于正确状态。
接下来,我发出一个“突袭”移动位置,这是一个远离工作站工具但靠近机器人工作区域以减少浪费时间的位置。示教位置时,确保机器人可以移动到任何突袭位置和原始位置,而不会受到任何物理中断。使用偏移命令从突袭位置移动到最终工作位置,最终工作位置为示教位置。
偏移命令只是从示教位置调整机器人在一个或多个笛卡尔轴上的位置。例如,如果您在 x0,y0 处示教位置,则应用 x10,y0 的偏移量,机器人将移动到 x10,y0。到示教拾取位置的最后移动应该是精细的线性移动,机器人程序指针将在该位置等待,直到机器人暂时完全停止。一旦停止,我们可以关闭零件周围的夹具并继续沿着我们的路径返回到突袭位置。
PROC mPickPallet()
!Check Part Present
CheckGripper\Empty;
!If Gripper Faulted End Command
IF dnFltPend1<>0 OR dnFltPend2<>0 THEN
FaultMsg;
SetCmdDone;
RETURN;
ENDIF
!Open Gripper
Gripper\Open;
!If Gripper Faulted End Command
IF dnFltPend1<>0 OR dnFltPend2<>0 THEN
FaultMsg;
SetCmdDone;
RETURN;
ENDIF
!Get Pick Position
pPallet_Pick:=GetPosition(\Pick);
MoveL pPallet_App,v2000,z200,tGrip;
MoveL Offs(pPallet_Pick,-20,0,120),v2000,z50,tGrip\WObj:=wobjPallet;
MoveL Offs(pPallet_Pick,-20,0,-5),v200,z10,tGrip\WObj:=wobjPallet;
MoveL offs(pPallet_Pick,0,0,-5),v200,z10,tGrip\WObj:=wobjPallet;
MoveL pPallet_Pick,v500,fine,tGrip\WObj:=wobjPallet;
Gripper\close;
!If Gripper Faulted End Command
IF bDryCycle=FALSE AND dnFltPend1<>0 OR dnFltPend2<>0 THEN
FaultAck;
gripper\Open;
IF dnFltPend1<>0 OR dnFltPend2<>0 THEN
FaultMsg;
SetCmdDone;
RETURN;
ENDIF
MoveL Offs(pPallet_Pick,0,0,150),v500,z50,tGrip\WObj:=wobjPallet;
MoveL pPallet_App,v2000,z200,tGrip;
MoveL pHome,v2000,z200,tGrip;
ENDIF
setdo do48PartPicked,1;
MoveL Offs(pPallet_Pick,0,0,150),v500,z50,tGrip\WObj:=wobjPallet;
MoveL pPallet_App,v2000,z200,tGrip;
SetCmdDone;
ENDPROC
上述拾取零件并将其移动到新位置的示例是常见的机器人任务,但机器人功能仅受设计者想象力的限制。如果使用正确的末端执行器和正确的机器人模型,机器人几乎可以完成任何任务。
独学而无友,则孤陋寡闻;如今,各行业内卷严重,如果不想被这个时代抛弃,可以加入我们大家庭一起进步,如果想和工控各行业人员交流,并且想获得更多的软件,图纸,程序,可以加入工控老周的粉丝群
如果您想有一个随身的工控128G大U盘,并且里面包含了各种工控图纸,软件,程序,可以购买以下这个U盘