hexagon logo

Looping_Multiple Parts on a Fixture Plate

This is the most clean way I know (thus far) to measure multiple parts on a fixture plate. I like this method a lot because I don't have to go through my program and lock my theo values down with "*1" or "+0"

This method requires two programs. One that creates the external alignments only...and your main program which recalls the external alignments and connects that to a variable. Many thanks to all on the forum (especially and ).

Alignment Prg:
STARTUP =ALIGNMENT/START,RECALL:USE_PART_SETUP,LIST=YES
ALIGNMENT/END
LOADPROBE/7107_Y_3X40
TIP/T1A0B0, SHANKIJK=0, 0, 1, ANGLE=0
MODE/DCC
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
PALLET_POS_1=GENERIC/POINT,DEPENDENT,CARTESIAN,$
NOM/XYZ,<2*1,2*1,0*1>,$
MEAS/XYZ,<2*1,2*1,0*1>,$
NOM/IJK,<0*1,0*1,1*1>,$
MEAS/IJK,<0*1,0*1,1*1>
ALI_RING_GAGE_0PNT750_1=ALIGNMENT/START,RECALL:7107_PLATE_ALIGN,LIST=YES
ALIGNMENT/TRANS,XAXIS,PALLET_POS_1
ALIGNMENT/TRANS,YAXIS,PALLET_POS_1
ALIGNMENT/END
SAVE/ALIGNMENT,ALI_RING_GAGE_0PNT750_1.aln,MACHINETOPARTS
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
PALLET_POS_2=GENERIC/POINT,DEPENDENT,CARTESIAN,$
NOM/XYZ,<6*1,2*1,0*1>,$
MEAS/XYZ,<6*1,2*1,0*1>,$
NOM/IJK,<0*1,0*1,1*1>,$
MEAS/IJK,<0*1,0*1,1*1>
ALI_RING_GAGE_0PNT750_2=ALIGNMENT/START,RECALL:7107_PLATE_ALIGN,LIST=YES
ALIGNMENT/TRANS,XAXIS,PALLET_POS_2
ALIGNMENT/TRANS,YAXIS,PALLET_POS_2
ALIGNMENT/END
SAVE/ALIGNMENT,ALI_RING_GAGE_0PNT750_2.aln,MACHINETOPARTS
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
PALLET_POS_3=GENERIC/POINT,DEPENDENT,CARTESIAN,$
NOM/XYZ,<10*1,2*1,0*1>,$
MEAS/XYZ,<10*1,2*1,0*1>,$
NOM/IJK,<0*1,0*1,1*1>,$
MEAS/IJK,<0*1,0*1,1*1>
ALI_RING_GAGE_0PNT750_3=ALIGNMENT/START,RECALL:7107_PLATE_ALIGN,LIST=YES
ALIGNMENT/TRANS,XAXIS,PALLET_POS_3
ALIGNMENT/TRANS,YAXIS,PALLET_POS_3
ALIGNMENT/END
SAVE/ALIGNMENT,ALI_RING_GAGE_0PNT750_3.aln,MACHINETOPARTS
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
PALLET_POS_4=GENERIC/POINT,DEPENDENT,CARTESIAN,$
NOM/XYZ,<2*1,6*1,0*1>,$
MEAS/XYZ,<2*1,6*1,0*1>,$
NOM/IJK,<0*1,0*1,1*1>,$
MEAS/IJK,<0*1,0*1,1*1>
ALI_RING_GAGE_0PNT750_4=ALIGNMENT/START,RECALL:7107_PLATE_ALIGN,LIST=YES
ALIGNMENT/TRANS,XAXIS,PALLET_POS_4
ALIGNMENT/TRANS,YAXIS,PALLET_POS_4
ALIGNMENT/END
SAVE/ALIGNMENT,ALI_RING_GAGE_0PNT750_4.aln,MACHINETOPARTS
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
PALLET_POS_5=GENERIC/POINT,DEPENDENT,CARTESIAN,$
NOM/XYZ,<6*1,6*1,0*1>,$
MEAS/XYZ,<6*1,6*1,0*1>,$
NOM/IJK,<0*1,0*1,0*1>,$
MEAS/IJK,<0*1,0*1,1*1>
ALI_RING_GAGE_0PNT750_5=ALIGNMENT/START,RECALL:7107_PLATE_ALIGN,LIST=YES
ALIGNMENT/TRANS,XAXIS,PALLET_POS_5
ALIGNMENT/TRANS,YAXIS,PALLET_POS_5
ALIGNMENT/END
SAVE/ALIGNMENT,ALI_RING_GAGE_0PNT750_5.aln,MACHINETOPARTS
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
PALLET_POS_6=GENERIC/POINT,DEPENDENT,CARTESIAN,$
NOM/XYZ,<10*1,6*1,0*1>,$
MEAS/XYZ,<10*1,6*1,0*1>,$
NOM/IJK,<0*1,0*1,1*1>,$
MEAS/IJK,<0*1,0*1,1*1>
ALI_RING_GAGE_0PNT750_6=ALIGNMENT/START,RECALL:7107_PLATE_ALIGN,LIST=YES
ALIGNMENT/TRANS,XAXIS,PALLET_POS_6
ALIGNMENT/TRANS,YAXIS,PALLET_POS_6
ALIGNMENT/END
SAVE/ALIGNMENT,ALI_RING_GAGE_0PNT750_6.aln,MACHINETOPARTS


