За жалобой «дёргается», «теряет синхронизацию», «вываливается из OP» стоят как минимум три разных механизма, и меряются они порознь. Всё ниже делается штатными средствами LinuxCNC и IgH-мастера — наш софт для этого не нужен. Мы дважды копали настройку EtherCAT там, где на самом деле был перегружен процессор, — этот разбор существует, чтобы не повторять наш путь.
Прежде чем искать ошибку в профиле движения или в описании шины:
cyclictest -m -p 80 -i 1000 -h 400
Запускать без графической оболочки и смотреть максимум, а не среднее: серво-поток
убивает редкий выброс, а не средняя величина. Утилиты latency-test и
latency-histogram поднимают собственный поток реального времени и
конфликтуют с уже работающим LinuxCNC — на машине с живым станком годится именно
cyclictest.
Ориентир с нашего стенда: после разгрузки системы пик составил 15 мкс — с таким запасом приводы держат OP устойчиво при servo-периоде 1 мс.
Как выглядит противоположный случай: в логе LinuxCNC появляется
Unexpected realtime delay on task 0 with period 1000000, а приводы
начинают отваливаться из OP по одному. Выглядит как проблема настройки EtherCAT —
лечится разгрузкой машины.
Пин joint.N.f-error показывает, насколько фактическое положение отстало
от командного. Снимается штатным halsampler:
halcmd loadrt sampler depth=10000 cfg=fff halcmd net fe0 joint.0.f-error sampler.0.pin.0 halcmd net fe1 joint.1.f-error sampler.0.pin.1 halcmd net fe2 joint.2.f-error sampler.0.pin.2 halcmd addf sampler.0 servo-thread halcmd start halsampler -c 0 -n 5000 > f-error.txt
По столбцам считать процентиль, а не среднее: интересен именно хвост распределения.
Ловушка сравнения осей. На программе с разной длиной ходов ось X у нас показала медиану 0,27 мм против нуля у Y и Z — читалось как «X настроена хуже». Неправда: X дольше была в движении. Сравнивать оси можно только на одинаковом движении с одинаковой подачей; тогда числа сошлись — 1,34 мм у всех трёх на 3000 мм/мин.
Что значит результат. Отставание пропорционально скорости, отношение одно и то же на разных подачах — у нас около 37 с⁻¹. Это штатный след позиционной петли, а не расстройка привода. На прямой оно в геометрию не выходит, потому что все оси отстают одинаково и меняется только фаза; срез появляется на углах и дугах.
Телеметрия на частоте servo-thread показывает и то, что в усреднённых значениях растворяется: например, дискрет, с которым привод отдаёт скорость, — у двух приводов нашего стенда он различается в 800 раз, и это прямо влияет на чтение «дрожи» (разбор — в сравнении сервоприводов).
Если синхронизация теряется посреди нормальной работы, а не при остановке мастера, — проверить счётчики ошибок портов у слейвов: RX Error, Forwarded RX Error, Lost Link.
Растут — проблема на проводе: кабель, экран, разность потенциалов между шкафами. Стоят на нуле, а сбои есть — проблема выше, в мастере и его расписании: возвращайтесь к первому измерению.
Разность часов distributed clocks не годится как мера разброса прихода кадров. Это
выход петли подстройки локальных часов слейва: она работает дискретными шагами по
знаку невязки и разброс сглаживает, а не показывает. Джиттер меряется на мастере
(cyclictest) и по счётчикам ошибок портов. Что разность часов DC меряет
на самом деле и почему она может не сходиться —
отдельный разбор.
Методика целиком, с примерами вывода:
github.com/SyncTwin/linuxcnc-ethercat-configs,
каталог measuring.