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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.

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

Сообщение nkp » 03 янв 2014, 00:03

прицепил костыли управление через ладдер своему скрипту...
(думал счетчик и пару реле - получилась портянка целая :) )

таймеры загрублены для отладки (да в принципе и скорости то в EDM сверхнизкие)...
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение tooshka » 03 янв 2014, 07:51

nkp писал(а):прицепил костыли управление через ладдер своему скрипту...
(думал счетчик и пару реле - получилась портянка целая )

Классно!!! Вроде работает? И на дуге тоже))))
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
tooshka
Почётный участник
Почётный участник
 
Сообщения: 1761
Зарегистрирован: 24 окт 2012, 14:26
Откуда: Нижний Новгород
Репутация: 202
Медальки:
Настоящее имя: Андрей

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

Сообщение PKM » 03 янв 2014, 13:49

а вот эти паузы откуда берутся?
Аватара пользователя
PKM
Почётный участник
Почётный участник
 
Сообщения: 4022
Зарегистрирован: 31 мар 2011, 18:11
Откуда: Украина
Репутация: 582
Медальки:
Настоящее имя: Андрей

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

Сообщение nkp » 03 янв 2014, 14:12

PKM писал(а):а вот эти паузы откуда берутся?

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

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

Сообщение nkp » 03 янв 2014, 23:38

есть желание использовать цепочку 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
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение nkp » 04 янв 2014, 23:35

неточности в преобразованиях:
траектория с R не совпадает с IJ
LinuxCNC реверс Gкода Выделение_070.png

вроде бы все просто - вычисляем гипотенузу
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 байт) Скачиваний: 235
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение nkp » 09 янв 2014, 11:36

не выяснил ничего по поводу "разночтений" 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
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение nkp » 09 янв 2014, 12:31

код из dxf получаю dxf2gcode , там можно подправить вывод как в ПП, так и в исходном коде...
но вот такая шероховатость - оказывается формат dxf не такой уж и однозначный,даже не так :
каждая программа понимает по своему как нужно экспортировать в dxf ;)
понятно , что нарисовав полилинию в коде получим обработку дуги короткими отрезками...
но вот другое например :
задаешь полноценную дугу в CADе , а он экспортирует в dxf просто линию с выпуклостью (42) ,а dxf2gcode такого вообще не понимает...
так что наверно dxf в плане преобразования в ж-код необходимо рассматривать и как графическое отражение ,и как синтаксическое наполнение...
=============
если весь цикл работ проводится одноособно от прорисовки чертежей и до готового жкода - то здесь вопросов меньше - выбрать нужные программы ,подработать пп и вперед...
а вот когда разные заказчики передают свои файлы ...
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение Nick » 09 янв 2014, 15:18

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

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

Сообщение Nick » 09 янв 2014, 15:37

Вот, чуть переделал твой скрипт, который просто меняет 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
Use the Console, Luke.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22330
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1328
Заслуга: Developer
Медальки:

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

Сообщение nkp » 10 янв 2014, 00:13

Nick писал(а):Вот, чуть переделал

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

нет - так питон калькулирует...
============
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение nkp » 10 янв 2014, 00:43

nkp писал(а):нет - так питон калькулирует...

:thinking: да - наверно я что то не так делал...
во всяком случае еще поюзать надо больше - но сейчас твоим скриптом выдает код ,и он не "расходится" с "JI" ;) (R60.0002 выдает)
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение Nick » 10 янв 2014, 10:46

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

Вот и я о том же... может у тебя где-то последние циферки отрезались...
nkp писал(а):да уж - регулярка рулит

А то! :)
nkp писал(а):(тут f = open('2.ngc','w') #результат наверно ('2.ngc','a') , а то перезаписывать будет)

А разве нам не надо перезаписывать?
Т.е. если конвертим второй файл, то он ведь должен стереть результат первого... вроде...
вообще может быть еще лучше сделать этот скрипт "фильтром" т.е. читать из стандартного входа и писать в стандартный вывод, тогда его можно будет гораздо универсальнее использовать...
Use the Console, Luke.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22330
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1328
Заслуга: Developer
Медальки:

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

Сообщение AlexTskan » 12 окт 2014, 01:19

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

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

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

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

А вообще вопрос интересный - нужно будет поразмышлять над ним.
Чудес не бывает. Бывает недопонимание субъектом процессов, часто осложнённое отсутствием самокритики и верой в непогрешимость своей системы знаний. Плохо когда ЧСВ ещё раздуто до степени судьи...
AlexTskan
Опытный
 
Сообщения: 184
Зарегистрирован: 08 янв 2014, 05:19
Репутация: 44

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

Сообщение nkp » 17 апр 2015, 21:27

ну вот - все костыли становятся неактуальными ;)
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
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение nkp » 19 апр 2015, 19:26

так как все это только зарождается - непредвиденной реакции в разных "местах" программы не избежать :freak:
оказалось - проблемы с М52 (при включении реверс не работает :cry: )

ну и один из способов обойтись без М52 ,используя напрямую команду задания
величины подачи c.feedrate(x)
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение Nick » 20 апр 2015, 13:42

А как он работает? Через запись координат и потом проигрывание их в обратном порядке?
Use the Console, Luke.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22330
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1328
Заслуга: Developer
Медальки:

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

Сообщение nkp » 21 апр 2015, 18:17

Nick писал(а):А как он работает? Через запись координат и потом проигрывание их в обратном порядке?

пока не смотрел "внутренности" ))
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение nkp » 13 сен 2015, 21:05

nkp писал(а):оказалось - проблемы с М52 (при включении реверс не работает )

по моему решился вопрос с адаптивным управлением:
(попробую - отпишусь подробней)

обсуждение:
http://www.mail-archive.com/emc-develop ... 15075.html
nkp
Мастер
 
Сообщения: 6954
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1084
Медальки:

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

Сообщение tooshka » 13 сен 2015, 21:51

nkp писал(а):по моему решился вопрос с адаптивным управлением:

Охренеть, классно. Ну ты маньяк, добил все таки!
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
tooshka
Почётный участник
Почётный участник
 
Сообщения: 1761
Зарегистрирован: 24 окт 2012, 14:26
Откуда: Нижний Новгород
Репутация: 202
Медальки:
Настоящее имя: Андрей

Пред.След.

Вернуться в LinuxCNC

Кто сейчас на конференции

Зарегистрированные пользователи: aldemm, Alexf2a, alexx.bit, Argon-11, avalter, Bing [Bot], Darxton, Dimka_almighty, Dirk Diggler, evdroniy, Evilmax, exe, frezeryga, Gerter, Google [Bot], Google Feedfetcher, Hanter, Lafayette, Lexxa, Malyarka74, MGG, nevkon, NickSon, Nonstopich, R6MF49T2, rage, Rd24, Redmn, scout, shalek, shatrovmaxim, Shkryab, sig, spawoon, spivakov, texnocentr, toxakorzh, ultrus, Umnik, verser, Vetal, Yahoo [Bot], Yandex [bot]

Поделиться

Reputation System ©'