Страница 6 из 9

Re: LinuxCNC реверс Gкода

Добавлено: 03 янв 2014, 00:03
nkp
прицепил костыли управление через ладдер своему скрипту...
(думал счетчик и пару реле - получилась портянка целая :) )
https://www.youtube.com/watch?v=zhTuBUDefs8
таймеры загрублены для отладки (да в принципе и скорости то в EDM сверхнизкие)...

Re: LinuxCNC реверс Gкода

Добавлено: 03 янв 2014, 07:51
tooshka
nkp писал(а):прицепил костыли управление через ладдер своему скрипту...
(думал счетчик и пару реле - получилась портянка целая )
Классно!!! Вроде работает? И на дуге тоже))))

Re: LinuxCNC реверс Gкода

Добавлено: 03 янв 2014, 13:49
PKM
а вот эти паузы откуда берутся?

Re: LinuxCNC реверс Gкода

Добавлено: 03 янв 2014, 14:12
nkp
PKM писал(а):а вот эти паузы откуда берутся?
паузы от таймеров - можно уменьшить ...
но все это работает "не правильно" - "правильно (через планировщик) еще не знаю как ,а как то уже надо :)
тут конечно решается узкоспециализированная задача - для эрозии - а там отход то нужен совсем небольшой - на
случай если система адаптированной подачи (зависимость величины подачи от напряжения в МЭП ) "проспит" ...
а так - для обработки по реверсной траектории можно перегрузить файл в емс на "реверсный" (опять же - заранее подготовленый) и пилькать с расчетными скоростями
и ускорениями...

Re: LinuxCNC реверс Gкода

Добавлено: 03 янв 2014, 23:38
nkp
есть желание использовать цепочку dxf2gcode + revers_script => EMC ...
dxf2gcode выдает код дуг с IJ
а реверс по g-коду возможен только в использованием в кадре "R"
можно конечно пп dxf2gcode править - но проще наверно на стадии формирования обратного кода это сделать ...
такой себе будет JI2R

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
#преобразование G-кода перемещений по дугам из вида с I и J 
#к виду с R,пример:
#исходная строка G2 F40 X62.996 Y40.000 I63.246 J-29.998
#результат       G2 F40 X62.996 Y40.000 R70
import math
f = open('/home/nkp/emc2-dev-80db2a2/configs/EDM/processing/2.ngc','r')
lines = f.readlines()
f.close()
s=2
#----------------------------------------------------------------------------- выделяем X,Y,I,J  текущей строки
l = lines[s]
x1=l.split('X')
x2=x1[1].split(' ')
x=float(x2[0])
print 'X=',x

y1=l.split('Y')
y2=y1[1].split(' ')
y=float(y2[0])
print 'Y=',y

i1=l.split('I')
i2=i1[1].split(' ')
i=float(i2[0])
print 'I=',i

j1=l.split('J')
j2=j1[1].split(' ')
j=float(j2[0])
print 'J=',j
#------------------------------------------------------------------------------выделяем X,Y  предыдущей  строки
l = lines[s-1]
x_old1=l.split('X')
x_old2=x_old1[1].split(' ')
x_old=float(x_old2[0])
print 'X_old=',x_old

y_old1=l.split('Y')
y_old2=y_old1[1].split(' ')
y_old=float(y_old2[0])
print 'Y_old=',y_old

i=x_old +i
j=y_old +j
c = '%.4f' %  math.sqrt(i*i + j*j)
print 'R',c


Re: LinuxCNC реверс Gкода

Добавлено: 04 янв 2014, 23:35
nkp
неточности в преобразованиях:
траектория с R не совпадает с IJ
Выделение_070.png (5982 просмотра) <a class='original' href='./download/file.php?id=23067&sid=8fd7c1c239d405a866e461cf61cd47bd&mode=view' target=_blank>Загрузить оригинал (16.08 КБ)</a>
вроде бы все просто - вычисляем гипотенузу
c = str(math.sqrt(i*i + j*j)) (сначала округлял c = '%.4f' % math.sqrt(i*i + j*j) - думал может в этом проблема )
код исходный:

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

