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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Сергей Саныч писал(а):А еще интересно, когда Lite+ и Lite++ в серию пойдут :thinking:
Только по секрету. Lite+ и LiteRF уже в продаже. Сильно не афиширую, чтобы успевать на высоком идейном и техническом уровне удовлетворить "горящие" запросы.
Lite++ в разработке, пока выпускаются экземпляры, достойные мусорного ведра, но в июле, возможно, родиться что-то дельное :) .
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

[упс.. удалите плз, нечаянно не то нажал]
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Обнаружил в Probe Screen серьезный баг, и пока не знаю как это исправить.
Если при переезде (команда G1) к месту начала поиска случайно коротко срабатывает probe, то error poll не видит этого, программа не останавливается, идет следующий переезд как ни в чем не бывало. Не пойму, почему не срабатывает error poll ?

P.S. Может, результат error poll имеет короткую жизнь, и его надо считывать по таймеру, в короткие интервалы времени?
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

А "коротко" - это сколько? На halscope видно?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Сергей Саныч писал(а):А "коротко" - это сколько? На halscope видно?
"Коротко" - это достаточно долго, несколько servo thread циклов. Linuxcnc успевает прервать текущее перемещение, выдать в терминале сообщение "..probe tripped..", но почему то при чтении канала ошибок в Probe Screen - тишина. Из-за этого недопустимо запускается следующее по ходу перемещение. В halscopе не смотрел, наверняка там будет видна ошибочная сработка probe-in.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

может быть это "издержки " реалтайма:
скрипт выполняется в userspace ,и "несколько servo thread циклов" может оказаться мало...
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

nkp писал(а):может быть это "издержки " реалтайма:
скрипт выполняется в userspace ,и "несколько servo thread циклов" может оказаться мало...
А может здесь проблема, что что-то считывает канал ошибок раньше Probe Screen, и при считывании канал обнуляется ?
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Начинает получаться.

В gmoccapy:
Здесь по-проще, уже есть пин, отражающий статус ошибок gmoccapy.error, с его помощью останов успешно делается. Error poll в gmoccapy делается по таймеру с периодом 100 ms, там и формируется пин gmoccapy.error

В Axis:
Придется создать таймер для Error poll .
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Сделал в Axis периодическую функцию для чтения error poll.
Новая беда.
Как только нажимаю кнопку измерения, таймер замирает, пока кнопка не отлипнет. После отлипания кнопки таймер продолжает тикать. Соответственно никакого чтения error poll не происходит.

P.S. Попробую создать таймер как-нить снаружи класса Probe Screen.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

Может, перехватывать ошибку "вручную", на уровне hal? Ну, то есть сопоставлять сигнал датчика и тип текущей операции. И если датчик сработал не во время измерения, то предпринимать нужные нам действия. Можно даже не допускать "неправильные" срабатывания до системы и избежать стандартного сообщения "probe tripped...".
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

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

Сообщение verser »

Nick писал(а):А покажиеще раз код, котоый выполняет Gкод... может ты не всегда опрашиваешь состояние ошибки?
измерение по X+ python

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

    # X+
    def on_xp_released(self, gtkbutton, data = None):
        self.command.mode( linuxcnc.MODE_MDI )
        self.command.wait_complete()
         # move X - xy_clearance
        s="""G91
        G1 X-%f
        G90""" % (self.spbtn1_xy_clearance.get_value() )        
        if self.gcode(s) == -1:
            return
        if self.z_clearance_down() == -1:
            return
       # Start xplus.ngc
        if self.ocode ("O<xplus> call") == -1:
            return
        a=self.probed_position_with_offsets()
        xres=float(a[0]+0.5*self.spbtn1_probe_diam.get_value())
        self.lb_probe_xp.set_text( "%.4f" % xres )
        self.lenght_x()
        self.add_history(gtkbutton.get_tooltip_text(),"XpLx",0,0,xres,self.lenght_x(),0,0,0,0,0,0,0)
        # move Z to start point up
        if self.z_clearance_up() == -1:
            return
        # move to finded  point
        s = "G1 X%f" % xres
        if self.gcode(s) == -1:
            return

    def error_poll(self):
        error = self.e.poll()
        if error:
            kind, text = error
            self.add_history("Error: %s" % text,"",0,0,0,0,0,0,0,0,0,0,0)            
            if kind in (linuxcnc.NML_ERROR, linuxcnc.OPERATOR_ERROR):

                typus = "error"
                print typus, text
                return -1
            else:
                typus = "info"
                print typus, text
                return -1


    def gcode(self,s, data = None): 
        for l in s.split("\n"):
            if "G1" in l :
                l+= " F#<_ini[TOOLSENSOR]RAPID_SPEED>"
            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

    def z_clearance_down(self, data = None):
        # move Z - z_clearance
        s="""G91
        G1 Z-%f
        G90""" % (self.spbtn1_z_clearance.get_value() )        
        if self.gcode(s) == -1:
            return -1
        return 0

    def z_clearance_up(self, data = None):
        # move Z + z_clearance
        s="""G91
        G1 Z%f
        G90""" % (self.spbtn1_z_clearance.get_value() )        
        if self.gcode(s) == -1:
            return -1
        return 0

