LinuxCNC реверс Gкода
- Nick
 - Мастер
 - Сообщения: 22776
 - Зарегистрирован: 23 ноя 2009, 16:45
 - Репутация: 1735
 - Заслуга: Developer
 - Откуда: Gatchina, Saint-Petersburg distr., Russia
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
хм... надо попробовать для начала через Gкод. Если поменять параметр, изменится ли смещение (оно может измениться и со следующего кадра)?
			
			
									
									
						- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
а что это даст?Nick писал(а):надо попробовать для начала через Gкод. Если поменять параметр, изменится ли смещение (оно может измениться и со следующего кадра)?
как не прерывая программу выполнить какой то код?
---------------
не может ли быть такое - что этого нужного механизма нет в емс , потому что емс считывает параметры один раз при загрузке
и поэтому менять их не может из хал???
- Nick
 - Мастер
 - Сообщения: 22776
 - Зарегистрирован: 23 ноя 2009, 16:45
 - Репутация: 1735
 - Заслуга: Developer
 - Откуда: Gatchina, Saint-Petersburg distr., Russia
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Ну для начала надо проверить будет ли он менять отступ, просто он может эти отступы читать только при выполнении G43... если будет - то найдем решениеnkp писал(а):а что это даст?
как не прерывая программу выполнить какой то код?
Плюс он может эти параметры вовсе не читать, а только писать - для информации...
Не, параметры можно менять на лету (через gкод) - поэтому все будет ок.nkp писал(а):не может ли быть такое - что этого нужного механизма нет в емс , потому что емс считывает параметры один раз при загрузке
и поэтому менять их не может из хал???
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
я немного не понимаю - куда ты клонишь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кода
Попробовал поменять #5402 через Gкод - сказало "параметр только для чтения 
"
Бум дальше думать...
			
			
									
									
						Бум дальше думать...
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Вот здесь что то о параметрах
			
			
									
									
						- Lexxa
 - Мастер
 - Сообщения: 2703
 - Зарегистрирован: 16 дек 2011, 16:48
 - Репутация: 319
 - Настоящее имя: Алексей
 - Откуда: ryazan
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
помнится в игре герои была читерская прога, когда значение переменных менялось прямо в ОЗУ. типа денег там много себе наделать можно было и еще что-то. Тут не прокатит такой метод?
			
			
									
									- 
				vmarkiv
 - Мастер
 - Сообщения: 516
 - Зарегистрирован: 21 янв 2012, 00:23
 - Репутация: 32
 - Откуда: Ивано-Франковск
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Да-да , а на стойке Н33-2м была целая панель корректоров , тоже все на ходу менялось http://cnc-club.ru/forum/posting.php?mo ... 15&p=55556#Lexxa писал(а):помнится в игре герои была читерская прога, когда значение переменных менялось прямо в ОЗУ. типа денег там много себе наделать можно было и еще что-то. Тут не прокатит такой метод?
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Старая ветка  с подобным вопросом
			
			
									
									
						- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
добавил в axis  несколько строк,позволяющих вывести в файл интерпретированный код:
"собираем" команду и выводим данные в ~/.srcngc...
что нам это может дать?
теперь у нас есть "линейная развертка" любых о-кодов (подпрограмм и повторений) , сложных кодов , состоящих из нескольких файлов и т.д.
например :
загружаем в емс : и в ~/.srcngc имеем:
			
			
									
									
						Код: Выделить всё
    import subprocess
    nst = ['rs274','-g',f,'-t', tooltable, '>' , '~/.srcngc' ]
    st =' '.join(nst)
    r = subprocess.Popen([st], shell=True)
    r.wait()что нам это может дать?
теперь у нас есть "линейная развертка" любых о-кодов (подпрограмм и повторений) , сложных кодов , состоящих из нескольких файлов и т.д.
например :
загружаем в емс : и в ~/.srcngc имеем:
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
с такими изменениями будет проверять в ini опцию SRCNGC = srcngc.ipr
(если прописана - вывод в указаный файл)
			
			
									
									
						(если прописана - вывод в указаный файл)
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Код: Выделить всё
    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--------
вот здесь бы сделать вызвов ret_line к примеру 5 раз - не более(5 невыполненых команд)
- Nick
 - Мастер
 - Сообщения: 22776
 - Зарегистрирован: 23 ноя 2009, 16:45
 - Репутация: 1735
 - Заслуга: Developer
 - Откуда: Gatchina, Saint-Petersburg distr., Russia
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Может так сделать:
 