Main Prg (simple ID-ring gage measured in 6 different positions).
STARTUP =ALIGNMENT/START,RECALL:USE_PART_SETUP,LIST=YES
ALIGNMENT/END
FLY/ON
MOVESPEED/ 300*0.9
LOADPROBE/7107_Y_3X40
TIP/T1A0B0, SHANKIJK=0, 0, 1, ANGLE=0
GROUP_COUNTPROMPT_AND_SERIALNUMBER=GROUP/SHOWALLPARAMS=YES
COUNT_PROMPT =COMMENT/INPUT,NO,FULL SCREEN=NO,
How many parts are you inspecting?
ASSIGN/TOTAL_PARTS=COUNT_PROMPT.INPUT
ASSIGN/SER=0
WHILE/SER<TOTAL_PARTS
ASSIGN/SER=SER+1
SER_PROMPT =COMMENT/INPUT,NO,FULL SCREEN=NO,
Please enter the Serial Number of the
"part at FIXTURE POSITION# "+SER+"."
RUN_PROMPT =COMMENT/INPUT,NO,FULL SCREEN=NO,
Please enter the Run Number of the
"part at FIXTURE POSITION# "+SER+"."
ASSIGN/SER_NUM[SER]=SER_PROMPT.INPUT
ASSIGN/RUN_NUM[SER]=RUN_PROMPT.INPUT
END_WHILE/
ENDGROUP/ID=GROUP_COUNTPROMPT_AND_SERIALNUMBER
MODE/DCC
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
ASSIGN/CURR_POS=0
DO/
ASSIGN/CURR_POS=CURR_POS+1
COMMENT/REPT,
"Serial Number: "+SER_NUM[CURR_POS]
COMMENT/REPT,
"Run Number: "+RUN_NUM[CURR_POS]
ASSIGN/PROG_NAME=GETPROGRAMINFO ("PARTNAME")
ASSIGN/REPORT_NAME="XX:\\INSERT_VALID_FILE-PATH_HERE\\"+PROG_NAME+"__"+SER_NUM[CURR_POS]+"__"+RUN_NUM[CURR_POS]+".PDF"
SELECT/CURR_POS
CASE/1
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
RECALL/ALIGNMENT,EXTERNAL,ALI_RING_GAGE_0PNT750_1
SAVE/ALIGNMENT,CUR.aln,MACHINETOPARTS
END_CASE/
CASE/2
RECALL/ALIGNMENT,INTERNAL,7107_PLATE_ALIGN
RECALL/ALIGNMENT,EXTERNAL,ALI_RING_GAGE_0PNT750_2
SAVE/ALIGNMENT,CUR.aln,MACHINETOPARTS
END_CASE/
CASE/3
RECALL/ALIGNMENT,INTERNAL,7107_PLATE_ALIGN
RECALL/ALIGNMENT,EXTERNAL,ALI_RING_GAGE_0PNT750_3
SAVE/ALIGNMENT,CUR.aln,MACHINETOPARTS
END_CASE/
CASE/4
RECALL/ALIGNMENT,INTERNAL,7107_PLATE_ALIGN
RECALL/ALIGNMENT,EXTERNAL,ALI_RING_GAGE_0PNT750_4
SAVE/ALIGNMENT,CUR.aln,MACHINETOPARTS
END_CASE/
CASE/5
RECALL/ALIGNMENT,INTERNAL,7107_PLATE_ALIGN
RECALL/ALIGNMENT,EXTERNAL,ALI_RING_GAGE_0PNT750_5
SAVE/ALIGNMENT,CUR.aln,MACHINETOPARTS
END_CASE/
CASE/6
RECALL/ALIGNMENT,INTERNAL,7107_PLATE_ALIGN
RECALL/ALIGNMENT,EXTERNAL,ALI_RING_GAGE_0PNT750_6
SAVE/ALIGNMENT,CUR.aln,MACHINETOPARTS
END_CASE/
END_SELECT/
RECALL/ALIGNMENT,EXTERNAL,CUR
IF/CURR_POS=="1"
RP_CHECK_Z =FEAT/POINT,CARTESIAN
THEO/<0*1,0*1,15*1>,<0,0,1>
ACTL/<0,0,15>,<0,0,1>
READPOINT/
MOVE/INCREMENT,<0,0,15-RP_CHECK_Z.Z>
MOVE/POINT,NORMAL,<0,0,15>
END_IF/
CLEARP/ZPLUS,4,ZPLUS,4,ON
LIN_THEO_XP =FEAT/LINE,CARTESIAN,UNBOUNDED,YES
THEO/<-0.5,0,0>,<1,0,0>
ACTL/<-0.5,0,0>,<1,0,0>
CONSTR/LINE,ALIGN,1,XPLUS
FLY/ON
MOVESPEED/ 300*0.9
TOUCHSPEED/ 10
PREHIT/0.4
RETRACT/0.4
CHECK/0.5,1
MOVE/CLEARPLANE
CIRXY1 =FEAT/CONTACT/CIRCLE/DEFAULT,CARTESIAN,IN,LEAST_SQR
THEO/<0,0,0.85>,<0,0,1>,0.75
ACTL/<0,0,0.85>,<0,0,1>,0.75
TARG/<0,0,0.85>,<0,0,1>
START ANG=0,END ANG=360
ANGLE VEC=<1,0,0>
DIRECTION=CCW
SHOW FEATURE PARAMETERS=NO
SHOW CONTACT PARAMETERS=NO
FLY/ON
MOVESPEED/ 300*0.9
TOUCHSPEED/ 5
PREHIT/0.125
RETRACT/0.125
CHECK/0.125,1
CIRXY2 =FEAT/CONTACT/CIRCLE/DEFAULT,CARTESIAN,IN,LEAST_SQR
THEO/<0,0,0.85>,<0,0,1>,0.75
ACTL/<0,0,0.85>,<0,0,1>,0.75
TARG/<CIRXY1.X,CIRXY1.Y,0.85>,<0,0,1>
START ANG=-120,END ANG=240
ANGLE VEC=<1,0,0>
DIRECTION=CCW
SHOW FEATURE PARAMETERS=NO
SHOW CONTACT PARAMETERS=NO
MOVE/INCREMENT,<0,0,0.5>
PLNZ1 =FEAT/CONTACT/PLANE/DEFAULT,CARTESIAN,NONE,LEAST_SQR
THEO/<0,0,0.93>,<0,0,1>
ACTL/<0,0,0.93>,<0,0,1>
TARG/<CIRXY2.X,CIRXY2.Y,0.93>,<0,0,1>
ANGLE VEC=<-0.978555,0.2059858,0>,RADIAL
SHOW FEATURE PARAMETERS=NO
SHOW CONTACT PARAMETERS=NO
CLEARP/ZPLUS,PLNZ1.Z+0.5,ZPLUS,PLNZ1.Z+0.5,ON
A1 =ALIGNMENT/START,RECALL:CUR,LIST=YES
ALIGNMENT/LEVEL,ZPLUS,PLNZ1
ALIGNMENT/ROTATE,XPLUS,TO,LIN_THEO_XP,ABOUT,ZPLUS
ALIGNMENT/TRANS,XAXIS,CIRXY2
ALIGNMENT/TRANS,YAXIS,CIRXY2
ALIGNMENT/TRANS,ZAXIS,PLNZ1
ALIGNMENT/END
FLY/ON
MOVESPEED/ 300*0.9
TOUCHSPEED/ 5
PREHIT/0.075
RETRACT/0.075
CHECK/0.075,1
MOVE/CLEARPLANE
CIR_ID =FEAT/CONTACT/CIRCLE/DEFAULT,CARTESIAN,IN,LEAST_SQR
THEO/<0,0,-0.1>,<0,0,1>,0.75
ACTL/<-0.0084,0.0436,-0.0964>,<-0.0001617,-0.0033755,0.9999943>,0.75
TARG/<0,0,-0.1>,<0,0,1>
START ANG=0,END ANG=360
ANGLE VEC=<1,0,0>
DIRECTION=CCW
SHOW FEATURE PARAMETERS=NO
SHOW CONTACT PARAMETERS=NO
FORMAT/TEXT,OPTIONS,ID,HEADINGS,SYMBOLS, ;MEAS,NOM,TOL,DEV,OUTTOL, ,
DISPLAYPRECISION/5
DIM MIS_1= LOCATION OF CIRCLE CIR_ID UNITS=IN ,$
GRAPH=OFF TEXT=OFF MULT=10.00 OUTPUT=BOTH HALF ANGLE=NO
AX MEAS NOMINAL +TOL -TOL DEV OUTTOL
D 0.75000 0.75000 0.00050 0.00050 0.00000 0.00000 ----#----
END OF DIMENSION MIS_1
DISPLAYPRECISION/4
UNTIL/CURR_POS==TOTAL_PARTS
RECALL/ALIGNMENT,EXTERNAL,7107_PLATE_ALIGN
MOVE/INCREMENT,<0,0,6>
MOVE/POINT,NORMAL,<1,35,15>