Проблема #1: переход через 360°
Добавил в свой станок 4-ю поворотную ось, делаю фрезерную операцию, ось накручивает обороты, при появлении команды G0 B0 linuxcnc начинает все эти обороты отматывать обратно. Симулятор g-code Cimco Edit имеет "галочку" Use shortest angle moves - она убирает эту отмотку. А есть ли в linuxcnc возможность задавать для поворотных осей переходы по кратчайшему угловому расстоянию?
Решение (для просмотра содержимого нажмите на ссылку)Благодаря подсказке Nicka про параметр wrapped_rotary (post #33) решение такое:
1. В мой-станок.ini в секции [AXIS_4] добавляем строчку
WRAPPED_ROTARY = 1
2. В CAM программе делаем настройку для оси вращения 0-359.999.
Вот SolidCAM настройки на примере операции торцевания детали согласно шаблона:
(я адаптировал под linuxcnc один из стандартных постпроцессоров SolidCAM, ссылка ниже)
При выполнении фрезеровки получается что в g-code позиция оси B идет между 0-359.999 а на экране linuxcnc позиция оси B нарастает до +99999, и никакой обратной отмотки
Так выглядит в InventorCAM :
Проблема #2: согласование угловых и линейных скоростей
В LinuxCNC при наличии поворотной оси существует проблема согласования линейных и угловых скоростей.
G1 X10 F600 - перемещает со скоростью 600мм/мин
G1 B10 F600 - перемещает со скоростью 600градусов/мин
G1 X10 B10 F600 - перемещает со скоростью 600мм/мин по линейным координатам, а по угловой - проворачивает с такой скоростью, чтобы стартовать и финишировать одновременно с линейными координатами.
В итоге при такой команде:
G1 X1 B360 F200 - считайте фреза сломана, т.к. расстояние 1мм по X на скорости F200 проходится быстро, а ось B, пытаясь догнать, прокручивается на максимально возможной скорости, и чик...
Решение (для просмотра содержимого нажмите на ссылку)Получилось решить эту проблему с помощью постпроцессора, установив режим скоростей на Inverse Time FeedRate:
Код: Выделить всё
...
i4xFeedMode = 1 ;4x-Simultanious control (0=Programed feedRate, 1=Inverse Time FeedRate, 2=Deg. per Minute)
...
В результате формируется такой G-code для той картинки, что в первой проблеме:
Код: Выделить всё
G00 G90 X0.02 Y-13.59 A0. B359.07 S18000 M03 Z6
G01 X0 Y-13.59 Z5.2 F1080
G93 B90.38 F145
B180.93 F146
B269.62 F149
B359.07 F148
G94 Z4.2 F1080
G93 B90.38 F180
B180.93 F181
B269.62 F184
B359.07 F183
G94 Z3.2 F1080
G93 Z3.2 B90.38 F236
Z3.2 B180.93 F237
Z3.2 B269.62 F241
Z3.2 B359.07 F240
G94 Z2.2 F1080
G93 Z2.2 B90.38 F343
Z2.2 B180.93 F345
Z2.2 B269.62 F351
Z2.2 B359.07 F349
G94 Z1.2 F1080
G93 Z1.2 B90.38 F629
Z1.2 B180.93 F633
Z1.2 B269.62 F644
Z1.2 B359.07 F639
G94 Z0.2 F1080
G93 Z0.2 B90.38 F3769
Z0.2 B180.93 F3794
Z0.2 B269.62 F3856
Z0.2 B359.07 F3830
G00 Z6
M05
M2
%
Видим появление команд G93 и G94. Теперь со скоростями нет проблем, постпроцессор сам всё грамотно рассчитывает
Здесь постпроцессор для SolidCAM(адаптировал под linuxcnc один из стандартных):
Вот на симуляторе:
Проблема #3: ориентация поворотной оси параллельно Y
Обычно в шаблонах конфигураций 4х-осных станков с одной осью вращения заложен набор осей AXYZ, при этом ось A описывается в .ini файле в разделе [AXIS_3]. Отображение траектории оси A в Gremline
осуществляется вокруг оси X. А как изменить её ориентацию на
вокруг Y ?
Решение (для просмотра содержимого нажмите на ссылку)Для настройки отображения вращения поворотной оси вокруг оси Y настройки должны быть по аналогии со следующими:
Для .ini файла такие изменения:
Код: Выделить всё
...
[DISPLAY]
...
GEOMETRY = BXYZ
...
[TRAJ]
AXES = 5
COORDINATES = X Y Z B
...
# Third axis = Z
[AXIS_2]
TYPE = LINEAR
#HOME = 0.0
MAX_VELOCITY = 18
MAX_ACCELERATION = 180
STEPGEN_MAXACCEL = 200
BACKLASH = 0.000
INPUT_SCALE = 1280
OUTPUT_SCALE = 1.000
MIN_LIMIT = 0.0
MAX_LIMIT = 62
FERROR = 0.050
MIN_FERROR = 0.010
HOME_OFFSET = 1.0
HOME = 30
HOME_SEARCH_VEL = -10.0
HOME_LATCH_VEL = 0.390625
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
HOME_IS_SHARED = 1
# Fourth axis = B
[AXIS_4]
TYPE = ANGULAR
WRAPPED_ROTARY = 1
HOME = 0.0
MAX_VELOCITY = 356.25
MAX_ACCELERATION = 4800.0
STEPGEN_MAXACCEL = 6000.0
INPUT_SCALE = -26.6666666667
FERROR = 1
MIN_FERROR = .25
BACKLASH = 0.000
OUTPUT_SCALE = 1.000
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.0
HOME_LATCH_VEL = 0.0
HOME_USE_INDEX = NO
HOME_IGNORE_LIMITS = YES
HOME_SEQUENCE = 0
...
обратите внимание что секция [AXIS_3] отсутствует, ось называется "B", AXES = 5.
Важно! Для отображения траектории поворотной оси на экране имеет значение очередность букв, букву поворотной оси лучше писать впереди остальных
+для .hal файла такие изменения:
Код: Выделить всё
...
loadrt stepgen step_type=0,0,0,0,0
...
setp stepgen.2.position-scale [AXIS_2]INPUT_SCALE
setp stepgen.2.steplen 1
setp stepgen.2.stepspace 1
setp stepgen.2.dirhold 18000
setp stepgen.2.dirsetup 18000
setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
net zstep <= stepgen.2.step
net zdir <= stepgen.2.dir
net zenable axis.2.amp-enable-out => stepgen.2.enable
net both-home-z => axis.2.home-sw-in
net both-home-z => axis.2.neg-lim-sw-in
net both-home-z => axis.2.pos-lim-sw-in
setp stepgen.4.position-scale [AXIS_4]INPUT_SCALE
setp stepgen.4.steplen 1
setp stepgen.4.stepspace 1
setp stepgen.4.dirhold 18000
setp stepgen.4.dirsetup 18000
setp stepgen.4.maxaccel [AXIS_4]STEPGEN_MAXACCEL
net bpos-cmd axis.4.motor-pos-cmd => stepgen.4.position-cmd
net bpos-fb stepgen.4.position-fb => axis.4.motor-pos-fb
net bstep <= stepgen.4.step
net bdir <= stepgen.4.dir
net benable axis.4.amp-enable-out => stepgen.4.enable
...
обратите внимание что секция [AXIS_3] также отсутствует.
Проблема #4: отступы по G92 (G54) для Z приводят к искажению отображения траектории поворотной оси
Отступы по оси X (для станков BXYZ) и по оси Y (для станков AXYZ) также приводят к искажению отображения траектории поворотной оси.
Как быть, если G92 (G54) использовалась для задания отступов при смене инструмента? или если требуется отступ для других целей?
Решение (для просмотра содержимого нажмите на ссылку)Придется перейти на использование встроенной в linuxcnc таблицы инструментов, заполнить ее, и делать отступ путем пересохранения состояния текущего инструмента вот таким g-code :
Код: Выделить всё
G0 X20 Y20 Z20 (здесь перемещаемся в какую-либо точку, которую хотим сделать нулем)
G10 L10 P1 X0 Y0 Z0
G43 H1
Где G10 L10 - записывает в таблицу инструментов значение отступов для инструмента P1 (он же T1), при этом текущая координата переназначится (без переезда) на X0 Y0 Z0, а после выполнения G43 отразиться в Gremline скачком траектории.
G43 - применить записанное значение к текущему отступу.
В итоге получим и отступ, и Gremlin корректно отрисует траекторию поворотной оси.
Если действия, описанные выше, уже один раз выполнились для инструмента T1, то повторную их "активацию" можно делать
Проблема #5: Ненужные паузы в движении после каждого полного оборота
Параметр WRAPPED_ROTARY = 1 позволяет задавать максимальную угловую координату 359.9999°, но не 360°(на 360°linuxcnc выдает ошибку превышения абсолютной координаты для WRAPPED оси)
При выполнении финишной фрезеровки поверхности прутка(цилиндра), чтобы все правильно проворачивалось по спирали, приходится применять в цикле, например, такую пару команд
Код: Выделить всё
G1 Y#<new_y> B359.999 F#<calculated_feed>
G1 B0 (доворот до полного оборота)
При таком подходе после каждого полного оборота происходит ненужная пауза движения.
Решение (для просмотра содержимого нажмите на ссылку)Решение подсказал Nick:
Код: Выделить всё
G1 Y[#<new_y>-#<half_step>] B180 F#<calculated_feed>
G1 Y#<new_y> B0 F<#calculated_feed>
нужно полный оборот оси B (или оси A) разбить на два одинаковых по 180°, тогда будет переход через ноль без приостановки
- logo_micro_vers_dark.png (2.41 КБ) 18000 просмотров
- logo_micro_v_dark.png (2.67 КБ) 2821 просмотр