используемый gcode

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

o<xplus> sub
	
#<x>=#<_x> (save start X position) 
G91
F #<_hal[probe.ps_searchvel]>
G38.2 X[#<_hal[probe.ps_probe_max]>]
G1 X[-#<_hal[probe.ps_probe_latch]>] F#<_ini[TOOLSENSOR]RAPID_SPEED> 
F #<_hal[probe.ps_probevel]>
G4 P0.5
G38.2 X[#<_hal[probe.ps_probe_latch]>*2]
(print, probe X=#5061 )
G90
(back to start point)
G1 X#<x> F#<_ini[TOOLSENSOR]RAPID_SPEED> 
	
o<xplus> endsub
M2
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Начиная с самого первого переезда

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

         # move X - xy_clearance
        s="""G91
        G1 X-%f
        G90""" % (self.spbtn1_xy_clearance.get_value() )        
        if self.gcode(s) == -1:
            return

при попытке дёрнуть probe, выхода из обработки кнопки не происходит (и до нужного места, кстати, не доезжает, прерывается, и начинает следующее движение - там опускание по Z)
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

verser писал(а):P.S. Попробую создать таймер как-нить снаружи класса Probe Screen.
Это не помогло, все-равно при нажатии кнопки таймер замирает. Интересно, почему в gmoccapy он не замирает и нормально отрабатывает?
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

Итак, вопрос моментальной остановки при сработке probe в "ненужном месте", решился для Gmoccapy, и остался открытым для Axis.
Повторюсь, внутри Axis уже открыт linuxcnc.error_channel(), доступ к которому не знаю как получить. Если же создаю свой собственный linuxcnc.error_channel(), то он молчит гад.
Сергей Саныч писал(а):Может, перехватывать ошибку "вручную", на уровне hal? Ну, то есть сопоставлять сигнал датчика и тип текущей операции. И если датчик сработал не во время измерения, то предпринимать нужные нам действия. Можно даже не допускать "неправильные" срабатывания до системы и избежать стандартного сообщения "probe tripped...".
У этого варианта немного смущает, что для предотвращения задержек на probe-in придется непосредственно в base-thread навешивать несколько функций, которые, по сути, в этом не нуждаются. Еще это усложнит установку Probe Screen для пользователя.
Надо имхо найти всё же какой-то способ прочитать из Axis linuxcnc.error_channel(). Я уже подумываю, может перехватывать всплывающие сообщения?
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

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

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

Сообщение nkp »

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

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

Сообщение Serg »

verser писал(а):Надо имхо найти всё же какой-то способ прочитать из Axis linuxcnc.error_channel(). Я уже подумываю, может перехватывать всплывающие сообщения?
Попробуй переопределить функцию, которая e.poll() зовёт...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
verser
Мастер
Сообщения: 1903
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1282
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

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

Сообщение verser »

UAVpilot писал(а): Попробуй переопределить функцию, которая e.poll() зовёт...
Рассматривал этот вариант. Это функция класса LivePlotter в axis.py
(для просмотра содержимого нажмите на ссылку)

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

    def error_task(self):
        error = e.poll()
        while error: 
            kind, text = error
            if kind in (linuxcnc.NML_ERROR, linuxcnc.OPERATOR_ERROR):
                icon = "error"
            else:
                icon = "info"
            notifications.add(icon, text)
            error = e.poll()
        self.error_after = self.win.after(200, self.error_task)
Казалось бы мало текста, но вот эта строчка

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

            notifications.add(icon, text)
тянет за собой такой паровоз, что боюсь даже ввязываться в это дело.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

А паровоз-то тебе зачем? Просто повтори эту функцию добавив обработку своих ошибок и всё.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

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