Ось по модулю 360 (не про wrapped_rotary)

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
am-i-go
Новичок
Сообщения: 3
Зарегистрирован: 30 май 2022, 14:26
Репутация: 0
Настоящее имя: Игорь
Контактная информация:

Ось по модулю 360 (не про wrapped_rotary)

Сообщение am-i-go »

Здравствуйте все!

Нуждаюсь в вашей помощи господа!
Есть сервопривод и мотор Leadshine с абсолютным многооборотным энкодером. Они работают на оси вращения A, и ось должна быть в координатах по модулю 360 градусов.

Сейчас для упрощения соотношение оборотов мотора и оси один к одному - за один оборот мотора координата оси изменяется до 359,999 градусов . При этом в приводе значение инкрементов на один оборот мотора стоит по умолчанию 10000, в файле hal лдя linuxcnc установлен параметр position-scale 27.7751 тогда максимальная координата пересчитывается из 10000 в 359,999.

Затем параметр wrapped_rotary в ini файле устанавливаю на 1 и когда ось проходит через 0 градусов возникает ошибка "joint 3 following error". На малых скоростях эта ошибка возникает ещё на координате 359,2 и пересечения нуля не происходит ещё но дальше ось не вращается.

Если энкодер настраивать как абсолютный линейный и ось делать wrapped, то можно увидеть как ось будет без ошибок вращаться в одном направлении по модулю в 360 градусов, но только до переполнения значения буфера энкодера (при 10000 инкрементов на оборот мотора это будет 214748 оборота) и после этого снова перескок координаты приводит к ошибке "joint 3 following error". Если же применить коэффициент редукции, то количество оборотов оси без ошибки в одном направлении станет гораздо меньше.

Файлы настроек прилагаю. Укажите пожалуйста в каком направлении копать.
am-i-go
Новичок
Сообщения: 3
Зарегистрирован: 30 май 2022, 14:26
Репутация: 0
Настоящее имя: Игорь
Контактная информация:

Re: Ось по модулю 360 (не про wrapped_rotary)

Сообщение am-i-go »

Я не корректно описал сущность проблемы.
Необходимо иметь возможность совершить неопределённо большое (бесконечное) количество оборотов в любую сторону и отследить угол положения вращаемого глобусного стола в значении координаты по модулю 360 градусов.

1) Как я понимаю в этом случае ось нужно обязательно настраивать как wrapped. Это так, других вариантов нет?

Для взаимодействия linuxcnc с сервоприводами я использую готовый Hal-компонент cia402. Этот компонент следующим образом пересчитывает значения для получения текущей позиции сервопривода по шкале pos_scale (float):

// read position feedback (float pos_fb)
pos_fb = ((double)drv_actual_position) * pos_scale_rcpt;
pin in signed drv_actual_position "Drives actual Position, index 0x6064"
pos_scale_rcpt = 1.0 / pos_scale;


В случае с сервоприводами которые я использую значение актуальной позиции в регистре EtherCAT (6064) имеет тип int32 (число в диапазоне 2147483648 ~ 2147483647 инкрементов энкодера). При этом пин принимает значение типа данных signed (значит int32), но в документации по HAL указаны значения -2147483647 to +2147483647 , т. е. отрицательный минимум на 1 больше того, что принято считать для этого типа данных.
Похоже ошибка в документации, наверное этим можно пренебречь…?
Получается, хоть pos_fb и имеет тип float, но мы не можем получить значение выходящее за диапазон величин int32, потому, что сервопривод может передавать только int32.

Далее Hal-компонент cia402 пересчитывает значения позиции по шкале pos_scale для команды перемещения сервопривода:

// write position command (out pin signed drv_target_position)

drv_target_position = (int32_t) (pos_cmd * pos_scale);
pin in float pos_cmd "target Position, from Motion or PID";

Тут всё нормально, на сервопривод уходит команда с типом данных int32, как и ожидается.
В моём случае при шкале 23138,953… инкремента на один градус получается выполнить от нулевого значения актуальной позиции до остановки сервопривода 92808 градуса в обоих направлениях. После достижения значения 2147483647 (или -2147483648) инкрементов происходит остановка мотора без появления ошибок на сервоприводе и в linuxcnc, а координата угла поворота оси A в linuxcnc перескакивает с 288 до 71 градуса. Продолжить движение в ту же сторону не получается, скорость подачи в интерфейсе появляется, но мотор стоит на месте. Приложу видео если получится это сделать.

2) Подскажите господа, в чём может быть причина такого поведения.
Ответить

Вернуться в «LinuxCNC»