← Robot hub
ROBOT / ABB / RAPID

BRAND.00 / IRC5 + OMNICORE · RAPID

ABB RAPID

The structured, Pascal-influenced language that runs every ABB industrial robot.

RAPID was introduced by ABB in 1994 with the S4 controller and is still the language of the current IRC5 and OmniCore controllers. It is structured, strongly typed, and modular — closer to Pascal or Ada than to BASIC. Programs live in modules, execution starts at a main routine, and the language separates data declarations from procedural code.

First all-electric IRB
1974
IRB-6 — ABB (then ASEA) shipped the first electrically driven 6-axis industrial robot.
RAPID introduced
1994
S4 controller debuted the RAPID language. Still binary-compatible with today's OmniCore programs.
Current platform
OmniCore
Successor to IRC5. Tighter motion control, native digital connectivity, lower energy draw.
Sim environment
RobotStudio
Free-to-use offline programming + virtual controller. Same RAPID runtime as the real cell.

ABB is one of the "Big Four" industrial robot vendors (with FANUC, KUKA and Yaskawa). Its identity is the long IRB lineage, RobotStudio as a free first-class simulator, and a tight integration between the language (RAPID), the controller (IRC5 / OmniCore) and the safety stack (SafeMove).

Heritage
Half a century of IRBs

The IRB family stretches from the 1974 IRB-6 to today's IRB 1010 and OmniCore-era cells. Programs written in RAPID on an old S4 still read the same in OmniCore.

Controller
IRC5 to OmniCore

IRC5 (2004) remains supported on millions of installed robots. OmniCore is the current platform — same language, more motion bandwidth, native digital connectivity.

Tooling
RobotStudio + RobotWare

RobotStudio is the offline programming and simulation environment. It ships a virtual controller running the exact RobotWare image that runs on real hardware.

CLASSIC IRB · 6-axis articulatedenclosed cells · fenced
IRB 1200
payload
5 – 7 kg
reach
703 – 901 mm

Compact pick-and-place, machine tending

IRB 1600
payload
6 – 10 kg
reach
1.20 – 1.45 m

Arc welding, material handling

IRB 2600
payload
12 – 20 kg
reach
1.65 – 1.85 m

Welding, dispensing, assembly

IRB 4600
payload
20 – 60 kg
reach
2.05 – 2.55 m

Handling, palletising, machine tending

IRB 6700
payload
150 – 300 kg
reach
2.60 – 3.20 m

Heavy-payload spot weld + handling

IRB 7600
payload
150 – 500 kg
reach
2.55 – 3.50 m

Heaviest payloads — automotive body-in-white

COLLABORATIVE · works alongside peoplePFL-safe per ISO/TS 15066
YuMi · IRB 14000
payload
0.5 kg / arm
reach
0.56 m

Dual-arm small parts assembly

14 DOF · 38 kg total · IP30

Single-arm YuMi · IRB 14050
payload
0.5 kg
reach
0.56 m

Bench-top precision assembly

7 DOF · 9.6 kg · 0.02 mm repeatability

GoFa · CRB 15000
payload
5 / 10 / 12 kg
reach
0.95 – 1.62 m

Cobot for material handling + machine tending

IP54 · ISO/TS 15066 PFL safe

SWIFTI · CRB 1100
payload
4 kg
reach
475 / 580 mm

Fast cobot — bridges cobot and industrial speed

Up to 5 m/s TCP · 0.02 mm repeatability

Payloads and reaches are the values ABB publishes on its product pages and datasheets. The actual configurable workspace is always smaller than the max-reach envelope — there are dead zones near the base and at full stretch.

FeatureIRC5 (legacy fleet)OmniCore (current)
GenerationLaunched 2004 · long-standing workhorseCurrent platform · successor to IRC5
Cabinet form factorSingle + dual cabinet, panel-mount variantsE10 (compact), C30 (standard), C90XT (heavy), V250XT (XL)
Motion controlTrueMove + QuickMove (path accuracy + cycle time)Refined TrueMove/QuickMove · 8× motion bandwidth uplift
SafetySafeMove2 (Cat 3/PL d, SIL 2)SafeMove (Cat 3/PL d, SIL 2) · safety fieldbus native
ConnectivityAdd-on industrial buses + EtherNet/IPBuilt-in OPC UA, MQTT, EtherNet/IP, PROFINET
Programming surfaceRAPID · FlexPendantRAPID · FlexPendant or Wizard block editor (cobots)
SimulationRobotStudio (RobotWare 5.x runtime)RobotStudio (RobotWare 7.x runtime)
Same RAPID source runs on both — no rewrite, only retargeting in RobotStudio.

Every classic IRB shares the same articulated 6-axis form. RAPID names the joints J1 through J6 from base to flange, and the right-handed world frame with +Z up follows ISO 9787:2013. Hover or click each part to see what it does.

TCP+X+Z+Y (out)ISO 9787 — right-handed, +Z upJ1J2J3J4-6
TCP

Tool Centre Point. The actual point the robot is positioning — typically the tip of the gripper, not the flange.

Modules and routines

MODULE/ENDMODULE wrap everything. PROC declares a procedure, FUNC returns a value, TRAP handles interrupts. Programs always start at a main routine.

MODULE M
  PROC Main()
    ! ...
  ENDPROC
ENDMODULE

Motion types

MoveJ is joint-interpolated and fastest (path not guaranteed). MoveL is linear in Cartesian space. MoveC is circular through a via point. MoveAbsJ moves to absolute joint angles.

MoveJ p1, v1000, fine, tool0;
MoveL p2, v500,  fine, tool0;

Coordinate systems

