[WIKI] FAQ по EMC2 LinuxCNC

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

[WIKI] FAQ по EMC2 LinuxCNC

Сообщение Nick »

FAQ переехал в wiki: FAQ по LinuxCNC
Вы можете помочь нам в оформлении статьи. Для внесения изменений надо залогинится в вики (логин и пароль такие же, как на форуме).
Как внести изменения в статью в wiki
(для просмотра содержимого нажмите на ссылку)
Q: EMC2 выдает такую ошибку: "Unexpected realtime delay: chek dmesg for details.". Что делать?
A: Это означает, что один из интервалов задержки стал больше Base period. Нужно увеличить base period в настройках EMC2. Запустите Приложения -> EMC2 -> Latеncy Test, попробуйте нагрузить компьютер, откройте несколько окон веб-браузера, запустите фильм, поставьте копироваться большой файл, по-перемещайте окна по экрану. После всего этого смотрим в окно Latency Test и запоминаем параметр Max Jitter для Base thread (если вы используете серво двигатели, Вам понадобятся оба параметра). Запускаем Приложения -> EMC2 -> Stepconf и в окне настройки конфигурации указываем Base period Maximum Jitter.

Q: При выполнении поиска начал осей (homing) EMC2 выдает ошибку "joint limit error"
A: Наверняка Вы используете в качестве датчика начала (home) один из концевых переключателей оси. Для корректного выполнения поиска в этом случае нужно:
  • Чтобы Home Location не было равно Home Switch Location. Т.к. после процедуры поиска начала станок остановится в положении Home Location, и оно не должно вызывать срабатывания концевого датчика оси.
  • Чтобы в конфигурационном файле в разделе описания оси присутствовала строчка "HOME_IGNORE_LIMITS = YES".
Q: Как запустить станок избегая процедуру поиска начал (homing)? Возникает ошибка: "Не могу исполнить программу если не найдены начала" ("Can't run a program when not homed").
A: EMC2 отказывается выполнять программы до тех пор пока не найдены начала осей потому, что EMC2 должен точно знать в каком положении находится станок, чтобы не дать ему выехать за пределы осей. Настоятельно рекомендую установить концевики и делать поиск нулей при каждом запуске EMC2 (при наличии концевиков это делается нажатием одной клавиши). Если концевиков нет, начала оси можно выставлять вручную.

Если совсем не хочется выставлять начала, то можно в файле конфигурации в раздел [TRAJ] нужно добавить строчку: "NO_FORCE_HOMING = 1" и EMC2 не будет выдавать эту ошибку. Но в этом случае нужно быть особенно внимательным следя за работой станка, т.к. EMC2 не сможет контролировать пределы осей и появится вероятность их превышения, что может привести к поломке станка :attention:!

Q: LinuxCNC не запускается, выдает ошибку RTAI[hal]: ERROR, LOCAL APIC CONFIGURED BUT NOT AVAILABLE/ENABLED.
A: Проблема с установкой EMC2 #48
Это незавершенный раздел, Вы можете помочь в его оформлении.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение Nick »

В принципе менять их можно. Только не очень правильно это делать в "прямом эфире".

Просто motion рассчитывает траектории исходя из таких же значений maxvel и maxaccel, которые меняться не будут. Соответственно все это не сильно повлияет на работу станка.

Поменять эти значения можно через halcmd setp stepgen.<chan>.maxvel ... и если надо можно делать из какого-нибудь скрипта или через отдельно заданный M-код.
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение solo »

UAVpilot писал(а):Зачем?
Если допустим у нас будет пин максимального ускорения то у нас появится возможность менять ускорение в зависимости от текущей скорости оси. Как известно ШД крутяший момент сильно снижжается с ростом оборотов по этому как вариант можно бы задать несколько ускорений в зависимости от скорости двигателя :) получили бы динамическое (ступенчатое) управление ускорением ;) я здесь на форуме встечал тему с похожим названием.

