You ever read a thread and see something stated incorrectly and keep reading and reading hoping someone will correct it? Thanks Daba!!
It is a common misunderstanding that the MCR "skips" rungs. I always explain it as:
"It makes the rung false regardless of the actual conditions. The outputs do, whatever it is they normally do when they are false. What does a latch do when it is false? Nothing. What does an OTE do? it turns it's bit off."
And I explain the timers much as Daba did.
MCRs can be handy for disabling an entire section or "zone" of logic. I can program a sort of kill switch or dead-man switch that can instantly take down a piece of equipment and essentially override it's normal logic. For example, I can program a kill switch and when that switch is triggered, a piece of equipment will shut down and even if the operator tries to restart it, the kill switch overrides it.
Using subroutines I have to be very aware of the "last state" condition and program for it. By default, if I stop calling a subroutine, the outputs in that subroutine remain in their last state. I have to make sure in my program that I program it so those outputs reset.
Now, as mentioned, the MCR can be a troubleshooting nightmare as there is nothing in the display that tells you that that code you are looking at is within an MCR zone. But, the same could be said for a subroutine. When looking at logic in a subroutine, nothing tells you that the subroutine is being scanned or skipped.
Frankly I think both subroutines and MCRs (as well as JMP/LBL) can cause headaches when troubleshooting. I think that these days, most programmers are inclined to go the subroutine route.
Just keep in mind that NOT calling a subroutine is very different than what the MCR does.
OG