Base frame, tool frame (tooldata), work object (wobjdata), and user frame. All motion is relative to a chosen tool and work object.

MoveL p, v500, fine, tGrip\WObj:=wPallet;

Data types

robtarget = Cartesian pose + orientation + config + external axes. jointtarget = joint angles. tooldata, wobjdata, speeddata (v100…v5000), zonedata (fine, z1…z200).

CONST robtarget p:=[[800,0,300,0],...];

I/O handling

SetDO / ResetDO drive digital outputs. WaitDI blocks on a digital input. PulseDO emits a pulse. GetGroupOutput reads grouped signals.

SetDO doGripper, 1;
WaitDI diReady, 1;

Program flow

IF/ELSEIF/ELSE, FOR…TO…DO, WHILE, TEST/CASE. Interrupts are declared with CONNECT and handled in TRAP routines.

FOR i FROM 1 TO 5 DO
  MoveL p{i}, v500, fine, tool0;
ENDFOR

RAPID is Pascal in a hard hat

PROC instead of procedure, VAR/CONST instead of var/const, ENDFOR instead of end, and a colon after a type instead of before — but the shape of the program is the same. Anyone fluent in Pascal can read RAPID at sight.

Pascal · 1970
procedure Cycle;
var i: integer;
begin
  for i := 1 to 5 do
    WriteLn('step ', i);
end;
RAPID · 1994
PROC Cycle()
  VAR num i;
  FOR i FROM 1 TO 5 DO
    TPWrite "step " + ValToStr(i);
  ENDFOR
ENDPROC

The two motion types you'll write 90% of the time. Same start point, same end point — the visible path is different because the controller interpolates in joint space (MoveJ) versus Cartesian space (MoveL). Toggle below and watch the TCP trace.

startend
MoveJ — curved TCP path, smooth joint motion
MoveL — straight TCP line, joint speeds vary
When to use MoveJ
Air moves between work pieces, any time the path doesn't matter, anywhere the robot is far from obstacles. Fastest and easiest on the joints.
When to use MoveL
Anywhere the tool tip must follow a straight line — welding seams, glue beads, picking through a narrow opening. Joint speeds will vary as the IK changes.

In RAPID, the third argument to a Move instruction is its zonedata. fine means "stop dead at the point". z1…z200 means "you may cut the corner within N mm". The bigger the zone, the smoother — and faster — the path.

z40
P1P2 (corner)P3
Taught path (fine — full stop at corner)
Executed path with blend radius 40 mm
ABB
z
z40
KUKA
$APO.CDIS
C_DIS=40
FANUC
CNT / FINE
CNT25
UR
blend_radius
0.040 m

Every vendor has the same concept: ABB calls it zonedata (z1…z200 mm), KUKA calls it $APO.CDIS, FANUC calls it CNT (0…100), UR calls it blend_radius in metres. The geometry is the same circular arc tangent to both legs.

When you write MoveAbsJ [j1, j2, j3, j4, j5, j6], ..., the controller runs forward kinematics — it walks the chain from base to flange and works out where the TCP will end up. Here's a 3-link planar simplification of that. Slide the joint sliders and watch the TCP pose update.

+X+Yworld (mm)J1J2J3TCP
45°
-160°160°
-60°
-120°120°
-30°
-150°150°
TCP pose
X321.7 mm
Y39.0 mm
φ(tool pitch about Z)-45.0°
d(distance from base)324.0 mm
InstructionCategoryPurposeExample
MoveJMotionJoint-interpolated move to a targetMoveJ pHome, v1000, fine, tool0;
MoveLMotionLinear move in Cartesian spaceMoveL pPick, v500, fine, tool0;
MoveCMotionCircular move through a via pointMoveC pMid, pEnd, v500, z10, tool0;
MoveAbsJMotionMove to absolute joint anglesMoveAbsJ jHome, v1000, fine, tool0;
SetDOI/OSet digital output highSetDO doGripper, 1;
ResetDOI/OSet digital output lowResetDO doGripper;
PulseDOI/OPulse a digital outputPulseDO doBuzzer;
WaitDIWaitWait for digital input valueWaitDI diPartReady, 1;
WaitTimeWaitWait for secondsWaitTime 0.5;
IFFlowConditionalIF nCount > 10 THEN ... ENDIF
FORFlowCounted loopFOR i FROM 1 TO 5 DO ... ENDFOR
WHILEFlowConditional loopWHILE bRun DO ... ENDWHILE
TESTFlowSwitch / caseTEST nMode CASE 1: ... ENDTEST
PROCStructureDeclare procedurePROC Main() ... ENDPROC
FUNCStructureDeclare functionFUNC num Add(num a, num b) ... ENDFUNC
TRAPStructureInterrupt handlerTRAP tEmergency ... ENDTRAP
CONNECTSystemBind interrupt to trapCONNECT iStop WITH tEmergency;
ConfLSystemToggle config monitoring (linear)ConfL\On;
VelSetSystemOverride speed globallyVelSet 50, 1000;
AccSetSystemOverride acceleration globallyAccSet 50, 50;
RAPID.EDITORPROC Main()
NOW:— idle —
NEXT:MoveJ pHome, v1000, fine, tool0;
XY.WORKSPACE3 targets · grid 100mm
SIM TIME
00:00.00
TCP [X,Y,Z]
600, 0, 800
SPEED
0 mm/s
DIGITAL OUT
doGripper
DIGITAL IN
(none)
FOR, IF, WHILE, TEST/CASE, REPEAT, PROC + RETURN, INOUT, FUNC, assignment, Offs() / RelTool() (nested), local VAR, and warnings supported.
00:00.00STATE: idle00:04.56