мах скорость-- появится возможность в зависимости от пользовательской необходимости ограничивать мах скорость по отдельной оси либо просто регулировать ее. Допустим у нас есть поворотная ось, желательно обрабатывать деталь с постоянной касательной скорости и в зависимость от того как далеко от оси вращения у нас находится режущий инструмент, а для этого неоходимо менять угловыю скорость, ну как вариант использования.
nkp писал(а): Наверно все параметры в емс можно разделить на 2 группы: те,которые считываются при загрузке на весь сеанс,и те,которые постоянно обновляются в потоках. Вот из второй группы значения пинов и параметров.
Просто здесь приводили пример как редактированием всего одной строки в компоненте , и повторной его установкой можно было сделать превращение параметра в пин, вот у меня и появилась такая мысль :thinking: , а самому проверить эту идею пока не хватает тяма :idiot:
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение Nick »

solo писал(а):Если допустим у нас будет пин максимального ускорения то у нас появится возможность менять ускорение в зависимости от текущей скорости оси. Как известно ШД крутяший момент сильно снижжается с ростом оборотов по этому как вариант можно бы задать несколько ускорений в зависимости от скорости двигателя получили бы динамическое (ступенчатое) управление ускорением я здесь на форуме встечал тему с похожим названием.
Это больше похоже на S-разгон, но его надо реализовывать на уровне планировщика траекторий - motion, а не на уровне драйверов шаговиков.
solo писал(а):мах скорость-- появится возможность в зависимости от пользовательской необходимости ограничивать мах скорость по отдельной оси либо просто регулировать ее. Допустим у нас есть поворотная ось, желательно обрабатывать деталь с постоянной касательной скорости и в зависимость от того как далеко от оси вращения у нас находится режущий инструмент, а для этого неоходимо менять угловыю скорость, ну как вариант использования.
А это делается на уровне кинематик.

Просто если делать это только на уровне stepgen - то ось начнет отставать от заданной траектории будет расти Ferror и неточность обработки. В общем, ничего хорошего не выйдет.
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение solo »

Nick писал(а):Это больше похоже на S-разгон, но его надо реализовывать на уровне планировщика траекторий - motion, а не на уровне драйверов шаговиков
Да я этого и пытаюсь добиться .
Чего то читая описание motion я не нашел пина который воспринимает ускорение.
====
motion у нас планирует траэкторию движения в зависимости от задачи(Жкод или ручное премешение) и текущего положения, я правельно понимаю.???? но у motion есть ограничения это МАХ ускорение осей и скорость осей которые участвуют в движении или может я ошибаюсь на мотион не заводятся значания максимального ускорения оси а ограничение ускорения появляется на stepgen так как махУскорение это параметр степгена
в хел файле у нас есть такие соединения
net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
тоесть здесь мы задаем положения перемешения (или скорость премешения) и отслеживам как это перемешение отработалось каждый сервоцикл, и в зависимости от того если разница между задачей и испонением вносим изменения в скорость перемещения, чегото я совсем запутался где у нас что :thinking: где можно влесть в эту цепочку что бы позволить ШД разгонятся веселее.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение Nick »

motion сам берет из ini ограничения максимальной скорости и ускорений осей. У stepgen обычно отдельная настройка ускорения - обычно большая, чем ускорение оси - в ini она пишется как stepgen_maxaccel. Больше она, например, для того, чтобы была возможность компенсировать люфты.
solo писал(а):тоесть здесь мы задаем положения перемешения (или скорость премешения) и отслеживам как это перемешение отработалось каждый сервоцикл, и в зависимости от того если разница между задачей и испонением вносим изменения в скорость перемещения
Нет как таковая обратная связь не отслеживается - она нужна только для контроля того что мы не слишком далеко ушли от траектории. Т.е. обратная связь на траекторию не влияет никак.

Как сейчас все работает:
1. motion рассчитывает траекторию и контрольные точки на каждый сервоцикл. Для расчетов используется скорость и ускорения из ini.
2. motion выдает следующую контрольную точку в stepgen/
3. stepgen исходя из своих параметров, текущего положения, скорости и ускорения рассчитывает частоту шагов на следующий сервоцикл.
4. stpegen долбит целый период на заданной скорости.
5. stepgen возвращает текущее положение в motion.
6. motion проверяет насколько отклонились от траектории, и если все нормально - продолжает.
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение solo »

