I think you also may be overthinking the problem.
You want the motor at 60 hz when it is between the originating and destination proximity switches, regardless of direction, correct?
from start to prox, or prox to stop, you want 35 hz.
You can use latching bits to set the origin, direction, and destination, and then clear them once the destination is reached.
I don't see how a subroutine will help, here. However, as a rule, in my SLC500's I use the Main routine as an organizer, and put all the logic in non-conditioned subroutines.
You might have one sub for determining direction, one for uptravel, one for downtravel, and one for alarms.
Keeping what you want to do separated also helps organize your thoughts. And is easier to diagnose.
I have subroutines with one rung simply because the logic doesn't belong anywhere else. The cost in scan time for small programs is negligible.
oh, and the (RET) commands aren't necessary unless you are doing conditional returns.