Сергей Саныч писал(а):А еще интересно, когда Lite+ и Lite++ в серию пойдут
Lite++ в разработке, пока выпускаются экземпляры, достойные мусорного ведра, но в июле, возможно, родиться что-то дельное
Сергей Саныч писал(а):А еще интересно, когда Lite+ и Lite++ в серию пойдут
"Коротко" - это достаточно долго, несколько servo thread циклов. Linuxcnc успевает прервать текущее перемещение, выдать в терминале сообщение "..probe tripped..", но почему то при чтении канала ошибок в Probe Screen - тишина. Из-за этого недопустимо запускается следующее по ходу перемещение. В halscopе не смотрел, наверняка там будет видна ошибочная сработка probe-in.Сергей Саныч писал(а):А "коротко" - это сколько? На halscope видно?
А может здесь проблема, что что-то считывает канал ошибок раньше Probe Screen, и при считывании канал обнуляется ?nkp писал(а):может быть это "издержки " реалтайма:
скрипт выполняется в userspace ,и "несколько servo thread циклов" может оказаться мало...
измерение по X+ pythonNick писал(а):А покажиеще раз код, котоый выполняет Gкод... может ты не всегда опрашиваешь состояние ошибки?
Код: Выделить всё
# 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
Код: Выделить всё
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
Код: Выделить всё
# move X - xy_clearance
s="""G91
G1 X-%f
G90""" % (self.spbtn1_xy_clearance.get_value() )
if self.gcode(s) == -1:
returnЭто не помогло, все-равно при нажатии кнопки таймер замирает. Интересно, почему в gmoccapy он не замирает и нормально отрабатывает?verser писал(а):P.S. Попробую создать таймер как-нить снаружи класса Probe Screen.
У этого варианта немного смущает, что для предотвращения задержек на probe-in придется непосредственно в base-thread навешивать несколько функций, которые, по сути, в этом не нуждаются. Еще это усложнит установку Probe Screen для пользователя.Сергей Саныч писал(а):Может, перехватывать ошибку "вручную", на уровне hal? Ну, то есть сопоставлять сигнал датчика и тип текущей операции. И если датчик сработал не во время измерения, то предпринимать нужные нам действия. Можно даже не допускать "неправильные" срабатывания до системы и избежать стандартного сообщения "probe tripped...".
Если их разместить в servo-thread в правильной последовательности, задержка не увеличится более чем на один период servo.verser писал(а): для предотвращения задержек на probe-in придется непосредственно в base-thread навешивать несколько функций, которые, по сути, в этом не нуждаются.
Попробуй переопределить функцию, которая e.poll() зовёт...verser писал(а):Надо имхо найти всё же какой-то способ прочитать из Axis linuxcnc.error_channel(). Я уже подумываю, может перехватывать всплывающие сообщения?
Рассматривал этот вариант. Это функция класса LivePlotter в axis.pyКазалось бы мало текста, но вот эта строчкаUAVpilot писал(а): Попробуй переопределить функцию, которая e.poll() зовёт...
Код: Выделить всё
notifications.add(icon, text)