hexagon logo

Pallet Routine Example - Loop Pattern types and Start direction options

Pallet Routine - Example

Pallet Routine highlight features

Use either Part ID or Pallet Cell (Station) number.
Pattern layouts are Z-Pattern or Linear-Pattern.
Change the start direction.
Skip Cells (Station) Parts.

PART NAME  : Pallet Routine Auto count Direction Forum
REV NUMBER : 20220816
SER NUMBER :
STATS COUNT : 1
 
STARTUP    =ALIGNMENT/START,RECALL:USE_PART_SETUP,LIST=YES
            ALIGNMENT/END
            MODE/MANUAL
            FORMAT/TEXT,OPTIONS, ,HEADINGS,SYMBOLS, ;NOM,TOL,MEAS,DEV,OUTTOL, ,
            LOADPROBE/5BY50_M3_SH
            TIP/TIP1, SHANKIJK=0, 0, 1, ANGLE=0
$$ NO,
            Add Manual Part Alignment and Features
            .
$$ NO,
            Add DCC Part Alignment and Features
            .
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter Part ID per-part (Ex. 101,107) or enter Same as Cell Count ; partIdNo : Same as Cell Count
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Measurement Pattern Layout ; movePattern : Linear-Pattern
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Select Start direction ; cellRunDirection : X Row
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter number of Rows - X axis ; xRowsTrace : 3
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter number of Columns - Y axis ; yColumnsTrace : 3
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter offset distance between parts - Each row X ; xCellOffsetRow : 2,3
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter offset distance between parts - Each column Y ; yCellOffsetColumn : 2,3
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Skip Cells(part Ex.1 or parts Ex.1,2,3) Enter in ascending order ; skipCellTrace : 2,6
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Report skip Cell information? ; skipCellReportInfo : Yes
            TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Report Part ID information? ; partId : Yes
            ASSIGN/X_AXIS_NUMBER_ROWS=GETTRACEVALUE("xRowsTrace")
            ASSIGN/Y_AXIS_NUMBER_ROWS=GETTRACEVALUE("yRowsTrace")
            ASSIGN/X_OFFSET_INPUT=GETTRACEVALUE("xCellOffsetRow")
            ASSIGN/Y_OFFSET_INPUT=GETTRACEVALUE("yCellOffsetColumn")
            ASSIGN/X_ROW_OFFSET=0
            ASSIGN/Y_COLUMN_OFFSET=0
            ASSIGN/Y_COLUMN_UNTIL_CNT=0
            ASSIGN/DIRECTION="ONE"
            ASSIGN/CELL_COUNT=0
            ASSIGN/SKIP_CELL_CNT=1
            DO/
              ASSIGN/Y_COLUMN_UNTIL_CNT=Y_COLUMN_UNTIL_CNT+1
              ASSIGN/X_ROW_UNTIL_CNT=0
              IF/GETTRACEVALUE("movePattern")=="Z-Pattern"
                IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                  ASSIGN/X_ROW_OFFSET=0
                END_IF/
                ELSE/
                  ASSIGN/Y_COLUMN_OFFSET=0
                END_ELSE/
              END_IF/
              DO/
                ASSIGN/X_ROW_UNTIL_CNT=X_ROW_UNTIL_CNT+1
                ASSIGN/SKIP_CELL_TRACE=ELEMENT(SKIP_CELL_CNT,",",GETTRACEVALUE("skipCellTrace"))
                ASSIGN/SKIP_CELL=SKIP_CELL_TRACE
                ASSIGN/CELL_COUNT=CELL_COUNT+1
                IF/CELL_COUNT==SKIP_CELL
                  IF/GETTRACEVALUE("skipCellReportInfo")=="Yes"
                    COMMENT/REPT,
                    "Skip Cell Number: "+CELL_COUNT
                  END_IF/
                  ASSIGN/SKIP_CELL_CNT=SKIP_CELL_CNT+1
                END_IF/
                IF_GOTO/CELL_COUNT==SKIP_CELL,GOTO = SKIP_CELL_L1
                ASSIGN/SER_NO_TRACE=ELEMENT(CELL_COUNT,",",GETTRACEVALUE("partIdNo"))
                ASSIGN/SER_NO=SER_NO_TRACE