G1 F400 X  53.498 Y -56.000
G2 F400 X   0.000 Y  -0.001 I   6.390 J  59.659
G2 F400 X  39.500 Y  85.000 I 114.987 J  -1.760
G2 F400 X 129.498 Y 124.000 I  97.138 J-100.818
G2 F400 X 204.501 Y  89.999 I -17.750 J-138.870
G1 F400 X 348.500 Y -75.000
G1 F400 X 209.500 Y  32.000
G3 F400 X 129.497 Y  65.001 I-133.892 J-211.123
G3 F400 X  94.498 Y  54.999 I   5.310 J -84.834
G3 F400 X  45.500 Y -15.000 I  35.700 J -77.140
G3 F400 X  53.499 Y -55.996 I 134.906 J   5.040
G1 F400 X   0.000 Y   0.000
M2
преобразованый:

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

G1 F400 X  53.498 Y -56.000
G2 F400 X0.000 Y-0.001 R59.9996735408
G2 F400 X39.500 Y85.000 R115.000483869
G2 F400 X129.498 Y124.000 R137.550544048
G2 F400 X204.501 Y89.999 R112.733013816
G1 F400 X 348.500 Y -75.000
G1 F400 X 209.500 Y  32.000
G3 F400 X129.497 Y65.001 R194.426383994
G3 F400 X94.498 Y54.999 R136.258119531
G3 F400 X45.500 Y-15.000 R132.067191554
G3 F400 X53.499 Y-55.996 R180.680730672
G1 F400 X   0.000 Y   0.000
M2
для какого класса учебник математики повторять учить? ;)
конвертировал этим:
JI2R.py.rar
(830 байт) 548 скачиваний

Re: LinuxCNC реверс Gкода

Добавлено: 09 янв 2014, 11:36
nkp
не выяснил ничего по поводу "разночтений" JIvsR в емс , но решил переделать реверс команда вида JI(пример G3 F400 X129.497 Y65.001 I-133.892 J-211.123 )
приходится для возврата пересчитывать координаты центров дуг в зависимости от текущего положения на момент реверса...
это конечно нагромождает и так малостройную картину системы :)
ведь теперь чтоб сделать реверс-реверс стоя на дуге,необходимо первый кадр выполнить mdi командой(так ,как пересчитать дугу требуется),
и только со следующего кадра продолжить выполнять основной код...
реверс работает (реверс-реверс пока не прицепил):

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import hal, linuxcnc
h = hal.component("rev")
h.newpin("stop", hal.HAL_BIT, hal.HAL_IN)
h.newpin("rev", hal.HAL_BIT, hal.HAL_IN)
h.newpin("rerev-stop", hal.HAL_BIT, hal.HAL_IN)
h.newpin("curent-line",hal.HAL_S32,hal.HAL_IN)
h.newpin("minmax-reset", hal.HAL_BIT, hal.HAL_OUT) 
h.newpin("again_forward", hal.HAL_BIT, hal.HAL_IN)
h.newpin("number-in",hal.HAL_S32,hal.HAL_IN)
h.newpin("number-out", hal.HAL_S32, hal.HAL_OUT) 
    
h.ready()

c = linuxcnc.command()
q = linuxcnc.stat()
def ret_line(s):
	f = open(u'/home/nkp/emc2-dev-80db2a2/nc_files/1.ngc','r')  #исходный код
	lines = f.readlines()
	f.close()
	if s > 0:
		if lines[s].find('G1')!=-1  :     # если текущая строка содержит G1
			pre=lines[s-1].split('X')
			al=lines[s-1].split('F')
			cl=al[1].split(' ')
			print ''.join('G1'+' '+'F400'+' '+cl[1]+' '+cl[2])
			return ''.join('G1'+' '+'F400'+' '+cl[1]+' '+cl[2])	
		elif lines[s].find('G2')!=-1  :   # если текущая строка содержит G2 
			chan=lines[s].replace('G2','G3')
			al=lines[s-1].split(' ')
			x=al[2].split('X')
			y=al[3].split('Y')
		
			bl=lines[s].split(' ')
			i=bl[4].split('I')
			j=bl[5].split('J')
		
			cur=chan.split('X')
			pre1=lines[s-1].split('F')
			pre=pre1[1].split(' ')
			q.poll()	
			Y_cur =q.position[1]                # текущее положение по Y
			J=float(j[1]) + (float(y[1]) - Y_cur)	
			X_cur = q.position[0]                #текущее положение по X
			I=float(i[1]) + (float(x[1]) - X_cur)
			print  ''.join(cur[0]+pre[1]+' '+pre[2]+' '+'I'+str(I)+' '+'J'+str(J))
			return ''.join(cur[0]+pre[1]+' '+pre[2]+' '+'I'+str(I)+' '+'J'+str(J))
		
		elif lines[s].find('G3')!=-1 :  # если текущая строка содержит G3
			chan=lines[s].replace('G3','G2')
			al=lines[s-1].split(' ')
			x=al[2].split('X')
			y=al[3].split('Y')
		
			bl=lines[s].split(' ')
			i=bl[4].split('I')
			j=bl[5].split('J')
		
			cur=chan.split('X')
			pre1=lines[s-1].split('F')
			pre=pre1[1].split(' ')
			q.poll()	
			Y_cur =q.position[1]                  #текущее положение по Y
			J=float(j[1]) + (float(y[1]) - Y_cur)	
			X_cur = q.position[0]                 #текущее положение по X
			I=float(i[1]) + (float(x[1]) - X_cur)
			print  ''.join(cur[0]+pre[1]+' '+pre[2]+' '+'I'+str(I)+' '+'J'+str(J))
			return ''.join(cur[0]+pre[1]+' '+pre[2]+' '+'I'+str(I)+' '+'J'+str(J))
	else:
		return lines[0] 		   
def stop():
	c.abort()
	c.wait_complete()
	print 'ok-stop'
 	h["stop"]=0
 	h["rerev-stop"]=0
def back():
	c.mode(linuxcnc.MODE_MDI)
	c.wait_complete()
	c.mdi(ret_line(h["curent-line"]))
	c.wait_complete()
	h["minmax-reset"] = 0
	h["rev"]=0
def again_forward():	
        q.poll()
	if q.interp_state == linuxcnc.INTERP_IDLE:
                c.mode(linuxcnc.MODE_AUTO)
                c.wait_complete()
                q.poll()
                c.wait_complete()
                if q.task_mode == 2 :
                        c.auto(linuxcnc.AUTO_RUN, (h["curent-line"]+1))
                        h["minmax-reset"] = 1
                else:
                        print 'linuxcnc.MODE_AUTO False'                
                h["again_forward"]=0
                print 'ok'
	else:
                h["again_forward"]=0	
try:
    while 1:	 
	if h["stop"]==1:
		stop()		
	if h["rerev-stop"]==1:
		stop()
	if h["rev"]==1:
		back()
	if h["again_forward"]==1:
		again_forward()			
except KeyboardInterrupt:
    raise SystemExit
вот на таком коде опробовал:

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

G1 F400 X0.000 Y0.000 
G1 F400 X53.498 Y-56.000 
G2 F400 X0.000 Y-0.001 I6.390 J59.659 
G2 F400 X39.500 Y85.000 I114.987 J-1.760 
G2 F400 X129.498 Y124.000 I97.138 J-100.818 
G2 F400 X204.501 Y89.999 I-17.750 J-138.870 
G1 F400 X348.500 Y-75.000 
G1 F400 X209.500 Y32.000 
G3 F400 X129.497 Y65.001 I-133.892 J-211.123 
G3 F400 X94.498 Y54.999 I5.310 J-84.834 
G3 F400 X45.500 Y-15.000 I35.700 J-77.140 
G3 F400 X53.499 Y-55.996 I134.906 J5.040 
G1 F400 X0.000 Y0.000 
M2

Re: LinuxCNC реверс Gкода

