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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

прицепил костыли управление через ладдер своему скрипту...
(думал счетчик и пару реле - получилась портянка целая :) )
https://www.youtube.com/watch?v=zhTuBUDefs8
таймеры загрублены для отладки (да в принципе и скорости то в EDM сверхнизкие)...
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

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

Сообщение tooshka »

nkp писал(а):прицепил костыли управление через ладдер своему скрипту...
(думал счетчик и пару реле - получилась портянка целая )
Классно!!! Вроде работает? И на дуге тоже))))
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

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

Сообщение PKM »

а вот эти паузы откуда берутся?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

PKM писал(а):а вот эти паузы откуда берутся?
паузы от таймеров - можно уменьшить ...
но все это работает "не правильно" - "правильно (через планировщик) еще не знаю как ,а как то уже надо :)
тут конечно решается узкоспециализированная задача - для эрозии - а там отход то нужен совсем небольшой - на
случай если система адаптированной подачи (зависимость величины подачи от напряжения в МЭП ) "проспит" ...
а так - для обработки по реверсной траектории можно перегрузить файл в емс на "реверсный" (опять же - заранее подготовленый) и пилькать с расчетными скоростями
и ускорениями...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение 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

nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

неточности в преобразованиях:
траектория с R не совпадает с IJ
Выделение_070.png (5883 просмотра) <a class='original' href='./download/file.php?id=23067&sid=2b555aa06120c4a8f516bcdb5c7b8848&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 байт) 547 скачиваний
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение 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
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

код из dxf получаю dxf2gcode , там можно подправить вывод как в ПП, так и в исходном коде...
но вот такая шероховатость - оказывается формат dxf не такой уж и однозначный,даже не так :
каждая программа понимает по своему как нужно экспортировать в dxf ;)
понятно , что нарисовав полилинию в коде получим обработку дуги короткими отрезками...
но вот другое например :
задаешь полноценную дугу в CADе , а он экспортирует в dxf просто линию с выпуклостью (42) ,а dxf2gcode такого вообще не понимает...
так что наверно dxf в плане преобразования в ж-код необходимо рассматривать и как графическое отражение ,и как синтаксическое наполнение...
=============
если весь цикл работ проводится одноособно от прорисовки чертежей и до готового жкода - то здесь вопросов меньше - выбрать нужные программы ,подработать пп и вперед...
а вот когда разные заказчики передают свои файлы ...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение 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
как так?
Хотя разница в принципе не большая...
может у тебя там где-то что-то округляется?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение 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
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

Nick писал(а):Вот, чуть переделал
да уж - регулярка рулит :good:
(тут f = open('2.ngc','w') #результат наверно ('2.ngc','a') , а то перезаписывать будет)
Nick писал(а):может у тебя там где-то что-то округляется?
нет - так питон калькулирует...
============
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

nkp писал(а):нет - так питон калькулирует...
:thinking: да - наверно я что то не так делал...
во всяком случае еще поюзать надо больше - но сейчас твоим скриптом выдает код ,и он не "расходится" с "JI" ;) (R60.0002 выдает)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

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

Сообщение 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) происходит утыкание и провод останавливается. В свете этого моё предложение в режиме компенсации работать скорее всего не будет.

А вообще вопрос интересный - нужно будет поразмышлять над ним.
Чудес не бывает. Бывает недопонимание субъектом процессов, часто осложнённое отсутствием самокритики и верой в непогрешимость своей системы знаний. Плохо когда ЧСВ ещё раздуто до степени судьи...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение 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
едем дальше по программе
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

так как все это только зарождается - непредвиденной реакции в разных "местах" программы не избежать :freak:
оказалось - проблемы с М52 (при включении реверс не работает :cry: )
https://www.youtube.com/watch?v=MUaiT1t7kb8
ну и один из способов обойтись без М52 ,используя напрямую команду задания
величины подачи c.feedrate(x)
https://www.youtube.com/watch?v=BpK4xP3Fih4
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

А как он работает? Через запись координат и потом проигрывание их в обратном порядке?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

Nick писал(а):А как он работает? Через запись координат и потом проигрывание их в обратном порядке?
пока не смотрел "внутренности" ))
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

nkp писал(а):оказалось - проблемы с М52 (при включении реверс не работает )
по моему решился вопрос с адаптивным управлением:
(попробую - отпишусь подробней)
https://www.youtube.com/watch?v=3aYaHxT6ZnQ
обсуждение:
http://www.mail-archive.com/emc-develop ... 15075.html
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

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

Сообщение tooshka »

nkp писал(а):по моему решился вопрос с адаптивным управлением:
Охренеть, классно. Ну ты маньяк, добил все таки!
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Ответить

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