daba:
"Indirect", as I've always known it from 'conventional' programming, involves pointers. So you'd define your pointer variable, load it with the *address* of something, then grab the value at the location referenced by the pointer.
Can you do pointers with ControlLogix PLCs (ie: assign the *address* of a tag to a variable)?
Probably best to forget about "convention", not everyone abides by them.
To fully appreciate what addressing mode Logix5000 processors use, if we take a step back to earlier processors, such as PLC5 and SLC series, they actually had both modes, Indexed and Indirect.
Those legacy controllers use "data-tables" for data storage, not a tag database like Logix5000.
Addressing a location in those data-tables took the form "N23:45", which is iNteger 45 (the 46th integer), in iNteger table number 23.
We could replace either the table number or the element number with another data-table location enclosed in square brackets. For example...
N23;[N7:10], use the
value in N7:10 as the element number in the N23 data table.
or...
N[N7:5]:0, use the
value in N7:5 as the data-table number to look at the first element of it.
It was even possible to indirectly address both table number and element number.... N[N7:5]:[N7:10]
Those earlier controllers also had an "Index Register", stored in the Status data-table, that could also be employed manually, although the controller used it heavily in the execution of instructions that worked its way through data-tables, such as FAL, FSC, DDT, etc.
I've not seen it used often, but it was possible to pre-load the Index Register with a number, then use that as the Index into another data-table, eg....
#N23:30
The # indicated an "Indexed Address", the "effective address" being calculated at run-time as the starting address, plus the value of the index register. In the example above if the index register contained the value 135, the effective address would be N23:{30 + 135} = N23:165. It is even possible to combine both methods, eg....
#N23:[N7:6]
... but now it gets really confusing !!
Now Logix5000 controllers don't have data-tables, you only have
arrays to store contiguous data. Addressing an element of the array can be evaluated at run-time, by placing an "expression" inside square brackets, eg....
NyArray[50]
MyArray[ArrayPointer]
MyArray[ArrayPointer + 23]
..are all valid.
This is similar to the legacy PLCs
Indirect addressing mode, (although they didn't allow expressions, only other addresses). To simulate the indirect use of both "table" and "element", you can create two-dimensional arrays, eg....
MyArray[Table, Element]
I believe
Indirect better describes this method of addressing file locations, irrespective of any "conventions".