Добавлено: 09 янв 2014, 12:31
nkp
код из dxf получаю dxf2gcode , там можно подправить вывод как в ПП, так и в исходном коде...
но вот такая шероховатость - оказывается формат dxf не такой уж и однозначный,даже не так :
каждая программа понимает по своему как нужно экспортировать в dxf ;)
понятно , что нарисовав полилинию в коде получим обработку дуги короткими отрезками...
но вот другое например :
задаешь полноценную дугу в CADе , а он экспортирует в dxf просто линию с выпуклостью (42) ,а dxf2gcode такого вообще не понимает...
так что наверно dxf в плане преобразования в ж-код необходимо рассматривать и как графическое отражение ,и как синтаксическое наполнение...
=============
если весь цикл работ проводится одноособно от прорисовки чертежей и до готового жкода - то здесь вопросов меньше - выбрать нужные программы ,подработать пп и вперед...
а вот когда разные заказчики передают свои файлы ...

Re: LinuxCNC реверс Gкода

Добавлено: 09 янв 2014, 15:18
Nick
nkp писал(а):вроде бы все просто - вычисляем гипотенузу
c = str(math.sqrt(i*i + j*j)) (сначала округлял c = '%.4f' % math.sqrt(i*i + j*j) - думал может в этом проблема )
В калькуляторе сделал:
√(59.659×59.659 + 6.390×6.390)
получил: 60,000236508
А у тебя, до:
G2 F400 X0.000 Y-0.001 I6.390 J59.659
После:
G2 F400 X0.000 Y-0.001 R59.9996735408
как так?
Хотя разница в принципе не большая...
может у тебя там где-то что-то округляется?

Re: LinuxCNC реверс Gкода

Добавлено: 09 янв 2014, 15:37
Nick
Вот, чуть переделал твой скрипт, который просто меняет IJ на R:

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
#преобразование G-кода перемещений по дугам из вида с I и J 
#к виду с R,пример:
#исходная строка G2 F40 X62.996 Y40.000 I63.246 J-29.998
#результат       G2 F40 X62.996 Y40.000 R70



import math
import re
f = open('1.ngc','r')  #исходный код
lines = f.readlines()
f.close()
f = open('2.ngc','w')  #результат

for l in lines : 
	
	if "G2" in l.upper() or "G3" in l.upper() :
		try :
			i = float(re.search("I\s*([-0-9.]+)",l, re.I).group(1))
		except :
			i = 0 
		try :
			j = float(re.search("J\s*([-0-9.]+)",l, re.I).group(1))
		except :
			j = 0 
		print i,j		
		l = re.sub("(?i)(I|J)\s*([-0-9.]+)","",l)[:-1]
		f.write( l + (" R%.4f" % math.sqrt(i*i+j*j)) + "\n")
	
		print 
	else:
		f.write(l)		
	
f.close()	
вместо
if lines[s].find('G2')!=-1 or lines[s].find('G3')!=-1
проще писать
if "G2" in lines[s] ..
И цикл лучше питону отдать:
for l in lines

Re: LinuxCNC реверс Gкода

Добавлено: 10 янв 2014, 00:13
nkp
Nick писал(а):Вот, чуть переделал
да уж - регулярка рулит :good:
(тут f = open('2.ngc','w') #результат наверно ('2.ngc','a') , а то перезаписывать будет)
Nick писал(а):может у тебя там где-то что-то округляется?
нет - так питон калькулирует...
============

Re: LinuxCNC реверс Gкода

Добавлено: 10 янв 2014, 00:43
nkp
nkp писал(а):нет - так питон калькулирует...
:thinking: да - наверно я что то не так делал...
во всяком случае еще поюзать надо больше - но сейчас твоим скриптом выдает код ,и он не "расходится" с "JI" ;) (R60.0002 выдает)

Re: LinuxCNC реверс Gкода

