Всем привет!
В качестве примера движения инструмента по спирали, привожу
пример программы и два маленьких клипа. На первом клипе показано
как примерно выглядит спираль. Здесь стоит отметить два момента:
1. Спираль сходится к центру (задаем радиус 50см и
уменьшаем его на итерациях цикла). Так сделано для того, что бы
не ударить робот.
2. После того как спираль сошлась вцентре, она нaчинает
разширятся. Видно, как она выходит за пределы белого прямоугольника.
Если белый прямоугольник, это пределы рабочей, безопасной зоны,
то выход за нее даст краш. По этому с экспериментми надо быть
осторожным.
На втором клипе виден результат работы программы с роботом.
Первый цикл это движение точка к точке, второй линеарное.
1
https://yadi.sk/d/ehqr4VxTtwuJf
2
https://yadi.sk/d/bbfdgjRUtwuQ3
Что же касается самой программы, то там все просто.
Робот начинает с домашней позиции. Затем выходит на стартовую
позицию перед началом спирального движения (скажем край белого
прямоугольника). После этого по спирали движется к центру от
тчки к точки (РТР). По завершении первого цикла возвращается
снова на стартовую позицию. Начинаем второй цикл движения по
спирали, но теперь движемся линеарно. После второго цикла робот
возвращается на домашнюю позицию.
В качестве примечания отмечу что вначале программы скорость
работы снижена до 30% ($OV_PRO = 30) для предотвращения столкновений.
Рад был помочь.
Павел.
Программа:
DEF Spiral ( )
DECL INT i
DECL REAL angle
DECL REAL radius
DECL REAL c
DECL REAL s
DECL REAL startX
DECL REAL startY
;FOLD INI;%{PE}
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
;set programm speed to 30%
$OV_PRO = 30
;start from home position
GoHome()
i = 0
angle = 0
radius = 500 ;mm
c = 0
s = 0
startX = 0
startY = 0
$TOOL = TOOL_DATA[1]
$BASE = BASE_DATA[3]
TempPos = $NULLFRAME
;go to start position (spiral begining)
;FOLD PTP P1 Vel=100 % PDAT1 Tool[1]:Pash Base[2]:222;%{PE}%R 8.3.32,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:P1, 3:, 5:100, 7:PDAT1
$BWDSTART=FALSE
PDAT_ACT=PPDAT1
FDAT_ACT=FP1
BAS(#PTP_PARAMS,100)
PTP XP1
;ENDFOLD
TempPos = XP1
;save start XY pos.
startX = TempPos.X
startY = TempPos.X
;circle formula: x + r*cos(a) and y + r*sin(a).
FOR i = 1 TO 50 STEP 1
radius = radius - 10
angle = angle + 10
c = COS(angle)
s = SIN(angle)
;calc. new X pos
TempPos.X = startX + (radius * c)
;calc. new Y pos
TempPos.Y = startY + (radius * s)
;move robot to new pos as Point to Point
PTP TempPos
ENDFOR
;return robot to start position
TempPos = XP1
PTP TempPos
startX = TempPos.X
startY = TempPos.X
angle = 0
radius = 500 ;mm
FOR i = 1 TO 50 STEP 1
radius = radius - 10
angle = angle + 10
c = COS(angle)
s = SIN(angle)
;calc. new X pos
TempPos.X = startX + (radius * c)
;calc. new Y pos
TempPos.Y = startY + (radius * s)
;move robot to new pos Line to Line
LIN TempPos C_DIS
ENDFOR
;return robot to home
GoHome()
END
DEF GoHome()
;FOLD PTP HOME Vel= 100 % DEFAULT;%{PE}%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7
EFAULT$BWDSTART = FALSE
PDAT_ACT=PDEFAULT
FDAT_ACT=FHOME
BAS (#PTP_PARAMS,100 )
$H_POS=XHOME
PTP XHOME
END
Dat файл:
DEFDAT Spiral
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make your modifications here
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLARATIONS)
DECL E6POS TempPos
DECL E6POS XP1={X -109.308006,Y -459.787598,Z 483.273438,A -26.8819447,B 89.9025955,C 155.420303,S 22,T 50,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}
DECL FDAT FP1={TOOL_NO 1,BASE_NO 2,IPO_FRAME #BASE,POINT2[] " ",TQ_STATE FALSE}
DECL PDAT PPDAT1={VEL 100.000,ACC 100.000,APO_DIST 100.000,GEAR_JERK 50.0000,EXAX_IGN 0}
ENDDAT