LOOP_ORIGIN    =GENERIC/POINT,DEPENDENT,CARTESIAN,$
                NOM/XYZ,<0+0,0+0,0+0>,$
                MEAS/XYZ,<X_ROW_OFFSET,Y_COLUMN_OFFSET,0+0>,$
                NOM/IJK,<0+0,0+0,1+0>,$
                MEAS/IJK,<0+0,0+0,1+0>
A1             =ALIGNMENT/START,RECALL:USE_ACTIVE_ALIGNMENT(STARTUP),LIST=YES
                  ALIGNMENT/TRANS,XAXIS,LOOP_ORIGIN
                  ALIGNMENT/TRANS,YAXIS,LOOP_ORIGIN
                ALIGNMENT/END
    $$ NO,
                Add Measured Features
                .
F1             =GENERIC/CIRCLE,DEPENDENT,CARTESIAN,OUT,$
                NOM/XYZ,<0,0,0>,$
                MEAS/XYZ,<0,0,0>,$
                NOM/IJK,<0,0,1>,$
                MEAS/IJK,<0,0,1>,$
                DIAMETER/1,1
                COMMENT/REPT,
                "Cell Count: "+CELL_COUNT
                IF/GETTRACEVALUE("partId")=="Yes"
                  COMMENT/REPT,
                  "Part ID: "+SER_NO
                END_IF/
    $$ NO,
                Add Dimensions
                .
    DIM LOC1= LOCATION OF CIRCLE F1  UNITS=IN ,$
    GRAPH=OFF  TEXT=OFF  MULT=10.00  OUTPUT=BOTH  HALF ANGLE=NO
    AX    NOMINAL       +TOL       -TOL       MEAS        DEV     OUTTOL
    X       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
    Y       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
    Z       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
    END OF DIMENSION LOC1
                RECALL/ALIGNMENT,INTERNAL,STARTUP
    $$ NO,
                Add Print or File save per-part
                .
