13.08.2026 мы перевели рабочий конфиг стенда с универсального описания
generic на драйверы устройств lcec. Описание шины сократилось с 236 строк
до 83, ручных записей PDO осталось 10 из 53. Экономия строк здесь не главное — главное,
где после перевода живёт знание об устройстве и кто отвечает за его правильность.
Железо: три сервопривода Inovance IS620N на осях X, Y, Z (режим CSP), привод Wecon VD3E в роли шпинделя (режим CSV) и каплер Omron NX-ECC202 с модулем дискретного ввода-вывода. Мастер — IgH, поверх него LinuxCNC. После перевода все пять слейвов доходят до OP:
0 0:0 OP + IS620N_ECAT_v2.6.8 1 0:1 OP + IS620N_ECAT_v2.6.8 2 0:2 OP + IS620N_ECAT_v2.6.8 3 0:3 OP + Wecon VD3E EtherCAT Servo v1.15 4 0:4 OP + NX-ECC202 EtherCAT coupler V1.2 lcec.0.all-op TRUE lcec.0.x.srv-opmode-display 8 (CSP) lcec.0.s.srv-opmode-display 9 (CSV, шпиндель)
Два вендора в двух разных режимах одного профиля CiA-402 работают на одной шине одновременно — это и была цель прогона.
В generic-режиме карту PDO каждого устройства пишет наладчик —
вручную, по вендорскому мануалу: какой объект, какой длины, в какой PDO замаплен, как
назвать пин HAL. Драйвер устройства несёт эту карту в себе, и описание привода в
конфиге сжимается до одной строки.
| было (generic) | стало (драйверы) | |
|---|---|---|
ethercat-conf.xml | 236 строк | 83 строки |
| записей PDO руками | 53 | 10 — все десять принадлежат каплеру |
| описание одного привода | ~39 строк карты PDO | одна строка |
<slave idx="0" type="IS620N" name="x"/> <slave idx="1" type="IS620N" name="y"/> <slave idx="2" type="IS620N" name="z"/> <slave idx="3" type="VD3E" name="s"/>
Разница не косметическая. Ручная карта PDO — это 39 строк на привод, которые каждый интегратор переписывает заново и в которых ошибка обнаруживается только на живой шине. Карта в драйвере написана один раз, лежит в коде под версионным контролем и одинакова у всех, кто этим драйвером пользуется.
Десять оставшихся ручных записей — каплер Omron. Для него драйвера нет, и generic здесь уместен: карта каплера зависит от набора модулей в стеке, у каждой сборки она своя.
В generic имена пинов HAL задавали мы сами. Драйвер называет
их по-своему, с префиксом srv- — и не всегда предсказуемо.
| было | стало |
|---|---|
| lcec.0.0.cia-statusword | lcec.0.x.srv-cia-statusword |
| lcec.0.0.actual-position | lcec.0.x.srv-actual-position |
| lcec.0.0.following-error | lcec.0.x.srv-actual-following-error |
Последняя строка показательна: изменилось не только начало имени. Заодно меняется
адресация — вместо номера слейва в имени пина стоит name из XML, поэтому
lcec.0.0. превращается в lcec.0.x.. Это удобнее: переставили
привод в цепи — имена пинов не поехали.
Более дорогая из двух: она проявляется не на этапе конфигурации, а при пуске.
Ошибку слежения мы объявляли в XML как s32. Класс cia402
в драйвере экспортирует её как u32, и запуск падает:
HAL: ERROR: type mismatch 'sampler.0.pin.3' <- 'x-drv-ferr' ./machine.hal:148: link failed
Лечится на приёмной стороне — в нашем случае каналы sampler под ошибку
слежения переведены в u32. Правило общее: переводя конфиг на драйвер,
сверяйте не только имена пинов, но и их типы — halcmd show pin lcec
показывает и то, и другое.
Полный конфиг этого прогона —
github.com/SyncTwin/linuxcnc-ethercat-configs,
каталог mill-3axis-named-drivers. Драйверы для IS620N и VD3E — в нашей
ветке апстрима lcec:
github.com/SyncTwin/linuxcnc-ethercat.
Масштабы осей в конфиге посчитаны под нашу механику (ШВП 10 мм, энкодер 23 бита), пределы и направления — под наш станок. При переносе на другую машину эти числа обязаны быть пересчитаны.
Смежные разборы: distributed clocks на той же шине · что привод расскажет о себе по SDO. Наблюдения по устройствам — в реестре EtherCAT-устройств.