Nick писал(а):Поменять эти значения можно через halcmd setp stepgen.<chan>.maxvel ... и если надо можно делать из какого-нибудь скрипта или через отдельно заданный M-код
можно ли использовать такую строку в хел файле такую запис
halcmd setp stepgen.0.maxaccel mux2.0.out
здесь выход компонента mux2.0.out я хочу использовать в виде переменной, номинального значения максимального ускорения оси.
но хел на эту строку ругается

хочу попробовать ступенчато изменять ускорение на одной оси
в хел дописываю следующее

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


loadrt wcomp count=1
loadrt mux2 count=1

setp mux2.0.in0 200  # начальное ускорение
setp mux2.0.in1 30  # основное ускорение

net wcomp.0.in axis.3.joint-vel-cmd #реальная скор

setp wcomp.0.min 10 # малая скорсть 
setp wcomp.0.max 30 # большая скорость 

net xa_0 wcomp.0.under mux2.0.sel

halcmd setp stepgen.0.maxaccel mux2.0.out 

addf wcomp.0 servo-thread
addf mux2.0 servo-thread
kernel
Опытный
Сообщения: 158
Зарегистрирован: 12 мар 2011, 15:48
Репутация: 17
Откуда: Красноярск
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение kernel »

Извиняюсь, если не там спрашиваю (отдельную ветку создавать для мелкого вопроса не хотелось бы), но есть у меня вопрос по HAL. Я не очень его понимаю, уже несколько дней пытаюсь читать, поэтому могу глупость спросить.
Можно ли с помощью него сделать так, чтобы в зависимости от получения на порт лог. "1" (т.е., например, именно в момент поступления +5V на вход), кидался одиночный импульс (например, step один раз) на другую ножку? Т.е. примерно так:

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

                            _______________
вход на каком-то пине:  ___|               |______
                            _
выход на другом пине:   ___| |____________________
Смотрел в сторону stepgen, pwmgen, oneshot -- но ничего не понял.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение nkp »

kernel писал(а):одиночный импульс (например, step один раз)
"например"...
длительность не критична одиночного импульса???
kernel
Опытный
Сообщения: 158
Зарегистрирован: 12 мар 2011, 15:48
Репутация: 17
Откуда: Красноярск
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение kernel »

Длительность желательно близкую к постоянной (т.е. чтобы при каждом таком импульсе большого разбега в его длине не было) и как можно меньше (например, пара десятков микросекунд). Что-то похожее на step сигнал нужно.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение nkp »

ну если запустить генератор и первым же импульсом его же и отключить... ;)
надо попробовать...
kernel
Опытный
Сообщения: 158
Зарегистрирован: 12 мар 2011, 15:48
Репутация: 17
Откуда: Красноярск
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение kernel »

nkp писал(а):ну если запустить генератор и первым же импульсом его же и отключить... ;)
надо попробовать...
Тоже думал об этом. Но по-моему через hal так не сделать? Кроме того, нельзя, чтобы прошло больше одного импульса.
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение zilk »

kernel писал(а):Можно ли с помощью него сделать так, чтобы в зависимости от получения на порт лог. "1" (т.е., например, именно в момент поступления +5V на вход), кидался одиночный импульс (например, step один раз) на другую ножку?
Компонент EDGE вам в помощь - по переднему фронту управляющего импульса формирует на выходе ОДИН импульс заданной (в наносекундах) длительности.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение Nick »

solo писал(а):halcmd setp stepgen.0.maxaccel mux2.0.out
здесь выход компонента mux2.0.out я хочу использовать в виде переменной, номинального значения максимального ускорения оси.
но хел на эту строку ругается
Ругается по трем причинам:
1. в hal файле писать halcmd не надо, там каждая строка выполняется как halcmd
2. и 3. Ты пытаешься связать парметр (ускорение) и пин (mux) так нельзя. Если мы хотим связать два пина - используется команда net. setp= - только для установки значения параметра, причем значение должно быть числом, а не пином!

