Глючный homing или кривые руки?

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Глючный homing или кривые руки?

Сообщение de-signer »

Здравствуйте.
Поставил токарное железо. Прикрутили привода. Пришла пора emc2 настроить на исполнение ритуала "Разъезд по нулям" Задал малюсенькую HOME_SEARCH_VEL, HOME_LATCH_VEL ещё на порядок меньше, проверил реферрентный конечник - всё работает, поехали: запускаю emc2, включаю станок, координата Х, кнопка "Найти начало"
Ось доезжает до реферрента и отскакивает от неё с такой скоростью, что emc2 кричит "joint 0 failed", а драйвер привода зарубает питание двигателя и встаёт в позу "Error".
Уменьшаю обе *_VEL на два порядка, т.к. ждать пока привод докрутит до концевика на таких скоростях не хватит и месяца, нажимаю концевик пальцем. привод выдержал возросшую на парядок/два скорость, emc2 неуклонно "joint 0 failed".
Искурил emc2 Integrator manual в пепел. Пошарил по инету и на русском и на английском. Ничего рядом стоящего не нашёл. Полистал emc/motion/homing.c - всё верно написано.
Подскажите, где грабли?
Спасибо.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение Nick »

Скорее всего станок находит 0, и потом с максимальной скоростью и ускорением оси едет в положение home. Тут-то и происходит Joint following error.

У тебя шаговые двигатели стоят?
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

Скакать он начинает после первого касания референтного концевика. Про максимальные скорости уже думал. Зажал их до одури, т.е. тоже на 2 порядка - не помогает.
Со скоростью HOME_SEARCH_VEL он едет до концевика - тут всё верно, но отскок должен быть на LATCH_VEL, которая зажата до предела, а в реальности он отскакивает на известной лишь ему скорости.
У меня сложнее привод. Двигатели - постоянники. На них работает драйвер. Драйвер отслеживает позицию движка по сигналам энкодера. А на вход просит только step/dir и питание.
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

Забыл добавить "home" и "home_position" у оси = 0.0 , т.е. после нахождения референта он никуда скакать не должен
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение Nick »

Скинь свои конфиги hal+ini так проще будет :).

Такая ситуация только с хоумингом, в других случаях не глючит?
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

