Диагностика ошибок CAN
Эта статья предназначена для обработки распространенных ошибок CAN-сети, диагностики нарушений связи и процедуры поиска, когда CAN ID не обнаруживается.
Сценарии применения:
- Появление ошибок, связанных с CAN0, CAN UUID или CAN-сетью, в Klipper.
- Периодическое отключение CAN-устройств или их ненахождение.
- Необходимость диагностики проблем
bytes_invalid, Timer too close и подобных.
Если требуется настроить CAN0, найти CAN ID или узнать правила подключения и оконечных резисторов, сначала ознакомьтесь с Настройка CAN-сети и поиск ID.
Определение распространенных ошибок
| Ошибка | Распространенная причина | Способ решения |
|---|---|---|
OSError: [Errno 19] No such device | Ведущий компьютер не находит CAN-устройство | Проверить UTOC, USB-кабель, прошивку CAN-моста и питание |
can.CanError: Failed to transmit: [Errno 100] Network is down | CAN0 не запущен или настроен неправильно | Перенастроить CAN0 и перезагрузить |
can.CanError: Failed to transmit: [Errno 105] No buffer space available | Недостаточно CAN-буфера или проблемы с системной сетевой очередью | Убедиться, что буфер равен 1024, при необходимости перенастроить CAN0 |
mcu 'xxx': Invalid CAN uuid | CAN UUID заполнен неправильно или устройство не в сети | Повторно найти UUID, проверить порядок проводов, питание и оконечные резисторы |
Serial connection closed | Klipper нашел конфигурацию, но соединение прервано | Проверить качество CAN-сети, порядок проводов, оконечные резисторы и скорость прошивки |
Больше ошибок Klipper можно найти в Распространенные сообщения об ошибках.
Диагностика ошибок CAN-связи
Значительная часть нарушений связи по CAN-шине вызвана электромагнитными помехами (EMI). Провода шаговых двигателей, нагревателей и стола внутри 3D-принтера при работе с большим током создают сильное электромагнитное поле. Если линии CAN-связи (CANH/CANL) проложены вблизи и параллельно этим сильным проводам, сигналы помех связываются с CAN-шиной, что приводит к:
- Тайм-аутам связи, периодическим отключениям MCU
- Случайным отключениям CAN-устройств, невозможности сканирования
canbus_query.py - Срабатыванию
Timer too closeилиCommunication timeoutво время процесса хоминга - Внезапному завершению печати (shutdown) без очевидных аппаратных ошибок в логе
При диагностике помех в первую очередь проверьте компоновку CAN-линий относительно силовых проводов, заземление экрана и целостность оконечных резисторов.
Постоянный рост счетчика CAN bytes_invalid
Сообщение об ошибке: В строке статистики Stats в klippy.log появляется ненулевое и постоянно растущее значение bytes_invalid.
Причина ошибки: Сообщения CAN-шины переупорядочиваются (reordered messages). Это серьезная проблема, приводящая к нестабильности и случайным ошибкам на любом этапе печати.
Известные причины:
- Версия ядра Linux ниже v6.6.0, присутствует ошибка переупорядочивания в драйвере gs_usb CAN.
- Использование USB-CAN адаптера с прошивкой candlelight версии ниже v2.0.
- Версия прошивки узла в режиме моста USB-to-CAN Klipper ниже v0.12.0.
Методы решения:
- Обновите ядро Linux до версии v6.6.0 или выше.
- Если используется USB-CAN адаптер candlelight, обновите прошивку до v2.0 или выше.
- Если используется режим моста USB-to-CAN Klipper, убедитесь, что на узле моста установлена прошивка Klipper v0.12.0+.
- Если
bytes_invalidпродолжает расти, значит, коренная причина не устранена. Необходимо продолжить проверку версий ядра и прошивки. - Примечание: Увеличение
bytes_invalidне вызывается аппаратными проблемами, такими как проводка или оконечные резисторы. Это исправляется только обновлением программного обеспечения/прошивки.
Недостаточная длина очереди CAN-шины, вызывающая Timer too close
Сообщение об ошибке: При связи по CAN-шине появляется MCU 'xxx' shutdown: Timer too close.
Причина ошибки: Длина очереди по умолчанию (qlen), установленная ядром Linux для сетевого интерфейса CAN, обычно равна 10. Это слишком мало для требований Klipper к высокочастотной связи с малой задержкой. В официальных примерах Klipper часто используется txqueuelen 128; в FlyOS-FAST по умолчанию установлено 1024, что дает больший запас при большом количестве узлов или высокой нагрузке.
Методы решения:
- Проверьте текущую длину очереди CAN-интерфейса:
ip link show can0 | grep qlen
- Временно увеличьте длину очереди. Для обычных систем можно сначала протестировать
128, для систем FLY или машин с несколькими узлами можно использовать1024:
sudo ip link set dev can0 qlen 128
# или
sudo ip link set dev can0 qlen 1024
- Для постоянной настройки: добавьте параметр
txqueuelen 128илиtxqueuelen 1024в файл/etc/network/interfaces.d/can0; если используется systemd-networkd, установитеTxQueueLength=в файле.link.
Узел CAN-шины не отвечает
Сообщение об ошибке: CAN-устройство внезапно отключается, canbus_query.py не находит устройство.
Распространенные причины:
- Отсутствие или неправильное подключение оконечных резисторов CAN (между CANH и CANL должно быть ровно два резистора по 120 Ом).
- Ослабление, плохая обжимка или неплотное подключение разъемов CANH/CANL.
- Использование неэкранированной витой пары для CAN-линий или прокладка параллельно силовым проводам, вызывающая электромагнитные помехи (самая распространенная и скрытая причина).
- Аномалии питания USB-CAN адаптера.
Основные моменты диагностики помех:
Нарушения CAN-связи из-за электромагнитных помех часто проявляются как "периодические" и "случайные" — иногда все работает нормально, иногда связь внезапно теряется, а после выключения и включения питания восстанавливается. При диагностике следует обратить особое внимание на:
- Компоновку линий: Проложены ли линии CAN-связи рядом с проводами двигателей, нагревателей и стола в кабель-канале? Сигналы управления двигателями с высокочастотной ШИМ-модуляцией и шум от включения/выключения нагревателей являются самыми сильными источниками помех.
- Заземление экрана: При использовании экранированного кабеля заземлен ли экран только с одной стороны (со стороны ведущего компьютера)? Двустороннее заземление создает контур заземления, что, наоборот, вносит помехи.
- Расположение оконечных резисторов: Установлены ли оконечные резисторы на физических концах CAN-шины и включены ли они с помощью перемычек на плате, DIP-переключателей или готовых терминальных интерфейсов?
- Спецификация CAN-кабеля: Используется ли витая пара (с шагом скрутки не более нескольких сантиметров)? Параллельные линии (не витая пара) практически не подавляют синфазные помехи.
- Целостность заземления: Надежно ли заземлены блок питания и корпус машины? Незаземленный металлический корпус принтера действует как большая антенна, легко улавливающая фоновый шум.
Методы диагностики:
Аппаратная диагностика должна проводиться только при полном отключении принтера от сети и отключении блока питания: проверка CANH/CANL, перекладка проводов, регулировка экрана, включение/выключение оконечных резисторов, измерение сопротивления между CANH и CANL.
- Убедитесь, что на CAN-шине есть ровно два оконечных резистора по 120 Ом. Предпочтительно использовать встроенные перемычки на плате, DIP-переключатели или готовые терминальные интерфейсы.
- Проверьте надежность подключения CANH/CANL, полностью ли вставлены разъемы.
- Перед работой обязательно отключите питание. С помощью мультиметра измерьте сопротивление между CANH и CANL (в норме около 60 Ом).
- Переложите провода: Проложите линии CAN-связи отдельно от силовых проводов, соблюдая расстояние не менее 2-3 см, избегая параллельной прокладки.
- Убедитесь в заземлении экрана: Экран заземлен только со стороны ведущего компьютера, на стороне инструментальной платы не подключен. Не разбирайте блок питания самостоятельно и не изменяйте заземление бытовой сети.
- Используйте
candumpдля мониторинга трафика CAN-шины, проверьте наличие большого количества ошибочных кадров (error frames). - Временно снизьте скорость/ускорение печати для теста. Если проблема исчезает, это указывает на прямую корреляцию помех с мощностью двигателей.
Порядок поиска, если ID не обнаружен
- Выполните
ip -details link show can0, убедитесь, что CAN0 существует и находится в рабочем состоянии. - Убедитесь, что скорость CAN в прошивке инструментальной платы и материнской платы соответствует скорости CAN0 ведущего компьютера.
- Если ID устройства уже записан в
printer.cfg, временно закомментируйте соответствующую конфигурацию, затем выключите питание примерно на 10 секунд и снова включите для поиска. - Проверьте, не перепутаны ли местами CAN-H и CAN-L, нет ли обрыва или плохого контакта.
- Убедитесь, что на каждом конце CAN-сети есть один оконечный резистор
120 Ом. При выключенном питании измерьте сопротивление между CAN-H и CAN-L. Оно должно быть около60 Ом. - Убедитесь, что инструментальная плата или материнская плата получает питание.
- Проверьте, что при компиляции прошивки выбран правильный способ связи.
- Если результат поиска показывает
Application: CANBOOTилиApplication: Katapult, сначала прошейте прошивку Klipper, а затем повторите поиск.
Правила подключения оконечных резисторов
Перед регулировкой перемычек оконечных резисторов, DIP-переключателей или повторным подключением CAN-кабеля полностью выключите принтер и отключите источник питания.
| Тип устройства | Требование к оконечному резистору | Инструкция по эксплуатации |
|---|---|---|
| CAN инструментальная плата | Требуется резистор 120 Ом | Включить с помощью перемычки на плате или DIP-переключателя |
| CAN-интерфейс материнской платы | Требуется резистор 120 Ом | Включить с помощью перемычки на плате или DIP-переключателя |
| Преобразователи типа UTOC | Обычно уже имеют встроенный резистор 120 Ом | Дополнительно включать оконечный резистор не требуется |
Быстрый порядок диагностики
- Сначала посмотрите на оборудование: выполните
lsusb, убедитесь, что видно1d50:606f. - Затем проверьте конфигурацию: выполните
ip -details link show can0, убедитесь, что CAN0 существует, скорость верна, буфер равен1024. - В конце проверьте аппаратное обеспечение: при полном отключении питания измерьте сопротивление между CAN-H и CAN-L, убедитесь, что оно равно примерно
60 Ом.
Если после всех проверок все еще есть проблемы, попробуйте провести перекрестное тестирование с заменой USB-кабеля, CAN-кабеля, UTOC или CAN-мостового устройства.
Справочная информация по обновлению прошивки CAN-устройств
Этот раздел предназначен для случаев, когда устройство уже подключено к CAN-сети и требуется обновить прошивку материнской платы или инструментальной платы через CAN. Названия прошивок и способы компиляции различаются для разных продуктов. Сначала скомпилируйте прошивку в соответствии с инструкцией для соответствующего продукта.
Подготовка
- Скомпилируйте новую прошивку в соответствии с инструкцией для продукта.
- Убедитесь, что CAN UUID устройства можно найти, или что
canbus_uuid:уже указан для этого устройства вprinter.cfg. - Остановите службу Klipper:
sudo systemctl stop klipper
Выполнение обновления
Замените <CAN_UUID> в команде ниже на фактический ID устройства.
Выберите соответствующую команду в зависимости от версии системы.
- FlyOS-FAST версии 1.3.8 и выше или системы, в которых Klipper обновлялся после 9 апреля 2026 года:
python3 ~/klipper/lib/katapult/flashtool.py -u <CAN_UUID>
- Системы старых версий, т.е. FlyOS-FAST до версии 1.3.8 или системы, в которых Klipper не обновлялся до 9 апреля 2026 года:
python3 ~/klipper/lib/canboot/flash_can.py -u <CAN_UUID>
После -u обязательно должен быть пробел, затем указывается CAN UUID.
Появление сообщения CAN Flash Success обычно означает успешную прошивку.
Действия после обновления
После завершения обновления перезапустите Klipper:
sudo systemctl start klipper
Если после обновления не удается подключиться, повторите поиск CAN ID и убедитесь, что canbus_uuid: в printer.cfg все еще верен.
Итоговый контрольный список
Если CAN ID не находится или Klipper не может подключиться к CAN-устройству, быстро проверьте в следующем порядке:
can0распознается системой.bitrateсоответствует скорости CAN, установленной при компиляции прошивки.qlenилиtxqueuelenравен1024.- CAN-H и CAN-L не перепутаны местами.
- Оконечные резисторы на обоих концах CAN-шины правильные.
- Питание инструментальной платы или материнской платы в норме.
- Правильно выбран способ связи в прошивке.
- В
printer.cfgиспользуется фактический найденныйcanbus_uuid:. - В одном
[mcu]не включены одновременноserial:иcanbus_uuid:.