В обратную сторону параметр=>пин можно через constant http://linuxcnc.org/docs/html/man/man9/constant.9.html
обратно скорее всего никак. Только через дополнительный скрипт в userspace, который будет выполнять
halcmd setp stepgen.0.maxaccel 10
вместо 10 можно будет вписывать значение пина, но все это будет делаться через скрипт на питоне, а не через hal!
kernel писал(а):кидался одиночный импульс (например, step один раз) на другую ножку? Т.е. примерно так:
А чем oneshot не подошел? Да и как zilk говорил edge?
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение zilk »

Nick писал(а):А чем oneshot не подошел?
Oneshot работает в сервопериоде, поэтому длительностей в микросекунды не получить:
This function needs to run in a thread which supports floating point (typically the servo thread)
А вот edge в базовом - там щитает наносекунды..
For a similar function that can run in the base thread, and which offers higher resolution, see "edge"
:)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение Nick »

Понял :)
kernel
Опытный
Сообщения: 158
Зарегистрирован: 12 мар 2011, 15:48
Репутация: 17
Откуда: Красноярск
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение kernel »

Спасибо, попробую edge!
kernel
Опытный
Сообщения: 158
Зарегистрирован: 12 мар 2011, 15:48
Репутация: 17
Откуда: Красноярск
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение kernel »

Да, edge работает как нужно. Спасибо! Но появился еще один вопрос :) Может быть есть у кого-нибудь опыт, скажем так, редактирования реакции EMC2 на какой-либо g-код или создание "своего g-кода"? Грубо говоря, можно ли внести изменения в какой-либо G-код? Поясню, мне нужно сделать "delay" в несколько микросекунд после прохождения строки с кодом M62 (при этом, не потеряв синхронизацию). G04 явно не подходит в данном случае :(
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение nkp »

kernel писал(а):редактирования реакции EMC2 на какой-либо g-код или создание "своего g-кода"?
задача у тебя какая то интересная - микросекунды через ж-код ;)
вот здесь есть про переназначение команд...
ты можешь написать любой скрипт (bash , питон , тикль , др.) - сохранить в файл M1xx - и вставлять в свою программу...
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение solo »

Nick писал(а):
solo писал(а):halcmd setp stepgen.0.maxaccel mux2.0.out
здесь выход компонента mux2.0.out я хочу использовать в виде переменной, номинального значения максимального ускорения оси.
но хел на эту строку ругается
Ругается по трем причинам:
1. в hal файле писать halcmd не надо, там каждая строка выполняется как halcmd
2. и 3. Ты пытаешься связать парметр (ускорение) и пин (mux) так нельзя. Если мы хотим связать два пина - используется команда net. setp= - только для установки значения параметра, причем значение должно быть числом, а не пином!
Попробовал написать свой первый скрипт поправте если что не так :beer_blow: :beer:
Хочу чтобы в зависимости от скорости оси Х которая подается на пин "vel" у меня менялось ступенчато ускорение с которым разгонялась ось Х

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

#!/usr/bin/python
h = hal.component("accstep_x")
h.newpin("vel", hal.HAL_FLOAT, hal.HAL_IN) #скорость с пина vel X
#h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
	 while 1: 
		if h['vel']<2:
			'halcmd setp stepgen.0.maxaccel 300'
		elif 2<= h['vel']<10:
			'halcmd setp stepgen.0.maxaccel 100'
		elit 10<=h['vel']<30:
			'halcmd setp stepgen.0.maxaccel 30'
		else :
			'halcmd setp stepgen.0.maxaccel 10'

except KeyboardInterrupt:
    raise SystemExit

Последний раз редактировалось solo 26 мар 2013, 19:40, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по EMC2 LinuxCNC

Сообщение Nick »

kernel писал(а):Да, edge работает как нужно. Спасибо! Но появился еще один вопрос Может быть есть у кого-нибудь опыт, скажем так, редактирования реакции EMC2 на какой-либо g-код или создание "своего g-кода"? Грубо говоря, можно ли внести изменения в какой-либо G-код? Поясню, мне нужно сделать "delay" в несколько микросекунд после прохождения строки с кодом M62 (при этом, не потеряв синхронизацию). G04 явно не подходит в данном случае
А какая синхронизация имеется в виду? Не пытаешься ли ты, случаем, таким образом многозаходную резьбу резать?
Ответить

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