(думал счетчик и пару реле - получилась портянка целая

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 писал(а):по моему решился вопрос с адаптивным управлением: