完整的VAL3程序

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=falsedoERobotDone=falsedoEhome=falsedoERobotError=falseopen(tGripper)_nDifY=0_nItem=0sState="已停止"
end

HMI()

beginuserPage()//切换到用户屏幕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==truegotoxy(10,6)put("ON")elsegotoxy(10,6)put("OFF")endIf//刷新正反向判断gotoxy(10,8)put("                          ")if _bPartRightgotoxy(10,8)put("正向")elseIf _bPartReversegotoxy(10,8)put("反向")endIf//刷新检测偏差gotoxy(10,10)put("                          ")gotoxy(10,10)put(toString("0.2",_nDifY)+"mm")delay(0)endWhile
end


robotpower()

beginwhile true//控制器在远程模式// if (workingMode()==4 or workingMode()==1)if workingMode()==4if !isPowered()enablePower()//控制器运行模式切换延时时间delay(1)wait(isPowered())endIfelseIf workingMode()==1enablePower()//wait(isPowered())elseIf workingMode()==2 or workingMode()==3disablePower()doERobotDone=falseendIfdelay(0)endWhile
end

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=falsesState="回原点"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 truecall Pallet()delay(0)endWhile
end

CheckSafeArea()

beginwhile truel_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=trueelsel_bAlarm=falseendIfif l_bAlarm and !l_bLastAlarmpopUpMsg("机器人超出安全工作空间!")logMsg("机器人超出安全工作空间!")endIfl_bLastAlarm=l_bAlarm//判断机器人是否在home位l_pHome=jointToPoint(tGripper,world,jHome)if distance(l_pHere,l_pHome)<5doEhome=trueelsedoEhome=falseendIfdelay(0)endWhile
end

Pallet()

begin//在进行开启/关闭阀门时//最好是使用waitendmove()等点到位以后再使用//wait(diEPlcDone==true)//doERobotDone=falsewait(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=falsemovel(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)==falsesState="无导光条"doERobotError=truestopMove()resetMotion()wait(diEReset==true)doERobotError=false//PLC复位后给出回原信号,机械手回原wait(diEPlcReady==true)doERobotDone=falsedoERobotError=falsesState="回原点"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=truereturnendIfstopMove()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.2mml_pCheckRight.trsf.y=l_pHere.trsf.y+0.2movel(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 _bPartRightl_nMoveID=movej(pCheckReady,tGripper,mSpeedH)elsel_nMoveID=movej(jhomen,tGripper,mSpeedH)endIfwaitEndMove()//去放件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=falsedelay(0)endFor//放件完成,回原点,发送完成信号sState="回原点"movej(jHome,tGripper,mSpeedH)waitEndMove()doERobotDone=true//     delay(10)
end


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS WebView 加载本地资源(图片,文件等)

NSString *path [[NSBundle mainBundle] pathForResource:"关于.docx" ofType:nil]; NSURL *url [NSURL fileURLWithPath:path]; NSLog("%", [self mimeType:url]); //webview加载本地文件&#xff0c;可以使用加载数据的方式 //第一个诶参数是一个N…

本文以H264视频流为例,讲解解码流数据的步骤。

本文以H264视频流为例&#xff0c;讲解解码流数据的步骤。 为突出重点&#xff0c;本文只专注于讨论解码视频流数据&#xff0c;不涉及其它&#xff08;如开发环境的配置等&#xff09;。如果您需要这方面的信息&#xff0c;请和我联系。 准备变量 定义AVCodecContext。如…

2008-2021年商业银行数据(农商行、城商行、国有行、股份制银行)

2008-2021年商业银行数据&#xff08;农商行、城商行、国有行、股份制银行&#xff09; 1、时间&#xff1a;2008-2021年 2、范围&#xff1a;1700银行 3 、指标&#xff1a;证券简称、year、证券代码、资产总计、负债合计、所有者权益合计、利润总额、净利润、贷款总额、存…

EPSON 任务同步 改写

有时需要在多个任务执行之前来使它们同步。如果预先知道执行每项任务所需要的时间&#xff0c;它们就可以通过简单地等待由最慢的任务产生的信号来实现同步。然而&#xff0c;如果不知道那个任务是最慢的&#xff0c;就需要使用一个更复杂的同步化机制&#xff0c;如下所示VAL …

线程池的简单使用

