BRAND.06 / DX + YRC + FS
The teach-pendant language of Yaskawa Motoman controllers.
INFORM runs on the DX100, DX200, FS100, YRC1000 and YRC1000micro. A JOB is a list of instructions between NOP and END, usually taught on the pendant one step at a time. Motion is MOVJ (joint), MOVL (linear), MOVC (arc) and MOVS (spline). Speed is a tag on each move: VJ= is a percentage of maximum joint speed and V= the TCP speed in mm/s, while PL= sets how closely the robot passes the point. I/O is DOUT OT#(n) and WAIT IN#(n)=ON; flow is JUMP *LABEL with an IF condition, CALL JOB:NAME for subroutines and, with the structured-language function, IF / WHILE / FOR blocks.
Every JOB starts with NOP and ends with END. CALL JOB:NAME runs another JOB and comes back to the next line; RET returns early. JUMP JOB:NAME moves to another JOB without coming back. On the controller each JOB is its own file (.JBI) with a header that lists its taught positions. The listings on this page show only the instruction part, the way the pendant shows it.
On a real cellA master JOB that calls one JOB per station is easy to follow on the pendant. One long JOB full of JUMPs and labels is not, and the pendant is where the cell gets debugged.
NOP MOVJ P000 VJ=50.00 CALL JOB:PICK END ' --- JOB:PICK --- NOP MOVL P001 V=100.0 RET END
MOVJ P000 VJ=50.00 moves the joints at 50 % of maximum joint speed: the quickest move, with a curved TCP (tool centre point) path. MOVL P001 V=100.0 moves the TCP in a straight line at 100 mm/s; the range is 0.1 to 1500.0 mm/s. MOVC needs three MOVC steps in a row to define its arc, and MOVS a run of spline points. PL= is the position level: PL=0 goes exactly to the point and PL=1 to PL=8 let the robot turn inside it, more at higher levels.
On a real cellCheck the speed unit before you copy a JOB to another cell. A controller can be set to cm/min, and V=100.0 is then about 16.7 mm/s. Keep PL=0 on the step where the gripper or gun fires, so the robot is really on that point.
MOVJ P000 VJ=50.00 MOVL P001 V=100.0 PL=0 MOVC P002 V=80.0 MOVC P003 V=80.0 MOVC P004 V=80.0
Most taught points are steps stored inside the JOB: the pendant shows MOVJ VJ=50.00 and the file holds MOVJ C00000 VJ=50.00. P variables (P000, P001 ...) are global position variables shared by every JOB, which suits points that a PLC or a calculation changes. BP holds a base-axis position, such as a track, and EX a station position, such as a positioner. Numbers go in B (byte, 0 to 255), I (16-bit integer), D (32-bit integer) and R (real) variables, text in S (16-byte string) variables.
On a real cellBecause P variables are global, two JOBs that both use P010 as scratch space will overwrite each other. Agree which JOB owns which variable numbers and write it down with the cell documentation.
SET I000 0 SET R000 1.50 GETS PX010 $PX001 MOVL P001 V=100.0
DOUT OT#(1) ON switches general-purpose output 1. WAIT IN#(2)=ON holds the JOB until input 2 is on; with T=5.00 added it stops waiting after 5 s. PULSE OT#(3) T=0.30 turns output 3 on for 0.3 s and then off. TIMER T=0.50 waits half a second without checking anything.
On a real cellA WAIT with T= carries on after the timeout whether or not the input came. Check the input again on the next line and jump to a fault routine, or the robot goes to pick a part that is not there.
DOUT OT#(1) ON WAIT IN#(2)=ON T=5.00 JUMP *NOPART IF IN#(2)=OFF PULSE OT#(3) T=0.30 TIMER T=0.50
JUMP *LABEL IF condition is the classic INFORM loop and runs on every controller. With the structured-language function you also get IF ... THEN / ELSEIF / ELSE / ENDIF, WHILE ... ENDWHILE, FOR ... NEXT and SWITCH ... CASE blocks. In the .JBI file these are stored as IFTHENEXP, WHILEEXP and FOR ... START=, worth knowing when you open a JOB in a text editor.
IF IN#(1)=ON THEN MOVL P001 V=100.0 ELSE MOVL P002 V=100.0 ENDIF
SET writes a value. ADD, SUB, MUL and DIV change a variable in place, and INC and DEC step it by 1. With JUMP ... IF that is enough for counters and simple palletizing: P[I000] addresses the position variable whose number is in I000, so a counter can step through slot points P003, P004 and P005.
SET I000 3 *LOOP MOVL P[I000] V=100.0 INC I000 JUMP *LOOP IF I000<6
| Instruction | Category | Purpose | Example |
|---|---|---|---|
| MOVJ | Motion | Joint move. VJ= is a percentage of the maximum joint speed. The fastest way between two points; the TCP path is not straight. | MOVJ P000 VJ=50.00 |
| MOVL | Motion | Linear move. V= is the TCP speed, 0.1 to 1500.0 mm/s, or 1 to 9000 cm/min if the controller is set to that unit. | MOVL P001 V=100.0 PL=0 |
| MOVC | Motion | Circular move. Three consecutive MOVC steps define the arc. | MOVC P002 V=80.0 |
| MOVS | Motion | Spline move through a run of consecutive MOVS points. | MOVS P003 V=80.0 |
| IMOV | Motion | Incremental linear move: shift the TCP by the offset held in a P variable, in the frame given by the tag (BF base, RF robot, TF tool, UF# user). | IMOV P010 V=50.0 BF |
| PL= | Motion | Position level tag on a move, 0 to 8. PL=0 reaches the point exactly; 1 to 8 let the robot turn inside the point, more rounding at higher levels. | MOVL P001 V=200.0 PL=3 |
| NWAIT | Motion | Tag on a move: run the following instructions while the robot is still moving. | MOVL P001 V=100.0 NWAIT |
| REFP | Motion | Reference point used by weaving and other motion functions, for example the wall direction of a fillet weld. | REFP 1 |
| SPEED | Motion | Set the speed used by later move instructions that have no speed tag of their own. | SPEED V=100.0 |
| DOUT | I/O | Switch a general-purpose output on or off. | DOUT OT#(1) ON |
| PULSE | I/O | Switch an output on for T= seconds, then off. | PULSE OT#(1) T=0.50 |
| AOUT | I/O | Set an analog output channel. | AOUT AO#(1) 5.00 |
| IN# | I/O | General-purpose input, read in WAIT, IF and JUMP conditions. | WAIT IN#(2)=ON |
| OT# | I/O | General-purpose output, written by DOUT and PULSE. WAIT and IF can test it too. | DOUT OT#(3) OFF |
| WAIT | Wait | Hold the job until an input or output matches. T= adds a timeout in seconds. | WAIT IN#(1)=ON |
| TIMER | Wait | Hold the job for T= seconds. | TIMER T=0.50 |
| CWAIT | Wait | Used with NWAIT: hold the job here until the NWAIT move has finished. | CWAIT |
| JUMP | Flow | Jump to a label or to another JOB, optionally only when a condition is true. | JUMP *LOOP IF I000<5 |
| IF | Flow | Condition. As a suffix it gates JUMP, CALL and other instructions; with the structured-language function it opens an IF ... THEN / ELSEIF / ELSE / ENDIF block. | JUMP *PICK IF IN#(1)=ON |
| THEN | Flow | Ends the condition of a structured IF or ELSEIF line. | IF B000=1 THEN |
| ELSE | Flow | Else branch inside a structured IF block. | ELSE |
| ENDIF | Flow | Closes a structured IF block. | ENDIF |
| WHILE | Flow | Structured loop that repeats while the condition is true: WHILE expr ... ENDWHILE. | WHILE I000<5 |
| ENDWHILE | Flow | Closes a WHILE loop. | ENDWHILE |
| FOR | Flow | Structured counted loop: FOR I000=1 TO 3 ... NEXT I000. | FOR I000=1 TO 3 |
| NEXT | Flow | Closes a FOR loop. | NEXT I000 |
| CALL | Job | Run another JOB as a subroutine, then come back. Takes an IF condition too. | CALL JOB:PICK |
| RET | Job | Return to the JOB that made the CALL. | RET |
| NOP | Job | No operation. The first line of every JOB. | NOP |
| END | Job | Last line of every JOB. | END |
| PAUSE | Flow | Stop the job until the operator restarts it. | PAUSE |
| ABORT | Flow | Stop the job. | ABORT |
| SET | Variable | Write a value into a variable: SET target source. | SET B000 1 |
| ADD | Variable | Add a value to a variable in place. | ADD I000 1 |
| SUB | Variable | Subtract a value from a variable in place. | SUB I000 1 |
| MUL | Variable | Multiply a variable by a value in place. | MUL D000 2 |
| DIV | Variable | Divide a variable by a value in place. | DIV D000 2 |
| INC | Variable | Add 1 to a variable. | INC I000 |
| DEC | Variable | Subtract 1 from a variable. | DEC I000 |
| CLEAR | Variable | Set a variable and the ones after it to zero. | CLEAR B000 ALL |
| C (step) | Position | A taught step stored inside the JOB. The pendant shows MOVJ VJ=50.00; the .JBI file shows MOVJ C00000 VJ=50.00. | MOVJ C00000 VJ=50.00 |
| P-var | Position | Robot position variable (P000, P001 ...), shared by every JOB on the controller. | MOVL P000 V=100.0 |
| BP / EX | Position | Position variables for a base axis (BP, e.g. a track) and a station axis (EX, e.g. a positioner). | MOVJ P000 EX000 VJ=50.00 |
| B-var | Variable | Byte variable, 0 to 255. Flags and small counters. | SET B000 1 |
| I-var | Variable | Integer variable, 16-bit (-32768 to 32767). Loop counters. | SET I000 0 |
| D-var | Variable | Double-precision integer variable (32-bit). | SET D000 1000 |
| R-var | Variable | Real (floating-point) variable. | SET R000 1.50 |
| S-var | Variable | String variable, up to 16 bytes. | SET S000 "PART A" |
| GETS | Position | Copy a system variable into a user variable, for example the current position $PX001 into a position variable. | GETS PX010 $PX001 |
| SFTON | Position | Start a parallel shift: add the offset held in a P variable to the moves that follow. | SFTON P020 |
| SFTOF | Position | End the parallel shift. | SFTOF |
| *LABEL | Flow | Jump target, written as *NAME on its own line. | *LOOP |
| MSG | System | Show a message on the pendant. | MSG "CYCLE DONE" |
| ' | Misc | Comment to the end of the line. | ' pick up the part |
JUMP *LABEL is read but not executed, so a JUMP loop runs once. Use FOR / NEXT or WHILE to see a loop repeat here.