If I had to guess, I'd say this is a switch timing issue. All of the logic is correct, but you finally hit the 'one in a million' timing of the cycle to play Rock 'em Sock 'em. If what I'm thinking is correct, you'll likely be able to run this for months at a time, without any issues - and then this will happen again, seemingly at random. (One in a million is a couple of times a day in some places, remember.)
If I had to start looking for a way to prevent this, I would look at using a SKIP command on one of the robots tied to a Flag, driven by outputs from the other robot (set up zones, if you have the memory available.) If any of the conditions of the 'other' robot cause the Flag to turn on, the motion of the other robot would be halted. Might actually have to be both, depending on the positioning of the robots - even if you stop the one in the zone, it could still get smacked by the other, potentially. In which case you could volley a bunch of flags back and forth - if the one halts due to a flag from the other, have it throw a flag back that halts, etc.
This is not an elegant solution, to be sure, but for the couple of times a year it will force a stop (and probably require operator intervention to recover from) it'll save you having to replace FieldBus I/O stuff every time it happens. And is fairly straightforward to implement and test (which is the type of solution I usually go for first.)
Best of luck!