ABB工业机器人现场编程-传送带搬运
- 格式:ppt
- 大小:298.50 KB
- 文档页数:6
ABB机器人搬运项目程序的分析,这么详细,看完就会了!
随着自动化产线的升级,工业机器人在生产线上使用越来越频繁。
当然,工业机器人在各行业中都扮演者不同的角色,机器人可以胜任搬运、码垛、涂胶、焊接、切割等不同的工作。
那今天我们就来聊一聊ABB机器人搬运项目如何编写程序。
1.我们先来看看,这个搬运项目的要求,如图1-1:机器人把右边产品盒的4个物料抓取后放置到左边的产品盒中。
2.分析物料的位置,左右两个物料盒尺寸相同,如图1-2。
3.编程:
1)用示教器手动操作机器人示教三个位置点分别是:pickbase (抓取基准点)、placebase(放置基准点)、phome(安全点)
2)定义3个位置型数据和2个数值型数据:1.VAR robtarget pick、2.VAR robtarget place、3.VAR num cishuleijia、PERS num geshuleijia用于程序的计算
3)程序分析:
这个就是我们这个机器人搬运项目程序的分析,大家赶紧去编一下试试吧。
abb搬运程序流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 系统初始化启动 ABB 机器人控制系统。
进行硬件和软件的初始化设置,包括机器人的关节位置、传感器校准等。
ABB机器人输送链跟踪配置和编程步骤ABB&ROBOT使用输送链跟踪功能的配置和编程步骤•输送链跟踪硬件安装DSQC377A(B)模块安装编码器安装触发开关安装机器人校准探针??安装输送线上的校准针??连接编码器线缆到DSQC377A(B)模块连接触发开关线缆到DSQC377A(B)模块•DSQC377A(B)模块•DSQC377A(B)模块X20端子接线图10-16不使用1 24 VDC supply2 0 V3 Encoder 1 - 24VDC4 Encoder 1 - 0V5 Encoder 1 - Phase A6 Encoder 1 - Phase B7 Digital input 1 - 24 VDC8 Digital input 1 - 0 V9 Digital input 1 - Signal•校准机器人探针夹具使用四点法•计算CountsPerMeter1、运转输送链,确认输送线运转时机器人显示的位置为正方向,否则交换编码器A/B相2、在输送线上找一参照点,并在固定边做标记一,记录机器人上显示的位置数据一3、运行输送线一段距离后停止,重复步骤2,得到标记二、位置数据2CountsPerMeter=(位置数据2-位置数据1)× CountsPerMeter(原)/标记间距(MM)配置-IO-Fieldbus command- CountsPerMeter ,修改参数值•定义queue tracking distance如果触发开关距离机器人过远,超出机器人工作范围,先定义queue tracking distance摇动机器人到恰当的位置测量开关到机器人的距离配置-IO-Fieldbus command-QueueTrckDist,修改参数值,单位M•校准输送线BaseFrame打开程序,单步运行一下指令ActUnit CNV1;WaitWObj wobjcnv1;启动输送线到触发开关,机器人上显示位置超过0,停止输送线。
abb机器人搬运编程程序实例abb机器人是一种智能化的机器人系统,可以用于搬运编程程序。
它具备高度的自动化和智能化能力,可以帮助人们提高工作效率,减轻工作负担。
abb机器人搬运编程程序的过程可以分为几个步骤。
abb机器人搬运编程程序的实例非常丰富多样。
比如,在工业生产中,abb机器人可以被用来搬运零部件或成品,从而提高生产效率。
在仓储物流领域,abb机器人可以被用来搬运货物,实现自动化的物流操作。
在医疗领域,abb机器人可以被用来搬运医疗设备或药品,提高医疗服务的效率和质量。
abb机器人搬运编程程序也可以应用于其他领域。
比如,在农业领域,abb机器人可以被用来搬运农作物或农机设备,提高农业生产的效率。
在建筑领域,abb机器人可以被用来搬运建筑材料或辅助施工,提高施工速度和质量。
在家庭生活中,abb机器人可以被用来搬运家具或清洁用品,减轻家庭劳动的负担。
abb机器人搬运编程程序的应用还可以进一步扩展。
比如,可以将abb机器人与其他智能设备进行联动,实现更加复杂的自动化操作。
可以利用人工智能技术,让abb机器人具备自主学习和决策的能力,提高其适应不同场景和任务的能力。
可以将abb机器人与大数据和云计算等技术相结合,实现更加高效的数据管理和分析。
然而,abb机器人搬运编程程序的应用也面临一些挑战和限制。
首先,abb机器人的成本较高,不是所有企业或个人都能够负担得起。
其次,abb机器人的使用需要一定的技术和操作人员的培训,对于一些没有相关经验的人来说可能存在一定的学习成本。
此外,abb 机器人的安全性也是一个需要重视的问题,特别是在与人员共同工作的环境中,需要采取相应的安全措施。
总结起来,abb机器人搬运编程程序具备广泛的应用前景和潜力。
它可以在多个领域中发挥重要的作用,帮助人们提高工作效率,降低工作风险。
随着技术的不断进步和创新,abb机器人搬运编程程序的应用将变得越来越普遍,为人们的生活和工作带来更多的便利和效益。
搬运码垛工作站建模1、创建机器人系统2、创建动态输送链3、创建动态夹具4、工作站逻辑连接5、添加 IO(设置好需重启)6、示教目标点(同步到RAPID )7、RAPID 编程一、创建机器人系统1、创建空工作站2、导入 IRB 260 机器人模型二、创建动态输送链1、添加输送链并修改位置2、创建 600*400*200 的物料并修改位置3、添加一个 smart 组件4、添加 source 组件5、设置物料本地原点6、添加LINEMOVER 和 QUEUE 组件8、添加面传感器组件10、设置 SC_输送链的属性连接11、设置信号连接12、添加信号处理组件,用于检测传感器下降沿14、传感器与 SC 输送链的输出联系16、添加置位复位组件,对仿真开始结束信号进行保持17、18、进行仿真设定选择SC——输送链进行验证三、创建动态夹具1、先制作一个吸盘模型,然后设置成工具,并安装到机器人法拉盘2、添加SMART 组件3、添加ATTACHER 和DETACHER 组件5、添加一个线传感器组件7、设置吸盘工具不能被传感器检测9、设置属性连接11、添加信号处理取非和锁定组件13、添加一个示教物料四、工作站逻辑连接五、参考代码MODULE MainMoudlePERS tooldatatGrip:=[TRUE,[[0,0,200],[1,0,0,0]],[25,[0,0.00109327,116.889],[1,0,0,0],0,0,0]];!吸盘工具数据PERS loaddata LoadEmpty:=[0.01,[0,0,1],[1,0,0,0],0,0,0];PERS loaddata LoadFull:=[40,[0,0,50],[1,0,0,0],0,0,0];!有效载荷数据PERS robtarget pHome:=[[1620.00,-0.00,1331.59],[1.27986E-06,-0.707107,- 0.707107,1.27986E-06],[0,0,1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];!基准点PERS robtarget pActualPos:=[[1620,-1.87531E-14,1331.59],[1.27986E-06,- 0.707107,-0.707107,1.27986E- 06],[0,0,1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];!实际点PERS robtarget pPick1:=[[1488.007792464,376.826660408,476.964684195],[0,0.707106307,0.7071 07256,0],[0,0,1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];!1 路拾取目标点PERS robtarget pPlace1:=[[- 292.446,1263.27,55.4492],[0,0.707107,0.707106,0],[1,0,2,0],[9E+09,9E+09,9E+09, 9E+09,9E+09,9E+09]];!1 路放置基准点PERS robtarget pBase1_0:=[[- 292.446294945,1263.272085268,55.449220723],[0,0.707107387,0.707106176,0],[1, 0,2,0],[9E9,9E9,9E9,9E9,9E9,9E9]];!1 路放置 0 度姿态PERS robtarget pBase1_90:=[[-391.976797324,1362.469634994,55.449159414],[0,1,-0.000030621,0],[1,0,3,0],[9E9,9E9,9E9,9E9,9E9,9E9]];!1 路放置 90 度姿态PERS robtarget pPick2:=[[1488.013130905,-358.406014736,476.965039287],[0,0.707106307,0.707107256,0],[-1,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];PERS robtarget pPlace2:=[[-317.378,-1857.99,55.449],[0,0.707108,0.707106,0],[-2,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];PERS robtarget pBase2_0:=[[-317.378137718,-1857.993871961,55.448967354],[0,0.707107745,0.707105817,0],[-2,0,-1,0],[9E9,9E9,9E9,9E9,9E9,9E9]];PERS robtarget pBase2_90:=[[-407.525988074,-1755.902485322,55.449282402],[0,1,-0.000031217,0],[-2,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];PERS speeddata MinSpeed:=[1000,300,5000,1000];PERS speeddata MidSpeed:=[2500,400,5000,1000];PERS speeddata MaxSpeed:=[4000,500,5000,1000];!搬运速度定义PERS bool bPalletFull1:=FALSE;PERS bool bPalletFull2:=FALSE;!逻辑布尔量,拾取后为UE ,放置后为FALSEPERS num nCount1:=1;PERS num nCount2:=1;!输送链计数PROC Main()rInitAll;WHILE TRUE DOIF diBoxInPos1=1 AND diPalletInPos1=1 AND bPalletFull1=FALSE THENrPick1;rPlace1;ENDIFIF diBoxInPos2=1 AND diPalletInPos2=1 AND bPalletFull2=FALSE THENrPick2;rPlace2;ENDIFWaitTime 0.1;ENDWHILEENDPROCPROC rInitAll()Reset doGrip;pActualPos:=CRobT(\tool:=tGrip);pActualPos.trans.z:=pHome.trans.z;MoveL pActualPos,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pHome,MidSpeed,fine,tGrip\WObj:=wobj0;bPalletFull1:=FALSE;nCount1:=1;bPalletFull2:=FALSE;nCount2:=1;ENDPROCPROC rPick1()MoveJ Offs(pPick1,0,0,400),MaxSpeed,z50,tGrip\WObj:=wobj0; MoveL pPick1,MinSpeed,fine,tGrip\WObj:=wobj0;Set doGrip;WaitTime 0.3;GripLoad LoadFull;MoveL Offs(pPick1,0,0,400),MinSpeed,z50,tGrip\WObj:=wobj0; ENDPROCPROC rPick2()MoveJ Offs(pPick2,0,0,400),MaxSpeed,z50,tGrip\WObj:=wobj0; MoveL pPick2,MinSpeed,fine,tGrip\WObj:=wobj0;Set doGrip;WaitTime 0.3;GripLoad LoadFull;MoveL Offs(pPick2,0,0,400),MinSpeed,z50,tGrip\WObj:=wobj0; ENDPROCPROC rPlace1()rPosition1;MoveJ Offs(pPlace1,0,0,400),MidSpeed,z50,tGrip\WObj:=wobj0; MoveL pPlace1,MinSpeed,fine,tGrip\WObj:=wobj0;Reset doGrip;WaitTime 0.3;GripLoad LoadEmpty;MoveL Offs(pPlace1,0,0,400),MidSpeed,z50,tGrip\WObj:=wobj0; MoveJ Offs(pPick1,0,0,400),MaxSpeed,z50,tGrip\WObj:=wobj0; nCount1:=nCount1+1;IF nCount1>20 THENbPalletFull1:=TRUE;ENDIFENDPROCPROC rPlace2()rPosition2;MoveJ Offs(pPlace2,0,0,400),MaxSpeed,z50,tGrip\WObj:=wobj0; MoveL pPlace2,MinSpeed,fine,tGrip\WObj:=wobj0;Reset doGrip;WaitTime 0.3;GripLoad LoadEmpty;MoveL Offs(pPlace2,0,0,400),MidSpeed,z50,tGrip\WObj:=wobj0; MoveJ Offs(pPick2,0,0,400),MaxSpeed,z50,tGrip\WObj:=wobj0; nCount2:=nCount2+1;IF nCount2>20 THENbPalletFull2:=TRUE;ENDIFENDPROCPROC rPosition1()TEST nCount1CASE 1:pPlace1:=Offs(pBase1_0,0,0,0);CASE 2:pPlace1:=Offs(pBase1_0,600+10,0,0);CASE 3:pPlace1:=Offs(pBase1_90,0,400+10,0);CASE 4:pPlace1:=Offs(pBase1_90,400+10,400+10,0);CASE 5:pPlace1:=Offs(pBase1_90,800+20,400+10,0);CASE 6:pPlace1:=Offs(pBase1_0,0,600+10,200);CASE 7:pPlace1:=Offs(pBase1_0,600+10,600+10,200);CASE 8:pPlace1:=Offs(pBase1_90,0,0,200);CASE 9:pPlace1:=Offs(pBase1_90,400+10,0,200);CASE 10:pPlace1:=Offs(pBase1_90,800+20,0,200);CASE 11:pPlace1:=Offs(pBase1_0,0,0,400);CASE 12:pPlace1:=Offs(pBase1_0,600+10,0,400);CASE 13:pPlace1:=Offs(pBase1_90,0,400+10,400);CASE 14:pPlace1:=Offs(pBase1_90,400+10,400+10,400);CASE 15:pPlace1:=Offs(pBase1_90,800+20,400+10,400); CASE 16:pPlace1:=Offs(pBase1_0,0,600+10,600);CASE 17:pPlace1:=Offs(pBase1_0,600+10,600+10,600);pPlace1:=Offs(pBase1_90,0,0,600);CASE19:pPlace1:=Offs(pBase1_90,400+10,0,600);CASE20:pPlace1:=Offs(pBase1_90,800+20,0,600);DEFAULT:TPErase;TPWrite"the Counter of line1is error,please check it!";Stop;ENDTESTENDPROCPROC rPosition2()TEST nCount2CASE1:pPlace2:=Offs(pBase2_0,0,0,0);CASE2:pPlace2:=Offs(pBase2_0,600+10,0,0);CASE3:pPlace2:=Offs(pBase2_90,0,400+10,0);CASE4:pPlace2:=Offs(pBase2_90,400+10,400+10,0);CASE5:pPlace2:=Offs(pBase2_90,800+20,400+10,0);CASE6:pPlace2:=Offs(pBase2_0,0,600+10,200);pPlace2:=Offs(pBase2_0,600+10,600+10,200); CASE8:pPlace2:=Offs(pBase2_90,0,0,200);CASE9:pPlace2:=Offs(pBase2_90,400+10,0,200);CASE10:pPlace2:=Offs(pBase2_90,800+20,0,200);CASE11:pPlace2:=Offs(pBase2_0,0,0,400);CASE12:pPlace2:=Offs(pBase2_0,600+10,0,400);CASE13:pPlace2:=Offs(pBase2_90,0,400+10,400);CASE14:pPlace2:=Offs(pBase2_90,400+10,400+10,400);CASE15:pPlace2:=Offs(pBase2_90,800+20,400+10,400);CASE16:pPlace2:=Offs(pBase2_0,0,600+10,600);CASE17:pPlace2:=Offs(pBase2_0,600+10,600+10,600);CASE18:pPlace2:=Offs(pBase2_90,0,0,600);CASE19:pPlace2:=Offs(pBase2_90,400+10,0,600);CASE20:pPlace2:=Offs(pBase2_90,800+20,0,600);DEFAULT:TPErase;TPWrite"the Counter of line1is error,please check it!";Stop;ENDTESTENDPROCPROC rModify()MoveJ pHome,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pPick1,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pBase1_0,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pBase1_90,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pPick2,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pBase2_0,MinSpeed,fine,tGrip\WObj:=wobj0;MoveJ pBase2_90,MinSpeed,fine,tGrip\WObj:=wobj0;ENDPROCENDMODULE。
abb搬运程序实例在中国,ABB搬运程序是工业自动化领域中的一项重要技术。
ABB搬运程序可以帮助企业实现高效的生产线自动化,提高生产效率和产品质量,降低人力成本和劳动强度。
本文将介绍ABB搬运程序的原理和应用,以及其在工业生产中的指导意义。
首先,让我们了解一下ABB搬运程序的原理。
ABB搬运程序是一种基于机器视觉和机器人控制的自动化系统,通过在生产线上安装相机和传感器,实现对产品的识别和定位。
然后,通过控制机器人的动作和路径规划,实现对物体的抓取、移动和放置。
这种自动化技术可以高效地完成各类产品的搬运任务,极大地减轻了人力负担,提高了生产效率。
ABB搬运程序在各个行业的应用非常广泛。
在汽车制造业中,ABB搬运程序可以实现对汽车零部件的自动化搬运和装配,有效地提高了生产效率和产品质量。
在电子工业中,ABB搬运程序可以实现对电子元件的自动化搬运和焊接,大大缩短了生产周期。
在食品行业中,ABB搬运程序可以实现对食品包装的自动化搬运和封装,确保了食品的卫生安全和品质。
ABB搬运程序在工业生产中具有重要的指导意义。
首先,它提高了生产效率和产品质量。
传统的搬运工作由人工完成,容易出现疲劳、误操作和质量问题。
而ABB搬运程序可以代替人工完成繁重的搬运任务,提高了工作效率和准确性。
其次,它降低了人力成本和劳动强度。
ABB搬运程序减少了人工搬运的需求,节约了人力资源,减少了劳动强度,提高了工人的劳动条件和生产效率。
最后,它推动了工业自动化的发展。
ABB搬运程序是工业自动化领域的重要应用,它的发展和应用促进了整个工业自动化技术的进步和创新。
总之,ABB搬运程序是一种生动、全面、有指导意义的技术。
它通过机器视觉和机器人控制实现对产品的识别、抓取和移动,可以广泛应用于各个行业的生产线自动化中。
ABB搬运程序的应用带来了生产效率和产品质量的提升,降低了人力成本和劳动强度,推动了工业自动化的发展。
对于企业来说,学习和应用ABB搬运程序可以有效提高生产效益,提高竞争力。
5.2 ABB工业机器人搬运编程52 ABB 工业机器人搬运编程在现代工业生产中,自动化技术的应用越来越广泛,其中 ABB 工业机器人凭借其出色的性能和可靠性,成为了许多企业的首选。
而搬运作业作为工业生产中常见的任务之一,通过对 ABB 工业机器人进行合理的编程,可以实现高效、精准的搬运操作,从而大大提高生产效率和质量。
ABB 工业机器人搬运编程的第一步是对工作场景进行详细的分析和规划。
这包括确定要搬运的物体的形状、尺寸、重量,以及搬运的起点和终点位置,还有可能遇到的障碍物等。
只有充分了解这些因素,才能为后续的编程提供准确的依据。
接下来,需要选择合适的机器人型号和工具。
ABB 工业机器人有多种型号可供选择,每种型号都有其特定的工作范围和负载能力。
根据搬运物体的重量和尺寸,选择能够胜任工作的机器人型号至关重要。
同时,还需要根据物体的形状和特性,选择合适的抓取工具,如夹爪、吸盘等。
在编程过程中,坐标系的设定是一个关键环节。
ABB 工业机器人通常使用笛卡尔坐标系、关节坐标系和工具坐标系等。
笛卡尔坐标系用于描述机器人在空间中的位置和姿态,关节坐标系则用于控制机器人各个关节的运动,而工具坐标系则是基于机器人末端工具的坐标系。
根据具体的搬运任务,合理选择和设置坐标系,可以使编程更加简单和直观。
路径规划是搬运编程的核心部分。
机器人的搬运路径需要在满足任务要求的前提下,尽可能地短且平滑,以减少运动时间和能量消耗。
常见的路径规划方法有直线插补、圆弧插补等。
在规划路径时,还需要考虑机器人的运动速度、加速度和加加速度等参数,以确保运动的平稳性和准确性。
为了实现精准的搬运操作,还需要对机器人的抓取和放置动作进行编程。
这包括控制抓取工具的开合力度、抓取时间,以及放置物体的位置和姿态等。
在抓取和放置过程中,还需要考虑物体的重心和稳定性,以防止物体掉落或损坏。
编程完成后,进行模拟和调试是必不可少的步骤。
通过在虚拟环境中模拟机器人的运动,可以提前发现可能存在的问题,如碰撞、运动异常等,并及时进行调整和优化。
MODULE MainModulePROC main()init;WHILE TRUE DOLeftmove;rightmove;WaitTime 0.1;ENDWHILEENDPROCPROC init()VAR intnum nTempCount;VAR intnum nTempH;VAR intnum nInputA;VAR intnum nInputB;! DO10_5=DOWN , DO10_6=PUSH !AccSet 70,70;VelSet 100,5000;IF DOutput(DO10_5)=1 OR DOutput(DO10_6)=1 THENnanswer1:=0;WHILE nanswer1<>5 DOTPErase;TPReadFK nanswer1 ,"Are you sure the grip is empty?"," "," "," ","No","YES";waittime 0.5;ENDWHILEENDIFReset DO10_5;Reset DO10_6;! ! DI10_8=0 TO 600*600; DI10_8=1 TO 600*1200 !!IF DI10_8=0 THENFull:=32;BoxL:=BoxLa;ppick:=ppickA;ELSEIF DI10_8=1 THENFull:=16;BoxL:=BoxLb;ppick:=ppickB;ELSEXXX:=0;ENDIFLabel1:TPErase;TPReadFK nInputA,"L_line_num:"+ ValToStr(countL)+"; R_line_num: "+ValToStr(CountR),"NO","","","","YES";TEST nInputACASE 1:Label2:TPErase;TPReadNum nTempCount,"Input L_line box numbers:";countL:=nTempCount;TPErase;TPReadNum nTempCount,"Input R_line box numbers:";countR:=nTempCount;IF (countL<0 OR countL> Full) OR (countR<0 OR countR> Full) THENTPErase;TPWrite "Input Error, try again!";GOTO Label2;ENDIFGOTO Label1;CASE 5:TPErase;TPWrite "Robot start Running!";ENDTESTLabel11:TPErase;TPReadFK nInputB,"Height:"+ ValToStr(BoxH),"NO","","","","YES";TEST nInputBCASE 1:Label12:TPErase;TPReadNum nTempH,"Input Height :";BoxH:=nTempH;IF BoxH<0 OR BoxH>171 THENTPErase;TPWrite "Input Error, try again!";GOTO Label12;ENDIFGOTO Label11;CASE 5:TPErase;TPWrite "Robot start Running!";ENDTESTGetPosition ;rMoveHome;GripLoad load0;ENDPROCPROC rMoveHome()VAR robtarget Cur;Cur:=CRobT(\Tool:=tGripper\WObj:=wobj0);Cur.trans.z:=pHome.trans.z;MoveL Cur,v500,z50,tGripper;MoveJ pHome,v500,fine,tGripper;ENDPROCPROC GetPosition()! ! DI10_8=0 TO 600*600; DI10_8=1 TO 600*1200 !!IF DI10_8=0 THENpplaceL{1}:=Offs(pplaceL90,-0.5*BoxL,-0.5*BoxW,BoxH); pplaceL{2}:=Offs(pplaceL90,-0.5*BoxL,0.5*BoxW,BoxH); pplaceL{3}:=Offs(pplaceL90,0.5*BoxL,-0.5*BoxW,BoxH); pplaceL{4}:=Offs(pplaceL90,0.5*BoxL,0.5*BoxW,BoxH); pplaceR{1}:=Offs(pplaceR0,-0.5*BoxL,-0.5*BoxW,BoxH); pplaceR{2}:=Offs(pplaceR0,-0.5*BoxL,0.5*BoxW,BoxH); pplaceR{3}:=Offs(pplaceR0,0.5*BoxL,-0.5*BoxW,BoxH); pplaceR{4}:=Offs(pplaceR0,0.5*BoxL,0.5*BoxW,BoxH);ELSEIF DI10_8=1 THENpplaceL{1}:=Offs(pplaceL90,-0.5*BoxW,0,BoxH); pplaceL{2}:=Offs(pplaceL90,0.5*BoxW,0,BoxH);!pplaceL{3}:=Offs(pplaceL0,0,-0.5*BoxW,2*BoxH);!pplaceL{4}:=Offs(pplaceL0,0,0.5*BoxW,2*BoxH); pplaceL{3}:=Offs(pplaceL90,-0.5*BoxW,0,2*BoxH); pplaceL{4}:=Offs(pplaceL90,0.5*BoxW,0,2*BoxH); pplaceR{1}:=Offs(pplaceR0,0,-0.5*BoxW,BoxH); pplaceR{2}:=Offs(pplaceR0,0,0.5*BoxW,BoxH);! pplaceR{3}:=Offs(pplaceR90,-0.5*BoxW,0,2*BoxH);! pplaceR{4}:=Offs(pplaceR90,0.5*BoxW,0,2*BoxH); pplaceR{3}:=Offs(pplaceR0,0,-0.5*BoxW,2*BoxH); pplaceR{4}:=Offs(pplaceR0,0,0.5*BoxW,2*BoxH);ELSEXXX:=0;ENDIFENDPROCPROC Leftmove()!! DI10_2=L_DiscStack,DI10_6=L_DiscIN !!WHILE DI10_2=1 AND DI10_6=0 AND countL<Full DO!! DI10_4=L_ForceOut,DI10_2=L_DiscStack,DI10_6=L_DiscIN, DO10_2=L_StackOUT !!IF DI10_4=1 AND DI10_2=1 AND DI10_6=0 THENcountL:=Full;ENDIFIF countL<Full THENReset DO10_5;Reset DO10_6;MoveJ Offs(ppick,0,0.5*BoxW+200,260),VH,z50,tGripper;MoveJ Offs(ppick,0,0.5*BoxW+200,0),VH,z50,tGripper;MoveL Offs(ppick,0,0,0),VL,fine,tGripper;! DO10_5=DOWN , DO10_6=PUSH !WaitDI DI10_1,1;Set DO10_5;waittime 0.3;GripLoad load1;Incr countL;pliesL:=Trunc((countL-1)/4);Lnum:=countL MOD 4;IF Lnum=0 THENLnum:=4 ;ENDIFIF DI10_8=0 THENLplace:=Offs( pplaceL{Lnum},0,0,pliesL*BoxH);TEST LnumCASE 1:xoffs:=0;yoffs:=0;CASE 2:xoffs:=0;yoffs:=50;CASE 3:xoffs:=50;yoffs:=0;CASE 4:xoffs:=50;yoffs:=50;ENDTESTELSEIF DI10_8=1 THENLplace:=Offs( pplaceL{Lnum},0,0,pliesL*2*BoxH);TEST LnumCASE 1:xoffs:=0;yoffs:=0;CASE 2:xoffs:=50;yoffs:=0;CASE 3:xoffs:=0;yoffs:=0;CASE 4:xoffs:=0;yoffs:=50;ENDTESTELSEXXX:=0;ENDIFMovel Offs(ppick,0,0,200),VM,z100,tGripper;IF Lplace.trans.z+260 > ppick.trans.z+260 THENMoveJ Offs(ppick,0,0,Lplace.trans.z-ppick.trans.z+260),VM,z200,tGripper; ELSEMoveJ Offs(ppick,0,0,260),VM,z200,tGripper;ENDIFMoveJ Offs(Lplace,xoffs,yoffs,260),VM,z100,tGripper;MoveJ Offs(Lplace,xoffs,yoffs,50),VM,z20,tGripper;MoveJ Offs(Lplace,0,0,0),VL,fine,tGripper;! DO10_5=DOWN , DO10_6=PUSH !Reset DO10_5;Set DO10_6;! DO10_10=GET PUSH !WaitDI DI10_10,1;waittime 0.2;GripLoad load0;MoveJ Offs(Lplace,xoffs,yoffs,260),VH,fine,tGripper;!waittime 0.2;Reset DO10_6;! DO10_9=NO PUSH !!WaitDI DI10_9,1;IF Lplace.trans.z+260 > ppick.trans.z+260 THENMoveJOffs(ppick,0,0.5*BoxW+200,Lplace.trans.z-ppick.trans.z+260),VH,z50,tGripper;ELSEMoveJ Offs(ppick,0,0.5*BoxW+200,260),VH,z50,tGripper;ENDIFENDIFENDWHILE!! DI10_2=L_DiscStack,DI10_6=L_DiscIN, DO10_2=L_StackOUT !!IF countl>=Full AND DI10_2=1 AND DI10_6=0 THENset DO10_2;WaitTime 0.2;Reset DO10_2;countL:=0;ENDIFENDPROCPROC rightmove()!! DI10_3=R_DiscStack,DI10_7=R_DiscIN ,DO10_3=R_StackOUT !!WHILE DI10_3=1 AND DI10_7=0 AND countR<Full DO!!DI10_5=R_ForceOut,DI10_3=R_DiscStack,DI10_7=R_DiscIN ,DO10_3=R_S tackOUT !!IF DI10_5=1 AND DI10_3=1 AND DI10_7=0 THENcountR:=Full;ENDIFIF countR<Full THENReset DO10_5;Reset DO10_6;MoveJ Offs(ppick,0,0.5*BoxW+200,260),VH,z50,tGripper;MoveJ Offs(ppick,0,0.5*BoxW+200,0),VH,z50,tGripper;MoveL Offs(ppick,0,0,0),VL,fine,tGripper;WaitDI DI10_1,1;! DO10_5=DOWN , DO10_6=PUSH !Set DO10_5;waittime 0.3;GripLoad load1;Incr countR;pliesR:=Trunc((countR-1)/4);Rnum:=countR MOD 4;IF Rnum=0 THENRnum:=4 ;ENDIFIF DI10_8=0 THENRplace:=Offs( pplaceR{Rnum},0,0,pliesR*BoxH); TEST RnumCASE 1:xoffs:=0;yoffs:=0;CASE 2:xoffs:=0;yoffs:=50;CASE 3:xoffs:=50;yoffs:=0;CASE 4:xoffs:=50;yoffs:=50;ENDTESTELSEIF DI10_8=1 THENRplace:=Offs( pplaceR{Rnum},0,0,pliesR*2*BoxH); TEST RnumCASE 1:xoffs:=0;yoffs:=0;CASE 2:xoffs:=50;yoffs:=0;CASE 3:xoffs:=0;yoffs:=0;CASE 4:xoffs:=0;yoffs:=50;ENDTESTELSEXXX:=0;ENDIFMovel Offs(ppick,0,0,200),VM,z100,tGripper;IF Rplace.trans.z+260 > ppick.trans.z+260 THENMoveJ Offs(ppick,0,0,Rplace.trans.z-ppick.trans.z+260),VM,z100,tGripper;ELSEMoveJ Offs(ppick,0,0,260),VM,z100,tGripper;ENDIFMoveJ Offs(Rplace,xoffs,yoffs,260),VM,z100,tGripper;MoveJ Offs(Rplace,xoffs,yoffs,50),VM,z20,tGripper;MoveJ Offs(Rplace,0,0,0),VL,fine,tGripper;! DO10_5=DOWN , DO10_6=PUSH !Reset DO10_5;Set DO10_6;! DO10_10=GET PUSH !WaitDI DI10_10,1;waittime 0.2;GripLoad load0;MoveJ Offs(Rplace,xoffs,yoffs,260),VH,fine,tGripper;!waittime 0.2;Reset DO10_6;! DO10_9=NO PUSH !!WaitDI DI10_9,1;!waittime 0.2;IF Rplace.trans.z+260 > ppick.trans.z+260 THENMoveJOffs(ppick,0,2*BoxW,Rplace.trans.z-ppick.trans.z+260),VM,z100,tGripper;ELSEMoveJ Offs(ppick,0,0.5*BoxW+200,260),VM,z100,tGripper;ENDIFENDIFENDWHILE!! DI10_3=R_DiscStack,DI10_7=R_DiscIN ,DO10_3=R_StackOUT !!IF countR>=Full AND DI10_3=1 AND DI10_7=0 THENset DO10_3;WaitTime 0.2;Reset DO10_3;countR:=0;ENDIFENDPROC ENDMODULE。