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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

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

Сообщение nkp »

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

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

Сообщение Nick »

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

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

Сообщение nkp »

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

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

Сообщение Nick »

Попробовал поменять #5402 через Gкод - сказало "параметр только для чтения :tongue:"
Бум дальше думать...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

Вот здесь что то о параметрах
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

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

Сообщение Lexxa »

помнится в игре герои была читерская прога, когда значение переменных менялось прямо в ОЗУ. типа денег там много себе наделать можно было и еще что-то. Тут не прокатит такой метод?
:bender:
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

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

Сообщение vmarkiv »

Lexxa писал(а):помнится в игре герои была читерская прога, когда значение переменных менялось прямо в ОЗУ. типа денег там много себе наделать можно было и еще что-то. Тут не прокатит такой метод?
Да-да , а на стойке Н33-2м была целая панель корректоров , тоже все на ходу менялось http://cnc-club.ru/forum/posting.php?mo ... 15&p=55556#
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

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

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

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

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

Сообщение nkp »

с такими изменениями будет проверять в ini опцию SRCNGC = srcngc.ipr
(если прописана - вывод в указаный файл)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

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

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

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

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

Сообщение nkp »

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

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

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

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

Сообщение nkp »

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

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

Сообщение Nick »

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

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

Сообщение nkp »

Nick писал(а):через motion.program-line в minmax, чтобы после остановки сохранить номер?
точно...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Ну добавь на старт/реверс ресет для minmax и все... вроде должно хватить...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

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

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

#!/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
Ответить

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