Ну и вызывать так:
			
			
									
									
						Код: Выделить всё
    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кода
попоробую ,спасибо ...
но тут с mdi какие то метаморфозы происходят
 
вроде бы на простых коротких файлах уже стабильно работает - бац - опять едет куда хочет
 
такое впечатление - что команды действительно хранятся в буфере , который работает пока по неизвестному алгоритму))
конечно ,используем мы это не по прямому назначению т.с. , но все же))
			
			
									
									
						но тут с mdi какие то метаморфозы происходят
вроде бы на простых коротких файлах уже стабильно работает - бац - опять едет куда хочет
такое впечатление - что команды действительно хранятся в буфере , который работает пока по неизвестному алгоритму))
конечно ,используем мы это не по прямому назначению т.с. , но все же))
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
нашел немного связанного с ошибкой:
то есть размер буфера можно устанавливать в ини файле(только нужно выяснить предел))по умолчанию стоит 10
============
заодно тут же :
if (NULL != (inistring = inifile.Find("INTERP_MAX_LEN", "TASK"))) {
if (1 == sscanf(inistring, "%d", &emc_task_interp_max_len))
			
			
									
									
						Код: Выделить всё
    // max number of queued MDI commands
    if (NULL != (inistring = inifile.Find("MDI_QUEUED_COMMANDS", "TASK"))) {
	max_mdi_queued_commands = atoi(inistring);============
заодно тут же :
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кода
"брал" номер активной строки программы с помощью minmax...
но он работает не для всех случаев:
запоминает максимальное значение и если остановиться в следуюший раз раньше - то номер ошибочный получается...
попробую сбрасывать - но где то на форуме другой вариант проскакивал
			
			
									
									
						но он работает не для всех случаев:
запоминает максимальное значение и если остановиться в следуюший раз раньше - то номер ошибочный получается...
попробую сбрасывать - но где то на форуме другой вариант проскакивал
- Nick
 - Мастер
 - Сообщения: 22776
 - Зарегистрирован: 23 ноя 2009, 16:45
 - Репутация: 1735
 - Заслуга: Developer
 - Откуда: Gatchina, Saint-Petersburg distr., Russia
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
А как именно ты его берешь?nkp писал(а):"брал" номер активной строки программы с помощью minmax...
через motion.program-line в minmax, чтобы после остановки сохранить номер?
- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
точно...Nick писал(а):через motion.program-line в minmax, чтобы после остановки сохранить номер?
- Nick
 - Мастер
 - Сообщения: 22776
 - Зарегистрирован: 23 ноя 2009, 16:45
 - Репутация: 1735
 - Заслуга: Developer
 - Откуда: Gatchina, Saint-Petersburg distr., Russia
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
Ну добавь на старт/реверс ресет для minmax и все... вроде должно хватить...
			
			
									
									
						- 
				nkp
 - Мастер
 - Сообщения: 8340
 - Зарегистрирован: 28 ноя 2011, 00:25
 - Репутация: 1589
 - Контактная информация:
 
Re: LinuxCNC реверс Gкода
вот такой промежуточный итог:
выбрал реверс-движения по одной команде mdi ...
так избавился от нескольких проблем(но не от всех
 ) - таких как переполнение буфера, и еще непонятных наслоений команд 
 
пока отработка кнопками - потом переведется на атоматическое управление из ладдера...
напомню весь алгоритм:
перед загрузкой в емс файла с кодом (а скорей всего одновременно с загрузкой - "на лету") фотмируется обратный (реверсный код) ...
потом при остановке (имеется в виду замыкание в edm) -все машины стоп,самый полный назад емс стоп, и из файла реверскода берем по одной строке и 
используя их как mdi команды отходим (в данном случае до размыкания) вот такое управление процессом:
			
			
									
									
						выбрал реверс-движения по одной команде mdi ...
так избавился от нескольких проблем(но не от всех
пока отработка кнопками - потом переведется на атоматическое управление из ладдера...
напомню весь алгоритм:
перед загрузкой в емс файла с кодом (а скорей всего одновременно с загрузкой - "на лету") фотмируется обратный (реверсный код) ...
потом при остановке (имеется в виду замыкание в edm) -
используя их как mdi команды отходим (в данном случае до размыкания) вот такое управление процессом:
Код: Выделить всё
#!/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