Table of Contents
ToggleWriting one rung for every recipe, station or test result quickly turns a program into a wall of copied logic. Pointers and indexed arrays let a few rungs handle hundreds of values cleanly, with far less room for typing mistakes.
Large data sets are hard to manage with fixed addresses in every rung. Using a variable to choose the memory location lets one piece of logic work across many records.

What Is Indirect Addressing?
Indirect addressing is a method in which an instruction does not use a fixed memory location but a location selected by the value of another register, called a pointer or index. It builds on normal PLC memory addressing, where every tag or register has a fixed place.
With a direct address, a rung always reads the same word. With a pointer, the same rung reads word 0, then 1, then 2, as the index changes.

ACC Automation calls this the most powerful PLC instruction for handling large data sets. Their example moves values into a table using a pointer that steps through memory.
How Platforms Handle It
Click PLCs use DS registers as pointers.
Productivity and Logix use Array[Index] tags.
Do More uses V memory for indirect access.
Variable array index, pointers and ANY in TIA Portal.
ACC Automation stresses that each platform implements indirect addressing differently. The concept is the same, but syntax and limits vary.
The data type of the index must be an integer, and the element type drives the size in memory. Review PLC data types before designing arrays.
Direct vs Indirect Access
| Aspect | Direct | Indirect |
|---|---|---|
| Address | Fixed in the rung | Chosen by an index |
| Rungs needed | One per value | One for many values |
| Readability | Very clear | Needs comments |
| Fault risk | Low | Out of range index |
Code using indirect addressing is shorter but harder to follow online. Name index tags clearly and document their range.
5 Powerful Indirect Addressing Uses
ACC Automation lists recipes, sequence control and test result storage as common uses. Recipe structures fit neatly with ISA 88 batch control.
For simple first in, first out tables, a shift register or bit shift instruction may be easier.
How an Indexed Move Works
The move itself uses standard data move instructions. Index maths uses math instructions such as ADD and MUL.
Address Formula
Valid when 0 ≤ Index ≤ Array length minus 1
Example:
Base word 100, index 7, each element 2 words, array of 20 elements
Address = 100 + 7 × 2 = 114
Index 7 is within the valid range 0 to 19
Logix arrays hide the raw address, but the same logic sets the valid index range. Element size matters when you use pointer arithmetic on register based PLCs.
Array Index Calculator
Always add a bounds check before any indirect addressing instruction. A compare instruction is enough, see our guide to compare instructions linked below.
Avoiding Out of Range Faults
In Logix controllers an index beyond the array size causes a major fault, Type 4 Code 20. Handling this is covered in PLC fault handling.
Use compare instructions such as LIM or GEQ and LEQ to guard every index. Clamp or reset the index when it leaves the range.
- Far fewer rungs for large data.
- Easy to add more records.
- Clean recipe and logging logic.
- Less copy and paste error.
- Harder to read and debug online.
- Out of range index faults the CPU.
- Syntax differs between brands.
- Cross reference tools show less detail.
Beginners should master direct logic first with ladder logic basics. Indirect addressing then becomes a natural next step.
Logix I/O and Tag Data Manual
TIA Portal Tutorial Video
Indirect Addressing FAQ
Related Articles
- PLC Memory Addressing
- PLC Data Types Explained
- PLC Data Move Instructions
- PLC Compare Instructions
- ISA 88 Batch Control
External References
- Logix 5000 Controllers I/O and Tag Data Programming Manual, Rockwell Automation
- The Most Powerful PLC Instruction, ACC Automation
- Addressing Mode, Wikipedia
What We Learn Today
- Indirect addressing selects memory using an index or pointer.
- It simplifies recipes, sequences and data logging.
- Always bounds check the index to avoid controller faults.
