ABB左右码垛详细解说 下载本文

内容发布更新时间 : 2024/12/25 10:18:24星期一 下面是文章的全部内容请认真阅读。

MODULE MainMoudle PERS wobjdata WobjPallet_L:=[FALSE,TRUE,\1,0,0,0]]]

!定义左侧码盘工件坐标系WobjPallet_L PERS wobjdata WobjPallet_R:=[FALSE,TRUE,\,0,0,0]]];

!定义右侧码盘工件坐标系WobjPallet_R PERS tooldata tGripper:=[TRUE,[[0,0,527],[1,0,0,0]],[20,[0,0,150],[1,0,0,0],0,0,0]]; !定义工具坐标系数据tGripper

PERS loaddata LoadFull:=[20,[0,0,300],[1,0,0,0],0,0,0.1]; !定义有效载荷数据LoadFull

PERS wobjdata CurWobj;

!定义工件坐标系数据CurWobj,此工件坐标系作为当前使用坐标系。即当在左侧码垛时,将左侧码盘坐标系WobjPllaet_L赋值给该数据;当在右侧码垛时,则将WobjPllaet_R赋值给该数据 PERS jointtarget jposHome:=[[0,0,0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

!定义关节目标点数据,各关节轴数值为0,用于手动将机器人运动至各关节轴机械零位 CONST robtarget pPlaceBase0_L:=[[296.473529255,212.21064316,3.210904169],[0,0.70711295,-0.707100612,0],[-2,0,-3,0],[9E9,9E9,9E9,9E9,9E9,9E9]]; !左侧不旋转放置基准位置 CONST robtarget pPlaceBase90_L:=[[218.407102669,695.953395421,3.210997808],[0,-0.000001669,1,0],[-2,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]]; !左侧旋转90°放置基准位置 CONST robtarget pPlaceBase0_R:=[[296.473529255,212.21064316,3.210904169],[0,0.707221603,-0.70699194,0],[1,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]]; !右侧旋转不旋转放置基准位置 CONST robtarget pPlaceBase90_R:=[[218.407102669,695.953395421,3.210997808],[0,-0.00038594,0.999999926,0],[1,0,1,0],[9E9,9E9,9E9,9E9,9E9,9E9]]; !右侧旋转90°放置基准位置 CONST robtarget pPick_L:=[[1627.550991372,-426.974661352,-26.736921885],[0,0.707109873,-0.707103689,0],[-1,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]]; !左侧抓取位置 CONST robtarget pPick_R:=[[1611.055992534,442.364097921,-26.736584068],[0,0.707220363,-0.706993181,0],[0,0,-1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];

!右侧抓取位置 CONST robtarget pHome:=[[1505.00,-0.00,878.55],[1.28548E-06,0.707107,-0.707107,-1.26441E-06],[0,0,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]; !程序起始点,即Home点

PERS robtarget pPlaceBase0; PERS robtarget pPlaceBase90; PERS robtarget pPick; PERS robtarget pPlace;

!定义目标点数据,这些数据是机器人当前使用的目标点。当在左侧、右侧码垛时,将对应的左侧、右侧基准点赋值给这些数据 PERS robtarget pPickSafe;

!机器人将产品抓取后需提升至一定的安全高度,才能向码垛位置移动,随着摆放位置逐层加高,此数据在程序中会被赋予不同的数值,以防止机器人与码放号的产品发生碰撞 PERS num nCycleTime:=3.803;

!定义数字型数据,用于存储单次节拍时间 PERS num nCount_L:=1; PERS num nCount_R:=1;

!定义数字型数据,分别用于左侧、右侧码垛计数,在计算位置子程序中根据该计数计算出相应的放置位置

PERS num nPallet:=2;

!定义数字型数据,利用TEST指令判断此数值,从而决定执行哪侧的码垛任务,1为左侧,2为右侧

PERS num nPalletNo:=1; !定义数字型数据,利用TEST指令判断此数值,从而决定执行哪垛计数累计,1为左侧,2为右侧

PERS num nPickH:=300; PERS num nPlaceH:=400;

!定义数字型数据,分别对应的是抓取、放置时的一个高度。例如nPickH:=300,则表示机器人快速移动至抓取位置上放300mm处,然后慢速移动至抓取位置,接着慢速将产品提升至抓取位置上放300mm处,最后再快速移动至其他位置 PERS num nBoxL:=605; PERS num nBoxW:=405; PERS num nBoxH:=300;

!定义三个数字型数据,分别对应的是产品长、宽、高。在计算位置程序中,通过在放置基准点上面叠加长、宽、高数值计算处放置位置 VAR clock Timer1; !定义时钟数据,用于计时 PERS bool bReady:=TRUE; !定义布尔量数据,作为主程序逻辑判断条件,当左右两侧有任何一侧满足码垛条件时,此布尔量均为TRUE,即机器人会执行码垛任务,否则该布尔量为FLASE,机器人会等待直至条件满足

PERS bool bPalletFull_L:=FALSE; PERS bool bPalletFull_R:=FALSE;

!定义两个布尔数据,当机器人在左侧码垛时,则bPallet_L为TURE,bPallet_R为FALSE,当机器人在右侧时,则相反

PERS bool bGetPosition:=FALSE;

!定义两个布尔量数据,判断是否已计算出当前取放位置 VAR triggdata HookAct; VAR triggdata HookOff;

!定义两个触发数据,分别对应的是夹具上面钩爪收紧及松开动作 VAR intnum iPallet_L; VAR intnum iPallet_R;

!定义两个中断符,对应左侧、右侧码盘更换时所需触发的相应复位操作,如满载信号复位等

PERS speeddata vMinEmpty:=[2000,400,6000,1000]; PERS speeddata vMidEmpty:=[3000,400,6000,1000]; PERS speeddata vMaxEmpty:=[5000,500,6000,1000]; PERS speeddata vMinLoad:=[1000,200,6000,1000]; PERS speeddata vMidLoad:=[2500,500,6000,1000]; PERS speeddata vMaxLoad:=[4000,500,6000,1000];

!定义多种速度数据,分别对应空载时高、中、低速,以及满载时的高、中、低速,便于对机器人的各个动作进行速度控制 PERS num Compensation{15,3}:=[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]];

!定义二维数组,用于各摆放位置的偏差调整;15组数据,对应15个摆放位置,每组数据3个数值,对应X、Y、Z的偏差值

PROC main() !主程序

rInitAll;

!调用初始化程序,包括复位信号、复位程序数据、初始化中断等 WHILE TRUE DO

!利用WHILE循环,将初始化程序隔离开,即只在第一次运行时需要执行一次初始化程序,之后循环执行拾取放置动作 IF bReady THEN

!利用IF条件判断,当左右两侧至少有一侧满足码垛条件时,判断条件bReady为TRUE,机器人则执行码垛任务 rPick; !调用抓取程序 rPlace; !调用放置程序 ENDIF rCycleCheck;

!调用循环检测程序,里面包含写屏显示循环时间、码垛个数、判断当前左右两侧状况等 Wait Time 0.05

!循环等待时间,防止不满足机器人动作条件的情况下程序执行进入无限循环状态,造成机

器人控制CPU过负荷 ENDWHILE ENDPROC

PROC rInitAll() !初始化程序

rCheckHomePos;

!调用检测Home点程序,若机器人在Home点,则直接执行后面的指令,否则机器人先安全返回Home点,然后再执行后面的指令 ConfL\\OFF; ConfJ\\OFF; !关闭轴配置监控 nCount_L:=1; nCount_R:=1;

!初始化左右两侧码垛计数数据 nPallet:=1;

!初始化两侧码垛任务标识,1为左侧,2为右侧 nPalletNo:=1;

!初始化两侧码垛计数累计标识,1为左侧,2为右侧 bPalletFull_L:=FALSE; bPalletFull_R:=FALSE;

!初始化左右两侧码垛满载布尔量 bGetPosition:=FALSE;

!初始化计算位置标识,FALSE为未完成计算,TRUE为已完成计算 Reset do00_ClampAct; Reset do01_HookAct;

!初始化夹具,夹板张开和钩爪松开 ClkStop Timer1; !停止时钟计时

ClkReset Timer1; !复位时钟

TriggEquip HookAct,100,0.1\\DOp:=do01_HookAct,1;

!定义触发事件:钩爪收紧。朝向指定目标点运动时提前100mm收紧钩爪,即将产品钩住,提前动作时间为0.1秒

TriggEquip HookOff,100\\Start,0.1\\DOp:=do01_HookAct,0;

!定义触发事件:钩爪松开。距离之后加上可选参变量\\Start,则表示在离开起点100mm处松开钩爪,提前动作时间为0.1秒 IDelete iPallet_L;

CONNECT iPallet_L WITH tEjectPallet_L;

ISignalDI di02_PalletInPos_L,0,iPallet_L;

!中断初始化,当左侧满载码盘到位信号为0时,即表示满载码盘被取走,则触发中断程序iPallet_L,复位左侧满载信号、满载布尔量 IDelete iPallet_R;

CONNECT iPallet_R WITH tEjectPallet_R;

ISignalDI di03_PalletInPos_R,0,iPallet_R;

!中断初始化,当右侧满载码盘单位信号变为0时,即表示满载码盘被取走,则触发中断程序iPallet_R,复位右侧满载信号、满载布尔量等 ENDPROC

PROC rPick() !抓取程序

ClkReset Timer1; !复位时钟

ClkStart Timer1; !开始计时

rCalPosition;

!计算位置,包括抓取位置、抓取安全位置、放置位置等

MoveJ Offs(pPick,0,0,nPickH),vMaxEmpty,z50,tGripper\\WObj:=wobj0; !利用MoveJ移动至抓取位置正上方

MoveL pPick,vMinLoad,fine,tGripper\\WObj:=wobj0; !利用MoveL移动至抓取位置 Set do00_ClampAct;

!置位夹板信号,将夹板收紧,夹取产品 Waittime 0.3;

!预留夹具动作时间,以保证夹具已将产品收紧,等待时间根据实际情况来调整其大小;若有夹紧反馈信号,则可利用WaitDI指令等待反馈信号变为1,从而替代固定的等待时间 GripLoad LoadFull; !加载载荷数据

TriggL Offs(pPick,0,0,nPickH),vMinLoad,HookAct,z50,tGripper\\WObj:=wobj0; !利用TriggL移动至抓取正上方,并调用触发事件HookAct,即在距离到达点100mm处将钩爪收紧,防止产品在快速移动中掉落

MoveL pPickSafe,vMaxLoad,z100,tGripper\\WObj:=wobj0; !利用MoveL移动至抓取位置 ENDPROC

PROC rPlace() !放置程序

MoveJ Offs(pPlace,0,0,nPlaceH),vMaxLoad,z50,tGripper\\WObj:=CurWobj; !利用MoveJ移动至放置位置正上方

TriggL pPlace,vMinLoad,HookOff,fine,tGripper\\WObj:=CurWobj; !利用TriggL移动至放置位置,并调用触发事件HookOff,即在离开放置位置正上方点为100mm后将钩爪放开

Reset do00_ClampAct;

!复位夹板信号,夹板松开,放下产品 Waittime 0.3;

!预留夹具动作时间,以保证夹具已将产品完全放下,等待时间根据实际情况调整其大小 GripLoad Load0; !加载载荷数据Load0