[WIKI] Работа с центроискателем в LinuxCNC

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение Serg »

Nick писал(а):Тогда пин гарантированно провисит этот sleep(1000), и любой rt компонент его схавает. Другое дело, что его может не увидеть другой userspace компонент...
Всё делается гораздо проще: в "приёмнике" надо реагировать не просто на высокий уровень пина, а именно на перепад с низкого на высокий.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение Nick »

Тогда возникнет проблема - надо гарантированно выключать пин :)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение Serg »

Nick писал(а):Тогда возникнет проблема - надо гарантированно выключать пин :)
Зато выключать можно будет не в какие-то конкретные моменты, а "когда делать нечего". :)
Ну или применить BIT_IO - кому надо, тот пусть и выключает. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Nick писал(а):А чего ты для вот этого всего не сделал ... что-то типо вот такого:
Буду так оптимизировать .py.
Может, есть замечания по стилистике? А то много исправлять потом.

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

#  ..... New defs ...............

   def gcode(self, s, data = None): 
        for l in s.split("\n"):
            self.command.mdi( l )
            self.command.wait_complete()
            if self.error_poll() == -1:
                return -1
        return 0

    def ocode(self, s, data = None)	
        self.command.mdi(s)
        self.stat.poll()
        while self.stat.exec_state == 7 or self.stat.exec_state == 3 :
            if self.error_poll() == -1:
                return -1
            self.command.wait_complete()
            self.stat.poll()
        self.command.wait_complete()
        if self.error_poll() == -1:
            return -1
		return 0
		
#....Result...............................


    # Corners
    # Move Probe manual under corner 2-10 mm
    # X+Y+ 
    def on_xpyp_released(self, data = None):
        self.command.mode( linuxcnc.MODE_MDI )
        self.command.wait_complete()
        # move Y + edge_lenght
        s="""G91
        G0 Y%f
        G90""" % (self.spbtn1_edge_lenght.get_value() )        
        if self.gcode(s) == -1:
            return
        # Start xplus.ngc
        if self.ocode ("O<xplus> call") == -1:
            return
        # show X result
        a=self.stat.probed_position
        xres=float(a[0])+0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_xp.set_text( "%.4f" % xres )
        self.lenght_x()

        # move X + edge_lenght
        s="""G91
        X%f Y-%f
        G90""" % (self.spbtn1_edge_lenght.get_value(),self.spbtn1_edge_lenght.get_value() )        
        if self.gcode(s) == -1:
            return
        # Start yplus.ngc
        if self.ocode ("O<yplus> call") == -1:
            return
        # show Y result
        a=self.stat.probed_position
        yres=float(a[1])+0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_yp.set_text( "%.4f" % yres )
        self.lenght_y()
        # move to finded  point
        self.command.mdi( "G0 X%f Y%f" % (xres,yres))
        self.command.wait_complete()
        self.command.mode( linuxcnc.MODE_MANUAL )
        self.command.wait_complete()

Код probe_screen.py станет короче на 300 строк :).
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Исправлена критическая ошибка для всех измерений изнутри (убран ошибочный переезд, строка 10, во всех четырёх ххх_in.ngc ). Если кто-то уже начал пользоваться приложением, обязательно обновите.

P.S. Этот "косяк" и предыдущий, на который указал nkp, появляются при перемещениях файлов с разных моих компьютеров друг на друга и в сеть. Запутываются версии. На моем рабочем компе этих багов нет. Пора открывать единое место размещения, например, на github :) .
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Крупное обновление.
1. Убрал "слепые" для error_poll() зоны, а именно, убрал перемещения на холостом ходу из ngc и перенес их в python c доп. проверкой error_poll(). Таким образом повысилась безопасность измерений. В результате этого также объединились ngc внешних и внутренних измерений.
2. Большущая оптимизация python кода в probe_screen.py.
3. Убрал переключения режима MDI -> MANUAL при каждом обмере. По-крайней мере в gmoccapy стало возможно нормально работать, не нужно после каждого обмера заново входить в Probe Screen.
4. Исходники Probe Screen теперь на github.

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

Re: [WIKI] Работа с центроискателем

Сообщение Nick »

В
verser писал(а):def gcode(self, s, data = None):
можно засунуть:

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

if re.search("^\s*O.*call",l,re.I) :
   if ocode(l) == -1 :
     return -1
И вызывать весь Gкод одной строчкой.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение Nick »

И зачем там data=None?
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Nick писал(а):...И вызывать весь Gкод одной строчкой.
Nick писал(а):...И зачем там data=None?
Спасибо. Внесу правки :) .
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Я так понял, что re.search мне вот так правильно будет в gcode() вставить

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

