в принципе подход верный, я примерно также делаю.
сначала определяю сколько будет баз и инструментов
(у меня грипперов). затем вручную, с пульта, беру все необходимые
основные точки с актуальными для них базами и инструментами.
эти точки естественно будут сохранятся в свои фолды в один или
несколько файлов. затем делаю такой трюк.
например все точки которые я взял вручную, сохранены в созданном файле
positions.src который имеет такую структуру(реальный код):
DEF positions ( )
;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)
IF FALSE THEN
;********* into mold position ***********
;FOLD PTP take_pos0 Vel=100 % PDAT16 Tool[1]:BaseTool Base[1];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:take_pos0, 3:, 5:100, 7:PDAT16
$BWDSTART=FALSE
PDAT_ACT=PPDAT16
FDAT_ACT=Ftake_pos0
BAS(#PTP_PARAMS,100)
PTP Xtake_pos0
;ENDFOLD
;FOLD LIN take_pos0 Vel=2 m/s CPDAT10 Tool[1]:BaseTool Base[1];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VLIN,%P 1:LIN, 2:take_pos0, 3:, 5:2, 7:CPDAT10
$BWDSTART=FALSE
LDAT_ACT=LCPDAT10
FDAT_ACT=Ftake_pos0
BAS(#CP_PARAMS,2)
LIN Xtake_pos0
;ENDFOLD
;FOLD PTP infront_take0 Vel=100 % PDAT15 Tool[1]:BaseTool Base[1];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:infront_take0, 3:, 5:100, 7:PDAT15
$BWDSTART=FALSE
PDAT_ACT=PPDAT15
FDAT_ACT=Finfront_take0
BAS(#PTP_PARAMS,100)
PTP Xinfront_take0
;ENDFOLD
;FOLD LIN infront_take0 Vel=2 m/s CPDAT11 Tool[1]:BaseTool Base[1];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VLIN,%P 1:LIN, 2:infront_take0, 3:, 5:2, 7:CPDAT11
$BWDSTART=FALSE
LDAT_ACT=LCPDAT11
FDAT_ACT=Finfront_take0
BAS(#CP_PARAMS,2)
LIN Xinfront_take0
;ENDFOLD
;FOLD PTP infront_take1 Vel=100 % PDAT13 Tool[1]:BaseTool Base[1];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:infront_take1, 3:, 5:100, 7:PDAT13
$BWDSTART=FALSE
PDAT_ACT=PPDAT13
FDAT_ACT=Finfront_take1
BAS(#PTP_PARAMS,100)
PTP Xinfront_take1
;ENDFOLD
;FOLD PTP infront_take2 Vel=100 % PDAT14 Tool[1]:BaseTool Base[1];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:infront_take2, 3:, 5:100, 7:PDAT14
$BWDSTART=FALSE
PDAT_ACT=PPDAT14
FDAT_ACT=Finfront_take2
BAS(#PTP_PARAMS,100)
PTP Xinfront_take2
;ENDFOLD
;FOLD PTP before_take_pos1 Vel=100 % PDAT4 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:before_take_pos1, 3:, 5:100, 7:PDAT4
$BWDSTART=FALSE
PDAT_ACT=PPDAT4
FDAT_ACT=Fbefore_take_pos1
BAS(#PTP_PARAMS,100)
PTP Xbefore_take_pos1
;ENDFOLD
;FOLD LIN before_take_pos1 Vel=2 m/s CPDAT8 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VLIN,%P 1:LIN, 2:before_take_pos1, 3:, 5:2, 7:CPDAT8
$BWDSTART=FALSE
LDAT_ACT=LCPDAT8
FDAT_ACT=Fbefore_take_pos1
BAS(#CP_PARAMS,2)
LIN Xbefore_take_pos1
;ENDFOLD
;FOLD PTP before_take_pos2 Vel=100 % PDAT3 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:before_take_pos2, 3:, 5:100, 7:PDAT3
$BWDSTART=FALSE
PDAT_ACT=PPDAT3
FDAT_ACT=Fbefore_take_pos2
BAS(#PTP_PARAMS,100)
PTP Xbefore_take_pos2
;ENDFOLD
;FOLD PTP before_take_pos3 Vel=100 % PDAT5 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:before_take_pos3, 3:, 5:100, 7:PDAT5
$BWDSTART=FALSE
PDAT_ACT=PPDAT5
FDAT_ACT=Fbefore_take_pos3
BAS(#PTP_PARAMS,100)
PTP Xbefore_take_pos3
;ENDFOLD
;FOLD PTP before_put_pos Vel=100 % PDAT8 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:before_put_pos, 3:, 5:100, 7:PDAT8
$BWDSTART=FALSE
PDAT_ACT=PPDAT8
FDAT_ACT=Fbefore_put_pos
BAS(#PTP_PARAMS,100)
PTP Xbefore_put_pos
;ENDFOLD
;********* box placed position ****************
;FOLD PTP PLACE_PART Vel=100 % PDAT7 Tool[2]:BoxGripper Base[2]:PalletBase;%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:PLACE_PART, 3:, 5:100, 7:PDAT7
$BWDSTART=FALSE
PDAT_ACT=PPDAT7
FDAT_ACT=FPLACE_PART
BAS(#PTP_PARAMS,100)
PTP XPLACE_PART
;ENDFOLD
;**** pallet positions ****
;FOLD PTP before_robot Vel=100 % PDAT18 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:before_robot, 3:, 5:100, 7:PDAT18
$BWDSTART=FALSE
PDAT_ACT=PPDAT18
FDAT_ACT=Fbefore_robot
BAS(#PTP_PARAMS,100)
PTP Xbefore_robot
;ENDFOLD
;FOLD PTP above_pallet_stack Vel=100 % PDAT20 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:above_pallet_stack, 3:, 5:100, 7:PDAT20
$BWDSTART=FALSE
PDAT_ACT=PPDAT20
FDAT_ACT=Fabove_pallet_stack
BAS(#PTP_PARAMS,100)
PTP Xabove_pallet_stack
;ENDFOLD
;FOLD PTP take_pallet_base Vel=100 % PDAT19 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:take_pallet_base, 3:, 5:100, 7:PDAT19
$BWDSTART=FALSE
PDAT_ACT=PPDAT19
FDAT_ACT=Ftake_pallet_base
BAS(#PTP_PARAMS,100)
PTP Xtake_pallet_base
;ENDFOLD
;FOLD PTP above_put_pallet Vel=100 % PDAT17 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:above_put_pallet, 3:, 5:100, 7:PDAT17
$BWDSTART=FALSE
PDAT_ACT=PPDAT17
FDAT_ACT=Fabove_put_pallet
BAS(#PTP_PARAMS,100)
PTP Xabove_put_pallet
;ENDFOLD
;FOLD PTP put_pallet Vel=100 % PDAT10 Tool[1]:BaseTool Base[0];%{PE}%R 8.3.43,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2
ut_pallet, 3:, 5:100, 7:PDAT10
$BWDSTART=FALSE
PDAT_ACT=PPDAT10
FDAT_ACT=Fput_pallet
BAS(#PTP_PARAMS,100)
PTP Xput_pallet
;ENDFOLD
ENDIF
InitPositions()
END
DEF InitPositions()
ptake_pos = Xtake_pos
pinfront_take = Xinfront_take
pbefore_take_pos1 = Xbefore_take_pos1
pbefore_take_pos2 = Xbefore_take_pos2
pbefore_take_pos3 = Xbefore_take_pos3
pbefore_put_pos = Xbefore_put_pos
pplace_part = XPLACE_PART
ptake_pos0 = Xtake_pos0
pinfront_take0 = Xinfront_take0
pinfront_take1 = Xinfront_take1
pinfront_take2 = Xinfront_take2
pbefore_robot = Xbefore_robot;
pabove_pallet_stack = Xabove_pallet_stack;
ptake_pallet_base = Xtake_pallet_base;
pabove_put_pallet = Xabove_put_pallet;
pput_pallet = Xput_pallet
END
здесь важно два момента.
первый: все фолды для точек находятся внутри конструкции
IF FALSE THEN
...
ENDIF
и при вызове процедуры positions() выполняться не будут,
а выполнится созданная нами процедура инициализации переменных
InitPositions()
переменные: ptake_pos, pinfront_take... это пользовательские
переменные типа E6POS, которые задаются в config.dat и видимы
во всех фалах проекта.
второй: из главного файла проекта при инициализации данных,
вызываем positions() (или несколько аналогичных процедур)
для инициализации внутренних переменнх и используем их в коде
типа PTP ptake_pos или LIN pplace_part
естественно, что при таком подходе надо заботиться о корректных
параметрах базы, инструмента и скорости. я обычно разбиваю код
движения на множество логических процедур которые начинаются
с установки базы, инструмента и скорости.
менять базу в формуляре нет необходимости.