Hi BobO,
The speed is 175'/min = 35"/s, within a station the events will come approximately 12" apart (.3428 second )but with 10 stations it is hard to tell!
The tolerance will be < or = .03125". The encoder will be 2500 pulse/ rev with 2 channels = 10,000 count/rev at 2.9 rev/s, so the encoder frequency will be 29,000 Hz (29KHz).
At 29KHz, your 12" events are 9941 pulses wide, so 1 pulse is about 0.0012". The time tolerance is then (0.03125/0.0012)/29000, or 893us. That's fairly relaxed.
I was first thinking you might be able to do multiple triggers on a single event, but I think that will miss triggers.
With a tolerance of 893 us, you might be able to use a timed interrupt. I hacked up some code to fire the interrupt every 800us, and then test for the rising edge of X0-X9, and stored that value in D0-D9, and the falling edge of X0-X9 and stored the difference between D0-D9 and .Acc and stored in D10-D19. Interrupt latency plus execution is very stable at about 35us. The entire routine is the 10 rising edge rungs, 10 falling edge rungs, and the last rung that stores the previous input state for edge compares.
Note that you cannot use edge based instructions in the ISR, which is why I create my own edge. I'm also using the MATH box for basic moves because it is accelerated for integers, and I can't remember if the MOVE is. The key to making this work is the use of accelerated instructions for everything...it's fast.