Программно-аппаратная смена инструмента

Материал из NikiWiki
Перейти к:навигация, поиск
YourBunnyWroute.pngАвтор предупреждает! Статья не дописана!
Данная статья не дописана и требует до- или, даже, переработки. Примеры и данные в этой статье могут быть не проверены, тесты не отлажены, а информация не действительна. Я постараюсь, чтобы таких статей было по-меньше, но пока они есть. Смотрите: NikiWiki:Отказ от ответственности


Linuxcnc logo 64.pngПроверялось на LinuxCNC
Все данные и примеры, приведенные в этой статье проверялись на по LinuxCNC и могут некорректно работать в других программах управления станками с ЧПУ


Cnc-club logo.pngОбсуждение на cnc-club.ru
Данные для этой статьи взяты из обсуждения, развернувшегося на форуме [cnc-club.ru]

Авторские права на все материалы, полученные с форума [cnc-club.ru] принадлежат их, материалов, авторам.

NikiWiki и Сообщество ни коим образом на авторство не претендует.


Задача

Найти конец инструмента и включить режим смещения с учетом длинны этого самого инструмента.

Техническая часть

Техническая часть заключается в том, чтобы обеспечить надежное и точное касание инструмента и определение его местоположения. В просторах интернет существует масса реализаций, как открытых, так и бесплатных.

В качестве датчика конца был взят кусок фольгированного текстолита. Это решение пока принято за основное, хотя, есть и более технологичные мысли. Они появятся тут по-мере реализации.

Программная часть

Программа для "оживления" датчика конца была позаимствована на форуме cnc-club.ru. Ее описание и приводится ниже.

Решение

В LinuxCNC и PLC545 есть возможность "подвесить" определенный контакт LPT порта на HAL сигнал probe-in. Как это сделать, описано в Step Conf Wizard и linuxcnc.ini. Также, как "нарисовать светодиод"-индикатор в интерфейсе LinuxCNC при помощи PyVCP описано в статье Виртуальный индикатор пробника инструмента. Точнее, не то как надо делать, а то как сделал я. В данный момент мне кажется, что эти два определения не совпадают.

Но что делать с этим дальше? Определить "конец" мы можем достаточно просто: переводим станок в позицию датчика и опускаем шпиндель командой G38.X в зависимости от желаемого результата - ждать нам ошибки LinuxCNC или "забить" на нее.

Потом мы поднимаем инструмент соответствующей G38.X до разрыва контакта. Это, по-идее, и есть нижняя точка инструмента. Она записывается в переменной #5063 (Для оси Z). (Вообще, probe затрагивает параметры 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069 и 5070)

Применение результата

Применить полученный результат можно двумя известными мне способами, один - тот, что описан в документации, а именно ввод коррекции на длину инструмента, а другой - предложенный на форуме - включение отступов по оси Z. При этом, во втором случае, длина инструмента берется из таблицы инструментов, но не применяется.

Оба случая имеют свои достоинства, недостатки и баги.

Отступ по всем осям

Файл поиска 0 m6.ngc выглядит так:

O<m6> sub

( 0 если датчик лежит на жертвенном столе )
#<substrate> = [0]
#<detail_hight> = [0]
#<probe_hight> = [1.5]
#<probe_x> = [200]
#<probe_y> = [50] 
#<safe_z> = [99]
 