创建指定线程数量的线程池 private static ExecutorService scheduledTaskFactoryExecutor null;private boolean isCancled false;private static class ThreadFactoryTest implements ThreadFactory { Overridepublic Thread newThread(Runnable r) { Thread threa…

异常--自定义异常类

为什么要调用父类构造器? http://blog.csdn.net/rockpk008/article/details/52951856 转载于:https://www.cnblogs.com/dwj-ngu/p/6576382.html

利用ffmpeg来进行视频解码的完整示例代码

&#xff08;转&#xff09;利用ffmpeg来进行视频解码的完整示例代码&#xff08;H.264&#xff09; Decode() { FILE * inpf; int nWrite; int i,p; int nalLen; unsigned char * Buf; int got_picture, consumed_bytes; unsigned char *DisplayBuf; Displ…

安卓观看免费视频

http://www.imooc.com/search/course?wordsAndroid%E6%94%BB%E5%9F%8E%E7%8B%AE%E7%AC%AC%E4%B8%80%E8%AF%BE&page3 http://www.imooc.com/course/list?candroid&src360onebox http://www.bilibili.com/video/av2788563/index_4.html http://www.imooc.com/course/pr…

EtherCAT 网站链接

http://www.ethercat.org.cn/cn.htm EtherCAT技术介绍 EtherCAT系统组成和工作原理 EtherCAT采用主从式结构&#xff0c;主站PC机采用标准的100Base-TX以太网卡&#xff0c;从站采用专用芯片。系统控制周期由主站发起&#xff0c;主站发出下行电报&#xff0c;电报的最大有效数…

IEC 6-1131/3的5种标准编程语言

用于开发控制系统和商业管理系统的TRACE MODE6编程工具面向不同领域的软件工程师. TRACE MODE6包含的五种编程语言为&#xff1a;Techno SFC、Techno LD、Techno FBD、Techno ST和Techno IL. 这些语言是下列IEC 6-1131/3标准语言的扩展&#xff1a; SFC&#xff08;顺序功能图…

ngRx 官方示例分析 - 4.pages

Page 中通过构造函数注入 Store&#xff0c;基于 Store 进行数据操作。 注意 Component 使用了 changeDetection: ChangeDetectionStrategy.OnPush. OnPush means that the change detectors mode will be set to CheckOnce during hydration. /app/containers/collection-page…

用ffmpeg把yuv格式转化为mpeg格式

http://blog.sina.com.cn/s/blog_5f5ad6a90100cs5k.html

方法:查询MongoDB数据库中最新一条数据(JAVA)

使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据&#xff1a; MongoCollection<Document> cpu MongoClient.getDatabase("sysmgr").getCollection("cpu"); //获取所需集合 Document dbo cpu.find().sort(descending("time"…

NoPause/NoEmgAbort的任务 与后台任务的区别

NoPause/NoEmgAbort的任务示例 下面的例子显示了一个程序&#xff0c;可以监视控制器的错误并根据错误编号在发生错误时切换I/O On/Off。 Function main Xqt ErrorMonitor, NoEmgAbort : FendFunction ErrorMonitor Wait ErrorOnIf 4000 < SysErr And Syserr < 5999 T…

30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)(转)

出处&#xff1a;http://www.cnblogs.com/best/p/6582294.html 目录 一、界面预览二、PSD源文件预览三、工具分享四、资源说明五、素材下载网站六、下载去年八月时要做一个OA系统为了后台界面而烦恼&#xff0c;后来写了一篇博客&#xff08;《后台管理UI的选择》&#xff09;介…

Linux 查看服务器开放的端口号

在讨论这个问题前&#xff0c;我们先来了解一下物理端口、逻辑端口、端口号等计算机概念。 端口相关的概念&#xff1a; 在网络技术中&#xff0c;端口&#xff08;Port&#xff09;包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口&#xff0c;如ADSL Modem、集…

VC的文件路径为什么要用双斜杠

在编程时&#xff0c;打开文件的路径在用单斜杠时&#xff0c;会出现问题&#xff0c;例如&#xff1a; image cvLoadImage("C:\Users\lyb\Documents\Visual Studio 2013\Projects\smooth\Debug\pic.png", 0);这样的写法在编译时&#xff0c;不会出现编译错误&#…

FFMpeg中apiexample.c例子分析——解码分析

FFMpeg中apiexample.c例子分析——解码分析 收藏 我们直接从 video_decode_example() 函数开始讲&#xff0c;该函数实现了如何去解码一个视频文件&#xff0c;以 .mpeg 文 件为例。 &#xff08; 1 &#xff09;将缓存的末尾清 0 &#xff0c;从而确保读操作不会越界导致破…

[转]整理一些好的开源项目

首先说明&#xff0c;要想找开源项目&#xff0c;当然是Github&#xff01; 另外oschina上面也可能有你要的&#xff0c;这个是分类的链接&#xff1a;http://www.oschina.net/project/tags&#xff0c;比如这个是一个Python的相关开源资源&#xff1a;http://www.oschina.net/…