PLC Indirect Addressing: A Complete Guide to Programming Techniques and Benefits
In the world of industrial automation, Programmable Logic Controllers (PLCs) are the backbone of modern manufacturing systems. Among the many advanced programming techniques available to automation engineers, PLC indirect addressing stands out as one of the most powerful and flexible methods for handling dynamic data manipulation. This technique allows programs to access memory locations using pointers or offset values rather than fixed addresses, enabling scalable, efficient, and reusable code across a wide range of applications.
Whether you are working with Allen-Bradley, Siemens, Mitsubishi, or Omron PLCs, understanding indirect addressing is essential for writing advanced automation programs. This comprehensive guide explores the fundamentals, mechanics, practical applications, and best practices of indirect addressing in PLC programming.
What Is PLC Indirect Addressing?
Indirect addressing is a programming method in which the memory location to be accessed is not specified directly in the instruction, but rather determined dynamically through the contents of another register, called a pointer or index register. Instead of writing N7:10, the program might reference N7:[Pointer], where the value stored in Pointer determines the actual data table element to be used.
This approach transforms a single static instruction into a flexible reference that can shift its target based on runtime conditions, loops, or calculated values. It is especially useful in applications involving recipes, batch processing, indexing through arrays, and data logging.
How Indirect Addressing Works
Indirect addressing works by separating the memory address from the memory content. In a typical PLC, registers are organized into structured files such as input (I), output (O), integer (N), float (F), binary (B), timer (T), and counter (C) files. Direct addressing uses fixed offsets, while indirect addressing uses a pointer value to dynamically determine the offset.
For example, in an Allen-Bradley ControlLogix system, you might use a tag such as Array_Tag[index] where index is a variable that changes at runtime. In Siemens S7 platforms, this is achieved through the use of DB (Data Block) pointers and address registers (AR1, AR2).
Key Components of Indirect Addressing
- Base Address: The starting location of the data table or memory block being referenced.
- Pointer/Index Register: A variable register that holds the offset value pointing to the desired element.
- Offset Value: The numeric value stored in the pointer that determines which element of the array to access.
- Data Source: The actual memory location containing the data being read or written.
Common Registers Used in Indirect Addressing
Different PLC manufacturers implement indirect addressing in slightly different ways. Below is a comparison table of common registers used for indirect addressing across major platforms.
| PLC Manufacturer | Pointer Register | Indirect Syntax Example |
|---|---|---|
| Allen-Bradley (SLC 500) | N7:x | N7:[N10:0] |
| Allen-Bradley (ControlLogix) | Tag-based | Recipe[index] |
| Siemens S7-300/400 | AR1, AR2 / DBW | DBW[AR1,P#0.0] |
| Mitsubishi GX Works | Z0–Z15 | D0Z0 |
| Omron CX-Programmer | IR, DR | D[DR0] |
Practical Example of Indirect Addressing
Imagine a packaging line where a PLC must store production data for 50 different products in an integer data file. Instead of writing 50 individual move instructions, indirect addressing allows a single instruction within a loop to handle all entries.
- Initialize the pointer to 0 (N10:0 = 0).
- At each scan of the loop, write the current production count to N7:[N10:0].
- Increment the pointer by 1 using an ADD instruction.
- Compare the pointer with the total number of products (50).
- Reset the pointer when the end of the array is reached.
This method reduces program length dramatically and makes modifications easier. To add support for 100 products instead of 50, the engineer only needs to change a single comparison value rather than duplicating blocks of code.
Advantages of Indirect Addressing
- Memory Efficiency: Programs become shorter and require less scan time since repetitive code is eliminated.
- Scalability: The same code can handle arrays of any size simply by changing loop limits.
- Flexibility: Recipe management, indexing, and sorting tasks become far easier to implement.
- Maintainability: Reduces duplication, making debugging and modifications more straightforward.
Common Pitfalls and Best Practices
To avoid errors and ensure safe operation, follow these best practices when implementing indirect addressing:
- Use commented labels for pointer registers to clarify their purpose in the program.
- Validate pointer values before each access using comparison instructions.
- Initialize pointers at startup to prevent reading uninitialized memory.
- Use structured text or function blocks when supported to encapsulate indirect logic and reuse it across projects.
- Test thoroughly with simulated data before deploying to live equipment.
Direct vs. Indirect Addressing Comparison
| Feature | Direct Addressing | Indirect Addressing |
|---|---|---|
| Address Specification | Fixed in code | Dynamic via pointer |
| Code Length | Long for repetitive tasks | Compact and efficient |
| Ease of Modification | Difficult | Simple — change pointer |
| Risk of Out-of-Range Access | Low | Higher without validation |
| Typical Use Case | Simple I/O mapping | Recipes, arrays, loops |