Добавлено: 10 янв 2014, 10:46
Nick
nkp писал(а):во всяком случае еще поюзать надо больше - но сейчас твоим скриптом выдает код ,и он не "расходится" с "JI" (R60.0002 выдает)
Вот и я о том же... может у тебя где-то последние циферки отрезались...
nkp писал(а):да уж - регулярка рулит
А то! :)
nkp писал(а):(тут f = open('2.ngc','w') #результат наверно ('2.ngc','a') , а то перезаписывать будет)
А разве нам не надо перезаписывать?
Т.е. если конвертим второй файл, то он ведь должен стереть результат первого... вроде...
вообще может быть еще лучше сделать этот скрипт "фильтром" т.е. читать из стандартного входа и писать в стандартный вывод, тогда его можно будет гораздо универсальнее использовать...

Re: LinuxCNC реверс Gкода

Добавлено: 12 окт 2014, 01:19
AlexTskan
Может глупая идея. И, понятно, костыль. Но если сделать так:
(для XYUV Z-не обрабатывать или для XYZ).
С помощью постпроцессора в одну команду записываем начальную и конечную точки траектории, конечную в связке "обратных осей".
IJ должы быть в абсолютном режиме. R - не использовать.
и тогда для отвода можно просто выполнить ту же строку но для "обратных осей".
предполагаю придётся ввести кое-какую корректировку в связях axis-stepgen (не помню параметр с fb - feed back).

Или, как вариант, заставить лцнц запоминать пложение инструмента в начале каждой команды. А потом просто выполнять из текущего положения инструмента команду "обратную" текущей. G1<=>G1, G2<=>G3.

т.е. например есть команда G1 X100 Y100. произошло событие при котором нужно пятиться назад: режим MDI -> Выполняем G1 X[old] Y[old] до нужного события. затем запускаем программу заново...

И у меня есть одно наблюдение - у нас на электроэрозии при включенной компенсации на диаметр инструмента обратный отход при повороте траектории не в одной команде а в двух (например две последовательных команды G1) происходит утыкание и провод останавливается. В свете этого моё предложение в режиме компенсации работать скорее всего не будет.

А вообще вопрос интересный - нужно будет поразмышлять над ним.

Re: LinuxCNC реверс Gкода

Добавлено: 17 апр 2015, 21:27
nkp
ну вот - все костыли становятся неактуальными ;)
RobEllenberg :good:
качаем
https://github.com/robEllenberg/linuxcn ... se-run-2.7
устанавливаем

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

./autogen.sh
./configure
make clean
make
sudo make setuid
запускаем
пока реверс работает так (не забываем - это первые шаги :) ):
запустили G-код - в "нужном" месте жмем "Пауза"
Shift+R
снимаем паузу
едем назад(пока недолго - но для edm уже хватит)
опять "Пауза"
Shift+F
едем дальше по программе

Re: LinuxCNC реверс Gкода

Добавлено: 19 апр 2015, 19:26
nkp
так как все это только зарождается - непредвиденной реакции в разных "местах" программы не избежать :freak:
оказалось - проблемы с М52 (при включении реверс не работает :cry: )
https://www.youtube.com/watch?v=MUaiT1t7kb8
ну и один из способов обойтись без М52 ,используя напрямую команду задания
величины подачи c.feedrate(x)
https://www.youtube.com/watch?v=BpK4xP3Fih4

Re: LinuxCNC реверс Gкода

Добавлено: 20 апр 2015, 13:42
Nick
А как он работает? Через запись координат и потом проигрывание их в обратном порядке?

Re: LinuxCNC реверс Gкода

Добавлено: 21 апр 2015, 18:17
nkp
Nick писал(а):А как он работает? Через запись координат и потом проигрывание их в обратном порядке?
пока не смотрел "внутренности" ))

Re: LinuxCNC реверс Gкода

Добавлено: 13 сен 2015, 21:05
nkp
nkp писал(а):оказалось - проблемы с М52 (при включении реверс не работает )
по моему решился вопрос с адаптивным управлением:
(попробую - отпишусь подробней)
https://www.youtube.com/watch?v=3aYaHxT6ZnQ
обсуждение:
http://www.mail-archive.com/emc-develop ... 15075.html

Re: LinuxCNC реверс Gкода

Добавлено: 13 сен 2015, 21:51
tooshka
nkp писал(а):по моему решился вопрос с адаптивным управлением:
Охренеть, классно. Ну ты маньяк, добил все таки!