ABB機器人應用程序簡述
機器人應用程序,我也是最近才開始接觸。算是入門小菜鳥,本篇文章只是介紹一個機器人程序的大概結構的簡述。
長話短說直接進入主題,這個機器人程序不是我從頭到尾開發的,是在原本的程序基礎上的。
在我們的ABB機器人的程序主要包括三個module模塊組成:1,Admin
2,機器具體動作程序(我們稱作Job)
3,write RegPos (當執行玩job中的某個特定位置後,這個作為標記用的)
以上這部分程序中,我們主要修改的是2module模塊這個程序,就是包含很多Job,每個Job都是具體實施機器人位置移動的程序。
任何程序都有一個程序入口,機器人程序也一樣。而在我們機器人程序的入口就是在這個Admin這個程序中。其中Admin程序的main()的源碼如下,注意我們看到PROC main(),ABB機器人的編程單元是procedure,就是PROC這個簡寫,這個Admin 的main procedure基本上我們在新建一台機器之後:
PROC main()
CONNECT fTCPSpeedHigh WITH IGenRobotMoving;
CONNECT fTCPSpeedLow WITH IGenRobotMoving; ISignalAO virt_TCPSpeed_Robot1, AIO_ABOVE_HIGH, 0.02, 0, 0, fTCPSpeedHigh; ISignalAO virt_TCPSpeed_Robot1, AIO_BELOW_HIGH, 0.015, 0, 0, fTCPSpeedLow;IF OpMode()=OP_MAN_PROG THEN
TPErase;TPReadFK FunkTaste,"Select move jobs by manual mode?","","","","No","Yes";
IF FunkTaste=5 THEN Manual; ELSE TPErase; TPWrite "Robot Moving in Manual Mode"; TPWrite "Communication with Master-PLC"; ENDIF ELSE TypNum:=0;JobNum:=0;
Funktaste:=0; ENDIFInitialize;
SpeedLimiter;pStartingPoint:=CRobT(Tool:=tool0 WObj:=wobj0);
regStartingAngleX:=EulerZYX(X, pStartingPoint.rot); regStartingAngleY:=EulerZYX(Y, pStartingPoint.rot); regStartingAngleZ:=EulerZYX(, pStartingPoint.rot); regStoppedAngleX:=EulerZYX(X, pPointAtStop.rot);regStoppedAngleY:=EulerZYX(Y, pPointAtStop.rot);
regStoppedAngleZ:=EulerZYX(, pPointAtStop.rot); IF (pPointAtStop.trans.X>=(pStartingPoint.trans.X+regTransDiff) OR pPointAtStop.trans.X<=(pStartingPoint.trans.X-regTransDiff) OR pPointAtStop.trans.Y>=(pStartingPoint.trans.Y+regTransDiff) OR pPointAtStop.trans.Y<=(pStartingPoint.trans.Y-regTransDiff) OR pPointAtStop.trans.Z>=(pStartingPoint.trans.Z+regTransDiff) OR pPointAtStop.trans.Z<=(pStartingPoint.trans.Z-regTransDiff)) OR (regStoppedAngleX>=(regStartingAngleX+regRotDiff) OR regStoppedAngleX<=(regStartingAngleX-regRotDiff) ORregStoppedAngleY>=(regStartingAngleY+regRotDiff) OR
regStoppedAngleY<=(regStartingAngleY-regRotDiff) OR regStoppedAngleZ>=(regStartingAngleZ+regRotDiff) OR regStoppedAngleZ<=(regStartingAngleZ-regRotDiff)) OR pPointAtStop.robconf<>pStartingPoint.robconf THEN Set DO13_RobotHasBeenMoved; ENDIFWHILE di8_HsStartMain=0 DO
SetGO DO32_39_HsStepCode,0; WaitDI DI10_ReadJobCode,1;VelSet DI40_47_Override, 7500; !Speed is set to max
SetGO DO24_31_HsJobCode,DI24_31_JobCode; SetDO DO10_HsReadJobCode,1; WaitDI DI10_ReadJobCode,0; SetDO DO10_HsReadJobCode,0; !Call Jobprogram CallByVar "Job",DI24_31_JobCode; ENDWHILE ENDPROC這個程序有點長,我也不想做過多介紹,主要想說最後這一段程序,因為這一段程序就是實現,機器人在移動位置時是怎麼實現調用在第二個module模塊的Job程序。我想這也是大多是想了解機器人程序的人最想了解和知道的:
首先,第一句 WHILE di8_HsStartMain=0 DO
注釋一下"DI8_HsStartMain" 的意思是 Handshake "Start Main done"
這是說當數字量輸入的Bool信號HsStartMain=0,表示Main這個沒有啟動完成,我們就要執行While Do 一下所有的代碼,這裡的代碼比較多,我舉一個例子如,第二條
WaitDI DI10_ReadJobCode,1; (注釋變數的意義 "DI10_ReadJobCode" 是來自於PLC的握手信號 Handshake "read Job")。
好了那到底是怎麼讓機器人執行各個Job的呢,別急就是這句:
!Call Jobprogram 這句只是注釋
CallByVar "Job",DI24_31_JobCode; 這句才是精髓所在。這個CallByVar Procedure參數有一個String型的參數Name,和一個Num型的參數Number。CallByVar "Job",DI24_31_JobCode, 在這句中我們賦值第一個string型參數為Job,而DI24_31_JobCode這個變數如果是1,那麼 我們就Call Job1這個程序。而"DI24_31_JobCode"這個變數是來自於PLC程序的握手信號 Handshake Job-Code。
好了,我們知道了程序中是怎麼Call Job的,那麼這個Job程序在哪呢,對了就是在第二module模塊這個基本上每個不同的機器我們就會設置不同的job,這也是每次寫新的機器人程序應用的時候要改的最多的module模塊。
然後就是wordzone部分:
在下面就是我們的各個Job的procedure了,未點開+號複選框之前。
具體Job1內的程序:好了,今天先寫到這裡,明天繼續更。。。。。。不好意思,在明天繼續更。。。。。哈哈
推薦閱讀: