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

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

Добавлено: 08 фев 2013, 11:27
Nick
хм... надо попробовать для начала через Gкод. Если поменять параметр, изменится ли смещение (оно может измениться и со следующего кадра)?

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

Добавлено: 08 фев 2013, 11:40
nkp
Nick писал(а):надо попробовать для начала через Gкод. Если поменять параметр, изменится ли смещение (оно может измениться и со следующего кадра)?
а что это даст?
как не прерывая программу выполнить какой то код?
---------------
не может ли быть такое - что этого нужного механизма нет в емс , потому что емс считывает параметры один раз при загрузке
и поэтому менять их не может из хал???

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

Добавлено: 08 фев 2013, 11:42
Nick
nkp писал(а):а что это даст?
как не прерывая программу выполнить какой то код?
Ну для начала надо проверить будет ли он менять отступ, просто он может эти отступы читать только при выполнении G43... если будет - то найдем решение :).
Плюс он может эти параметры вовсе не читать, а только писать - для информации...
nkp писал(а):не может ли быть такое - что этого нужного механизма нет в емс , потому что емс считывает параметры один раз при загрузке
и поэтому менять их не может из хал???
Не, параметры можно менять на лету (через gкод) - поэтому все будет ок.

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

Добавлено: 08 фев 2013, 12:09
nkp
Nick писал(а):просто он может эти отступы читать только при выполнении G43... если будет - то найдем решение
я немного не понимаю - куда ты клонишь ;)
коррекция конечно без ж43 не включиться - ну и что
нам это не мешает - допустим мы работаем - инструмент Т1 - сломался - меняем -меряем- и корректируем параметр
а ж43 и так уже активен (он был активирован при смене-М6 Т1 G43) - и параметр емс учитывает
Nick писал(а):Не, параметры можно менять на лету (через gкод)
ну не факт :)
из ж-кода - в моем понимании - не совсем на лету
код грузится 1 раз - и не предполагает изменений ...

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

Добавлено: 08 фев 2013, 12:18
Nick
Попробовал поменять #5402 через Gкод - сказало "параметр только для чтения :tongue:"
Бум дальше думать...

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

Добавлено: 08 фев 2013, 12:25
nkp
Вот здесь что то о параметрах

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

Добавлено: 08 фев 2013, 12:35
Lexxa
помнится в игре герои была читерская прога, когда значение переменных менялось прямо в ОЗУ. типа денег там много себе наделать можно было и еще что-то. Тут не прокатит такой метод?

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

Добавлено: 08 фев 2013, 12:39
vmarkiv
Lexxa писал(а):помнится в игре герои была читерская прога, когда значение переменных менялось прямо в ОЗУ. типа денег там много себе наделать можно было и еще что-то. Тут не прокатит такой метод?
Да-да , а на стойке Н33-2м была целая панель корректоров , тоже все на ходу менялось http://cnc-club.ru/forum/posting.php?mo ... 15&p=55556#

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

Добавлено: 08 фев 2013, 12:54
nkp
Старая ветка с подобным вопросом

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

Добавлено: 01 дек 2013, 12:41
nkp
добавил в axis несколько строк,позволяющих вывести в файл интерпретированный код:

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

    import subprocess
    nst = ['rs274','-g',f,'-t', tooltable, '>' , '~/.srcngc' ]
    st =' '.join(nst)
    r = subprocess.Popen([st], shell=True)
    r.wait()
"собираем" команду и выводим данные в ~/.srcngc...
что нам это может дать?
теперь у нас есть "линейная развертка" любых о-кодов (подпрограмм и повторений) , сложных кодов , состоящих из нескольких файлов и т.д.
например :
загружаем в емс :
(для просмотра содержимого нажмите на ссылку)

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

#<x-num>  =    4  (количество отверстий в ряду)
#<y-num>  =    4  (количество рядов)
#<x-0>    =    10   (начальная позиция X)
#<y-0>    =    10   (начальная позиция Y)
#<x-step> =    4    (шаг по X)
#<y-step> =    4    (шаг по Y)
#<y-shift> = [#<y-step>/2]
#<x> = #<x-0>
#<y> = #<y-0>
#<y-num_1> = [#<y-num>-1] 
#<i> = 0

F800
o100 REPEAT [[#<x-num>*2]-1]
	#<y> = #<y-0>
	#<i> = [[#<i>+1] MOD 2]
	#<y> = [#<y> - #<i>*#<y-shift>]

		o120 IF [#<i> EQ 1]
			 #<y-numN> = #<y-num>
		o120 ELSE
			 #<y-numN> = #<y-num_1>   
		o120 ENDIF
		o101 REPEAT [#<y-numN>]
			G1 X#<x> Y#<y>
			G1 z-5
			G0 z0
			#<y> = [#<y>+#<y-step>]
		o101 ENDREPEAT
	#<x> = [#<x>+[#<x-step>/2]]
		(DEBUG, i = #<i>,n = #<y-numN> )
o100 ENDREPEAT
M2
и в ~/.srcngc имеем:
(для просмотра содержимого нажмите на ссылку)

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

    1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
    2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
    3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
    4 N..... SET_XY_ROTATION(0.0000)
    5 N..... SET_FEED_REFERENCE(CANON_XYZ)
    6 N..... COMMENT("количество отверстий в ряду")
    7 N..... COMMENT("количество рядов")
    8 N..... COMMENT("начальная позиция X")
    9 N..... COMMENT("начальная позиция Y")
   10 N..... COMMENT("шаг по X")
   11 N..... COMMENT("шаг по Y")
   12 N..... SET_FEED_RATE(800.0000)
   13 N..... STRAIGHT_FEED(10.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   14 N..... STRAIGHT_FEED(10.0000, 8.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   15 N..... STRAIGHT_TRAVERSE(10.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   16 N..... STRAIGHT_FEED(10.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   17 N..... STRAIGHT_FEED(10.0000, 12.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   18 N..... STRAIGHT_TRAVERSE(10.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   19 N..... STRAIGHT_FEED(10.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   20 N..... STRAIGHT_FEED(10.0000, 16.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   21 N..... STRAIGHT_TRAVERSE(10.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   22 N..... STRAIGHT_FEED(10.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   23 N..... STRAIGHT_FEED(10.0000, 20.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   24 N..... STRAIGHT_TRAVERSE(10.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   25 N..... MESSAGE(" i = 1.000000,n = 4.000000 ")
   26 N..... STRAIGHT_FEED(12.0000, 10.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   27 N..... STRAIGHT_FEED(12.0000, 10.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   28 N..... STRAIGHT_TRAVERSE(12.0000, 10.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   29 N..... STRAIGHT_FEED(12.0000, 14.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   30 N..... STRAIGHT_FEED(12.0000, 14.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   31 N..... STRAIGHT_TRAVERSE(12.0000, 14.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   32 N..... STRAIGHT_FEED(12.0000, 18.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   33 N..... STRAIGHT_FEED(12.0000, 18.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   34 N..... STRAIGHT_TRAVERSE(12.0000, 18.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   35 N..... MESSAGE(" i = 0.000000,n = 3.000000 ")
   36 N..... STRAIGHT_FEED(14.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   37 N..... STRAIGHT_FEED(14.0000, 8.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   38 N..... STRAIGHT_TRAVERSE(14.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   39 N..... STRAIGHT_FEED(14.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   40 N..... STRAIGHT_FEED(14.0000, 12.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   41 N..... STRAIGHT_TRAVERSE(14.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   42 N..... STRAIGHT_FEED(14.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   43 N..... STRAIGHT_FEED(14.0000, 16.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   44 N..... STRAIGHT_TRAVERSE(14.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   45 N..... STRAIGHT_FEED(14.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   46 N..... STRAIGHT_FEED(14.0000, 20.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   47 N..... STRAIGHT_TRAVERSE(14.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   48 N..... MESSAGE(" i = 1.000000,n = 4.000000 ")
   49 N..... STRAIGHT_FEED(16.0000, 10.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   50 N..... STRAIGHT_FEED(16.0000, 10.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   51 N..... STRAIGHT_TRAVERSE(16.0000, 10.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   52 N..... STRAIGHT_FEED(16.0000, 14.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   53 N..... STRAIGHT_FEED(16.0000, 14.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   54 N..... STRAIGHT_TRAVERSE(16.0000, 14.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   55 N..... STRAIGHT_FEED(16.0000, 18.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   56 N..... STRAIGHT_FEED(16.0000, 18.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   57 N..... STRAIGHT_TRAVERSE(16.0000, 18.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   58 N..... MESSAGE(" i = 0.000000,n = 3.000000 ")
   59 N..... STRAIGHT_FEED(18.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   60 N..... STRAIGHT_FEED(18.0000, 8.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   61 N..... STRAIGHT_TRAVERSE(18.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   62 N..... STRAIGHT_FEED(18.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   63 N..... STRAIGHT_FEED(18.0000, 12.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   64 N..... STRAIGHT_TRAVERSE(18.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   65 N..... STRAIGHT_FEED(18.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   66 N..... STRAIGHT_FEED(18.0000, 16.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   67 N..... STRAIGHT_TRAVERSE(18.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   68 N..... STRAIGHT_FEED(18.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   69 N..... STRAIGHT_FEED(18.0000, 20.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   70 N..... STRAIGHT_TRAVERSE(18.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   71 N..... MESSAGE(" i = 1.000000,n = 4.000000 ")
   72 N..... STRAIGHT_FEED(20.0000, 10.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   73 N..... STRAIGHT_FEED(20.0000, 10.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   74 N..... STRAIGHT_TRAVERSE(20.0000, 10.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   75 N..... STRAIGHT_FEED(20.0000, 14.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   76 N..... STRAIGHT_FEED(20.0000, 14.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   77 N..... STRAIGHT_TRAVERSE(20.0000, 14.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   78 N..... STRAIGHT_FEED(20.0000, 18.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   79 N..... STRAIGHT_FEED(20.0000, 18.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   80 N..... STRAIGHT_TRAVERSE(20.0000, 18.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   81 N..... MESSAGE(" i = 0.000000,n = 3.000000 ")
   82 N..... STRAIGHT_FEED(22.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   83 N..... STRAIGHT_FEED(22.0000, 8.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   84 N..... STRAIGHT_TRAVERSE(22.0000, 8.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   85 N..... STRAIGHT_FEED(22.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   86 N..... STRAIGHT_FEED(22.0000, 12.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   87 N..... STRAIGHT_TRAVERSE(22.0000, 12.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   88 N..... STRAIGHT_FEED(22.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   89 N..... STRAIGHT_FEED(22.0000, 16.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   90 N..... STRAIGHT_TRAVERSE(22.0000, 16.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   91 N..... STRAIGHT_FEED(22.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   92 N..... STRAIGHT_FEED(22.0000, 20.0000, -5.0000, 0.0000, 0.0000, 0.0000)
   93 N..... STRAIGHT_TRAVERSE(22.0000, 20.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   94 N..... MESSAGE(" i = 1.000000,n = 4.000000 ")
   95 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
   96 N..... SET_XY_ROTATION(0.0000)
   97 N..... SET_FEED_MODE(0)
   98 N..... SET_FEED_RATE(0.0000)
   99 N..... STOP_SPINDLE_TURNING()
  100 N..... SET_SPINDLE_MODE(0.0000)
  101 N..... PROGRAM_END()

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

Добавлено: 01 дек 2013, 13:46
nkp
с такими изменениями будет проверять в ini опцию SRCNGC = srcngc.ipr
(если прописана - вывод в указаный файл)

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

Добавлено: 29 дек 2013, 22:10
nkp

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

    def ret_line(number):
        f = open(fl, "r")
        lines = f.readlines()
        f.close()
        if number >= 0:
            return lines[number]
    
    def up(event=None):
        commands.task_stop()
        ensure_mode(linuxcnc.MODE_MDI)
        num = int(comp["curent-line"]) - 1
        while num >= 0 :
            commands.send_mdi_command(commands.ret_line(num))
            num -= 1
примерно так мы читаем подготовленый код в файле fl от некоторой строки и до начала.
--------
вот здесь бы сделать вызвов ret_line к примеру 5 раз - не более(5 невыполненых команд)

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

Добавлено: 29 дек 2013, 22:16
Nick
Может так сделать:

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

    def ret_line(number, num=1):
        f = open(fl, "r")
        lines = f.readlines()
        f.close()
        if number >= 0:
            lines = lines[number:max(number-num,0)]
            lines.reverse()
            return lines     
Ну и вызывать так:

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

lines = commands.ret_line(num,5)
for l in lines :
    commands.send_mdi_command(l)

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

Добавлено: 29 дек 2013, 22:36
nkp
попоробую ,спасибо ...
но тут с mdi какие то метаморфозы происходят :)
вроде бы на простых коротких файлах уже стабильно работает - бац - опять едет куда хочет :hehehe:
такое впечатление - что команды действительно хранятся в буфере , который работает пока по неизвестному алгоритму))
конечно ,используем мы это не по прямому назначению т.с. , но все же))

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

Добавлено: 29 дек 2013, 23:55
nkp
нашел немного связанного с ошибкой:

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

    // max number of queued MDI commands
    if (NULL != (inistring = inifile.Find("MDI_QUEUED_COMMANDS", "TASK"))) {
	max_mdi_queued_commands = atoi(inistring);
то есть размер буфера можно устанавливать в ини файле(только нужно выяснить предел))по умолчанию стоит 10
============
заодно тут же :
if (NULL != (inistring = inifile.Find("INTERP_MAX_LEN", "TASK"))) {
if (1 == sscanf(inistring, "%d", &emc_task_interp_max_len))

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

Добавлено: 30 дек 2013, 10:26
nkp
"брал" номер активной строки программы с помощью minmax...
но он работает не для всех случаев:
запоминает максимальное значение и если остановиться в следуюший раз раньше - то номер ошибочный получается...
попробую сбрасывать - но где то на форуме другой вариант проскакивал :thinking:

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

Добавлено: 30 дек 2013, 10:57
Nick
nkp писал(а):"брал" номер активной строки программы с помощью minmax...
А как именно ты его берешь?
через motion.program-line в minmax, чтобы после остановки сохранить номер?

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

Добавлено: 30 дек 2013, 10:59
nkp
Nick писал(а):через motion.program-line в minmax, чтобы после остановки сохранить номер?
точно...

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

Добавлено: 30 дек 2013, 11:02
Nick
Ну добавь на старт/реверс ресет для minmax и все... вроде должно хватить...

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

Добавлено: 31 дек 2013, 11:44
nkp
вот такой промежуточный итог:
выбрал реверс-движения по одной команде mdi ...
так избавился от нескольких проблем(но не от всех :) ) - таких как переполнение буфера, и еще непонятных наслоений команд :shock:
пока отработка кнопками - потом переведется на атоматическое управление из ладдера...
напомню весь алгоритм:
перед загрузкой в емс файла с кодом (а скорей всего одновременно с загрузкой - "на лету") фотмируется обратный (реверсный код) ...
потом при остановке (имеется в виду замыкание в edm) - все машины стоп,самый полный назад емс стоп, и из файла реверскода берем по одной строке и
используя их как mdi команды отходим (в данном случае до размыкания)
EDM.rar
(5.33 КБ) 484 скачивания
вот такое управление процессом:

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

#!/usr/bin/python
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", hal.HAL_BIT, hal.HAL_IN)
h.newpin("curent-line",hal.HAL_FLOAT,hal.HAL_IN)
h.newpin("minmax-reset", hal.HAL_BIT, hal.HAL_OUT)    
h.ready()
c = linuxcnc.command()
s = linuxcnc.stat()
def ret_line(number):
	f = open('/home/nkp/temp_rev.ngc', "r") #here prepared code(revers Gcode)
	lines = f.readlines()
	f.close()
	if number >= 0:
	    return lines[number]
	else:
	    return lines[0]   
def stop():
	c.abort()
	c.wait_complete()
	global num_curent_line 
	num_curent_line = int(h["curent-line"]) - 1

 	h["stop"]=0
	print  num_curent_line
def back():
	global num_curent_line 
	c.mode(linuxcnc.MODE_MDI)
	c.wait_complete()
	c.mdi(ret_line(num_curent_line))
	print 'comand:',ret_line(num_curent_line), 'curent line:', num_curent_line
	num_curent_line -= 1
	h["minmax-reset"] = 0
	h["rev"]=0
def again_forward():
	h["rerev"]=0
	global num_curent_line
	c.mode(linuxcnc.MODE_AUTO)
	c.wait_complete()
	c.auto(linuxcnc.AUTO_RUN, (num_curent_line+2))
	h["minmax-reset"] = 1
	print  num_curent_line ,'!'
try:
    while 1:	 
	if h["stop"]==1:
		stop()
	if h["rev"]==1:
		back()		
	if h["rerev"]==1:
		again_forward()	
except KeyboardInterrupt:
    raise SystemExit