Страница 4 из 38
Re: [WIKI] Работа с центроискателем
Добавлено: 15 май 2015, 11:58
Serg
Nick писал(а):Тогда пин гарантированно провисит этот sleep(1000), и любой rt компонент его схавает. Другое дело, что его может не увидеть другой userspace компонент...
Всё делается гораздо проще: в "приёмнике" надо реагировать не просто на высокий уровень пина, а именно на перепад с низкого на высокий.
Re: [WIKI] Работа с центроискателем
Добавлено: 15 май 2015, 12:08
Nick
Тогда возникнет проблема - надо гарантированно выключать пин

Re: [WIKI] Работа с центроискателем
Добавлено: 15 май 2015, 12:33
Serg
Nick писал(а):Тогда возникнет проблема - надо гарантированно выключать пин

Зато выключать можно будет не в какие-то конкретные моменты, а "когда делать нечего".

Ну или применить BIT_IO - кому надо, тот пусть и выключает.

Re: [WIKI] Работа с центроискателем
Добавлено: 16 май 2015, 11:24
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 строк

.
Re: [WIKI] Работа с центроискателем
Добавлено: 17 май 2015, 08:41
verser
Исправлена критическая ошибка для всех измерений изнутри (убран ошибочный переезд, строка 10, во всех четырёх ххх_in.ngc ). Если кто-то уже начал пользоваться приложением, обязательно обновите.
P.S. Этот "косяк" и предыдущий, на который указал nkp, появляются при перемещениях файлов с разных моих компьютеров друг на друга и в сеть. Запутываются версии. На моем рабочем компе этих багов нет. Пора открывать единое место размещения, например, на github

.
Re: [WIKI] Работа с центроискателем
Добавлено: 17 май 2015, 19:44
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 операции, багов не обнаружил.
Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 11:49
Nick
В
verser писал(а):def gcode(self, s, data = None):
можно засунуть:
Код: Выделить всё
if re.search("^\s*O.*call",l,re.I) :
if ocode(l) == -1 :
return -1
И вызывать весь Gкод одной строчкой.
Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 11:51
Nick
И зачем там data=None?
Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 12:00
verser
Nick писал(а):...И вызывать весь Gкод одной строчкой.
Nick писал(а):...И зачем там data=None?
Спасибо. Внесу правки

.
Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 12:12
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, как латекс, тяни под себя как хочешь

Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 12:46
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
вместо простого
и убрать ocode вообще.
ну будет + 5 комманд на каждый вызов mdi, это совсем не критично.
Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 13:30
verser
Nick писал(а):Ненене, это все в цикл построчной обработки. Если видим O...CALL - то запускаем ocode.
а-а, теперь понял... сделаю..
Re: [WIKI] Работа с центроискателем
Добавлено: 18 май 2015, 23:38
pkasy
пожелание - сделайте индикацию текущей работы. хотя бы лампочку, что процесс идет.
а то он подвисает, потом чего то рывком. и не понятно, выполнил ли, получилось ли?
1. лампочка зеленая - процесс идет.
2. лампочка красная - нифига не нашел, измените параметры. и лучше бы ему вернуться в начальную точку.
3. лампочка какая-то - процесс закончен успешно, вот новые координаты/результаты обмерений.
п.с. 4 датчика сломал.
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 02:17
pkasy
интерфейс приятный, но логику нужно доработать.
опять сломал иглу, но это мусор, как раз для тестирования таких прог.
стартовая точка была близко к правому краю.
при измерении внутреннего центра по Х все отработало хорошо, но! для измерения вернулись в стартовую точку, а зачем? мы же знаем теперь центр по Х, давай вернемся в него и от него уже пойдем искать дальше.
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 07:59
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 писал(а):пожелание - сделайте индикацию текущей работы. хотя бы лампочку, что процесс идет.
а то он подвисает, потом чего то рывком. и не понятно, выполнил ли, получилось ли?
Лампочку аварийного завершения сделаю

. А индикация, что процесс идет - это нажатая кнопка, она залипает и другим цветом отображаться должна.
Хмм, что-то странно, что подвисает, хорошо бы по-подробнее эту ситуацию описать.
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 08:24
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

)
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 09:01
verser
Как же не хватает записи истории измерений! Вот бы сделать! Такое окошко строк на 5 с прокруткой, в котором отражены все произведенные замеры. Заодно и вопрос с индикацией аварии решился бы.
Только не нашел такого виджета в gladevcp

Может, есть идеи?
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 09:03
verser
nkp писал(а):а пока так
Любопытно как это на экране выглядит?
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 09:16
nkp
verser писал(а):Любопытно как это на экране выглядит?
выглядит так как ты сделал
панелька твоя - еще не подправлял...
или я не понял - про что речь?
вот эмулятор:
"одинокая кнопка" (она все равно у меня без дела) - пока кнопка показа результата...
потом нужно это дело автоматизировать...
=========
вообще - мне переделки не прихоть - просто я использую (пытаюсь прикрутить) это к станку с
двумя осями (XY)
Re: [WIKI] Работа с центроискателем
Добавлено: 19 май 2015, 09:25
verser
nkp писал(а):или я не понял - про что речь?
а, я думал, что ты preview прямо к Probe Screen панельке прикрутил.