if re.search("^\s*O.*call",l,re.I) :
   if ocode(l) == -1 :
     return -1
   return 0
else:
# всё остальное из gcode() 
P.S. всё, ознакомился с "re".., python, как латекс, тяни под себя как хочешь :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение Nick »

Ненене, это все в цикл построчной обработки. Если видим O...CALL - то запускаем ocode.

Вообще, можешь спокойно добавить все вот это

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

self.stat.poll()
        while self.stat.exec_state == 7 or self.stat.exec_state == 3 :
            if self.error_poll() == -1:
                return -1
            self.command.wait_complete()
            self.stat.poll()
        self.command.wait_complete()
        if self.error_poll() == -1:
            return -1
вместо простого

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

            if self.error_poll() == -1:
                return -1
и убрать ocode вообще.
ну будет + 5 комманд на каждый вызов mdi, это совсем не критично.
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Nick писал(а):Ненене, это все в цикл построчной обработки. Если видим O...CALL - то запускаем ocode.
а-а, теперь понял... сделаю..
pkasy
Мастер
Сообщения: 1139
Зарегистрирован: 15 мар 2013, 09:39
Репутация: 45
Откуда: Владивосток

Re: [WIKI] Работа с центроискателем

Сообщение pkasy »

пожелание - сделайте индикацию текущей работы. хотя бы лампочку, что процесс идет.
а то он подвисает, потом чего то рывком. и не понятно, выполнил ли, получилось ли?
1. лампочка зеленая - процесс идет.
2. лампочка красная - нифига не нашел, измените параметры. и лучше бы ему вернуться в начальную точку.
3. лампочка какая-то - процесс закончен успешно, вот новые координаты/результаты обмерений.

п.с. 4 датчика сломал.
pkasy
Мастер
Сообщения: 1139
Зарегистрирован: 15 мар 2013, 09:39
Репутация: 45
Откуда: Владивосток

Re: [WIKI] Работа с центроискателем

Сообщение pkasy »

интерфейс приятный, но логику нужно доработать.
опять сломал иглу, но это мусор, как раз для тестирования таких прог.
стартовая точка была близко к правому краю.
при измерении внутреннего центра по Х все отработало хорошо, но! для измерения вернулись в стартовую точку, а зачем? мы же знаем теперь центр по Х, давай вернемся в него и от него уже пойдем искать дальше.
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

pkasy писал(а): при измерении внутреннего центра по Х все отработало хорошо, но! для измерения вернулись в стартовую точку, а зачем? мы же знаем теперь центр по Х, давай вернемся в него и от него уже пойдем искать дальше.
Ух ты, точно. Сейчас сделаю. Но только для измерения цилиндра, а не отверстия, с отверстием есть такой подъезд (см. "# move X to new center").
(для просмотра содержимого нажмите на ссылку)

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

    # Hole Xin- Xin+ Yin- Yin+
    def on_xy_hole_released(self, data = None):
        self.command.mode( linuxcnc.MODE_MDI )
        self.command.wait_complete()
        if self.z_clearance_down() == -1:
            return
        # move X - edge_lenght Y + xy_clearance
        tmpx=self.spbtn1_edge_lenght.get_value()-self.spbtn1_xy_clearance.get_value()
        s="""G91
        X-%f
        G90""" % (tmpx)        
        if self.gcode(s) == -1:
            return
        # Start xminus.ngc
        if self.ocode ("O<xminus> call") == -1:
            return
        # show X result
        a=self.stat.probed_position
        xres=float(a[0])-0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_xm.set_text( "%.4f" % xres )
        self.lenght_x()

        # move X +2 edge_lenght - 2 xy_clearance
        tmpx=2*(self.spbtn1_edge_lenght.get_value()-self.spbtn1_xy_clearance.get_value())
        s="""G91
        X%f
        G90""" % (tmpx)        
        if self.gcode(s) == -1:
            return
        # Start xplus.ngc
        if self.ocode ("O<xplus> call") == -1:
            return
        # show X result
        a=self.stat.probed_position
        xres1=float(a[0])+0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_xp.set_text( "%.4f" % xres1 )
        self.lenght_x()
        cxres=0.5*(xres+xres1)
        self.lb_probe_xc.set_text( "%.4f" % cxres )

        # move X to new center
        s="""G0 X%f""" % (cxres)        
        if self.gcode(s) == -1:
            return

        # move Y - edge_lenght + xy_clearance
        tmpy=self.spbtn1_edge_lenght.get_value()-self.spbtn1_xy_clearance.get_value()
        s="""G91
        G0 Y-%f
        G90""" % (tmpy)        
        if self.gcode(s) == -1:
            return
        # Start yminus.ngc
        if self.ocode ("O<yminus> call") == -1:
            return
        # show Y result
        a=self.stat.probed_position
        yres=float(a[1])-0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_ym.set_text( "%.4f" % yres )
        self.lenght_y()

        # move Y +2 edge_lenght - 2 xy_clearance
        tmpy=2*(self.spbtn1_edge_lenght.get_value()-self.spbtn1_xy_clearance.get_value())
        s="""G91
        G0 Y%f
        G90""" % (tmpy)        
        if self.gcode(s) == -1:
            return
        # Start yplus.ngc
        if self.ocode ("O<yplus> call") == -1:
            return
        # show Y result
        a=self.stat.probed_position
        yres1=float(a[1])+0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_yp.set_text( "%.4f" % yres1 )
        self.lenght_y()
        # find, show and move to finded  point
        cyres=0.5*(yres+yres1)
        self.lb_probe_yc.set_text( "%.4f" % cyres )
        diam=0.5*((xres1-xres)+(yres1-yres))
        self.lb_probe_d.set_text( "%.4f" % diam )
        # move to center
        self.command.mdi( "G0 Y%f" % cyres)
        self.command.wait_complete()
        # move Z to start point
        self.z_clearance_up()
