I am a big fan of Stages as well as Programs/Tasks.
A helpful little tidbit is if you right-click in the project browser and then select sort>>Code-blocks>>Sort by execution order. This allows you to see the blocks in the order that they will actually execute. When Main executes a RUN to another program block, it will execute that block when it gets to that blocks 'slice' of the scan time. There may be other blocks before it, and there may be other blocks after it. If the result of the program/task block is needed for another instruction, then I always use stage programming. It works great for monitoring exactly when I call the block, and knowing when it gets done.
BTW the .doneThisScan (sometimes with a NC) is another very useful tool for edge triggering.
Another thought on stages that can make them *seem* unpredictable. If you JMP forward, then that stage will execute in the same scan, but if you JMP to a previous Stage, then it will not execute until the next scan.
Also, in you screenshot you have a JMP to stage 0 inside of Stage 0.

EDIT: I corrected my comment about JMP to a previous stage as noted by franji1 in the next post. Thanks franji1!
