-
MODULE MainMoudle
PERS
wobjdata
Wob
jPallet_L:=[FALSE,TRUE,
1,0,0,0]]]
!定义左侧码盘工件坐标系
WobjPallet_L
PERS
wobjdata
p>
WobjPallet_R:=[FALSE,TRUE,
,0,0
,0]]];
!定义右侧码盘工件坐标系
WobjPallet_R
PERS
tooldata
p>
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
< br>赋值给该数据;当在右侧码垛时,则将
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.2106
4316,3.210904169],[0,0.70711295,-0.707100
612,0],[-2,0,-3,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
!左侧不旋转放置基准位置
CONST
robtarget
p
PlaceBase90_L:=[[218.407102669,695.953395421,3.210
997808],[0,-0.000001669,1,0],
[-2,0,-2,0
],[9E9,9E9,9E9,9E9,9E9,9E9]];
!左侧旋转
90
°放置基准位置
CONST
robtarget
p
PlaceBase0_R:=[[296.473529255,212.21064316,3.21090
4169],[0,0.707221603,-0.70699
194,0],[1,
0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
!右侧旋转不旋转放置基准位置
CONST
robtarget
p
PlaceBase90_R:=[[218.407102669,695.953395421,3.210
997808],[0,-0.00038594,0.9999
99926,0],[
1,0,1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
!右
侧旋转
90
°放置基准位置
CONST
robtarget
pPick_L:=[[1627.550991372,-426.97466135
2,-26.736921885],[0,0.707109873,-0.707103
689,0],[-1,0,-2,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
!左侧抓取位置
CONST
robtarget
p
Pick_R:=[[1611.055992534,442.364097921,-26.7365840
68],[0,0.707220363,-0.7069931
81,0],[0,0
,-1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
!右侧抓取位置
CONST
robtarget
pHome:=[[1505.00,-0.00,878.55],[1.28548
E-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;
!定义目标点数据,这些数据是机器人当前
使用的目标点。当在左侧、右侧码垛时,将对应
的左侧、右侧基准点赋值给这些数据
p>
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,<
/p>
则表示
机器人快速移动至抓取位置上放
3
00mm
处,然后慢速移动至抓取位置,接着慢速将产品提升
至
抓取位置上放
300mm
处,最后再快速移动至其他位置
PERS num nBoxL:=605;
PERS num nBoxW:=405;
PERS num nBoxH:=300;
!定义三个数字型数据,分别对应
的是产品长、宽、高。在计算位置程序中,通过在放
置基准点上面叠加长、宽、高数值计
算处放置位置
VAR clock Timer1;
!定义时钟数据,用于计时
PERS bool bReady:=TRUE;
!
p>
定义布尔量数据,
作为主程序逻辑判断条件,
当左右两侧有任何一侧满足码垛条件时,
此布尔量均为
TRU
E,
即机器人会执行码垛任务,
否则该布尔量为
FLASE
,
机器人会等待直至条
件满足
PERS bool
bPalletFull_L:=FALSE;
PERS bool bPalletFull_R:=FALSE;
!
定义两
个布尔数据,
当机器人在左侧码垛时,
则
bPallet_L
为
TURE
,<
/p>
bPallet_R
为
FALSE,
p>
当机器人在右侧时,则相反
PERS bool
bGetPosition:=FALSE;
!定义两个布尔量数据,判断是否已计算出当前取放位置
VAR triggdata HookAct;
VAR triggdata
HookOff;
!定义两
个触发数据,分别对应的是夹具上面钩爪收紧及松开动作
VAR intnum iPallet_L;
VAR intnum iPallet_R;
!定义
两个中断符,对应左侧、右侧码盘更换时所需触发的相应复位操作,如满载信号
复位等<
/p>
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
<
/p>
!利用
WHILE
循环,将初始化程序隔
离开,即只在第一次运行时需要执行一次初始化程
序,之后循环执行拾取放置动作
IF bReady THEN
!利用
I
F
条件判断,当左右两侧至少有一侧满足码垛条件时,判断条件
bReady
为
TRUE,
机
器人则执行码垛任务
rPick;
!调用抓取程序
rPlace;
!调用放置程序
ENDIF
rCycleCheck;
p>
!调用循环检测程序,里面包含写屏显示循环时间、码垛个数、判断当前左右两侧状况等
p>
Wait Time 0.05
p>
!循环等待时间,防止不满足机器人动作条件的情况下程序执行进入无限循环状态,造成机<
/p>
器人控制
CPU
过负荷
< br>
ENDWHILE
ENDPROC
PROC rInitAll()
!初始化程序
rCheckHomePos;
!调用检测
Home
点程序,若机器人在
Home
点,则直接执行后面的指
令,否则机器人先
安全返回
Home
点
,然后再执行后面的指令
ConfLOFF;
ConfJOFF;
!关闭轴配置监控
nCount_L:=1;
nCount_R:=1;
!初始化左右两侧码垛计数数据
nPallet:=1;
!初始化两侧码垛任务标识,
1
为左侧,
2
为右侧
nPalletNo:=1; <
/p>
!初始化两侧码垛计数累计标识,
1
为左
侧,
2
为右侧
bPalletFull_L:=FALSE;
bPalletFull_R:=FALSE;
!初始化左右两侧码垛满载布尔量
bGetPosition:=FALSE;
!初始化计算位
置标识,
FALSE
为未完成计算,
T
RUE
为已完成计算
Reset do00_ClampAct;
Reset do01_HookAct;
!初始化夹具,夹板张开和钩爪松开
ClkStop Timer1;
!停止时钟计时
ClkReset Timer1;
!复位时钟
TriggEquip
HookAct,100,0.1DOp:=do01_HookAct,1;
!定
义触发事件:钩爪收紧。朝向指定目标点运动时提前
100mm
收紧钩爪,即将产品钩住,
提前动作时间为
0.1
秒
TriggEquip
HookOff,100Start,0.1DOp:=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,tGripperWObj:=wobj0;
<
/p>
!利用
MoveJ
移动至抓取位置正上方
MoveL
pPick,vMinLoad,fine,tGripperWObj:=wobj0;
< br>!利用
MoveL
移动至抓取位置
Set do00_ClampAct;
!置位夹板信号,将夹板收紧,夹取产品
Waittime 0.3;
<
/p>
!预留夹具动作时间,以保证夹具已将产品收紧,等待时间根据实际情况来调整其大小;若
有夹紧反馈信号,则可利用
WaitDI
指令等待反馈信号变为
1
,从而替代固定的等待时间
GripLoad LoadFull;
!加载载荷数据
TriggL Offs(pPick,0,0,nPick
H),vMinLoad,HookAct,z50,tGripperWObj:=wobj0;
!利用
TriggL
移动至抓取正上方,并调用触发事件
HookAct
,
即在距离到达点
100mm
处将钩
爪收
紧,防止产品在快速移动中掉落
MoveL
pPickSafe,vMaxLoad,z100,tGripperWObj:=wobj0;
!利用
MoveL
< br>移动至抓取位置
ENDPROC
PROC rPlace()
!放置程序
MoveJ Offs(pPlace,0,0,nPlaceH),vMaxLoad
,z50,tGripperWObj:=CurWobj;
!利用
MoveJ
移动至放置位置正上方
TriggL pPlace,vMinLoad,Hook
Off,fine,tGripperWObj:=CurWobj;
!
利用
TriggL
移动至放置位置,
并调用触发事件
HookOff,
即在离开放置位置正
上方点为
100mm
后将钩爪放开
Reset
do00_ClampAct;
!复位夹板信号,夹板松开,放下产品
Waittime 0.3;
<
/p>
!预留夹具动作时间,以保证夹具已将产品完全放下,等待时间根据实际情况调整其大小<
/p>
GripLoad Load0;
!加载载荷数据
Load0
MoveL Offs(pPlace,0,0,nPlac
eH),vMinEmpty,z50,tGripperWObj:=CurWobj;
!
利用
Mo
veL
移动至放置位置正上方
rPlaceRD;
!调用放置计数程序,其中会执行计数加
1
操作,并判断当前码盘是否已满载
MoveJ
pPickSafe,vMaxEmpty,z50,tGripperWObj:=wobj0;
!利用
MoveJ
移动至抓取安全位置,以等待
执行下一次循环
ClkStop Timer1;
停止计时
nCycleTime:=ClkRead(Timer1);
读取时钟数值,并赋值给
nCycletime
ENDPROC
PROC rCycleCheck()
!周期循环检查
TPErase;
TPWrite
!示教器清屏,并显示当前机器人运行状态
TPWrite
!显示上次循环运行时间
TPWrite
TPWrite
!显示当前左右码
盘上面已摆放产品个数。由于
nCount_L
和
nCount_R
表示的是下轮循环将
要摆放的第多
少个产品,此处显示的是码盘上已摆放的产品数,所以在当前计数数值上面减
去
1
IF
(bPalletFull_L=FALSE
AND
di02_PalletInPos_L=1
AND
di00_BoxInPos_L=1)
OR
(bPalletFull_R=FALSE AND
di03_PalletInPos_R=1 AND di01_BoxInPos_R=1) THEN
bReady:=TRUE;
ELSE
bReady:=FALSE;
!
< br>判断当前工作站状况,
只要左右两侧有任何一侧满足码垛条件,
< br>则布尔量
bReady
为
TRU
E
,
机器人继续执行码垛任务;否则布尔量
bReady
为
FALSE
,机器
人则等待码垛条件的满足
WaitTime 0.1;
ENDIF
ENDPROC
PROC
rCalPosition()
!计算位置程序
bGetPosition:=FALSE;
!复位完成计算位置标识
WHILE
bGetPosition=FALSE DO
!若未完成计算位置,则重复执行
WHILE
循
环
TEST
nPallet
!利用
TEST
判断
执行码垛检测标识的数值,
1
为左侧,
2
为右侧
CASE 1:
!若为
1
,则执行左侧检测
IF bPalletFull_L=FALSE AND di02_PalletInPos_L=1
AND di00_BoxInPos_L=1
THEN
!判断左侧是否满足码垛条件,若
条件满足则将左侧的基准位置数值赋值给当前执行位置数
据
pPick:=pPick_L;
!将左侧抓取目标点数据赋值给当前抓取目标点
pPlaceBase0:=pPlaceBase0_L;
pPlaceBase90:=pPlaceBase90_L;
!将左侧放置位置基准目标点数据赋值给当前放置位置基准点
CurWobj:=WobjPallet_L;
!将左侧码盘工件坐标系数据赋值给当前工件坐标系
pPlace:=pPattern(nCount_L);
!调用
计算放置位置功能程序,同时写入左侧计数参数,从而计算出当前需要摆放的位置数
据,
并赋值给当前放置目标点
bGetPosition:=TRUE;
!已完成计算位置,则将完成计算位置标识为
TURE
nPalletNo:=1;
!将码垛计数标识置为
1
,则后续会执行左侧码垛计算累计
ELSE
bGetPosition:=FALSE;
!若左侧不满足
码垛任务,则完成计算位置位置标识置为
FLASE
,则程序会
再次执行
WHILE
循环
ENDIF
nPallet:=2;
!将码垛检测标识
置为
2
,则下次执行
WHILE
循环时检测右侧是否满足码垛条件
CASE 2:
!若为
2
,则执行右侧检测
IF bPalletFull_R=FALSE AND
di03_PalletInPos_R=1 AND di01_BoxInPos_R=1
THEN
!判断右侧是否满足码垛条件,若条件满足,则将右
侧的基准位置数值赋值给当前执行位置
数据
pPick:=pPick_R;
!将右侧抓取目标点数据赋值给当前抓取目标点
pPlaceBase0:=pPlaceBase0_R;
pPlaceBase90:=pPlaceBase90_R;
!将右侧放置位置基准目标点数据赋值给当前放置位置基准点
CurWobj:=WobjPallet_R;
!将右侧码盘工件坐标系数据赋值给当前工件坐标系
pPlace:=pPattern(nCount_R);
!调用计算放置位置功能程序,同
时写入右侧计数参数,从而计算出当前需要摆放的位置数
据,并赋值给当前放置目标点<
/p>
bGetPosition:=TRUE;
!已完成计算位置,则将完成计算位置标识为
TRUE
-
-
-
-
-
-
-
-
-
上一篇:最新整理1-100数字记忆方法训练方式
下一篇:尿常规化验单上各指标临床意义