Вручную оси катаются на 5+
Аварийные конечники чухает.
Простенькую программу отрабатывает.
Всё люкс. Только homing =(
Через пару минут добавлю конфиги.
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

ini:

Код: Выделить всё

[EMC]
MACHINE = lathe
DEBUG = 0x0

[DISPLAY]
DISPLAY = axis
EDITOR = gedit
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 1.2
INTRO_GRAPHIC = linuxcnc.gif
INTRO_TIME = 5
PROGRAM_PREFIX = /home/user/linuxcnc/nc_files
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
LATHE = 1

[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python

[TASK]
TASK = milltask
CYCLE_TIME = 0.010

[RS274NGC]
PARAMETER_FILE = linuxcnc.var

[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
BASE_PERIOD = 45000
SERVO_PERIOD = 1000000

[HAL]
HALFILE = lathe.hal
HALFILE = custom.hal
POSTGUI_HALFILE = custom_postgui.hal
HALUI = halui

[TRAJ]
AXES = 3
COORDINATES = X Z
LINEAR_UNITS = mm
ANGULAR_UNITS = degree
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 4.0
MAX_LINEAR_VELOCITY = 19.4042553191

[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl

[AXIS_0]
TYPE = LINEAR
MAX_VELOCITY = 4.85106382979
MAX_ACCELERATION = 100
STEPGEN_MAXACCEL = 125.0
SCALE = 4166.66666667
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -100.0
MAX_LIMIT = 100.0
HOME = 0.0
HOME_OFFSET = 0.0
HOME_SEARCH_VEL = 0.01
HOME_LATCH_VEL = -0.001
HOME_FINAL_VEL = 0.001
HOME_IGNORE_LIMITS = NO
HOME_USE_INDEX = NO

[AXIS_2]
TYPE = LINEAR
MAX_VELOCITY = 19.4042553191
MAX_ACCELERATION = 50.0
STEPGEN_MAXACCEL = 62.5
SCALE = 1041.66666667
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -100.0
MAX_LIMIT = 100.0
HOME = 1.0
HOME_OFFSET = 3.0
HOME_SEARCH_VEL = 0.05
HOME_LATCH_VEL = 0.001
HOME_FINAL_VEL = 0.001
HOME_IGNORE_LIMITS = NO
HOME_USE_INDEX = NO
hal:

Код: Выделить всё

loadrt trivkins
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hal_parport cfg="0x378 in 0xdc00 in 0xd000 out"
setp parport.2.reset-time 5000
setp parport.2.pin-01-out 0
loadrt stepgen step_type=0,0 ctrl_type=p,p
loadrt pwmgen output_type=0
loadrt encoder num_chan=4
loadrt switch_n num_chan=1
loadrt operator_or num_chan=2
#loadrt switch_mul_n num_chan=1

net estop-remote => iocontrol.0.emc-enable-in <= parport.0.pin-11-in => parport.2.pin-01-out => parport.2.pin-14-out
net estop-out <= iocontrol.0.user-enable-out
#net estop-out => iocontrol.0.emc-enable-in


addf parport.0.read base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread
addf parport.1.read base-thread
addf parport.1.write base-thread
addf parport.1.reset base-thread
addf parport.2.read base-thread
addf parport.2.write base-thread
addf parport.2.reset base-thread
addf stepgen.make-pulses base-thread
#addf pwmgen.make-pulses base-thread

addf stepgen.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
#addf pwmgen.update servo-thread
#addf switch_n.update servo-thread
addf operator_or.update servo-thread
#addf switch_mul_n.update servo-thread

#net spindle-cmd <= motion.spindle-speed-out => pwmgen.0.value
#net spindle-on <= motion.spindle-on => pwmgen.0.enable
#net spindle-pwm <= pwmgen.0.pwm
#setp pwmgen.0.pwm-freq 100.0
#setp pwmgen.0.scale 1166.66666667
#setp pwmgen.0.offset 0.114285714286
#setp pwmgen.0.dither-pwm true
#net spindle-cw <= motion.spindle-forward
#net coolant-mist <= iocontrol.0.coolant-mist

net estop-out => parport.0.pin-01-out

setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0
setp stepgen.0.dirhold 65000
setp stepgen.0.dirsetup 65000
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.joint-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net xstep <= stepgen.0.step => parport.2.pin-02-out
setp parport.2.pin-02-out-reset 1
net xdir <= stepgen.0.dir => parport.2.pin-06-out
setp parport.2.pin-06-out-reset 1
net xenable axis.0.amp-enable-out => stepgen.0.enable

setp stepgen.1.position-scale [AXIS_2]SCALE
setp stepgen.1.steplen 1
setp stepgen.1.stepspace 0
setp stepgen.1.dirhold 65000
setp stepgen.1.dirsetup 65000
setp stepgen.1.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.joint-pos-cmd => stepgen.1.position-cmd
net zpos-fb stepgen.1.position-fb => axis.2.motor-pos-fb
net zstep <= stepgen.1.step => parport.2.pin-03-out
setp parport.2.pin-03-out-reset 1
net zdir <= stepgen.1.dir => parport.2.pin-07-out
setp parport.2.pin-07-out-reset 1
net zenable axis.2.amp-enable-out => stepgen.1.enable

loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

# *****************
# remote pins

# штурвал
net enc-phase-A-remote => encoder.3.phase-A <= parport.0.pin-02-in
net enc-phase-B-remote => encoder.3.phase-B <= parport.1.pin-11-in

# выбор оси
net axis-select-X-remote <= parport.1.pin-05-in => axis.0.jog-enable
net axis-select-Z-remote <= parport.0.pin-03-in => axis.2.jog-enable
net axis-jog-feed-remote <= encoder.3.rawcounts => axis.0.jog-counts => axis.1.jog-counts => halui.feed-override.counts
setp axis.0.jog-scale 1.0
setp axis.2.jog-scale 1.0

# множитель
#net mul-pin0 <= parport.1.pin-13-in => switch_mul_n.0.pin-0
#net mul-pin1 <= parport.0.pin-15-in => switch_mul_n.0.pin-1
#net mul_scale <= switch_mul_n.0.scale => axis.0.jog-scale => axis.2.jog-scale

# auto unipin
net unipin0 operator_or.0.pin-0 <= parport.0.pin-13-in
# mdi unipin
net unipin1 operator_or.0.pin-1 <= parport.1.pin-12-in
# режим
net auto-request => halui.mode.auto <= operator_or.0.pin-0-val
net manual-request => halui.mode.manual <= parport.1.pin-10-in
net mdi-request => halui.mode.mdi <= operator_or.0.pin-1-val

# режим работы encoder.3
net feedoverride-not-allowed halui.feed-override.count-enable <= operator_or.0.result
setp halui.feed-override.scale 0.0025
#net jog-not-allowed halui.feed-override.count-enable <= operator_or.0.result

# кнопки
net spindle-switch <= halui.spindle.is-on => parport.2.pin-16-out
#net spindle-on <= parport.0.pin-07-in => halui.spindle.start
#net spindle-off <= parport.0.pin-04-in => halui.spindle.stop
#net flood-switch <= halui.flood.is-on => parport.2.pin-17-out
#net flood-on <= parport.0.pin-06-in => halui.flood.on
#net flood-off <= parport.0.pin-10-in => halui.flood.off
net program-run <= parport.0.pin-05-in => halui.program.run
net program-pause <= parport.0.pin-09-in => halui.program.pause
net program-stop <= parport.0.pin-08-in => halui.program.stop
net program-resume <= parport.1.pin-08-in => halui.program.resume

# готовность

# switch
#net sw-recv0 <= parport.1.pin-03-in => switch_n.0.pin-0
#net sw-recv1 <= parport.0.pin-12-in => switch_n.0.pin-1
#net sw-recv2 <= parport.1.pin-07-in => switch_n.0.pin-2
#net sw-recv3 <= parport.1.pin-04-in => switch_n.0.pin-3
#net templink0 <= switch_n.0.sw-position => halui.feed-override.counts

#net templink1 halui.feed-override.count-enable <= parport.0.pin-13-in + parport.1.pin-12-in

# end of remote
# *****************

# *****************
# Конечники / реферренты

net xIndex encoder.0.index-enable <=> axis.0.index-enable
#net xPhaseZ <= parport.1.pin-07-in => encoder.0.phase-Z
net xRef <= parport.2.pin-15-in-not => axis.0.home-sw-in
net xLim <= parport.2.pin-12-in-not => axis.0.pos-lim-sw-in => axis.0.neg-lim-sw-in

net zIndex encoder.1.index-enable <=> axis.2.index-enable
#net zPhaseZ <= parport.1.pin-09-in => encoder.1.phase-Z
net zRef <= parport.2.pin-11-in-not => axis.2.home-sw-in
net zLim <= parport.2.pin-13-in-not => axis.2.pos-lim-sw-in => axis.2.neg-lim-sw-in

# end of Конечники / реферренты
# *****************

loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

# encoder
addf encoder.update-counters base-thread
addf encoder.capture-position servo-thread
#net Xencoder-phaseA <= parport.0.pin-10-in => encoder.0.phase-A
#net Xencoder-phaseB <= parport.0.pin-11-in => encoder.0.phase-B

#net Xencoder-phaseZ <= parport.0.pin-12-in => encoder.0.phase-Z
#setp encoder.0.position-scale -750
setp encoder.3.position-scale 1
#net apos-fb axis.3.motor-pos-fb <= encoder.0.position

# далее просто скопировано для нарезания резьбы/ согласованного движения со шпинделем
# ещё не опробовано на практике

# ******************************************************************************
# Spindle settings for thread

# counting the spindle encoder in software
# added above loadrt encoder num_chan=1
# simulate the encoder
loadrt sim_encoder num_chan=1
loadrt limit2 count=1

addf limit2.0                   servo-thread

#######################################################
# Beginning of threading related stuff
#######################################################

# spindle speed control
net spindle-speed-cmd  motion.spindle-speed-out => limit2.0.in
net spindle-speed-limited limit2.0.out => sim-encoder.0.speed

# simulate spindle mass
setp limit2.0.maxv 500.0 # rpm/second

# spindle encoder
# connect encoder signals to encoder counter
net spindle-phase-A sim-encoder.0.phase-A => encoder.2.phase-A
net spindle-phase-B sim-encoder.0.phase-B => encoder.2.phase-B
net spindle-phase-Z sim-encoder.0.phase-Z => encoder.2.phase-Z

# assume 120 ppr = 480 counts/rev for the spindle
setp sim-encoder.0.ppr 120
# iocontrol output is in rpm, but sim-encoder speed is rps
setp sim-encoder.0.scale 60
# scale encoder output to read in revolutions
# (that way thread pitches can be straightforward,
#  a 20 tpi thread would multiply the encoder output
#  by 1/20, etc)
setp encoder.2.position-scale 480

# encoder reset control
# hook up motion controller's sync output
net spindle-index-enable motion.spindle-index-enable <=> encoder.2.index-enable

# report our revolution count to the motion controller
net spindle-pos encoder.2.position => motion.spindle-revs

# for spindle velocity estimate
loadrt lowpass count=1
loadrt scale count=1
net spindle-rps-raw encoder.2.velocity lowpass.0.in
net spindle-rps-filtered lowpass.0.out scale.0.in motion.spindle-speed-in
net spindle-rpm-filtered scale.0.out
setp scale.0.gain 60
setp lowpass.0.gain .07
addf lowpass.0 servo-thread
addf scale.0 servo-thread

# for at-speed detection
loadrt near
addf near.0 servo-thread
setp near.0.scale 1.1
setp near.0.difference 10
net spindle-speed-cmd => near.0.in1
net spindle-rpm-filtered => near.0.in2
net spindle-at-speed near.0.out motion.spindle-at-speed

net  spindle-fwd <= motion.spindle-forward

addf sim-encoder.update-speed servo-thread

addf sim-encoder.make-pulses    base-thread
Будут вопросы по конфигу. Спрашивай.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение Nick »

de-signer писал(а):operator_or
А что это за компонент такой?
de-signer писал(а):net xIndex encoder.0.index-enable <=> axis.0.index-enable
И вот это зачем?

Хмм... надо пойти другим путем... попробуй записать halscope по каналам скорости и poscmd при хоуминге по оси. Может это как-то глючит твой сервопривод... По идее LinuxCNC в любом случае не должен выдавать на ось скорость больше чем установлено в конфиге.

FERROR может вылетать из-за того, что в данной системе суррогат обратной связи в виде stepgen.0.position-fb. Попробуй поставить FERROR и MIN_FERROR = 20 или еще больше.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение Nick »

А по какой оси он у тебя быстро ехать начинает, по X или Z?
И кстати, scale оси у тебя правильно выставлен? Получается 4000 шагов на мм, это реально так?
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

Ехать быстро начинает и там и там.
Выставлено всё верно и отторировано. Дело в том, что энкодер купили на 2500 импульсов/оборот. Энкодер висит на оси движка. Движок занижается шестерёнчатой передачей (соотв. увеличивается момент), а потом ещё ШВП с шагом 6мм. Так что Scale верный.
По теме.
По идее LinuxCNC в любом случае не должен выдавать на ось скорость больше чем установлено в конфиге
Верно. Навёл фразой меня на мысль! А что если stepgen'у управлять не положением, а скоростью! Как только переключил на управление скоростью (ctrl_type=v,v) сразу всё стало на свои места. Никаких лишних движений - всё отлично.

Появился ещё затык =( По шагам:
Включаю emc2. Все координаты по нулям. Выполняю homing. Движок докручивает до реферрента, сбрасывает координату в 0.0, отходит назад, ищет нулевую метку на энкодере (я такой способ выбрал он третий по счёту в Integrator manual) и ... возвращается в то положение, в котором был при включении, ЕЩЁ раз сбрасывает координату в 0.0 и рисует значок homed напротив координаты. Я когда увидел чуть пальцы ног челюстью не отдавил. Первый вопрос вслух: "А нах ты до реферрета ездил?! Сразу бы значок нарисовал" =(
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

Nick писал(а):de-signer писал:
operator_or
А что это за компонент такой?
Это самописный компонент. Я потом узнал, что он в hal уже есть, просто не стал менять конфиг.
Nick писал(а):А что это за компонент такой?
de-signer писал(а):
net xIndex encoder.0.index-enable <=> axis.0.index-enable
И вот это зачем?
Линк должен быть в одну сторону. Я с системой в целом до конца не разобрался. Понял только ключевые моменты. Поэтому не трогаю то, что работает =)
de-signer
Кандидат
Сообщения: 63
Зарегистрирован: 20 дек 2011, 19:10
Репутация: 0
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение de-signer »

Причем vel_cmd = 0.0, а станок едет.
На больших скачках заметил, что отскок _от_ референта происходит при срабатывании оного, как только контакт на референте размыкается происходит наскок на референт на тоже расстояние, на какое от него отскочил. Вобщем глюк какой-то. Перешёл на управление скоростью.
Вложения
Нормальный ход в ручном режиме (1616 просмотров) <a class='original' href='./download/file.php?id=8027&sid=1f5444bd8ef158be86d14a5db58ebfcf&mode=view' target=_blank>Загрузить оригинал (57.21 КБ)</a>
Нормальный ход в ручном режиме
Ещё скачок (1616 просмотров) <a class='original' href='./download/file.php?id=8028&sid=1f5444bd8ef158be86d14a5db58ebfcf&mode=view' target=_blank>Загрузить оригинал (61.92 КБ)</a>
Ещё скачок
А вот скачки (1616 просмотров) <a class='original' href='./download/file.php?id=8029&sid=1f5444bd8ef158be86d14a5db58ebfcf&mode=view' target=_blank>Загрузить оригинал (61.14 КБ)</a>
А вот скачки
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Глючный homing или кривые руки?

Сообщение Nick »

de-signer писал(а):А что если stepgen'у управлять не положением, а скоростью! Как только переключил на управление скоростью (ctrl_type=v,v) сразу всё стало на свои места. Никаких лишних движений - всё отлично.
А у тебя обратная связь в LinuxCNC как-то заводится или все внутри сервы? Если внутри сервы то управлять по скорости смысла особого нет.
de-signer писал(а):Линк должен быть в одну сторону. Я с системой в целом до конца не разобрался. Понял только ключевые моменты. Поэтому не трогаю то, что работает =)
А он и будет в одну сторону. Все эти символы => <= <=> hal вообще игнорирует, они нужны только для удобного чтения :).
de-signer писал(а):Причем vel_cmd = 0.0, а станок едет.
Может не правильно настроен энкодер...
de-signer писал(а):Это самописный компонент. Я потом узнал, что он в hal уже есть, просто не стал менять конфиг.
Прикольно, ты научился писать свои компоненты до того как изучил hal :).
de-signer писал(а):Первый вопрос вслух: "А нах ты до реферрета ездил?! Сразу бы значок нарисовал" =(
А до референта он едет, чтобы индексную метку в нужном месте найти. Она же появляется раз на 1 поворот оси ;).

Опиши еще раз процедуру хоуминга, и когда станок начинает быстро ехать до индексной метки или после?
Ответить

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