Another perspective.
We use OTL to activate our code, this way we can repeat it as we want. I find it quite user friendly. This is on our Compact/ControlLogix systems. Some clairty...
We have a pretty structured code, so everything is programmed using step engines and device activations are organized according to the device type. To compliment this we have AOIs that handle all of our device activations and we have faceplates in our HMIs that reflect functionality. The AOIs actually have the OTE used to drive the output.
This also aligns with our design practices as we use grafcet documents to engineer the programs before we actually program the PLC. This allows us to look at a step in grafcet, see what the device activations are, and translate it directly to step activations in our code. It's almost a 1-1 translation (exception being complex conditions). Makes it very easy to audit the engineerd desgin against the written code. I can write my grafcet program definition, hand it to a rookie engineer and they can program 90% of what I need without really having to understand it all. Frees up my time to do higher level stuff.
The program OTL is simply a "Request to activate"
The AOI processes this request, and if true will activate the OTE used to control the output.
The AOI resets the "Request to activate".
Example:
Program Code:
Req_to_Activate
--+--EQU-+------------------------(L)---
| Step |
| 10 |
+------+
AOI Code:
Req_to_Activate Device_Output
-----||--------------------------+--( )-------------+
| |
| Req_to_Activate |
+---(U)------------+
So if I need the device activated in a step, I just add the OTL, if I don't need it in a step, I remove the OTL, the AOI resets it automatically.
From a trouble shooting perspective, look at the HMI to see what program is running, and the step number in reference. Go to the rung that has the step equal to the one in question, review the devices being activated by the OTL on that rung.