完整的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.pswp.cn/news/255060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255060.shtml
英文地址,請注明出處:http://en.pswp.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/…