Страница 10 из 38

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

Добавлено: 17 июн 2015, 16:16
verser
Сергей Саныч писал(а):А еще интересно, когда Lite+ и Lite++ в серию пойдут :thinking:
Только по секрету. Lite+ и LiteRF уже в продаже. Сильно не афиширую, чтобы успевать на высоком идейном и техническом уровне удовлетворить "горящие" запросы.
Lite++ в разработке, пока выпускаются экземпляры, достойные мусорного ведра, но в июле, возможно, родиться что-то дельное :) .

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

Добавлено: 20 июн 2015, 13:16
verser
[упс.. удалите плз, нечаянно не то нажал]

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

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

P.S. Может, результат error poll имеет короткую жизнь, и его надо считывать по таймеру, в короткие интервалы времени?

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

Добавлено: 21 июн 2015, 04:50
Сергей Саныч
А "коротко" - это сколько? На halscope видно?

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

Добавлено: 21 июн 2015, 07:10
verser
Сергей Саныч писал(а):А "коротко" - это сколько? На halscope видно?
"Коротко" - это достаточно долго, несколько servo thread циклов. Linuxcnc успевает прервать текущее перемещение, выдать в терминале сообщение "..probe tripped..", но почему то при чтении канала ошибок в Probe Screen - тишина. Из-за этого недопустимо запускается следующее по ходу перемещение. В halscopе не смотрел, наверняка там будет видна ошибочная сработка probe-in.

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

Добавлено: 21 июн 2015, 07:22
nkp
может быть это "издержки " реалтайма:
скрипт выполняется в userspace ,и "несколько servo thread циклов" может оказаться мало...

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

Добавлено: 21 июн 2015, 07:42
verser
nkp писал(а):может быть это "издержки " реалтайма:
скрипт выполняется в userspace ,и "несколько servo thread циклов" может оказаться мало...
А может здесь проблема, что что-то считывает канал ошибок раньше Probe Screen, и при считывании канал обнуляется ?

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

Добавлено: 21 июн 2015, 11:23
verser
Начинает получаться.

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

В Axis:
Придется создать таймер для Error poll .

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

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

P.S. Попробую создать таймер как-нить снаружи класса Probe Screen.

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

Добавлено: 21 июн 2015, 12:28
Сергей Саныч
Может, перехватывать ошибку "вручную", на уровне hal? Ну, то есть сопоставлять сигнал датчика и тип текущей операции. И если датчик сработал не во время измерения, то предпринимать нужные нам действия. Можно даже не допускать "неправильные" срабатывания до системы и избежать стандартного сообщения "probe tripped...".

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

Добавлено: 21 июн 2015, 13:49
Nick
А покажиеще раз код, котоый выполняет Gкод... может ты не всегда опрашиваешь состояние ошибки?

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

Добавлено: 21 июн 2015, 14:40
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

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

Добавлено: 21 июн 2015, 14:50
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)

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

Добавлено: 21 июн 2015, 15:26
verser
verser писал(а):P.S. Попробую создать таймер как-нить снаружи класса Probe Screen.
Это не помогло, все-равно при нажатии кнопки таймер замирает. Интересно, почему в gmoccapy он не замирает и нормально отрабатывает?

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

Добавлено: 23 июн 2015, 20:27
verser
Итак, вопрос моментальной остановки при сработке probe в "ненужном месте", решился для Gmoccapy, и остался открытым для Axis.
Повторюсь, внутри Axis уже открыт linuxcnc.error_channel(), доступ к которому не знаю как получить. Если же создаю свой собственный linuxcnc.error_channel(), то он молчит гад.
Сергей Саныч писал(а):Может, перехватывать ошибку "вручную", на уровне hal? Ну, то есть сопоставлять сигнал датчика и тип текущей операции. И если датчик сработал не во время измерения, то предпринимать нужные нам действия. Можно даже не допускать "неправильные" срабатывания до системы и избежать стандартного сообщения "probe tripped...".
У этого варианта немного смущает, что для предотвращения задержек на probe-in придется непосредственно в base-thread навешивать несколько функций, которые, по сути, в этом не нуждаются. Еще это усложнит установку Probe Screen для пользователя.
Надо имхо найти всё же какой-то способ прочитать из Axis linuxcnc.error_channel(). Я уже подумываю, может перехватывать всплывающие сообщения?

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

Добавлено: 23 июн 2015, 20:41
Сергей Саныч
verser писал(а): для предотвращения задержек на probe-in придется непосредственно в base-thread навешивать несколько функций, которые, по сути, в этом не нуждаются.
Если их разместить в servo-thread в правильной последовательности, задержка не увеличится более чем на один период servo.

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

Добавлено: 23 июн 2015, 20:53
nkp
здесь вроде и советуют иметь один канал

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

Добавлено: 24 июн 2015, 01:36
Serg
verser писал(а):Надо имхо найти всё же какой-то способ прочитать из Axis linuxcnc.error_channel(). Я уже подумываю, может перехватывать всплывающие сообщения?
Попробуй переопределить функцию, которая e.poll() зовёт...

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

Добавлено: 24 июн 2015, 07:27
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)
тянет за собой такой паровоз, что боюсь даже ввязываться в это дело.

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

Добавлено: 24 июн 2015, 08:32
Serg
А паровоз-то тебе зачем? Просто повтори эту функцию добавив обработку своих ошибок и всё.