Я делал конкретно для энкодеров, конкретно для решения задач движения, на недорогом ПЛК со стандартным интерфейсом. Временные характеристики мог обеспечить только CAN
¯\_(ツ)_/¯ А вот уже в процессе изучения протокола CANopen, выяснилось что он очень гибок и его можно по разному использовать.