G28.1
#<x_copy> = [#5161]
#<y_copy> = [#5162]
G53 G00 Z[#<safe_z>]
M6 T[#1]
G53 G0 X[#<probe_x>] Y[#<probe_y>]
G49
G40
G91
G38.3 Z-90 F250
o123 if[#5070 NE 0]
        G38.5 Z2.
        G38.2 Z-3. F30
        #<z_new> = [#<probe_hight> - #<detail_hight> - #<substrate>]
        G92 Z[#<z_new>]
o123 else
        ( M100 P0 )
        (MSG, Ошибка!)
o123 endif
G90
G53 G0 Z[#<safe_z>]
G53 G0 X[#<x_copy>] Y[#<y_copy>]
O<m6> endsub
O<m6> CALL [100]
M2

Он выполнен в виде подпрограммы по той причине, чтобы его вставить в качестве перенаправления оператора M06 в linuxcnc.ini, как предложено пользователем Gennadiy на [форуме].

Ввод коррекции на длину инструмента

Ниже приведен код, который я пока так и не смог заставить работать как положено, да и приведенный код уже модифицировался 1000 раз, но для "памятки" он подходит.

По материалам обсуждения [GladeVCP и PyVCP для начинающих на форуме cnc-club.ru]

Долго ли коротко, но мной был сделан датчик конца фрезы и, По материалам обсуждения [Авто ноль по Z в EMC на форуме cnc-club.ru] и кучи документации, написана ниже приведенная программка. Суть ее в тестировании датчика много-много раз (50 в данном контексте). Не стану описывать весь алгоритм, может когда-нибудь, но в журнале, который я создал записаны два самых мне приятных значения:

minZDelta = 0.000168
maxZDelta = 0.032450

Это, соответственно минимальная, найденная за 50 измерений дельта (разница положения инструмента) и максимальная. Что-то мне сдается, что 168 микрон - это слабо достижимая разница, а вот максимальная 32 тысячных или 3.2 сотых - более чем для меня достаточная.

%
N0000 G17 G49 G21 G40 G90 G92.1
O<logappend> CALL
(LOG, Отладка началась)
G53 G00 X1 Y316 Z50
#1=1
O06 sub
G53 G00 Z100
( G53 G00 X210 Y-316 Z-10 )
( G53 G00  X210 Y10 Z90 )
(MSG, Смените инструмент на N = #1)
M06 T#1
G53 X200 Y50
(PROBEOPEN probe.log)
(LOG, Teст на опуск до датчика)
#<currentZoffset>=#5063
(LOG, currentZoffset = #<currentZoffset>)
G91 G38.2 Z-90 F250
(LOG, Пройден тест на опуск до датчика)
#<newZoffsetDown>=#5063
(LOG, newZoffsetDown = #<newZoffsetDown>)
M01
(LOG, Тест на подъем от датчика)
G91 G38.4 Z10 F10
#<newZoffsetUp>=#5063
(LOG, newZoffsetUp = #<newZoffsetUp>)
(LOG, Пройден тест на подъем от датчика)
#<deltaZDownUpDistance>=[#<newZoffsetUp>-#<newZoffsetDown>]
(LOG, deltaZDownUpDistance = #<deltaZDownUpDistance>)
#<lastZoffset>=#5063
(LOG, lastZoffset = #<lastZoffset>)
#<deltaZPrevToolOffset>=[#<currentZoffset>-#<lastZoffset>]
(LOG, deltaZPrevToolOffset = #<deltaZPrevToolOffset>)
M01
G90
G53 G00 Z90
(G53 G00 Z[#<currentZ>])
M01
(PROBECLOSE)
O06 endsub
#<finalZOffset>=0
#<minZOffset>=0
#<maxZOffset>=100
#<minZDelta>=100
#<maxZDelta>=0
#<deltaZ>=0
O07 REPEAT [50]
O111 IF [[#<finalZOffset>] EQ 0]
#<previousZOffset>=#5063
O111 ELSE
#<previoulZOffset>=#<finalZOffset>
O111 ENDIF
#<finalZOffset>=#5063
O103 IF [[#<finalZOffset>] GT [#<previousZOffset>]] 
#<deltaZ>=[#<finalZOffset>-#<previousZOffset>]
O103 ELSE
#<deltaZ>=[#<previousZOffset>-#<finalZOffset>]
O103 ENDIF
O112 IF [[#<finalZOffset>] NE [#<previousZOffset>]]
O105 IF [[#<deltaZ>] LT [#<minZDelta>]]
#<minZDelta>=#<deltaZ>
O105 ENDIF
O104 IF [[#<deltaZ>] GT [#<maxZDelta>]]
#<maxZDelta>=#<deltaZ>
O104 ENDIF
O112 ENDIF
O101 IF [[#<finalZOffset>] GT [#<minZOffset>]]
#<minZOffset>=#<finalZOffset>
O101 ENDIF
O102 IF [[#<finalZOffset>] LT [#<maxZOffset>]]
#<maxZOffset>=#<finalZOffset>
O102 ENDIF
(LOG, finalZoffset = #<finalZoffset>)
(LOG, minZoffset = #<minZoffset>)
(LOG, maxZoffset = #<maxZoffset>)
(LOG, minZDelta = #<minZDelta>)
(LOG, maxZDelta = #<maxZDelta>)
O06 CALL [1]
G53 G00 X1 Y316 Z50
O07 ENDREPEAT
(LOG, Отладка закончилась)
O<logclose> CALL
%