VENDOR CHEAT SHEET
One pick-and-place, seven robot languages
One 12-step pick-and-place cycle written in ABB RAPID, KUKA KRL, FANUC TP, Mitsubishi MELFA BASIC V, Universal Robots URScript, Yaskawa INFORM and Kawasaki AS. Each row is one step of the cycle, so read across a row to see how each controller says the same thing. The listings show the program body; the files you load onto a controller carry extra header and position data, covered in the notes at the bottom.
ABB · RAPID
KUKA · KRL
FANUC · TP
Mitsubishi · MELFA BASIC V
Universal · URScript
Yaskawa · INFORM
Kawasaki · AS
| Step | ABB RAPID | KUKA KRL | FANUC TP | Mitsubishi MELFA BASIC V | Universal URScript | Yaskawa INFORM | Kawasaki AS |
|---|---|---|---|---|---|---|---|
01 Program header | PROC main() | DEF main() | /PROG MAIN | 10 ' Pick and place | def main(): | NOP | .PROGRAM main() |
02 Set default speed | ! speed via v-tag | $VEL.CP = 0.5 | ! speed in motion | 20 Spd 100 | # speed in motion | 'speed in motion | SPEED 50 ALWAYS |
03 Move joint to home | MoveJ home, v1000, fine, tool0; | PTP home | J P[1] 100% FINE | 30 Mov P0 | movej(home, a=1.4, v=1.05) | MOVJ P000 VJ=50.00 | JMOVE home |
04 Move linear to pick | MoveL pick, v500, fine, tool0; | LIN pick | L P[2] 500mm/sec FINE | 40 Mvs P1 | movel(pick, a=1.2, v=0.25) | MOVL P001 V=100.0 | LMOVE pick |
05 Close gripper (DO ON) | SetDO doGrip, 1; | $OUT[1] = TRUE | DO[1]=ON | 50 M_Out(1) = 1 | set_digital_out(1, True) | DOUT OT#(1) ON | SIGNAL 1 |
06 Wait 0.5 s | WaitTime 0.5; | WAIT SEC 0.5 | WAIT 0.50(sec) | 60 Dly 0.5 | sleep(0.5) | TIMER T=0.50 | TWAIT 0.5 |
07 Retract to home | MoveL home, v1000, fine, tool0; | LIN home | L P[1] 1000mm/sec FINE | 70 Mvs P0 | movel(home, a=1.2, v=0.5) | MOVL P000 V=100.0 | LMOVE home |
08 Move linear to place | MoveL place, v500, fine, tool0; | LIN place | L P[3] 500mm/sec FINE | 80 Mvs P2 | movel(place, a=1.2, v=0.25) | MOVL P002 V=100.0 | LMOVE place |
09 Open gripper (DO OFF) | ResetDO doGrip; | $OUT[1] = FALSE | DO[1]=OFF | 90 M_Out(1) = 0 | set_digital_out(1, False) | DOUT OT#(1) OFF | SIGNAL -1 |
10 Wait 0.5 s | WaitTime 0.5; | WAIT SEC 0.5 | WAIT 0.50(sec) | 100 Dly 0.5 | sleep(0.5) | TIMER T=0.50 | TWAIT 0.5 |
11 Return to home | MoveJ home, v1000, fine, tool0; | PTP home | J P[1] 100% FINE | 110 Mov P0 | movej(home, a=1.4, v=1.05) | MOVJ P000 VJ=50.00 | JMOVE home |
12 End of program | ENDPROC | END | /END | 120 End | end | END | .END |
Full programs, side-by-side
The same cycle again, one block per language, so you can read or copy a whole program at once.
PROC main() ! speed via v-tag MoveJ home, v1000, fine, tool0; MoveL pick, v500, fine, tool0; SetDO doGrip, 1; WaitTime 0.5; MoveL home, v1000, fine, tool0; MoveL place, v500, fine, tool0; ResetDO doGrip; WaitTime 0.5; MoveJ home, v1000, fine, tool0; ENDPROC
DEF main() $VEL.CP = 0.5 PTP home LIN pick $OUT[1] = TRUE WAIT SEC 0.5 LIN home LIN place $OUT[1] = FALSE WAIT SEC 0.5 PTP home END
/PROG MAIN ! speed in motion J P[1] 100% FINE L P[2] 500mm/sec FINE DO[1]=ON WAIT 0.50(sec) L P[1] 1000mm/sec FINE L P[3] 500mm/sec FINE DO[1]=OFF WAIT 0.50(sec) J P[1] 100% FINE /END
10 ' Pick and place 20 Spd 100 30 Mov P0 40 Mvs P1 50 M_Out(1) = 1 60 Dly 0.5 70 Mvs P0 80 Mvs P2 90 M_Out(1) = 0 100 Dly 0.5 110 Mov P0 120 End
def main(): # speed in motion movej(home, a=1.4, v=1.05) movel(pick, a=1.2, v=0.25) set_digital_out(1, True) sleep(0.5) movel(home, a=1.2, v=0.5) movel(place, a=1.2, v=0.25) set_digital_out(1, False) sleep(0.5) movej(home, a=1.4, v=1.05) end
NOP 'speed in motion MOVJ P000 VJ=50.00 MOVL P001 V=100.0 DOUT OT#(1) ON TIMER T=0.50 MOVL P000 V=100.0 MOVL P002 V=100.0 DOUT OT#(1) OFF TIMER T=0.50 MOVJ P000 VJ=50.00 END
Three more instructions, seven spellings
The pick-and-place cycle above never needs an arc, a blended corner or a subroutine. This table shows those three in each language. Names such as pVia, p1 and PICK are placeholders.
| Instruction | ABB RAPID | KUKA KRL | FANUC TP | Mitsubishi MELFA BASIC V | Universal URScript | Yaskawa INFORM | Kawasaki AS |
|---|---|---|---|---|---|---|---|
| Circular move through a via point | MoveC pVia, pEnd, v200, z10, tool0; | CIRC P_VIA, P_END | C P[3] P[4] 200mm/sec FINE | Mvr P2, P3, P4 | movec(p_via, p_end, a=1.2, v=0.25) | MOVC P003 V=80.0 MOVC P004 V=80.0 MOVC P005 V=80.0 | C1MOVE via C2MOVE arc_end |
| Blend past a point instead of stopping | MoveL p1, v500, z10, tool0; | $APO.CDIS = 10 LIN P1 C_DIS | L P[1] 500mm/sec CNT50 | Cnt 1 | movel(p1, a=1.2, v=0.25, r=0.01) | MOVL P001 V=100.0 PL=3 | ACCURACY 10 ALWAYS |
| Call a subroutine | Pick; | PICK() | CALL PICK | GoSub *PICK | pick() | CALL JOB:PICK | CALL pick |
- FANUC shows one circular instruction over two lines, via point then end point. Yaskawa needs three MOVC points in a row (start, via, end). Kawasaki splits the arc into C1MOVE to the via point and C2MOVE to the end.
- ABB z10, KUKA C_DIS, UR r and Kawasaki ACCURACY are distances, in millimetres except for UR, which uses metres. FANUC CNT runs from 0 to 100 and is not a distance. Yaskawa PL is a level from 0 to 8 whose distances are set in parameters. MELFA Cnt 1 turns continuous-path motion on for the moves that follow.
- MELFA GoSub jumps to a label in the same program and comes back on Return; CallP runs another program. FANUC, Yaskawa and Kawasaki call a separate program by name. ABB, KUKA and URScript call a routine defined in the program or module.
Notes
- FANUC TP puts the speed on each motion line, and ABB RAPID gives each move its own speed argument (
v500,v1000). KUKA KRL sets$VEL.CPonce, in m/s, but it only applies to LIN and CIRC; PTP speed comes from$VEL_AXIS, a percentage per axis. - Yaskawa INFORM stores positions as
P000toP002, FANUC TP asP[1]toP[3]. In URScript,home,pickandplaceare variables holding pose values such asp[x, y, z, rx, ry, rz], in metres and a rotation vector in radians. - Digital outputs look different and do the same job: ABB
SetDO, KUKA$OUT[], FANUCDO[], MELFAM_Out(), URScriptset_digital_out, YaskawaDOUT OT#(), KawasakiSIGNAL n(SIGNAL -nswitches it off). - MELFA BASIC V programs carry line numbers; the other six languages do not need them in the source.
- On the pendant every FANUC TP line has a line number. The /PROG and /END lines come from the .LS text file, which also has /MN and /POS sections and ends each line with a semicolon.
- Comment markers: ! in ABB RAPID and FANUC TP, ; in KUKA KRL and Kawasaki AS, # in URScript, and a leading apostrophe in MELFA BASIC and Yaskawa INFORM.