FUNC robtarget pStack(robtarget pBase,num partColumns,num partWidth,num PartHeight,num numCounter) VAR num Columns; VAR num Rows; Columns:=( numCounter -1) MOD partColumns; Rows:=( numCounter -1-Columns)/partColumns; RETURN Offs(pBase,0,Columns*(PartWidth),Rows*PartHeight); ENDFUNC >如何实现机器人在任意路径上可自动回原点 多数项目机器人直接自动回原点可能会导致撞机,只能通过增加过渡点的方式实现,有的时候过渡点可以设置成机器人当前位置在指定坐标系中往指定方向偏移指定位移的位置,如果需要更加严格保证安全,可以根据位置和旋转方向来判定机器人需要往何种方向偏移,这里不做深究。 FUNC robtarget getRobT(switch Rel,num x,num y,num z,inout tooldata tool,wobjdata wobj) VAR robtarget pCurrent; pCurrent:=crobT(tool:=toolwobj:=wobj); IF Present(Rel) THEN IF Present(x) THEN pCurrent.trans.x:=pCurrent.trans.x+x; ENDIF IF Present(y) THEN pCurrent.trans.y:=pCurrent.trans.y+y; ENDIF IF Present(z) THEN pCurrent.trans.z:=pCurrent.trans.z+z; ENDIF ELSE IF Present(x) THEN pCurrent.trans.x:=x; ENDIF IF Present(y) THEN pCurrent.trans.y:=y; ENDIF IF Present(z) THEN pCurrent.trans.z:=z; ENDIF ENDIF RETURN pCurrent; tENDFUNC 其中实现了有开关型参数Rel情况下,实现增量偏移,无Rel时实现**偏移,也可以根据可选参数x,y,z实现指定方向偏移,返回robtarget目标位置(过渡点)。下面是指令的使用示例,调用形式上与RAPID内置Offs等指令有些相识。
FUNC bool rCheckPos(jointtarget pCheck,num num1) VAR jointtarget pCurrent; VAR num numTemp; IF Present(num1) THEN numTemp:=num1; ENDIF pCurrent:=CalcJointT(CRobT(),tool0); IF pCurrent.robax.rax_1<=pcheck.robax.rax_1+num1 and="" pcurrent.robax.rax_1="">=pCheck.robax.rax_1-num1 AND pCurrent.robax.rax_2<=pcheck.robax.rax_2+num1 and="" pcurrent.robax.rax_2="">=pCheck.robax.rax_2-num1 AND pCurrent.robax.rax_3<=pcheck.robax.rax_3+num1 and="" pcurrent.robax.rax_3="">=pCheck.robax.rax_3-num1 AND pCurrent.robax.rax_4<=pcheck.robax.rax_4+num1 and="" pcurrent.robax.rax_4="">=pCheck.robax.rax_4-num1 AND pCurrent.robax.rax_5<=pcheck.robax.rax_5+num1 and="" pcurrent.robax.rax_5="">=pCheck.robax.rax_5-num1 AND pCurrent.robax.rax_6<=pcheck.robax.rax_6+num1 and="" pcurrent.robax.rax_6="">=pCheck.robax.rax_6-num1 THEN RETURN TRUE; ELSE RETURN FALSE; ENDIF ENDFUNC 当然,熟悉编写如何去编写指令是不够的,还需深刻认识坐标系的概念和一些基本指令,结合实际操作。