完整的VAL3程序
来源:互联网 发布:网络上db是什么意思 编辑:程序博客网 时间:2024/05/17 06:34
start()
begin //延时10秒 delay(5) //初始化变量 call init() //清空原有运动堆栈 resetMotion() //建立上电任务 taskCreate "robotpower",100,robotpower() wait(isPowered()) //建立生产任务 taskCreate "ProductionCycle",10,ProductionCycle() //建立安全区域检测任务 taskCreate "CheckSafeArea",10,CheckSafeArea() //建立屏幕刷新任务 taskCreate "HMI",80,HMI() // //end
init()
begin _bPartReverse=false _bPartRight=false _bCheckArrived=false _bStartCheck=false _bSyncErr=false doERobotDone=false doEhome=false doERobotError=false open(tGripper) _nDifY=0 _nItem=0 sState="已停止"end
HMI()
begin userPage()//切换到用户屏幕 cls() gotoxy(0,2) put("生产状态:") gotoxy(0,4) put("工件序号:") gotoxy(0,6) put("光电信号:") gotoxy(0,8) put("正反检测:") gotoxy(0,10) put("检测偏差:") while true //刷新生产状态 gotoxy(10,2) put(" ") gotoxy(10,2) put(sState) //刷新工件序号 gotoxy(10,4) put(" ") gotoxy(10,4) put(toString("",_nItem+1)) //刷新激光传感器信号 gotoxy(10,6) put(" ") if diFCheckSensor==true gotoxy(10,6) put("ON") else gotoxy(10,6) put("OFF") endIf //刷新正反向判断 gotoxy(10,8) put(" ") if _bPartRight gotoxy(10,8) put("正向") elseIf _bPartReverse gotoxy(10,8) put("反向") endIf //刷新检测偏差 gotoxy(10,10) put(" ") gotoxy(10,10) put(toString("0.2",_nDifY)+"mm") delay(0) endWhileend
robotpower()
begin while true //控制器在远程模式 // if (workingMode()==4 or workingMode()==1) if workingMode()==4 if !isPowered() enablePower() //控制器运行模式切换延时时间 delay(1) wait(isPowered()) endIf elseIf workingMode()==1 enablePower() //wait(isPowered()) elseIf workingMode()==2 or workingMode()==3 disablePower() doERobotDone=false endIf delay(0) endWhileend
ProductionCycle()
begin //开始回零 //wait(diEPlcReady==true or (workingMode()==1 and isPowered()and delay(2)) or doEhome==true) wait(diEPlcReady==true or doEhome==true or diEManualStart==true) doERobotDone=false sState="回原点" l_pHome=jointToPoint(tGripper,world,jHome) l_pHere=here(tGripper,world) l_pHere.trsf.z=max(l_pHere.trsf.z,50) movel(l_pHere,tGripper,mSpeedL) movej(jHome,tGripper,mSpeedL) waitEndMove() open(tGripper) doEhome=true //循环生产 while true call Pallet() delay(0) endWhileend
CheckSafeArea()
begin while true l_pHere=here(tGripper,world) if l_pHere.trsf.x>nXLimitMax or l_pHere.trsf.x<nXLimitMin or l_pHere.trsf.y>nYLimitMax or l_pHere.trsf.y<nYLimitMin // disablePower() stopMove() resetMotion() l_bAlarm=true else l_bAlarm=false endIf if l_bAlarm and !l_bLastAlarm popUpMsg("机器人超出安全工作空间!") logMsg("机器人超出安全工作空间!") endIf l_bLastAlarm=l_bAlarm //判断机器人是否在home位 l_pHome=jointToPoint(tGripper,world,jHome) if distance(l_pHere,l_pHome)<5 doEhome=true else doEhome=false endIf delay(0) endWhileend
Pallet()
begin //在进行开启/关闭阀门时 //最好是使用waitendmove()等点到位以后再使用 //wait(diEPlcDone==true) //doERobotDone=false wait(diEStart==true or diEManualStart==true) doERobotDone=false //if !isPowered() //call start() //endIf //抓放循环,5次 for _nItem=0 to 4 //运动开始 //wait(diEStart==true or workingMode()==1) //去取件 sState="取件中" l_pPickAppro=appro(pPick[_nItem],{0,0,-nPickAppro,0,0,0}) movej(l_pPickAppro,tGripper,mSpeedH) doEhome=false movel(pPick[_nItem],tGripper,mSpeedL) waitEndMove() close(tGripper) l_nMoveID=movel(l_pPickAppro,tGripper,mSpeedL) //去检测 wait(getMoveId()>l_nMoveID+0.5) sState="检测中" movej(pCheckReady,tGripper,mSpeedH) movel(pCheckStart,tGripper,mSpeedL) l_nMoveID=movel(pCheckOver,tGripper,mSpeedLL) //开始检测激光传感器状态 wait(getMoveId()>l_nMoveID) // _bStartCheck=true // wait(_bCheckArrived) // _bCheckArrived=false // do // until (diFCheckSensor==false) //传感器感应到后,停止手臂运动,清除运动指令 //检测导光条的边缘,若检测不到信号则报警 if watch(diFCheckSensor==false,3)==false sState="无导光条" doERobotError=true stopMove() resetMotion() wait(diEReset==true) doERobotError=false //PLC复位后给出回原信号,机械手回原 wait(diEPlcReady==true) doERobotDone=false doERobotError=false sState="回原点" l_pHome=jointToPoint(tGripper,world,jHome) l_pHere=here(tGripper,world) l_pHere.trsf.z=max(l_pHere.trsf.z,50) movel(l_pHere,tGripper,mSpeedL) movej(jHome,tGripper,mSpeedL) waitEndMove() open(tGripper) doEhome=true return endIf stopMove() resetMotion() //检测到导光条,外部绿灯亮 doESensor=!diFCheckSensor //delay(0.5) //计算工件Y向位置偏差 l_pHere=here(tGripper,world) _nDifY=l_pHere.trsf.y-pCheckMark.trsf.y //向上提起,判断正反向 l_pCheckRight=l_pHere //向上提起到pCheckUp的高度 l_pCheckRight.trsf.z=pCheckUp.trsf.z //向里伸入0.2mm l_pCheckRight.trsf.y=l_pHere.trsf.y+0.2 movel(l_pCheckRight,tGripper,mSpeedL) waitEndMove() //延时检测 delay(0.1) //如果光电感应不到,判断为正向,并计算调整后的放件位置 if diFCheckSensor==true _bPartRight=true _bPartReverse=false //l_pPlace=compose(pPlace[0,_nItem],fPlacePallet,{0,_nDifY,0,0,0,0}) l_pPlace=appro(pPlace[0,_nItem],{-_nDifY,0,0,0,0,0}) //否则,为反向,并计算调整后的放件位置 else _bPartRight=false _bPartReverse=true //l_pPlace=compose(pPlace[1,_nItem],fPlacePallet,{0,-_nDifY,0,0,0,0}) l_pPlace=appro(pPlace[1,_nItem],{-_nDifY,0,0,0,0,0}) endIf //向上提起,离开检测区 l_pCheckAppro=appro(l_pCheckRight,{0,0,-20,0,0,0}) movel(l_pCheckAppro,tGripper,mSpeedL) if _bPartRight l_nMoveID=movej(pCheckReady,tGripper,mSpeedH) else l_nMoveID=movej(jhomen,tGripper,mSpeedH) endIf waitEndMove() //去放件 wait(getMoveId()>l_nMoveID+0.3) sState="放件中" //外部绿灯灭 doESensor=false //去放件准备位 l_pPlaceAppro=appro(l_pPlace,{0,0,-nPlaceAppro,0,0,0}) movej(l_pPlaceAppro,tGripper,mSpeedH) //根据压入深度,计算压入点 l_pPress=appro(l_pPlace,{0,0,nPressDeepth,0,0,0}) //计算压入准备位,在压入点上方nPressAppro高,角度与放件位相同。 l_pPressAppro=appro(l_pPress,{0,0,-nPressAppro,0,0,0}) //到压入准备位,打开夹爪 movel(l_pPressAppro,tGripper,mSpeedL) waitEndMove() open(tGripper) //延时nPressDelay s,保证夹爪已打开 delay(nPressDelay) //压入卡槽 movel(l_pPress,tGripper,mSpeedL) //回准备位 l_nMoveID=movel(l_pPlaceAppro,tGripper,mSpeedL) wait(getMoveId()>l_nMoveID+0.5) _bPartReverse=false _bPartRight=false delay(0) endFor //放件完成,回原点,发送完成信号 sState="回原点" movej(jHome,tGripper,mSpeedH) waitEndMove() doERobotDone=true // delay(10)end
0 0
- 完整的VAL3程序
- 完整的动画程序
- Val3语言介绍
- 精巧完整的日历程序
- 一个完整的聊天程序
- 一个完整的聊天程序
- 功能完整的分页程序
- 完整的.net程序打包
- 一个客户端的完整程序
- ios程序的完整流程
- 程序启动的完整过程
- 一个完整的mapreduce程序
- 程序启动的完整过程
- 程序启动的完整过程
- 一个完整的猫眼程序
- 一个完整的MapReduce程序
- 时钟类的完整程序
- 求格雷码的完整程序源代码
- 在ListView、ScrollView中动态存在高度不固定的View,高度显示异常
- Java知识分类
- Swift from Scratch: Variables and Constants
- 6个Python性能优化技巧
- 使用Ambari快速部署Hadoop大数据环境
- 完整的VAL3程序
- linux(centos7)基于hadoop2.5.2安装spark1.2.1
- Android 代码proguard混淆之后的错误log查看方法
- List集合多次提交
- Hadoop Hive与Hbase关系 整合
- SVM入门(七)为何需要核函数
- 配置yum源的两种方式
- Linux下父子进程拾遗
- 推荐算法—协同过滤