Here's something I did in a ControlLogix that has a series string of conditions to allow a mill to run. It was sometimes hard to identify what caused it to stop, since the mill stopping caused other things to happen very quickly, or the stop event would be too momentary to catch.
The screenshots are the order in which they're processed in the PLC (0, 1, 2), but I'll explain a little out of order.
Screenshot 1 shows the rung that has the series string of conditions that all enable LT_MillRun. In order for LT_MillRun to turn ON, all of the input conditions must be in their OK state. If any of those conditions change to not OK, LT_MillRun will turn off, so we have to check the status of the input conditions BEFORE LT_MillRun can turn off. For readability, I separated the traps into several rungs that are right ABOVE the rung that controls LT_MillRun (see screenshot 0 for an example). Right after LT_MillRun's rung, I have a MOV instruction to transfer the trap bits to a holding register and another MOV to reset the traps when the Mill is restarted, leaving the storage location unchagned. That way, if the operators have to reset and restart quickly, they can look back and see what went wrong after things calm down some. Those bits are on the HMI.
Incidentally, in the tag comments, you can see notes from when the code was translated first to PLC2, then to PLC5, then to ControlLogix over the years.