BRAND.00 / IRC5 + OMNICORE · 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.
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).
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.
IRC5 (2004) remains supported on millions of installed robots. OmniCore is the current platform — same language, more motion bandwidth, native digital connectivity.
RobotStudio is the offline programming and simulation environment. It ships a virtual controller running the exact RobotWare image that runs on real hardware.
Compact pick-and-place, machine tending
Arc welding, material handling
Welding, dispensing, assembly
Handling, palletising, machine tending
Heavy-payload spot weld + handling
Heaviest payloads — automotive body-in-white
Dual-arm small parts assembly
14 DOF · 38 kg total · IP30
Bench-top precision assembly
7 DOF · 9.6 kg · 0.02 mm repeatability
Cobot for material handling + machine tending
IP54 · ISO/TS 15066 PFL safe
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.
| Feature | IRC5 (legacy fleet) | OmniCore (current) |
|---|---|---|
| Generation | Launched 2004 · long-standing workhorse | Current platform · successor to IRC5 |
| Cabinet form factor | Single + dual cabinet, panel-mount variants | E10 (compact), C30 (standard), C90XT (heavy), V250XT (XL) |
| Motion control | TrueMove + QuickMove (path accuracy + cycle time) | Refined TrueMove/QuickMove · 8× motion bandwidth uplift |
| Safety | SafeMove2 (Cat 3/PL d, SIL 2) | SafeMove (Cat 3/PL d, SIL 2) · safety fieldbus native |
| Connectivity | Add-on industrial buses + EtherNet/IP | Built-in OPC UA, MQTT, EtherNet/IP, PROFINET |
| Programming surface | RAPID · FlexPendant | RAPID · FlexPendant or Wizard block editor (cobots) |
| Simulation | RobotStudio (RobotWare 5.x runtime) | RobotStudio (RobotWare 7.x runtime) |
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.
Tool Centre Point. The actual point the robot is positioning — typically the tip of the gripper, not the flange.
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
ENDMODULEMoveJ 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;
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;
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],...];
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;
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;
ENDFORPROC 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.
procedure Cycle;
var i: integer;
begin
for i := 1 to 5 do
WriteLn('step ', i);
end;PROC Cycle()
VAR num i;
FOR i FROM 1 TO 5 DO
TPWrite "step " + ValToStr(i);
ENDFOR
ENDPROCThe 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.
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.
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.
| Instruction | Category | Purpose | Example |
|---|---|---|---|
| MoveJ | Motion | Joint-interpolated move to a target | MoveJ pHome, v1000, fine, tool0; |
| MoveL | Motion | Linear move in Cartesian space | MoveL pPick, v500, fine, tool0; |
| MoveC | Motion | Circular move through a via point | MoveC pMid, pEnd, v500, z10, tool0; |
| MoveAbsJ | Motion | Move to absolute joint angles | MoveAbsJ jHome, v1000, fine, tool0; |
| SetDO | I/O | Set digital output high | SetDO doGripper, 1; |
| ResetDO | I/O | Set digital output low | ResetDO doGripper; |
| PulseDO | I/O | Pulse a digital output | PulseDO doBuzzer; |
| WaitDI | Wait | Wait for digital input value | WaitDI diPartReady, 1; |
| WaitTime | Wait | Wait for seconds | WaitTime 0.5; |
| IF | Flow | Conditional | IF nCount > 10 THEN ... ENDIF |
| FOR | Flow | Counted loop | FOR i FROM 1 TO 5 DO ... ENDFOR |
| WHILE | Flow | Conditional loop | WHILE bRun DO ... ENDWHILE |
| TEST | Flow | Switch / case | TEST nMode CASE 1: ... ENDTEST |
| PROC | Structure | Declare procedure | PROC Main() ... ENDPROC |
| FUNC | Structure | Declare function | FUNC num Add(num a, num b) ... ENDFUNC |
| TRAP | Structure | Interrupt handler | TRAP tEmergency ... ENDTRAP |
| CONNECT | System | Bind interrupt to trap | CONNECT iStop WITH tEmergency; |
| ConfL | System | Toggle config monitoring (linear) | ConfL\On; |
| VelSet | System | Override speed globally | VelSet 50, 1000; |
| AccSet | System | Override acceleration globally | AccSet 50, 50; |