SKIP_CELL_L1    =LABEL/
                ASSIGN/X_ROW_OFFSET_INPUT=ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))
                ASSIGN/Y_COLUMN_OFFSET_INPUT=ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))
    $$ NO,
                Routine Settings results - Test - Change from document to operator to validate the Setting results.
                .
                "X_ROW_OFFSET_INPUT for next feature is: "+X_ROW_OFFSET_INPUT+" and Current X_ROW_OFFSET: "+X_ROW_OFFSET
                "X_ROW_UNTIL_CNT: "+X_ROW_UNTIL_CNT
                "Y_COLUMN_OFFSET_INPUT for next feature is: "+Y_COLUMN_OFFSET_INPUT+" and Current Y_COLUMN_OFFSET: "+Y_COLUMN_OFFSET
                "Y_COLUMN_UNTIL_CNT: "+Y_COLUMN_UNTIL_CNT
                "Entered info for X_OFFSET_INPUT: "+X_OFFSET_INPUT+" and Y_OFFSET_INPUT: "+Y_OFFSET_INPUT
                "Entered info for X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS+" and X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS
                IF/GETTRACEVALUE("movePattern")=="Z-Pattern"
                  IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                    ASSIGN/X_ROW_OFFSET=X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow")))
                  END_IF/
                  ELSE/
                    ASSIGN/Y_COLUMN_OFFSET=Y_COLUMN_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn")))
                  END_ELSE/
                END_IF/
                ELSE/
                  IF/X_ROW_UNTIL_CNT<>ABS(GETTRACEVALUE("xRowsTrace"))
                    IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                      ASSIGN/X_ROW_OFFSET=IF(DIRECTION=="ONE",X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))),X_ROW_OFFSET-(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))))
                    END_IF/
                    ELSE/
                      ASSIGN/Y_COLUMN_OFFSET=IF(DIRECTION=="ONE",Y_COLUMN_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))),Y_COLUMN_OFFSET-(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))))
                    END_ELSE/
                    ASSIGN/ROW_COMPLETE=IF(DIRECTION=="ONE","LEFT","RIGHT")
                  END_IF/
                END_ELSE/
              UNTIL/X_ROW_UNTIL_CNT==ABS(GETTRACEVALUE("xRowsTrace"))
              ASSIGN/X_ROW_OFFSET_INPUT=ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))
              ASSIGN/Y_COLUMN_OFFSET_INPUT=ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))
  $$ NO,
              Routine Settings results - Test - Change from document to operator to validate the Setting results.
              .
              "Y_COLUMN_OFFSET_INPUT for next feature is: "+Y_COLUMN_OFFSET_INPUT+" and Current Y_COLUMN_OFFSET: "+Y_COLUMN_OFFSET
              "Y_COLUMN_UNTIL_CNT: "+Y_COLUMN_UNTIL_CNT
              "X_ROW_OFFSET_INPUT for next feature is: "+X_ROW_OFFSET_INPUT+" and Current X_ROW_OFFSET: "+X_ROW_OFFSET
              "X_ROW_UNTIL_CNT: "+X_ROW_UNTIL_CNT
              "Entered info for X_OFFSET_INPUT: "+X_OFFSET_INPUT+" and Y_OFFSET_INPUT: "+Y_OFFSET_INPUT
              "Entered info for X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS+" and X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS
              ASSIGN/DIRECTION=IF(ROW_COMPLETE=="RIGHT","ONE","TWO")
              IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                ASSIGN/Y_COLUMN_OFFSET=Y_COLUMN_OFFSET+(ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn")))
              END_IF/
              ELSE/
                ASSIGN/X_ROW_OFFSET=X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow")))
              END_ELSE/
  $$ NO,
              Test - Change from document to operator to validate the offset distance.
            UNTIL/Y_COLUMN_UNTIL_CNT==ABS(GETTRACEVALUE("yColumnsTrace"))
            ASSIGN/TOTAL_PART_CNT=CELL_COUNT-(SKIP_CELL_CNT-1)
            COMMENT/REPT,
            "Total Part Quantity: "+TOTAL_PART_CNT
$$ NO,
            Add append Print or File save
            .
Parents
  • Updated the Pallet Routine Example - Loop Pattern types and Start direction options to use number of parts on a pallet.

    03-07-2023
    Pallet Routine - Example

    Pallet Routine highlight features

    Use either Part ID or Pallet Cell (Station) number.
    Pattern layouts are Z-Pattern or Linear-Pattern.
    Change the start direction.
    Skip Cells (Station) Parts.

    There is no Exit Do (VB.NET) or break; (C#) to exit the loop in PC-DMIS. I used the IF_GOTO with a true condition to jump to a label instead.
    Added features:
    TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter the number of parts to be executed ; totalParts : 6
    ASSIGN/NUMBER_PARTS_EXECUTED=GETTRACEVALUE("totalParts")​
    IF_GOTO/(CELL_COUNT-1)==NUMBER_PARTS_EXECUTED,GOTO = EXIT_DO
    EXIT_DO =LABEL/


    ​PART NAME  : Pallet Routine Auto count Direction Forum
    REV NUMBER : 20220816
    SER NUMBER :
    STATS COUNT : 1
     
    STARTUP    =ALIGNMENT/START,RECALL:USE_PART_SETUP,LIST=YES
                ALIGNMENT/END
                MODE/MANUAL
                FORMAT/TEXT,OPTIONS, ,HEADINGS,SYMBOLS, ;NOM,TOL,MEAS,DEV,OUTTOL, ,
                LOADPROBE/5BY50_M3_SH
                TIP/TIP1, SHANKIJK=0, 0, 1, ANGLE=0
    $$ NO,
                Add Manual Part Alignment and Features
                .
    $$ NO,
                Add DCC Part Alignment and Features
                .
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter Part ID per-part (Ex. 101,107) or enter Same as Cell Count ; partIdNo : Same as Cell Count
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter the number of parts to be executed ; totalParts : 6
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Measurement Pattern Layout ; movePattern : Linear-Pattern
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Select Start direction ; cellRunDirection : X Row
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter number of Rows - X axis ; xRowsTrace : 3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter number of Columns - Y axis ; yColumnsTrace : 3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter offset distance between parts - Each row X ; xCellOffsetRow : 2,3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter offset distance between parts - Each column Y ; yCellOffsetColumn : 2,3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Skip Cells(part Ex.1 or parts Ex.1,2,3) Enter in ascending order ; skipCellTrace : 2,6
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Report skip Cell information? ; skipCellReportInfo : Yes
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Report Part ID information? ; partId : Yes
                ASSIGN/NUMBER_PARTS_EXECUTED=GETTRACEVALUE("totalParts")
                ASSIGN/X_AXIS_NUMBER_ROWS=GETTRACEVALUE("xRowsTrace")
                ASSIGN/Y_AXIS_NUMBER_ROWS=GETTRACEVALUE("yRowsTrace")
                ASSIGN/X_OFFSET_INPUT=GETTRACEVALUE("xCellOffsetRow")
                ASSIGN/Y_OFFSET_INPUT=GETTRACEVALUE("yCellOffsetColumn")
                ASSIGN/X_ROW_OFFSET=0
                ASSIGN/Y_COLUMN_OFFSET=0
                ASSIGN/Y_COLUMN_UNTIL_CNT=0
                ASSIGN/DIRECTION="ONE"
                ASSIGN/CELL_COUNT=0
                ASSIGN/SKIP_CELL_CNT=1
                DO/
                  ASSIGN/Y_COLUMN_UNTIL_CNT=Y_COLUMN_UNTIL_CNT+1
                  ASSIGN/X_ROW_UNTIL_CNT=0
                  IF/GETTRACEVALUE("movePattern")=="Z-Pattern"
                    IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                      ASSIGN/X_ROW_OFFSET=0
                    END_IF/
                    ELSE/
                      ASSIGN/Y_COLUMN_OFFSET=0
                    END_ELSE/
                  END_IF/
                  DO/
                    ASSIGN/X_ROW_UNTIL_CNT=X_ROW_UNTIL_CNT+1
                    ASSIGN/SKIP_CELL_TRACE=ELEMENT(SKIP_CELL_CNT,",",GETTRACEVALUE("skipCellTrace"))
                    ASSIGN/SKIP_CELL=SKIP_CELL_TRACE
                    ASSIGN/CELL_COUNT=CELL_COUNT+1
                    IF_GOTO/(CELL_COUNT-1)==NUMBER_PARTS_EXECUTED,GOTO = EXIT_DO
                    IF/CELL_COUNT==SKIP_CELL
                      IF/GETTRACEVALUE("skipCellReportInfo")=="Yes"
                        COMMENT/REPT,
                        "Skip Cell Number: "+CELL_COUNT
                      END_IF/
                      ASSIGN/SKIP_CELL_CNT=SKIP_CELL_CNT+1
                    END_IF/
                    IF_GOTO/CELL_COUNT==SKIP_CELL,GOTO = SKIP_CELL_L1
                    ASSIGN/SER_NO_TRACE=ELEMENT(CELL_COUNT,",",GETTRACEVALUE("partIdNo"))
                    ASSIGN/SER_NO=SER_NO_TRACE
    LOOP_ORIGIN    =GENERIC/POINT,DEPENDENT,CARTESIAN,$
                    NOM/XYZ,<0+0,0+0,0+0>,$
                    MEAS/XYZ,<X_ROW_OFFSET,Y_COLUMN_OFFSET,0+0>,$
                    NOM/IJK,<0+0,0+0,1+0>,$
                    MEAS/IJK,<0+0,0+0,1+0>
    A1             =ALIGNMENT/START,RECALL:USE_ACTIVE_ALIGNMENT(STARTUP),LIST=YES
                      ALIGNMENT/TRANS,XAXIS,LOOP_ORIGIN
                      ALIGNMENT/TRANS,YAXIS,LOOP_ORIGIN
                    ALIGNMENT/END
        $$ NO,
                    Add Measured Features
                    .
    F1             =GENERIC/CIRCLE,DEPENDENT,CARTESIAN,OUT,$
                    NOM/XYZ,<0,0,0>,$
                    MEAS/XYZ,<0,0,0>,$
                    NOM/IJK,<0,0,1>,$
                    MEAS/IJK,<0,0,1>,$
                    DIAMETER/1,1
                    COMMENT/REPT,
                    "Cell Count: "+CELL_COUNT
                    IF/GETTRACEVALUE("partId")=="Yes"
                      COMMENT/REPT,
                      "Part ID: "+SER_NO
                    END_IF/
        $$ NO,
                    Add Dimensions
                    .
        DIM LOC1= LOCATION OF CIRCLE F1  UNITS=IN ,$
        GRAPH=OFF  TEXT=OFF  MULT=10.00  OUTPUT=BOTH  HALF ANGLE=NO
        AX    NOMINAL       +TOL       -TOL       MEAS        DEV     OUTTOL
        X       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
        Y       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
        Z       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
        END OF DIMENSION LOC1
                    RECALL/ALIGNMENT,INTERNAL,STARTUP
        $$ NO,
                    Add Print or File save per-part
                    .
    SKIP_CELL_L1    =LABEL/
                    ASSIGN/X_ROW_OFFSET_INPUT=ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))
                    ASSIGN/Y_COLUMN_OFFSET_INPUT=ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))
        $$ NO,
                    Routine Settings results - Test - Change from document to operator to validate the Setting results.
                    .
                    "X_ROW_OFFSET_INPUT for next feature is: "+X_ROW_OFFSET_INPUT+" and Current X_ROW_OFFSET: "+X_ROW_OFFSET
                    "X_ROW_UNTIL_CNT: "+X_ROW_UNTIL_CNT
                    "Y_COLUMN_OFFSET_INPUT for next feature is: "+Y_COLUMN_OFFSET_INPUT+" and Current Y_COLUMN_OFFSET: "+Y_COLUMN_OFFSET
                    "Y_COLUMN_UNTIL_CNT: "+Y_COLUMN_UNTIL_CNT
                    "Entered info for X_OFFSET_INPUT: "+X_OFFSET_INPUT+" and Y_OFFSET_INPUT: "+Y_OFFSET_INPUT
                    "Entered info for X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS+" and X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS
                    IF/GETTRACEVALUE("movePattern")=="Z-Pattern"
                      IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                        ASSIGN/X_ROW_OFFSET=X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow")))
                      END_IF/
                      ELSE/
                        ASSIGN/Y_COLUMN_OFFSET=Y_COLUMN_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn")))
                      END_ELSE/
                    END_IF/
                    ELSE/
                      IF/X_ROW_UNTIL_CNT<>ABS(GETTRACEVALUE("xRowsTrace"))
                        IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                          ASSIGN/X_ROW_OFFSET=IF(DIRECTION=="ONE",X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))),X_ROW_OFFSET-(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))))
                        END_IF/
                        ELSE/
                          ASSIGN/Y_COLUMN_OFFSET=IF(DIRECTION=="ONE",Y_COLUMN_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))),Y_COLUMN_OFFSET-(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))))
                        END_ELSE/
                        ASSIGN/ROW_COMPLETE=IF(DIRECTION=="ONE","LEFT","RIGHT")
                      END_IF/
                    END_ELSE/
                  UNTIL/X_ROW_UNTIL_CNT==ABS(GETTRACEVALUE("xRowsTrace"))
                  ASSIGN/X_ROW_OFFSET_INPUT=ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))
                  ASSIGN/Y_COLUMN_OFFSET_INPUT=ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))
      $$ NO,
                  Routine Settings results - Test - Change from document to operator to validate the Setting results.
                  .
                  "Y_COLUMN_OFFSET_INPUT for next feature is: "+Y_COLUMN_OFFSET_INPUT+" and Current Y_COLUMN_OFFSET: "+Y_COLUMN_OFFSET
                  "Y_COLUMN_UNTIL_CNT: "+Y_COLUMN_UNTIL_CNT
                  "X_ROW_OFFSET_INPUT for next feature is: "+X_ROW_OFFSET_INPUT+" and Current X_ROW_OFFSET: "+X_ROW_OFFSET
                  "X_ROW_UNTIL_CNT: "+X_ROW_UNTIL_CNT
                  "Entered info for X_OFFSET_INPUT: "+X_OFFSET_INPUT+" and Y_OFFSET_INPUT: "+Y_OFFSET_INPUT
                  "Entered info for X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS+" and X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS
                  ASSIGN/DIRECTION=IF(ROW_COMPLETE=="RIGHT","ONE","TWO")
                  IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                    ASSIGN/Y_COLUMN_OFFSET=Y_COLUMN_OFFSET+(ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn")))
                  END_IF/
                  ELSE/
                    ASSIGN/X_ROW_OFFSET=X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow")))
                  END_ELSE/
      $$ NO,
                  Test - Change from document to operator to validate the offset distance.
                UNTIL/Y_COLUMN_UNTIL_CNT==ABS(GETTRACEVALUE("yColumnsTrace"))
                ASSIGN/TOTAL_PART_CNT=CELL_COUNT-(SKIP_CELL_CNT-1)
                COMMENT/REPT,
                "Total Part Quantity: "+TOTAL_PART_CNT
    $$ NO,
                Add append Print or File save
                .
    EXIT_DO    =LABEL/
    
Reply
  • Updated the Pallet Routine Example - Loop Pattern types and Start direction options to use number of parts on a pallet.

    03-07-2023
    Pallet Routine - Example

    Pallet Routine highlight features

    Use either Part ID or Pallet Cell (Station) number.
    Pattern layouts are Z-Pattern or Linear-Pattern.
    Change the start direction.
    Skip Cells (Station) Parts.

    There is no Exit Do (VB.NET) or break; (C#) to exit the loop in PC-DMIS. I used the IF_GOTO with a true condition to jump to a label instead.
    Added features:
    TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter the number of parts to be executed ; totalParts : 6
    ASSIGN/NUMBER_PARTS_EXECUTED=GETTRACEVALUE("totalParts")​
    IF_GOTO/(CELL_COUNT-1)==NUMBER_PARTS_EXECUTED,GOTO = EXIT_DO
    EXIT_DO =LABEL/


    ​PART NAME  : Pallet Routine Auto count Direction Forum
    REV NUMBER : 20220816
    SER NUMBER :
    STATS COUNT : 1
     
    STARTUP    =ALIGNMENT/START,RECALL:USE_PART_SETUP,LIST=YES
                ALIGNMENT/END
                MODE/MANUAL
                FORMAT/TEXT,OPTIONS, ,HEADINGS,SYMBOLS, ;NOM,TOL,MEAS,DEV,OUTTOL, ,
                LOADPROBE/5BY50_M3_SH
                TIP/TIP1, SHANKIJK=0, 0, 1, ANGLE=0
    $$ NO,
                Add Manual Part Alignment and Features
                .
    $$ NO,
                Add DCC Part Alignment and Features
                .
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter Part ID per-part (Ex. 101,107) or enter Same as Cell Count ; partIdNo : Same as Cell Count
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter the number of parts to be executed ; totalParts : 6
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Measurement Pattern Layout ; movePattern : Linear-Pattern
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Select Start direction ; cellRunDirection : X Row
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter number of Rows - X axis ; xRowsTrace : 3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter number of Columns - Y axis ; yColumnsTrace : 3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter offset distance between parts - Each row X ; xCellOffsetRow : 2,3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Enter offset distance between parts - Each column Y ; yCellOffsetColumn : 2,3
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Skip Cells(part Ex.1 or parts Ex.1,2,3) Enter in ascending order ; skipCellTrace : 2,6
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Report skip Cell information? ; skipCellReportInfo : Yes
                TRACEFIELD/DISPLAY=YES,REPORT=NO,DISPLAY MESSAGE=Report Part ID information? ; partId : Yes
                ASSIGN/NUMBER_PARTS_EXECUTED=GETTRACEVALUE("totalParts")
                ASSIGN/X_AXIS_NUMBER_ROWS=GETTRACEVALUE("xRowsTrace")
                ASSIGN/Y_AXIS_NUMBER_ROWS=GETTRACEVALUE("yRowsTrace")
                ASSIGN/X_OFFSET_INPUT=GETTRACEVALUE("xCellOffsetRow")
                ASSIGN/Y_OFFSET_INPUT=GETTRACEVALUE("yCellOffsetColumn")
                ASSIGN/X_ROW_OFFSET=0
                ASSIGN/Y_COLUMN_OFFSET=0
                ASSIGN/Y_COLUMN_UNTIL_CNT=0
                ASSIGN/DIRECTION="ONE"
                ASSIGN/CELL_COUNT=0
                ASSIGN/SKIP_CELL_CNT=1
                DO/
                  ASSIGN/Y_COLUMN_UNTIL_CNT=Y_COLUMN_UNTIL_CNT+1
                  ASSIGN/X_ROW_UNTIL_CNT=0
                  IF/GETTRACEVALUE("movePattern")=="Z-Pattern"
                    IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                      ASSIGN/X_ROW_OFFSET=0
                    END_IF/
                    ELSE/
                      ASSIGN/Y_COLUMN_OFFSET=0
                    END_ELSE/
                  END_IF/
                  DO/
                    ASSIGN/X_ROW_UNTIL_CNT=X_ROW_UNTIL_CNT+1
                    ASSIGN/SKIP_CELL_TRACE=ELEMENT(SKIP_CELL_CNT,",",GETTRACEVALUE("skipCellTrace"))
                    ASSIGN/SKIP_CELL=SKIP_CELL_TRACE
                    ASSIGN/CELL_COUNT=CELL_COUNT+1
                    IF_GOTO/(CELL_COUNT-1)==NUMBER_PARTS_EXECUTED,GOTO = EXIT_DO
                    IF/CELL_COUNT==SKIP_CELL
                      IF/GETTRACEVALUE("skipCellReportInfo")=="Yes"
                        COMMENT/REPT,
                        "Skip Cell Number: "+CELL_COUNT
                      END_IF/
                      ASSIGN/SKIP_CELL_CNT=SKIP_CELL_CNT+1
                    END_IF/
                    IF_GOTO/CELL_COUNT==SKIP_CELL,GOTO = SKIP_CELL_L1
                    ASSIGN/SER_NO_TRACE=ELEMENT(CELL_COUNT,",",GETTRACEVALUE("partIdNo"))
                    ASSIGN/SER_NO=SER_NO_TRACE
    LOOP_ORIGIN    =GENERIC/POINT,DEPENDENT,CARTESIAN,$
                    NOM/XYZ,<0+0,0+0,0+0>,$
                    MEAS/XYZ,<X_ROW_OFFSET,Y_COLUMN_OFFSET,0+0>,$
                    NOM/IJK,<0+0,0+0,1+0>,$
                    MEAS/IJK,<0+0,0+0,1+0>
    A1             =ALIGNMENT/START,RECALL:USE_ACTIVE_ALIGNMENT(STARTUP),LIST=YES
                      ALIGNMENT/TRANS,XAXIS,LOOP_ORIGIN
                      ALIGNMENT/TRANS,YAXIS,LOOP_ORIGIN
                    ALIGNMENT/END
        $$ NO,
                    Add Measured Features
                    .
    F1             =GENERIC/CIRCLE,DEPENDENT,CARTESIAN,OUT,$
                    NOM/XYZ,<0,0,0>,$
                    MEAS/XYZ,<0,0,0>,$
                    NOM/IJK,<0,0,1>,$
                    MEAS/IJK,<0,0,1>,$
                    DIAMETER/1,1
                    COMMENT/REPT,
                    "Cell Count: "+CELL_COUNT
                    IF/GETTRACEVALUE("partId")=="Yes"
                      COMMENT/REPT,
                      "Part ID: "+SER_NO
                    END_IF/
        $$ NO,
                    Add Dimensions
                    .
        DIM LOC1= LOCATION OF CIRCLE F1  UNITS=IN ,$
        GRAPH=OFF  TEXT=OFF  MULT=10.00  OUTPUT=BOTH  HALF ANGLE=NO
        AX    NOMINAL       +TOL       -TOL       MEAS        DEV     OUTTOL
        X       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
        Y       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
        Z       0.0000     0.0020     0.0020     0.0000     0.0000     0.0000 ----#----
        END OF DIMENSION LOC1
                    RECALL/ALIGNMENT,INTERNAL,STARTUP
        $$ NO,
                    Add Print or File save per-part
                    .
    SKIP_CELL_L1    =LABEL/
                    ASSIGN/X_ROW_OFFSET_INPUT=ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))
                    ASSIGN/Y_COLUMN_OFFSET_INPUT=ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))
        $$ NO,
                    Routine Settings results - Test - Change from document to operator to validate the Setting results.
                    .
                    "X_ROW_OFFSET_INPUT for next feature is: "+X_ROW_OFFSET_INPUT+" and Current X_ROW_OFFSET: "+X_ROW_OFFSET
                    "X_ROW_UNTIL_CNT: "+X_ROW_UNTIL_CNT
                    "Y_COLUMN_OFFSET_INPUT for next feature is: "+Y_COLUMN_OFFSET_INPUT+" and Current Y_COLUMN_OFFSET: "+Y_COLUMN_OFFSET
                    "Y_COLUMN_UNTIL_CNT: "+Y_COLUMN_UNTIL_CNT
                    "Entered info for X_OFFSET_INPUT: "+X_OFFSET_INPUT+" and Y_OFFSET_INPUT: "+Y_OFFSET_INPUT
                    "Entered info for X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS+" and X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS
                    IF/GETTRACEVALUE("movePattern")=="Z-Pattern"
                      IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                        ASSIGN/X_ROW_OFFSET=X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow")))
                      END_IF/
                      ELSE/
                        ASSIGN/Y_COLUMN_OFFSET=Y_COLUMN_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn")))
                      END_ELSE/
                    END_IF/
                    ELSE/
                      IF/X_ROW_UNTIL_CNT<>ABS(GETTRACEVALUE("xRowsTrace"))
                        IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                          ASSIGN/X_ROW_OFFSET=IF(DIRECTION=="ONE",X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))),X_ROW_OFFSET-(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))))
                        END_IF/
                        ELSE/
                          ASSIGN/Y_COLUMN_OFFSET=IF(DIRECTION=="ONE",Y_COLUMN_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))),Y_COLUMN_OFFSET-(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))))
                        END_ELSE/
                        ASSIGN/ROW_COMPLETE=IF(DIRECTION=="ONE","LEFT","RIGHT")
                      END_IF/
                    END_ELSE/
                  UNTIL/X_ROW_UNTIL_CNT==ABS(GETTRACEVALUE("xRowsTrace"))
                  ASSIGN/X_ROW_OFFSET_INPUT=ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow"))
                  ASSIGN/Y_COLUMN_OFFSET_INPUT=ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn"))
      $$ NO,
                  Routine Settings results - Test - Change from document to operator to validate the Setting results.
                  .
                  "Y_COLUMN_OFFSET_INPUT for next feature is: "+Y_COLUMN_OFFSET_INPUT+" and Current Y_COLUMN_OFFSET: "+Y_COLUMN_OFFSET
                  "Y_COLUMN_UNTIL_CNT: "+Y_COLUMN_UNTIL_CNT
                  "X_ROW_OFFSET_INPUT for next feature is: "+X_ROW_OFFSET_INPUT+" and Current X_ROW_OFFSET: "+X_ROW_OFFSET
                  "X_ROW_UNTIL_CNT: "+X_ROW_UNTIL_CNT
                  "Entered info for X_OFFSET_INPUT: "+X_OFFSET_INPUT+" and Y_OFFSET_INPUT: "+Y_OFFSET_INPUT
                  "Entered info for X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS+" and X_AXIS_NUMBER_ROWS: "+X_AXIS_NUMBER_ROWS
                  ASSIGN/DIRECTION=IF(ROW_COMPLETE=="RIGHT","ONE","TWO")
                  IF/GETTRACEVALUE("cellRunDirection")=="X Row"
                    ASSIGN/Y_COLUMN_OFFSET=Y_COLUMN_OFFSET+(ELEMENT(Y_COLUMN_UNTIL_CNT,",",GETTRACEVALUE("yCellOffsetColumn")))
                  END_IF/
                  ELSE/
                    ASSIGN/X_ROW_OFFSET=X_ROW_OFFSET+(ELEMENT(X_ROW_UNTIL_CNT,",",GETTRACEVALUE("xCellOffsetRow")))
                  END_ELSE/
      $$ NO,
                  Test - Change from document to operator to validate the offset distance.
                UNTIL/Y_COLUMN_UNTIL_CNT==ABS(GETTRACEVALUE("yColumnsTrace"))
                ASSIGN/TOTAL_PART_CNT=CELL_COUNT-(SKIP_CELL_CNT-1)
                COMMENT/REPT,
                "Total Part Quantity: "+TOTAL_PART_CNT
    $$ NO,
                Add append Print or File save
                .
    EXIT_DO    =LABEL/
    
Children
No Data