Программно-аппаратная смена инструмента
Автор предупреждает! Статья не дописана! Данная статья не дописана и требует до- или, даже, переработки. Примеры и данные в этой статье могут быть не проверены, тесты не отлажены, а информация не действительна. Я постараюсь, чтобы таких статей было по-меньше, но пока они есть. Смотрите: NikiWiki:Отказ от ответственности |
Проверялось на LinuxCNC Все данные и примеры, приведенные в этой статье проверялись на по LinuxCNC и могут некорректно работать в других программах управления станками с ЧПУ |
Обсуждение на cnc-club.ru Данные для этой статьи взяты из обсуждения, развернувшегося на форуме [cnc-club.ru] Авторские права на все материалы, полученные с форума [cnc-club.ru] принадлежат их, материалов, авторам. |
Содержание
Задача
Найти конец инструмента и включить режим смещения с учетом длинны этого самого инструмента.
Техническая часть
Техническая часть заключается в том, чтобы обеспечить надежное и точное касание инструмента и определение его местоположения. В просторах интернет существует масса реализаций, как открытых, так и бесплатных.
В качестве датчика конца был взят кусок фольгированного текстолита. Это решение пока принято за основное, хотя, есть и более технологичные мысли. Они появятся тут по-мере реализации.
Программная часть
Программа для "оживления" датчика конца была позаимствована на форуме 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 %