KUKA机器人焊接程序解析
- 格式:pdf
- 大小:771.79 KB
- 文档页数:35
Pages1/8广州蓝姆汽车设备有限公司2014.6Pages2/81.准备工作①.焊机的输入输出大小(本例Input=40bit=5Byte,Output=24bit=3Byte)②.机器人及焊机节点号,波特率及相对应的拨码(本例节点号:1拨码对应,波特率500)2.其他①:机器人端后台逻辑编写:R/KRC/R1/System/sps.sub在此可编写逻辑,进行程序或者IO 控制.VB 语法编写.按上诉文档配置完毕后打开配置-输出输出驱动程序--输入/输出重新配置回车.6焊机IO配置打开如图7进入后根据焊机IO进行配置例:正在焊接..焊机那边是焊机输出第一位在机器人这边就是64+1=65位以此类推,进行设置.8完成后进行备份荻原项目博世力士乐焊机启动顺序:机器人To焊机程序Code(out81-out88组成)机器人To焊机程序Code确认(out66)焊机To机器人确认反馈(in66)机器人To焊机焊接启动(out65)焊机完成机器人焊接结束信号(in65)其他信号依据博世说明书配置荻原项目SPS程序追加说明:LOOPif($out[81]or$out[82]or$out[83]or$out[84]or$out[85]or$out[86]or$out[87]or$out[88]and not$in[66])then if$out[72]==true then$out[66]=true$out[72]=falseelse$out[66]=false$out[72]=trueendifEndifENDLOOP如果焊接Code不为0判断out72(此处为中间变量,临时采用机器人To焊机备用输出代替)是否为1进行交替输出OUT660和1LOOP-------ENDLOOP为循环扫描语句.务必在其间编写程序.主要目的:KUKA Servo TC软件包没有程序号确认功能.编写此程序进行控制.。
KUKA焊接程序解析KUKA焊接程序解析一:引言本文档旨在详细解析KUKA焊接程序的概念、使用、参数设置等内容,旨在帮助用户更好地理解和使用该程序。
二:程序概述1. 程序介绍:介绍KUKA焊接程序的基本功能和作用。
2. 程序结构:详细解析焊接程序的结构,包括主程序、子程序、步骤和过程的关系等。
3. 程序流程:解释焊接程序的流程控制,包括循环、条件判断等。
三:程序编写1. 程序环境:介绍编写焊接程序所需的软件环境和KUKA 相关设备。
2. 程序语言:介绍KRL编程语言的基本语法和常用指令。
3. 程序规范:详细说明焊接程序编写的规范和注意事项。
四:程序参数1. 焊接参数:解析焊接程序中的各种参数,包括电流、电压、焊接速度等。
2. 工作空间:介绍焊接程序中定义的工作空间范围和坐标系。
3. 速度和加速度:详细说明焊接程序中的速度和加速度设置。
五:程序调试1. 程序加载:介绍焊接程序的加载和启动方法。
2. 调试工具:介绍常用的KUKA调试工具和方法。
3. 调试策略:详细说明焊接程序调试的策略和步骤。
六:程序优化1. 采样率和分辨率:解析焊接程序中的采样率和分辨率设置。
2. 优化算法:介绍优化焊接程序的算法和方法。
3. 节点优化:详细说明如何优化焊接程序中的节点。
七:附件本文档涉及的附件包括示例程序、程序调试记录和优化结果分析表等,详见附件目录。
注释:1. KUKA:某品牌生产商。
2. KRL编程语言:KUKA专用的编程语言。
3. 采样率:指每秒钟采集数据的次数。
4. 分辨率:指控制系统对输入指令或输出结果的精确度。
kuka点焊轨迹点讲解
在点焊过程中,KUKA机器人可以通过以下步骤设置焊接轨迹点:
1. 设置焊接位置:使用输入坐标或者示教器来设定焊接的位置。
这个步骤是必要的,它确保了焊接点能准确对齐,为接下来的点焊过程提供准确的基准。
2. 设置焊接参数:焊接电流、焊接时间、焊接速度等参数是关键,它们对焊接质量和效率有着直接影响。
因此,需要对这些参数进行仔细的设定和调整。
3. 规划焊接路径:在设定了焊接位置和参数之后,还需要对焊接路径进行规划。
通过合理的路径规划,机器人可以在焊接过程中更有效地移动,提高工作效率。
请注意,以上步骤仅供参考,具体操作可能会因设备型号和具体需求而有所不同。
在实际操作中,应遵循设备的使用说明和安全指南,并咨询专业技术人员以获取准确和安全的工作指导。
KUKA机器人程序命令一、概述KUKA机器人是一种广泛应用于工业自动化领域的机器人,其高度的灵活性和适应性使得它在众多行业中都有广泛的应用。
为了能够控制和使用KUKA机器人,我们需要通过编写程序来对其进行操作。
下面将介绍一些常用的KUKA机器人程序命令。
二、基本命令1、PTP(Point to Point):这是最基本的运动指令,可以控制机器人在空间的任意两点之间进行运动。
PTP指令需要指定起始位置和目标位置,机器人会以最短路径的方式进行移动。
2、LIN(Linear):这个指令可以让机器人在两点之间进行线性插补。
与PTP指令不同,LIN指令可以让机器人在两点之间进行速度和加速度的插补,实现更加平滑的运动。
3、SCUR(Scaled Curvilinear):这个指令可以让机器人在两点之间进行曲线插补。
SCUR指令可以让机器人在两点之间进行速度和加速度的插补,实现更加平滑的运动。
4、STOP:停止指令用于停止机器人的运动。
当执行STOP指令时,机器人会立即停止当前的运动。
三、高级命令1、MOVE_L:这是一个高级运动指令,可以让机器人在两个目标点之间进行线性插补。
与LIN指令相比,MOVE_L指令可以同时指定多个目标点,让机器人按照预设的路径进行运动。
2、MOVE_P:这是一个高级运动指令,可以让机器人在两个目标点之间进行曲线插补。
与SCUR指令相比,MOVE_P指令可以同时指定多个目标点,让机器人按照预设的路径进行运动。
3、ARC:这是一个高级运动指令,可以让机器人在两个目标点之间进行圆弧插补。
ARC指令可以让机器人在两点之间进行速度和加速度的插补,实现更加平滑的运动。
4、JMP(Jump):这是一个高级控制指令,可以让机器人在两个目标点之间进行跳跃式运动。
JMP指令需要指定起始位置、目标位置和跳跃高度等参数,机器人会以最短路径的方式进行跳跃式运动。
四、程序结构在编写KUKA机器人程序时,需要遵循一定的程序结构。
入门教程•KUKA机器人简介•焊接基础知识•KUKA机器人焊接系统组成•KUKA机器人焊接编程基础目录•焊接工艺参数设置与调整•实际操作演练与问题解答•总结与展望KUKA机器人简介KUKA机器人发展历程早期发展KUKA机器人公司成立于1898年,早期主要从事于焊接设备和其他自动化设备的制造。
技术创新随着计算机技术和传感器技术的发展,KUKA机器人逐渐实现了数字化、智能化和网络化,成为全球领先的工业机器人制造商之一。
拓展应用领域KUKA机器人不断拓展应用领域,从最初的汽车制造领域逐步扩展到航空航天、电子、物流等多个领域。
KUKA 机器人应用领域01020304汽车制造航空航天电子产品物流领域高精度高速度高可靠性强大的编程能力KUKA机器人技术特点焊接基础知识焊接原理及分类焊接原理焊接分类常见焊接方法与特点熔化焊压力焊钎焊焊缝表面应平整、均匀,无裂纹、气孔、夹渣等缺陷。
外观质量内在质量无损检测破坏性检测焊缝内部应无裂纹、未熔合、未焊透等缺陷,且强度、韧性等力学性能应符合要求。
通过射线探伤、超声波探伤等无损检测方法对焊缝进行检测,以确保其内部质量。
通过拉伸、弯曲、冲击等破坏性试验对焊缝进行检测,以评估其力学性能和可靠性。
焊接质量评价标准KUKA机器人焊接系统组成机器人本体及控制器机器人本体控制器KUKA机器人控制器采用先进的计算机技术和运动控制技术,实现对机器人本体的精准控制,保证焊接质量和效率。
焊接电源及送丝机构焊接电源送丝机构传感器与检测装置传感器检测装置辅助设备及安全防护辅助设备KUKA机器人焊接系统还包括一些辅助设备,如焊接工装、变位机等,用于提高焊接效率和降低劳动强度。
安全防护为保障操作人员的安全和设备的正常运行,KUKA机器人焊接系统采取多重安全防护措施,如安全围栏、急停按钮、碰撞检测等。
KUKA机器人焊接编程基础编程语言及编程方式KRL编程语言编程方式离线编程软件介绍KUKA SimKUKA Sim是一款强大的离线编程软件,它可以在计算机上模拟机器人的运动轨迹和焊接过程,帮助程序员提前发现并解决潜在的问题。
KUKA焊枪设置正文:1. 概述本文档提供了KUKA焊枪设置的详细步骤和说明。
焊枪设置是KUKA的重要功能之一,它允许用户对焊接过程进行精确控制和调整。
2. 硬件安装在进行焊枪设置之前,首先需要确保以下硬件组件已经正确安装和连接:- 控制器- 焊枪- 焊接电源- 电缆和连接器3. 焊枪参数调整3.1 焊接电源设置首先,根据所需的焊接工艺和材料类型,调整焊接电源的相关参数,例如焊接电流、电压和极性等。
请参考焊接电源的用户手册获取详细的参数设置指导。
3.2 焊枪姿态设置焊枪的姿态对于焊接质量和稳定性至关重要。
通过控制器的界面,可以调整焊枪的角度、位置和姿态。
根据焊接作业的要求,进行适当的调整。
3.3 焊枪速度和力量设置焊枪的速度和力量也会影响焊接质量。
在控制器的界面上,可以设置焊枪的速度和力量参数。
通过试焊和调整,找到合适的设置值以获得理想的焊接结果。
4. 焊枪传感器设置4.1 触发传感器校准焊枪通常配备了触发传感器,用于检测焊接接触和离开。
在使用前,需要对触发传感器进行校准,确保其准确可靠地检测焊接过程中的接触状态。
4.2 焊接参数监测焊枪还可以配备其他传感器,用于监测焊接参数,例如焊接电流、电压和温度等。
根据需要,使用控制器设置这些传感器,以实时监测焊接参数并进行调整和控制。
5. 安全设置在进行焊枪设置时,务必注意安全。
首先,确保和周围环境没有危险物体和人员。
其次,根据相关法规和标准,设置安全措施,例如安全光幕、急停按钮和警示标识等。
附件:- 用户手册:KUKA焊枪设置手册.pdf法律名词及注释:- 焊接电流:指焊接过程中通过焊枪流动的电流。
- 焊接电压:指焊接过程中焊枪供应的电压。
- 极性:焊接电极的正负极性设置,根据不同焊接材料和工艺选择合适的极性。
KUKA机器人焊接程序解析CELL程序DEF CELL ()INIT;初始化(折合)CHECK HOME;检测机器人是否在HOME位置(折合)PTP HOME Vel= 100 % DEFAULT;移动到HOME位置AUTOEXT INI;外部自动初始化(折合)LOOP;此处开始LOOP循环Loop_Init ();调用初始化程序P00 (#EXT_PGNO,#PGNO_GET,DMY[],0 );请求程序号SWITCH PGNO;此处为SWITCH…CASE语句,进行程序号选择CASE 1P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求AC_WELD ();调用AC车型的焊接程序CASE 2P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求AD_WELD ();调用AD车型的焊接程序CASE 3P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求AF_WELD ();调用AF车型的焊接程序CASE 4P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求A68_WELD ();调用A68车型的焊接程序CASE 5P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求A28_WELD ();调用A28车型的焊接程序CASE 29P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求Tipdress_GunX1 ();调用修磨程序CASE 31P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求Tipchange_GunX1 ();调用换帽程序DEFAULT;若请求到的程序号无以上数值,则执行词句,程序即在词句无限循环P00 (#EXT_PGNO,#PGNO_FAULT,DMY[],0 );复位程序号请求ENDSWITCHENDLOOPENDA2_WELD程序DEF A28_WELD()INI;初始化(折合)USER INI;用户初始化(折合);Work_Start (1)A28_Weld1_GunC1 ();调用焊接程序1(定点焊接)A28_Weld2_GunC1 ();调用焊接程序2(空中焊接);Work_End (1)ENDA2_Weld1_GunX1程序DEF A28_Weld1_GunC1()INI;初始化(折合)BASISTECH INI;初始化基坐标参数(折合)USER INI;用户初始化(折合)VALID_HOME ();调用子程序,检测当前机器人是否在HOME位置VALID_FRAME ();调用子程序,检测坐标是否可用VALID_DATA ();调用子程序,参数正确检查PTP HOME Vel=100 % PDAT4;移动到HOME位置SEGMENT=1;机器人进入程序(发给PLC)PTP P59 CONT Vel=100 % PDAT76 Tool[1]:C_GUN1 Base[5]:A28_BASEREQ_CONTINUE ();调用“请求继续运行”子程序SEGMENT=50;进入点定焊接程序(发给PLC)$timer[1]=0;计时器1清零$timer_stop[1]=FALSE;计时器1开始计时PTP P26 CONT Vel=100 % PDAT37 Tool[1]:C_GUN1 Base[5]:A28_BASE PTP P27 CONT Vel=100 % PDAT38 Tool[1]:C_GUN1 Base[5]:A28_BASE PTP P28 CONT Vel=100 % PDAT39 Tool[1]:C_GUN1 Base[5]:A28_BASE(1) (2) (3) (4) (5) (6) (7)PTP SG0000010 Vel=100 % PDAT42 ProgNr=81 ServoGun=1 Cont=CLS OPN (1) (2) (3) (4) (5) (6) (7)Part=3mm Force=3.2 kN Tool[1]:C_GUN1 Base[5]:A28_BASE(8) (9) (10) (11)PTP P31 CONT Vel=100 % PDAT43 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P32 CONT Vel=100 % PDAT44 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000011 Vel=100 % PDAT45 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P33 CONT Vel=100 % PDAT46 Tool[1]:C_GUN1 Base[5]:A28_BASE;ENTER ZONE 5 WITH R2;对下句调用的注释ENTER_ZONE (5);进入干涉区5PTP P34 CONT Vel=100 % PDAT47 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000012 Vel=100 % PDAT50 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P37 CONT Vel=100 % PDAT51 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P40 CONT Vel=100 % PDAT54 Tool[1]:C_GUN1 Base[5]:A28_BASE;LEAVE ZONE 5 WITH R2;对下句调用的注释CLOSE_ZONE (5);离开干涉区5PTP P41 CONT Vel=100 % PDAT55 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000014 Vel=100 % PDAT58 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P43 CONT Vel=100 % PDAT59 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P2 CONT Vel=100 % PDAT2 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P44 CONT Vel=100 % PDAT60 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P45 CONT Vel=100 % PDAT61 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000015 Vel=100 % PDAT66 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P50 CONT Vel=100 % PDAT67 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P51 CONT Vel=100 % PDAT68 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P52 CONT Vel=100 % PDAT69 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP lpd28 CONT Vel=100 % P_OLP3 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000001 Vel=100 % PDAT9 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP lpd30 CONT Vel=100 % P_OLP6 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P4 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP HOME1 Vel=100 % PDAT17;到达HOME1位置,此为定义的第二个HOME位(库卡机器人最多可以定义6个HOME位置)$timer_stop[1]=TRUE;计时器1停止计时REQ_CONTINUE ();调用“请求继续运行”子程序SEGMENT=55;机器人进入空中焊接程序(发给PLC)ENDA2_Weld2_GunC1程序DEF A28_Weld2_GunC1()INI;初始化(折合)PTP HOME1 Vel=100 % PDAT19;home1位置SEGMENT=55;机器人进入空中焊接程序(发给PLC)$timer[2]=0;计时器2清零$timer_stop[2]=FALSE;计时器2开始计时PTP P2 CONT Vel=100 % PDAT2 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p16 CONT Vel=100 % PDAT23 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P1 CONT Vel=100 % PDAT1 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P3 CONT Vel=100 % PDAT3 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000001 Vel=100 % PDAT5 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P5 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000007 Vel=100 % PDAT24 ProgNr=29 ServoGun=1 Cont=CLS OPN Part=2.1 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P6 CONT Vel=100 % PDAT7 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000008 Vel=100 % PDAT25 ProgNr=90 ServoGun=1 Cont=CLS OPN Part=4.1 mm Force=3.3 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000009 Vel=100 % PDAT26 ProgNr=90 ServoGun=1 Cont=CLS OPN Part=4.1 mm Force=3.3 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P8 CONT Vel=100 % PDAT9 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p15 CONT Vel=100 % PDAT22 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p17 CONT Vel=100 % PDAT27 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p18 CONT Vel=100 % PDAT28 Tool[1]:C_GUN1 Base[5]:A28_BASE$timer_stop[2]=TRUE;计时器2停止计时REQ_CONTINUE ();调用“请求继续运行”子程序SEGMENT=62;机器人准备进入下循环的焊接SEGMENT=63;机器人准备进入下循环的焊接PTP HOME Vel= 100 % DEFAULTENDTipDress_GunC1程序DEF TipDress_GunC1()INI;初始化(折合)Work_Start(7);调用子程序,工作启动PTP HOME Vel= 100 % DEFAULT;原点位置SEGMENT=4;机器人进入修磨程序(发给PLC)PTP P1 CONT Vel=100 % PDAT1 Tool[1]:C_GUN1 Base[0]PTP P3 CONT Vel=100 % PDAT3 Tool[1]:C_GUN1 Base[0]PTP P2 CONT Vel=100 % PDAT2 Tool[1]:C_GUN1 Base[0]Full_Speed();调用子程序,设置机器人速度为全速LIN P11 CONT Vel=2 m/s CPDAT5 Tool[1]:C_GUN1 Base[0]TD_Start();调用子程序,启动修磨器转动TD_TIME=1.5;设置修磨时间为1.5秒LIN TIPDRESS Vel=2 m/s CPDAT4 TipDress ProgNr=1 ServoGun=1 Part=5 mm Force=1.5 kN Tool[1]:C_GUN1 Base[0];修磨位置TD_Stop();调用子程序,停止修磨器转动LIN P12 CONT Vel=2 m/s CPDAT6 Tool[1]:C_GUN1 Base[0]LIN P6 Vel=2 m/s CPDAT3 Tool[1]:C_GUN1 Base[0]PTP P7 CONT Vel=100 % PDAT5 Tool[1]:C_GUN1 Base[0]INIT ServoGun=1 Same;修磨后初始化电极,进行补偿Previous_Speed ();调用子程序,使机器人从100%的速度返回到原来设置的速度PTP P8 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[0]PTP P9 CONT Vel=100 % PDAT7 Tool[1]:C_GUN1 Base[0]PTP HOME Vel= 100 % DEFAULT;回到原点位置OUT 47 ' TipDress_Comp1' State=TRUE ;置位修磨完成信号Work_END(7);调用子程序,工作终止OUT 47 ' TipDress_Comp1' State=FALSE ;复位修磨完成信号ENDTipChange_GunC1程序DEF TipChange_GunC1()INI;初始化(折合)Work_Start(8);调用子程序,工作启动PTP HOME Vel= 100 % DEFAULT;原点位置SEGMENT=2;机器人进入维修程序(发给PLC)PTP P7 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[0]PTP P8 CONT Vel=100 % PDAT7 Tool[1]:C_GUN1 Base[0]PTP P9 CONT Vel=100 % PDAT8 Tool[1]:C_GUN1 Base[0]OUT 38 'Service_Position' State=TRUE ;置位服务位置信号REQ_CONTINUE ();调用“请求继续运行”子程序OUT 38 'Service_Position' State=FALSE ;复位服务位置信号IF $IN[40] THEN;如果“更换电极帽完成”信号存在,则继续执行PTP P13 CONT Vel=100 % PDAT12 Tool[1]:C_GUN1 Base[0]Full_Speed();调用子程序,设置机器人速度为全速INIT ServoGun=1 New;新电极帽的初始化TC_Reset();调用子程序,电极复位Zero_Point_Copy ();调用子程序,判断电极是否达到最大修磨量PTP P5 CONT Vel=100 % PDAT5 Tool[1]:C_GUN1 Base[0]LIN P17 CONT Vel=2 m/s CPDAT2 Tool[1]:C_GUN1 Base[0]TD_Start();调用子程序,启动修磨器转动TD_TIME=1.5;设置修磨时间为1.5秒LIN TIPDRESS Vel=2 m/s CPDAT4 TipDress ProgNr=1 ServoGun=1 Part=5 mm Force=1.5 kN Tool[1]:C_GUN1 Base[0]LIN P16 CONT Vel=2 m/s CPDAT1 Tool[1]:C_GUN1 Base[0]TD_Stop();调用子程序,停止修磨器转动LIN P6 Vel=2 m/s CPDAT0 Tool[1]:C_GUN1 Base[0]INIT ServoGun=1 Same;修磨后初始化电极,进行补偿Previous_Speed();调用子程序,使机器人从100%的速度返回到原来设置的速度ENDIFSEGMENT=3;机器人退出修磨程序(发给PLC)PTP P11 CONT Vel=100 % PDAT10 Tool[1]:C_GUN1 Base[0]PTP P12 CONT Vel=100 % PDAT11 Tool[1]:C_GUN1 Base[0]PTP HOME Vel= 100 % DEFAULTWork_END(8);调用子程序,工作停止ENDDEF LSB010_WE_L2_data( )ENDVALID_HOME;检测HOME位的数据global DEF VALID_HOME()E6AXIS VALID_HOMEVALID_HOME={A1 -46.5159492,A2 -122.549797,A3 148.406601,A4 0.00109880499,A5 64.1413269,A6 -53.1286888,E1 -97.7747269,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} ;可用的HOME位的坐标值WAIT FOR XHOME.A1==VALID_HOME.A1WAIT FOR XHOME.A2==VALID_HOME.A2WAIT FOR XHOME.A3==VALID_HOME.A3WAIT FOR XHOME.A4==VALID_HOME.A4WAIT FOR XHOME.A5==VALID_HOME.A5WAIT FOR XHOME.A6==VALID_HOME.A6;把现在的HOME位置与可用的HOME位置进行比较(现在的HOME位置保存在Config.dat中)ENDVALID_FRAME;检测坐标系数据(Root, Base, Tool)global DEF VALID_FRAME()FRAME VALID_ROOTFRAME VALID_BASE[32]FRAME VALID_TOOL[16]VALID_ROOT={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}WAIT FOR $ROBROOT.X==VALID_ROOT.XWAIT FOR $ROBROOT.Y==VALID_ROOT.YWAIT FOR $ROBROOT.Z==VALID_ROOT.ZWAIT FOR $ROBROOT.A==VALID_ROOT.AWAIT FOR $ROBROOT.B==VALID_ROOT.BWAIT FOR $ROBROOT.C==VALID_ROOT.C;把现在的世界坐标位置与可用的坐标位置进行比较(现在的世界坐标位置保存在Config.dat中)VALID_TOOL[1]={X -200.0,Y 0.00999999978,Z 919.0,A 180.0,B 0.0,C 180.0} WAIT FOR TOOL_DATA[1].X==VALID_TOOL[1].XWAIT FOR TOOL_DATA[1].Y==VALID_TOOL[1].YWAIT FOR TOOL_DATA[1].Z==VALID_TOOL[1].ZWAIT FOR TOOL_DATA[1].A==VALID_TOOL[1].AWAIT FOR TOOL_DATA[1].B==VALID_TOOL[1].BWAIT FOR TOOL_DATA[1].C==VALID_TOOL[1].C;把现在的工具坐标位置与可用的坐标位置进行比较(现在的工具坐标位置保存在Config.dat中)WAIT FOR TOOL_TYPE[1]==#BASEVALID_BASE[1]={X 1277.27405,Y -439.797485,Z 632.609924,A 90.0454025,B 0.0703999996,C 89.867897}WAIT FOR BASE_DATA[1].X==VALID_BASE[1].XWAIT FOR BASE_DATA[1].Y==VALID_BASE[1].YWAIT FOR BASE_DATA[1].Z==VALID_BASE[1].ZWAIT FOR BASE_DATA[1].A==VALID_BASE[1].AWAIT FOR BASE_DATA[1].B==VALID_BASE[1].BWAIT FOR BASE_DATA[1].C==VALID_BASE[1].C;把现在的基坐标位置与可用的坐标位置进行比较(现在的基坐标位置保存在Config.dat中)WAIT FOR BASE_TYPE[1]==#BASEENDVALID_DATA;检测可用的数据(此数据为系统配置,不作详细解析)global DEF VALID_DATA()WAIT FOR EG_NON_KUKA_DRESS==TRUEWAIT FOR $COLL_ENABLECAV==TRUEWAIT FOR $CHCK_MOVENA==TRUEWAIT FOR CHECK_HOME==TRUEWAIT FOR $OUT[37]==TRUEWAIT FOR PGNO_TYPE==1WAIT FOR REFLECT_PROG_NR==1WAIT FOR PGNO_FBIT==4WAIT FOR PGNO_FBIT_REFL==4WAIT FOR PGNO_LENGTH==6WAIT FOR PGNO_REQ==10WAIT FOR PGNO_VALID==10WAIT FOR APPL_RUN==12WAIT FOR EG_GUN_TYP[1]==2WAIT FOR EG_DIRECTION_OF_TIPWEAR[1]==#PZWAIT FOR EG_TIP_CORRECTION==TRUEWAIT FOR EG_PART_CONTROL==TRUEWAIT FOR EG_EQ_ACTIVE==TRUEIF $EXT AND (NOT $IN[15])THENWAIT FOR EG_NO_PART_IN==1026ENDIFIF $EXT AND (NOT $IN[42])THENWAIT FOR EG_TIMER_TYP==2ENDIFENDCHECK_HOME1;检测可用的HOME1位置global DEF CHECK_HOME1()E6AXIS VALID_HOME1VALID_HOME1={A1 -43.6800194,A2 -123.675797,A3 147.271103,A4 0.00200690911,A5 66.4055862,A6 -56.4421997,E1 -97.7750015,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} ;可用的HOME1位置WAIT FOR XHOME1.A1==VALID_HOME1.A1WAIT FOR XHOME1.A2==VALID_HOME1.A2WAIT FOR XHOME1.A3==VALID_HOME1.A3WAIT FOR XHOME1.A4==VALID_HOME1.A4WAIT FOR XHOME1.A5==VALID_HOME1.A5WAIT FOR XHOME1.A6==VALID_HOME1.A6;把现在的HOME1位置与可用的HOME1位置进行比较(现在的HOME1位置保存在Config.dat中)WAIT FOR $OUT[39]==TRUE;等待HOME1位置的输出信号ENDVALID_WEAR;检测电极磨损数据global DEF VALID_WEAR()IF(EG_WEAR[1]<=-2) OR (EG_WEAR[1]>=16) OR (EG_WEAR_FLEX[1]<=-1) OR(EG_WEAR_FLEX[1]>=8) OR (EG_WEAR_FIX[1]<=-1) OR (EG_WEAR_FIX[1]>=8)THEN $cycflag[4]=true;置位循环标识位4ELSE$cycflag[4]=falseENDIFIF EG_WORN[1] OR $CYCFLAG[4] THEN$OUT[51]=TRUE;如果达到最大修磨量或循环标识位4为1,则置位“请求换电极帽1”信号ELSE$OUT[51]=FALSEENDIFIF(EG_WEAR[2]<=-4) OR (EG_WEAR[2]>=16) OR (EG_WEAR_FLEX[2]<=-2) OR(EG_WEAR_FLEX[2]>=8) OR (EG_WEAR_FIX[2]<=-2) OR (EG_WEAR_FIX[2]>=8)THEN $cycflag[9]=true;置位循环标识位9ELSE$cycflag[9]=falseENDIFIF EG_WORN[2] OR $CYCFLAG[9] THEN$OUT[52]=TRUE;如果达到最大修磨量或循环标识位9为1,则置位“请求换电极帽2”信号ELSE$OUT[52]=FALSEENDIFENDVALID_TIP;检测可用的电极global DEF VALID_TIP()IF(Wear_copy1>=4)THENMsgNotify("WRONG TIP,PLS CHECK !");如果电极修磨量>=4,则在示教器上显示出报警信息WAIT FOR(Wear_copy1<=4)ENDIFENDZero_Point_Copy;检测电极帽的余量GLOBAL DEF Zero_Point_Copy()SWITCH EG_EXTAX_ACTIVECASE 1Wear_Copy1=EG_WEAR[EG_EXTAX_ACTIVE]CASE 2Wear_Copy2=EG_WEAR[EG_EXTAX_ACTIVE]ENDSWITCHIF Wear_Copy1>4 THEN$OUT[201]=TRUE;枪1电极达到最大修磨量ELSE$OUT[201]=FALSEENDIFIF Wear_Copy2>4 THEN$OUT[202]=TRUE;枪2电极达到最大修磨量ELSE$OUT[202]=FALSEENDIFENDCheck_Tip;检测修磨或换帽请求global DEF Check_Tip(index :IN )INT indexSWITCH indexCASE 1IF $IN[47] THEN; Tipdress1( )ENDIFCASE 2IF $IN[48] THEN; Tipdress2( )ENDIFCASE 3IF $IN[40] THEN; Tipchange1( )ENDIFCASE 4IF $IN[41] THEN; Tipchange2( )ENDIFENDSWITCHENDTool_Number;激活工具号global DEFFCT INT Tool_Number()DECL INT tool_numberif($in[97] and not $in[98] and $in[99])then if(not $in[115] and $in[116])thenwait for eg_extax_active==1wait for $ASYNC_EX_AX_DECOUPLE=='B0010'tool_number=1;激活工具号1elseif($in[115] and not $in[116])thenwait for eg_extax_active==2wait for $ASYNC_EX_AX_DECOUPLE=='B0001'tool_number=2;激活工具号2endifendifelsewait for(not $in[97] and $in[98] and not $in[99] and $in[115] and $in[116]) wait for $ASYNC_EX_AX_DECOUPLE=='B0011'tool_number=10;激活工具号10endifwait for(tool_number==1) or (tool_number==2) or (tool_number==10)return tool_numberENDFCTChange_Gun;切换焊枪;----------------------------------------;Get Desired Gun;----------------------------------------global DEF Change_Gun (index :IN )INT indexSWITCH indexCASE 1IF Tool_Number ()<>1 THENIF Tool_Number ()==2 THENWAIT FOR $OUT[37]wait for $in[27];drop_gun2 ( );调用子程序,放下枪2;pick_gun1 ( );调用子程序,抓起枪1ENDIFENDIFWAIT FOR Tool_Number ()==1CASE 2IF Tool_Number ()<>2 THENIF Tool_Number ()==1 THENWAIT FOR $OUT[37]wait for $in[27];drop_gun1 ( );调用子程序,放下枪1;pick_gun2 ( );调用子程序,抓起枪2 ENDIFENDIFWAIT FOR Tool_Number ()==2 ENDSWITCHENDCheck_with_Gun;检测是否是需要的焊枪global DEF Check_with_Gun (index :IN ) INT indexSWITCH indexCASE 1WAIT FOR Tool_Number ()==1CASE 2WAIT FOR Tool_Number ()==2CASE 10WAIT FOR Tool_Number ()==10 ENDSWITCHENDOpen_Cover;打开防尘罩global DEF Open_Cover (index :IN )INT indexSWITCH indexCASE 1$OUT[113]=FALSE$OUT[114]=TRUECASE 2$OUT[114]=FALSE$OUT[113]=TRUEENDSWITCHENDOpen_Cover_Check;打开防尘罩检测global DEF Open_Cover_Check (index :IN ) INT indexSWITCH indexCASE 1WAIT FOR( NOT $IN[113] AND $IN[114] ) $OUT[113]=FALSE$OUT[114]=FALSECASE 2WAIT FOR( $IN[113] AND NOT $IN[114] ) $OUT[113]=FALSE$OUT[114]=FALSEENDSWITCHENDTool_in_Stand;工具在架台上global DEF Tool_in_Stand (index :IN ) INT indexSWITCH indexCASE 1WAIT FOR $IN[115]CASE 2WAIT FOR $IN[116]ENDSWITCHENDStand_Empty;架台上无工具global DEF Stand_Empty (index :IN )INT indexSWITCH indexCASE 1WAIT FOR NOT $IN[115]CASE 2WAIT FOR NOT $IN[116]ENDSWITCHENDTool_Present;检测机器人上携带着工具global DEF Tool_Present()WAIT FOR $IN[99]ENDTool_Unpresent;检测机器人上没携带着工具global DEF Tool_Unpresent()WAIT FOR NOT $IN[99]ENDTool_Lock;工具锁紧global DEF Tool_Lock()wait for $in[99]$OUT[97]=FALSE$OUT[98]=TRUEWAIT FOR($IN[97] AND NOT $IN[98] AND $IN[99]) $OUT[97]=FALSE$OUT[98]=FALSEENDTool_Unlock;工具解锁global DEF Tool_Unlock()$OUT[98]=FALSE$OUT[97]=TRUEWAIT FOR(NOT $IN[97] AND $IN[98])$OUT[97]=FALSE$OUT[98]=FALSEENDTool_Lock_Check;工具锁紧检测global DEF Tool_Lock_Check()WAIT FOR($IN[97] AND NOT $IN[98] AND $IN[99]) ENDTool_Unlock_Check;工具解锁检测global DEF Tool_Unlock_Check()WAIT FOR(NOT $IN[97] AND $IN[98])ENDClose_Water;关闭循环水global DEF Close_Water()$OUT[45]=trueENDOpen_Water;打开循环水global DEF Open_Water() $OUT[116]=trueENDWait_Water_OK;等待水流正常global DEF Wait_Water_OK()wait for $in[50]$OUT[116]=false$OUT[45]=falseENDWait_Gate_OK;等待安全门正常global DEF Wait_Gate_OK()wait for $in[27]$OUT[27]=falseENDDEF Library ( )ENDInit;机器人初始化global DEF Init()SEGMENT=0VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()$OUT[17]=TRUE$OUT[18]=TRUE$OUT[19]=TRUE$OUT[20]=TRUE$OUT[21]=TRUE$OUT[22]=TRUE$OUT[23]=TRUE$OUT[24]=TRUE$OUT[25]=TRUE$OUT[26]=TRUE$OUT[27]=TRUE$OUT[28]=TRUE$OUT[EG_NOCURRENT_OUT[EG_EXTAX_ACTIVE]]=TRUE$OUT[EG_Timer_Ready_Out]=TRUEPULSE($OUT[EG_QUIT_OUT[EG_EXTAX_ACTIVE]], TRUE,0.5)$OUT[29]=FALSE$OUT[38]=FALSE$OUT[47]=FALSE$OUT[79]=FALSE$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSE$OUT[Deposition_Out]=FALSEAPPL_RUN_FLAG=FALSETD_HALT_FLAG=FALSEFull_Speed_REQ=FALSEENDLoop_Init;LOOP循环初始化global DEF Loop_Init()VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()SEGMENT=0$OUT[38]=FALSE$OUT[47]=FALSE$OUT[79]=FALSE$OUT[Deposition_Out]=FALSEAPPL_RUN_FLAG=FALSETD_HALT_FLAG=FALSEFull_Speed_REQ=FALSEIF $IN[EG_ERROR_IN[EG_EXTAX_ACTIVE]] OR $IN[EG_ALARM_IN] OR NOT $IN[EG_TIMER_READY_IN[EG_EXTAX_ACTIVE]] THENPULSE($OUT[EG_QUIT_OUT[EG_EXTAX_ACTIVE]], TRUE,0.5)ENDIFIF $OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]] AND$IN[EG_TIMER_READY_IN[EG_EXTAX_ACTIVE]] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFENDWork_Start;工作启动global DEF Work_Start(Job :IN )INT Job;定义Job为整型变量SWITCH Job;进入SWITCH…CASE循环CASE 1,2,5VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()VALID_TIP()I[1]=0;复位枪1的循环焊接计数$CYCFLAG[1]=FALSE;复位循环标识器1I[6]=0;复位枪2的循环焊接计数$CYCFLAG[6]=FALSE;复位循环标识器6$OUT[25]=FALSE$OUT[26]=FALSE$Timer_Stop[1]=TRUE;计时器1停止计时$Timer[1]=0;计时器1清零$Timer_Stop[1]=FALSE;计时器1开始计数CASE 7SWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000','B0010'WAIT FOR NOT $OUT[51]CASE 'B0001'WAIT FOR NOT $OUT[52] ENDSWITCH……………………………………………………………………;此处为嵌套的SWITCH…CASE循环VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()VALID_TIP()Before_TW()$OUT[47]=FALSE$OUT[48]=FALSECASE 8VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()VALID_TIP()Before_TW()$OUT[40]=FALSE$OUT[41]=FALSEENDSWITCHENDWork_End;工作结束global DEF Work_End(Job :IN )DECL STATE_T STATEINT OFFSETINT JobCHAR ActNr[10]SWITCH JobCASE 1,2,5WAIT FOR $OUT[37]==TRUE;等待HOME位置信号$Timer_Stop[1]=TRUE;计时器1停止计时IF($EXT AND NOT $IN[Dry_Run_In] AND NOT $IN[Weld_Off_In])THEN SWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000'if I[1]>=Gun1_Spot[Job] then$cycflag[1]=trueelse$cycflag[1]=falseendifif I[2]>=TD1_Spot then$cycflag[2]=trueelse$cycflag[2]=falseendifif I[3]>=TC1_Spot then$cycflag[3]=trueelse$cycflag[3]=falseendifIF NOT $CYCFLAG[1] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",Gun1_Spot[Job]-I[1])MsgDialog(Answer,"Warnning %1 Spot Without Weld-End Signal, SetCycle-Complete Signal to PLC?","GAMC", ActNr[],,,,,,"NO","YES") WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFIF $CYCFLAG[2] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",TD1_Spot-I[2])MsgDialog(Answer,"Warnning %1 Spot Outof TD1_Spot Setting ! Please Check the Gun1 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFCASE 'B0010','B0001'if I[1]>=Gun1_Spot[Job] then$cycflag[1]=trueelse$cycflag[1]=falseendifif I[2]>=TD1_Spot then$cycflag[2]=trueelse$cycflag[2]=falseendifif I[3]>=TC1_Spot then$cycflag[3]=trueelse$cycflag[3]=falseendifif I[6]>=Gun2_Spot[Job] then$cycflag[6]=trueelse$cycflag[6]=falseendifif I[7]>=TD2_Spot then$cycflag[7]=trueelse$cycflag[7]=falseendifif I[8]>=TC2_Spot then$cycflag[8]=trueelse$cycflag[8]=falseendifIF(NOT $CYCFLAG[1]) OR (NOT $CYCFLAG[6])THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",(Gun1_Spot[Job]-I[1])+(Gun2_Spot[Job]-I[6]))MsgDialog(Answer,"Warnning %1 Spot Outof TD1_Spot Setting ! Please Check the Gun1 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFIF $CYCFLAG[2] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",TD1_Spot-I[2])MsgDialog(Answer,"Warnning %1 Spot Outof TD1_Spot Setting ! Please Check the Gun1 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFIF $CYCFLAG[7] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",TD2_Spot-I[7])MsgDialog(Answer,"Warnning %1 Spot Outof TD2_Spot Setting ! Please Check the Gun2 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFENDSWITCHENDIF$OUT[25]=TRUE$OUT[26]=TRUE$OUT[29]=TRUEWAIT FOR $IN[31]$OUT[29]=FALSECASE 7After_TW()VALID_WEAR()WAIT FOR $OUT[37]==TRUE$OUT[130]=FALSESWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000','B0010'IF((LAST_WEAR_FLEX1[TW1_Index]+LAST_WEAR_FIX1[TW1_Index])<=TW1_Min) OR ((LAST_WEAR_FLEX1[TW1_Index]+LAST_WEAR_FIX1[TW1_Index])>=TW1_Max)THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%f",(LAST_WEAR_FLEX1[TW1_Index]+LAST_WEAR_FIX1[TW1_Index]))MsgDialog(Answer,"Last_Wear[1] = %1 (mm), Please CheckTipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFPULSE($OUT[47], TRUE,1.0)CASE 'B0001'IF((LAST_WEAR_FLEX2[TW2_Index]+LAST_WEAR_FIX2[TW2_Index])<=TW2_Min) OR ((LAST_WEAR_FLEX2[TW2_Index]+LAST_WEAR_FIX2[TW2_Index])>=TW2_Max)THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%f",(LAST_WEAR_FLEX2[TW2_Index]+LAST_WEAR_FIX2[TW2_Index]))MsgDialog(Answer,"Last_Wear[2] = %1 (mm), Please CheckTipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFPULSE($OUT[48], TRUE,1.0)ENDSWITCHCASE 8EG_WORN[1]=FALSEAfter_TW()VALID_WEAR()WAIT FOR $OUT[37]==TRUE$OUT[130]=FALSE$OUT[38]=FALSESWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000','B0010'PULSE($OUT[40], TRUE,1.0)CASE 'B0001'PULSE($OUT[41], TRUE,1.0)ENDSWITCHENDSWITCHENDEnter_Zone;进入干涉区global DEF Enter_Zone (Zone :IN )INT ZoneSWITCH Zone$OUT[17]=FALSE;复位“干涉区1”信号WAIT FOR $IN[17]CASE 2$OUT[18]=FALSE;复位“干涉区2”信号WAIT FOR $IN[18]CASE 3$OUT[19]=FALSE;复位“干涉区3”信号WAIT FOR $IN[19]CASE 4$OUT[20]=FALSE;复位“干涉区4”信号WAIT FOR $IN[20]CASE 5$OUT[21]=FALSE;复位“干涉区5”信号WAIT FOR $IN[21]CASE 6$OUT[22]=FALSE;复位“干涉区6”信号WAIT FOR $IN[22]CASE 7$OUT[23]=FALSE;复位“干涉区7”信号WAIT FOR $IN[23]CASE 8$OUT[24]=FALSE;复位“干涉区8”信号WAIT FOR $IN[24]CASE 9$OUT[25]=FALSE;复位“干涉区9”信号WAIT FOR $IN[25]CASE 10$OUT[26]=FALSE;复位“干涉区10”信号WAIT FOR $IN[26]CASE 11$OUT[27]=FALSE;复位“干涉区11”信号WAIT FOR $IN[27]$OUT[28]=FALSE;复位“干涉区12”信号WAIT FOR $IN[28]ENDSWITCHENDClose_Zone;离开干涉区global DEF Close_Zone(Zone :IN ) INT ZoneSWITCH ZoneCASE 1WAIT SEC 0$OUT[17]=TRUE;置位“干涉区1”信号CASE 2WAIT SEC 0$OUT[18]=TRUE;置位“干涉区2”信号CASE 3WAIT SEC 0$OUT[19]=TRUE;置位“干涉区3”信号CASE 4WAIT SEC 0$OUT[20]=TRUE;置位“干涉区4”信号CASE 5WAIT SEC 0$OUT[21]=TRUE;置位“干涉区5”信号CASE 6WAIT SEC 0$OUT[22]=TRUE;置位“干涉区6”信号CASE 7WAIT SEC 0$OUT[23]=TRUE;置位“干涉区7”信号CASE 8WAIT SEC 0$OUT[24]=TRUE;置位“干涉区8”信号CASE 9WAIT SEC 0$OUT[25]=TRUE;置位“干涉区9”信号CASE 10WAIT SEC 0$OUT[26]=TRUE;置位“干涉区10”信号CASE 11WAIT SEC 0$OUT[27]=TRUE;置位“干涉区11”信号CASE 12WAIT SEC 0$OUT[28]=TRUE;置位“干涉区12”信号ENDSWITCHENDSafe_Condition;检测安全条件global DEF Safe_Condition()IF $EXT THENIF(NOT $ALARM_STOP)OR (NOT $USER_SAF)OR (NOT $PERI_RDY)OR (NOT $ON_PATH) THENSafe_Speed_REQ=TRUEELSESafe_Speed_REQ=FALSEENDIFENDIFENDSafe_Speed;安全速度global DEF Safe_Speed()if $EXT and $PERI_RDY and $PRO_ACT and Safe_Speed_REQ thenSafe_Speed_REQ=FALSEif($OV_PRO>=50) and ($OV_PRO<=100)thenif(PRE_OV_PRO==0)or ($OV_PRO==50)or($OV_PRO==75)or ($OV_PRO==100)then PRE_OV_PRO=$OV_PROendif$OV_PRO=20$timer_stop[11]=true$timer[11]=0$timer_stop[11]=falseelseif($OV_PRO==20) or ($OV_PRO==40)then$timer_stop[11]=true$timer[11]=0$timer_stop[11]=falseelsePRE_OV_PRO=0$timer_stop[11]=true$timer[11]=100endifendifendifif$EXT and (PRE_OV_PRO>=0)and (PRE_OV_PRO<=100)and ($timer[11]>=5000)then if($OV_PRO==20) or ($OV_PRO==40) or ($OV_PRO==60) or ($OV_PRO==80)then if($OV_PRO<=PRE_OV_PRO) and $PRO_MOVE thenif $OV_PRO+20<PRE_OV_PRO then$OV_PRO=$OV_PRO+20$timer_stop[11]=true$timer[11]=0$timer_stop[11]=falseelse$OV_PRO=PRE_OV_PROPRE_OV_PRO=0$timer_stop[11]=true$timer[11]=101endifendifelsePRE_OV_PRO=0$timer_stop[11]=true$timer[11]=102endifendifENDFull_Speed;设置全速运行global DEF Full_Speed()Full_Speed_REQ=TRUE;置位“全速请求”信号if $EXT and ($OV_PRO<>100)then;如果在外部自动状态且程序运行的速度不是100%,则继续if PRE_OV_PRO==0 thenPRE_OV_PRO=$OV_PRO;如果PRE_OV_PRO的值为0,则把程序运行的速度值赋值给PRE_OV_PRO endif$OV_PRO=100;程序运行的速度设置为100%endifENDPrevious_Speed;从全速返回到之前的速度global DEF Previous_Speed()if $EXT and ($OV_PRO==100) and (PRE_OV_PRO>0) and (PRE_OV_PRO<=100)then $OV_PRO=PRE_OV_PRO;变量PRE_OV_PRO中的速度值赋值给程序运行的速度PRE_OV_PRO=0endifFull_Speed_REQ=FALSE;复位“全速请求”信号ENDSpeed_Control;从PLC对速度进行控制global DEF Speed_Control()IF $EXT AND ($OV_PRO>0) AND ($OV_PRO<=100) AND (NOT Full_Speed_REQ) AND (Speed_In<>Speed_Out)THENSWITCH Speed_InCASE 0$OV_PRO=0Speed_Out=0;“Speed_In”为0时,程序执行的速度为0CASE 1$OV_PRO=30Speed_Out=1;“Speed_In”为1时,程序执行的速度为30%CASE 2$OV_PRO=70Speed_Out=2;“Speed_In”为2时,程序执行的速度为70%CASE 3$OV_PRO=100Speed_Out=3;“Speed_In”为3时,程序执行的速度为100%DEFAULT$OV_PRO=0Speed_Out=0ENDSWITCHENDIFENDPRO_Monitor;程序监控,避免不可用的程序执行global DEF PRO_Monitor()IF $OUT[APPL_RUN] THENAPPL_RUN_FLAG=TRUEENDIFIF $EXT AND $PRO_ACT AND $PRO_MOVE AND NOT $STOPMESS THENIF(NOT $OUT[APPL_RUN]) AND (NOT APPL_RUN_FLAG)THEN$OV_PRO=0MsgQuit("The Running Program Does not Start from CELL, PleaseCheck!!!","GAMC")ENDIFENDIFENDWeld_Mode;焊接模式global DEF Weld_Mode()$OUT[Weld_Off_Out]=NOT $FLAG[2];发给PLC的焊接模式信号$OUT[Timer_Ready_to_PLC]=$IN[EG_TIMER_READY_IN[EG_EXTAX_ACTIVE]];发给PLC的“焊接控制器准备好”信号IF $EXT THEN$FLAG[1]=NOT $IN[Dry_Run_In]$FLAG[2]=NOT $IN[Weld_Off_In]ENDIFIF $FLAG[1] THENEG_NO_PART_IN=1026。