Skip to content

System values

Built-in values like program state and override, usable by name with no tag to declare.

Some things about a controller are always true of every controller — which program is selected, whether the robot is running, the speed override. These are available as system values, and they need no tag. Use one by name in any expression or label: {active_program}, {robot_running}.

Bind a control to one the same way: they appear in every tag picker under System values, separate from the tags you defined. Read-only ones are offered only where reading makes sense — a slider is offered override and not robot_running.

The Tags panel lists the ones a document uses, under System values in use.

The names are reserved: a tag cannot be called override or active_program. A document made with an older version may have a tag of kind SYS for one of these. It still works, and Validate flags it for deleting — the name reads the same value without it.

Value What it holds Writable
active_program The program the controller currently has selected. yes
override Speed override, as a percentage. yes
program_state What the selected program is doing. no
robot_running Whether a program is executing. no
tp_enabled Whether the teach pendant is enabled. no
estop_op Operator panel emergency stop. no
estop_tp Teach pendant emergency stop. no
faulted Whether the controller has an active fault. no
step_mode Whether single-step mode is on. no
error_code The current alarm as a number; 0 after a reset. no
alarm_message The current alarm’s text, as the pendant shows it. Empty after a reset. no
uframe_num The user frame the robot is in; 0 is WORLD. no
utool_num The tool frame the robot is in. no
current_routine The program the robot is executing right now, a called subprogram included. Empty when nothing is running. no
current_line The line the robot is on, counted within current_routine; 0 when nothing is running. no
date Today’s date from the controller clock, as 2026-09-15. no
time The time of day from the controller clock, as 14:05:30. no
clock The controller clock as one packed number. Use date and time instead. no

Writing active_program changes the controller’s selection, and writing override changes the speed. The rest are read-only.

uframe_num and utool_num are read-only on purpose. Both are selections a TP program or the operator makes, and writing one from a screen changes the frame the robot actually moves in — a decision worth making deliberately rather than as a side effect of a slider someone dragged.

{date} and {time} in a label show the controller’s clock:

{date} {time}

To show them another way, add a format in double quotes after a |:

{date | "MM/dd/yyyy"}
{time | "h:mm a"}
{date | "MMM d, yyyy HH:mm"}

Both names read the same clock, so a format on date can include the time and one on time can include the date.

The format is made of these, for 2:05:30 PM on September 5, 2026:

Part Tokens
Year yyyy 2026, yy 26
Month MM 09, M 9, MMM Sep
Day dd 05, d 5
Hour HH 14, H 14 in 24-hour time; hh 02, h 2 in 12-hour time
Minute mm 05, m 5
Second ss 30, s 30
AM/PM a PM

Any other character is shown as typed. Keep words outside the braces, since a letter from the table inside the format is a token: Updated {time | "HH:mm"} rather than {time | "Updated HH:mm"}. Month names and AM/PM come from the document’s language.

The clock is the controller’s, set on the pendant under System > Clock. It updates every few seconds on the screen, and the seconds are even: the controller stores time in two-second steps.

Gate a Start button on the cell being safe and a program being selected:

{active_program} != "" && !{estop_op}

Show a warning banner while the pendant is enabled, since the robot will not run in automatic while it is:

{tp_enabled}

Put the selected program in a label so an operator can see what is about to run:

Ready to run {active_program}

Show a recovery button only while there is something to recover from. Give a button a Run program action naming the recovery program, and set its Visible when to:

{faulted} || {program_state} == "ABORTED"

faulted is the controller’s FAULT lamp: on while any fault is active, off once it is reset. It is the same check a Run program action makes before starting, so a button hidden by {faulted} never shows while a run would be refused for that reason.

Warn that a Start will run one line at a time, so an operator does not read a stopped robot as a fault:

{step_mode}

Show a control only for one alarm. The code is the facility number times 1000 plus the alarm number, so SRVO-001 is 11001 and SYST-045 is 24045. It is set for alarms that do not light the FAULT lamp too, and goes back to 0 on reset:

{error_code} == 11001

Put the alarm’s text in a label. It is the same line the pendant shows, SRVO-001 Operator panel E-stop, and it covers controller alarms only: an alarm defined in the Alarms panel shows in the banner, not here:

{alarm_message}

Show where a program is, the way the pendant’s status line does. While MAIN is inside a call to PICK_PART, active_program stays MAIN, current_routine is PICK_PART, and current_line is the line within PICK_PART, not the line of the call in MAIN:

{current_routine} line {current_line}

Show which frame a job is set up for, so an operator can see at a glance that the wrong one is active:

UFRAME[{uframe_num}] / UTOOL[{utool_num}]
  • Expressions — the syntax these are used in.
  • Program control — reads active_program without you naming it.
  • Dropdown — bind one to active_program to change the selected program.