pkasy писал(а):пожелание - сделайте индикацию текущей работы. хотя бы лампочку, что процесс идет.
а то он подвисает, потом чего то рывком. и не понятно, выполнил ли, получилось ли?
Лампочку аварийного завершения сделаю :) . А индикация, что процесс идет - это нажатая кнопка, она залипает и другим цветом отображаться должна.
Хмм, что-то странно, что подвисает, хорошо бы по-подробнее эту ситуацию описать.
Последний раз редактировалось verser 19 май 2015, 08:55, всего редактировалось 1 раз.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение nkp »

пока не поборол ошибки (бывает вылетает примерно такое:"Закончил движение без касания" )
пробую без mdi команд...
удобство в некоторой мере уйдет ...
потом может найду в чем косяк , а пока так:
(для просмотра содержимого нажмите на ссылку)

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

######################################################################################
    def send(self, f, *arg ) :
        self.stat.poll()
        if self.stat.interp_state == linuxcnc.INTERP_IDLE :
            self.command.reset_interpreter()
            self.command.mode(linuxcnc.MODE_AUTO)
            self.command.program_open(PROGRAM_PREFIX + f)
            subprocess.call(["axis-remote",PROGRAM_PREFIX + f])
    # Y-
    def on_ym_released(self, data = None):
        self.halcomp["ps_enable_tab_preview"] = 1
        self.send("/yminus.ngc")
        self.halcomp["ps_enable_tab_preview"] = 0
    def res(self, data = None): 
        self.stat.poll()
        a=self.stat.probed_position
        res=float(a[1])-0.5*self.spbtn1_probe_diam.get_value()
        self.lb_probe_ym.set_text( "%.4f" % res )
        self.lenght_y()
#########################################################################################
то есть просто используется интерфейс для запуска подпрограмм
("кусочек" взят из Features ;) )
Последний раз редактировалось nkp 19 май 2015, 09:19, всего редактировалось 1 раз.
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

Как же не хватает записи истории измерений! Вот бы сделать! Такое окошко строк на 5 с прокруткой, в котором отражены все произведенные замеры. Заодно и вопрос с индикацией аварии решился бы.
Только не нашел такого виджета в gladevcp :wik: Может, есть идеи?
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

nkp писал(а):а пока так
Любопытно как это на экране выглядит?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение nkp »

verser писал(а):Любопытно как это на экране выглядит?
выглядит так как ты сделал :)
панелька твоя - еще не подправлял...
или я не понял - про что речь?
вот эмулятор: "одинокая кнопка" (она все равно у меня без дела) - пока кнопка показа результата...
потом нужно это дело автоматизировать...
=========
вообще - мне переделки не прихоть - просто я использую (пытаюсь прикрутить) это к станку с
двумя осями (XY)
Аватара пользователя
verser
Мастер
Сообщения: 1885
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: [WIKI] Работа с центроискателем

Сообщение verser »

nkp писал(а):или я не понял - про что речь?
а, я думал, что ты preview прямо к Probe Screen панельке прикрутил.
Ответить

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