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

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

паузы от таймеров - можно уменьшить ...PKM писал(а):а вот эти паузы откуда берутся?
Код: Выделить всё
#!/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
Код: Выделить всё
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Код: Выделить всё
#!/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 писал(а):вроде бы все просто - вычисляем гипотенузу
c = str(math.sqrt(i*i + j*j)) (сначала округлял c = '%.4f' % math.sqrt(i*i + j*j) - думал может в этом проблема )
Код: Выделить всё
#!/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()	
да уж - регулярка рулитNick писал(а):Вот, чуть переделал
нет - так питон калькулирует...Nick писал(а):может у тебя там где-то что-то округляется?
nkp писал(а):нет - так питон калькулирует...
Вот и я о том же... может у тебя где-то последние циферки отрезались...nkp писал(а):во всяком случае еще поюзать надо больше - но сейчас твоим скриптом выдает код ,и он не "расходится" с "JI" (R60.0002 выдает)
А то!nkp писал(а):да уж - регулярка рулит
А разве нам не надо перезаписывать?nkp писал(а):(тут f = open('2.ngc','w') #результат наверно ('2.ngc','a') , а то перезаписывать будет)
Код: Выделить всё
./autogen.sh
./configure
make clean
make
sudo make setuidпока не смотрел "внутренности" ))Nick писал(а):А как он работает? Через запись координат и потом проигрывание их в обратном порядке?
по моему решился вопрос с адаптивным управлением:nkp писал(а):оказалось - проблемы с М52 (при включении реверс не работает )

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