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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

я все таки не оставляю надежду "научить" емс исполнение программы в реверсном режиме(пусть даже только линейные перемещения и без подпрограмм)
вот такие наработки:
1. по внешнему сигналу останавливаемся:

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

	def run_from_line(self,widget):
#		self.c.set_feed_hold(1)
#		self.c.wait_complete()
		self.c.abort()
		self.c.wait_complete()
		print 'task_mode-' , self.s.task_mode,'program_line',self.halcomp["program-line"] 
2. получаем номер текущего кадра в переменную(из хал в скрипт)
3. вот тут пока недорешенный вопрос:

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

	def run_from_line_re(self,widget):
		self.program_start_line = int(self.halcomp["program-line"]) - 1
		self.c.auto(linuxcnc.AUTO_RUN , self.program_start_line)
		self.c.wait_complete()
		self.c.auto(linuxcnc.AUTO_STEP)
после остановки нужно вернуться в предыдущий кадр и повторять это в цикле до команды
тут загвоздка вот в чем:
насколько я понял - емс может (пока) начать с указанного кадра только в обычном(не пошаговом) режиме

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

self.c.auto(linuxcnc.AUTO_RUN , self.program_start_line)
а вот включая пошаговый :

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

self.c.auto(linuxcnc.AUTO_STEP)
мы не можем арументом указать требуемый стартовый кадр
(может выйдет и имеющимися средствами обойтись - а может и модуль linuxcnc.so нужно изменять)
какие у кого мнения по самому принципу?
Эта тема была отделена от: MyGUI #532
--Nick
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

А что будет, если написать:

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

self.c.auto(linuxcnc.AUTO_STEP,  self.program_start_line) 
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Nick писал(а):А что будет, если написать:
как и следовало ожидать:

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

Traceback (most recent call last):
  File "/home/nkp/emc2-dev-80db2a2/bin/mygui", line 75, in run_from_line_re
    self.c.auto(linuxcnc.AUTO_STEP , self.program_start_line)
TypeError: function takes exactly 1 argument (2 given)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

в принципе - учитывая потребность в отходе на сравнительно небольшое расстояние при кз (в EDM)
даже такое решение может быть достаточным
https://www.youtube.com/watch?v=ZP9MvwxHZJA
естественно вместо кнопок получаем сигнал напряжения на эрозионном промежутке
и "на весь" кадр конечно не нужно отходить - только до устранения кз
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

nkp писал(а):как и следовало ожидать:
TypeError: function takes exactly 1 argument (2 given)
Так функция же одна и та же?!
Можешь целиком ошибку скопировать?
nkp писал(а):в принципе - учитывая потребность в отходе на сравнительно небольшое расстояние при кз (в EDM)
даже такое решение может быть достаточным
Ахренеть! :good: Это медаль!
Ток я не понял, а как ты все это сделал??? По кнопке реверсируется Gкод, и автоматом загружается в MyGUI? Кстати, код целиком реверсируешь и после загрузки есть пройденный путь (который раньше был окончанием траектории)?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Nick писал(а):По кнопке реверсируется Gкод, и автоматом загружается в MyGUI
нет ,ничего не грузится
вот примерно так:

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

	def run_from_line(self,widget):
		self.c.abort() #  делаем стоп
		self.c.wait_complete() # ждем выполнения (может это лишнее...)
		self.run_from_line_re(self) # вызываем следующую функцию
		print 'task_mode-' , self.s.task_mode,'program_line',self.halcomp["program-line"]  #контроль 
	def run_from_line_re(self,widget):
		self.program_start_line = int(self.halcomp["program-line"]) - 1 #вычисляем нужный нам номер кадра (коннект с пином motion.program-line)
		self.c.auto(linuxcnc.AUTO_RUN , self.program_start_line)# начать обработку с кадра  self.program_start_line
вот если бы подправить модуль linuxcnc в плане

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

c.auto(linuxcnc.AUTO_STEP,  self.program_start_line) 
то таким образом можно было бы отходить хоть до начала...
найти бы для начала исходники модуля...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

вот исходники модуля linuxcnc.so
насколько я понимаю - именно в нем сосредоточена большая часть(или весь?) интерфейса емс
знатокам Си:
возможно ли изменение работы в пошаговом режиме с указанием начального кадра
(по аналогии с c.auto(linuxcnc.AUTO_RUN, self.program_start_line) - где
вторым аргументом указываем номер начального кадра(строки)
хочеться иметь команду:

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

c.auto(linuxcnc.AUTO_STEP,  self.program_start_line) 
emcmodule.txt
расширение .cc
(73.41 КБ) 1544 скачивания
наверно вот эта функция:

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

static PyObject *emcauto(pyCommandChannel *s, PyObject *o) {
    int fn;
    EMC_TASK_PLAN_RUN run;
    EMC_TASK_PLAN_PAUSE pause;
    EMC_TASK_PLAN_RESUME resume;
    EMC_TASK_PLAN_STEP step;

    if(PyArg_ParseTuple(o, "ii", &fn, &run.line) && fn == LOCAL_AUTO_RUN) {
        run.serial_number = next_serial(s);
        s->c->write(run);
        emcWaitCommandReceived(s->serial, s->s);
    } else {
        PyErr_Clear();
        if(!PyArg_ParseTuple(o, "i", &fn)) return NULL;
        switch(fn) {
        case LOCAL_AUTO_PAUSE:
            pause.serial_number = next_serial(s);
            s->c->write(pause);
            emcWaitCommandReceived(s->serial, s->s);
            break;
        case LOCAL_AUTO_RESUME:
            resume.serial_number = next_serial(s);
            s->c->write(resume);
            emcWaitCommandReceived(s->serial, s->s);
            break;
        case LOCAL_AUTO_STEP:
            step.serial_number = next_serial(s);
            s->c->write(step);
            emcWaitCommandReceived(s->serial, s->s);
            break;
        default:
            PyErr_Format(error, "Unexpected argument '%d' to command.auto", fn);
            return NULL;
        }
    }
    Py_INCREF(Py_None);
    return Py_None;
}
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: MyGUI

Сообщение Serg »

по
c.auto(linuxcnc.AUTO_STEP
оно должно "провалится" вот сюда
case LOCAL_AUTO_STEP: ...
Останется только проверить наличие второлго аргумента...
Не понял только что делает PyArg_ParseTuple(...), вроде достаёт соотв. аргументы, надо только почитать как.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

PyArg_ParseTuple(...) как я понял конвертирует типы данных из питоновских в сишные...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: MyGUI

Сообщение Serg »

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

Re: MyGUI

Сообщение Nick »

UAVpilot писал(а):Не понял только что делает PyArg_ParseTuple(...), вроде достаёт соотв. аргументы, надо только почитать как.
Она парсит Tuple, в питоне это тип, который может содержать n переменных. ii - по ходу это два интеджера.


Попробуй :
Вместо:

if(!PyArg_ParseTuple(o, "i", &fn)) return NULL;

написать:

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

        if(!(PyArg_ParseTuple(o, "ii", &fn, &run.line) ) # если не берется два параметра
        {
                if(!PyArg_ParseTuple(o, "i", &fn)) return NULL# пробуем взять хотя бы  один, если не возьмется - return Null
        }
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

выложу файлы где отходы можно протестировать в axis
функции повесил на кнопки zoom (на видео видно)
принцип простой : командуем начать выполнение с такого то кадра( точнее строки)
из-за этого есть ограничения по структуре программы(ж-кода)
но это решается простым парсером кода
https://www.youtube.com/watch?v=fEMpiFBwznc
для "попробовать" нужно:
1. заменить "родной" файл axis.py (который лежит /usr/bin) - это в случае с установленным в систему емс (делаем под root, не забывая сохранить оригинальный файл)
2. папку EDM1 положить в папку configs к остальным конфигурационным директориям
то же можно сделать и на установленном емс из исходников(еще проще )
этот примитивный ж-код в архиве (1_re.ngc)
----------------
маленькое отступление:
я стараюсь ставить емс в мужском роде - ведь это контроллер - он
а язык чешеться всегда сказать емс - она :)

--------------
новая папка.rar
(32.34 КБ) 739 скачиваний
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

сейчас немного подправил - так компактней и без использования пинов хал
теперь внеся такие изменения только в axis.py , получаем отъезды в любой конфигурации:

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

###############################################################################################rev
    def zoomin(event=None):
	s.poll() 
        c.abort()
	c.wait_complete()
	c.auto(linuxcnc.AUTO_RUN , (s.motion_line-1))

    def zoomout(event=None):
	s.poll() 
	c.abort()
	c.wait_complete()
	c.auto(linuxcnc.AUTO_RUN , (s.motion_line+1))
##################################################################################################end_rev
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

Nick писал(а):Попробуй :Вместо: if(!PyArg_ParseTuple(o, "i", &fn)) return NULL;
наверно в этом модуле только исключительно интерфейс "общения " с помощью питона
а основные функции режимов (AUTO_RUN , AUTO_STEP,...) зарыты глубже...
найти бы где это????
там бы уже попытаться прицепить к step номер стартового кадра
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: MyGUI

Сообщение Nick »

А что получается, если if поменять?
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: MyGUI

Сообщение vmarkiv »

По #544 не удается запустить реверс . Ошибки Print file information:
RUN_IN_PLACE=no
LINUXCNC_DIR=
LINUXCNC_BIN_DIR=/usr/bin
LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
LINUXCNC_SCRIPT_DIR=
LINUXCNC_RTLIB_DIR=/usr/realtime-2.6.32-122-rtai/modules/linuxcnc
LINUXCNC_CONFIG_DIR=
LINUXCNC_LANG_DIR=/usr/share/linuxcnc/tcl/msgs
INIVAR=inivar
HALCMD=halcmd
LINUXCNC_EMCSH=/usr/bin/wish8.5
LINUXCNC - 2.5.1
Machine configuration directory is '/home/cnc/linuxcnc/configs/EDM1'
Machine configuration file is 'Sherline3Axis_mm.ini'
INIFILE=/home/cnc/linuxcnc/configs/EDM1/Sherline3Axis_mm.ini
PARAMETER_FILE=stepper.var
TASK=milltask
HALUI=halui
DISPLAY=axis
Starting LinuxCNC...
Starting LinuxCNC server program: linuxcncsvr
Loading Real Time OS, RTAPI, and HAL_LIB modules
Starting LinuxCNC IO program: io
Starting HAL User Interface program: halui
Starting TASK program: milltask
Starting DISPLAY program: axis
Shutting down and cleaning up LinuxCNC...
Killing task linuxcncsvr, PID=5627
Killing task milltask, PID=5678
Removing HAL_LIB, RTAPI, and Real Time OS modules
Removing NML shared memory segments
Cleanup done

Debug file information:
Can not find -sec MOT -var MOT -num 1
Can not find -sec IO -var IO -num 1
Can not find -sec LINUXCNC -var NML_FILE -num 1
Can not find -sec EMC -var NML_FILE -num 1
rev.py:2: DeprecationWarning: the emc module is deprecated; use the linuxcnc module instead
import hal, time, emc
Traceback (most recent call last):
File "/usr/bin/axis", line 3036, in <module>
setup_grid_menu(grids)
File "/usr/bin/axis", line 3031, in setup_grid_menu
variable="grid_size", command="set_grid_size")
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 2642, in add_radiobutton
self.add('radiobutton', cnf or kw)
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 2630, in add
self._options(cnf, kw))
_tkinter.TclError: invalid command name ".menu.view.grid"
5627
PID TTY STAT TIME COMMAND
5678
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components

Kernel message information:
[ 5073.388137] I-pipe: Domain RTAI registered.
[ 5073.388149] RTAI[hal]: <3.8.1> mounted over IPIPE-NOTHREADS 2.6-03.
[ 5073.388154] RTAI[hal]: compiled with gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) .
[ 5073.388220] RTAI[hal]: mounted (IPIPE-NOTHREADS, IMMEDIATE (INTERNAL IRQs DISPATCHED), ISOL_CPUS_MASK: 0).
[ 5073.388226] PIPELINE layers:
[ 5073.388233] fca3de20 9ac15d93 RTAI 200
[ 5073.388238] c085cb20 0 Linux 100
[ 5073.416421] RTAI[malloc]: global heap size = 2097152 bytes, <BSD>.
[ 5073.417283] RTAI[sched]: IMMEDIATE, MP, USER/KERNEL SPACE: <with RTAI OWN KTASKs>, kstacks pool size = 524288 bytes.
[ 5073.417294] RTAI[sched]: hard timer type/freq = APIC/12468720(Hz); default timing: periodic; linear timed lists.
[ 5073.417301] RTAI[sched]: Linux timer freq = 250 (Hz), TimeBase freq = 2992667000 hz.
[ 5073.417307] RTAI[sched]: timer setup = 999 ns, resched latency = 2944 ns.
[ 5073.417440] RTAI[usi]: enabled.
[ 5073.505313] RTAI[math]: loaded.
[ 5073.708346] config string '0x0378'
[ 5076.792568] RTAI[math]: unloaded.
[ 5076.868542] SCHED releases registered named ALIEN RTGLBH
[ 5076.900889] RTAI[malloc]: unloaded.
[ 5077.000047] RTAI[sched]: unloaded (forced hard/soft/hard transitions: traps 0, syscalls 0).
[ 5077.004708] I-pipe: Domain RTAI unregistered.
[ 5077.004785] RTAI[hal]: unmounted.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: MyGUI

Сообщение nkp »

да ,забыл отметить:
если пользуем linuxcnc (а не емс) - то модуль rev.py такой:

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

#!/usr/bin/python
import hal, time,linuxcnc
h = hal.component("rev")
h.newpin("rev", hal.HAL_BIT, hal.HAL_IN)
h.newpin("rerev", hal.HAL_BIT, hal.HAL_IN)
h.newpin("program-line", hal.HAL_FLOAT, hal.HAL_IN)
h.ready()
c =linuxcnc.command()
def back():
	c.abort()
	c.wait_complete()		
	c.auto(emc.AUTO_RUN , program_start_line)
def again_forward ():
	c.abort()
	c.wait_complete()
	program_start_line = int(program_start_line) + 1
	c.auto(emc.AUTO_RUN , program_start_line)
try:
    while 1:
	program_start_line = int(h["program-line"])-2
	 
	if h["rev"]==1:
		back()
		time.sleep(0.1)
		h["rev"]=0
		print program_start_line

except KeyboardInterrupt:
    raise SystemExit

то есть разница в импортируемых модулях(точнее в их названии)
зы лучше попробовать внести изменения как в #545 (всего 8 строк кода) :проще, без привязки к хал,и работает в любой конфигурации
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: MyGUI

Сообщение vmarkiv »

По #545 ошибки Print file information:
RUN_IN_PLACE=no
LINUXCNC_DIR=
LINUXCNC_BIN_DIR=/usr/bin
LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
LINUXCNC_SCRIPT_DIR=
LINUXCNC_RTLIB_DIR=/usr/realtime-2.6.32-122-rtai/modules/linuxcnc
LINUXCNC_CONFIG_DIR=
LINUXCNC_LANG_DIR=/usr/share/linuxcnc/tcl/msgs
INIVAR=inivar
HALCMD=halcmd
LINUXCNC_EMCSH=/usr/bin/wish8.5
LINUXCNC - 2.5.1
Machine configuration directory is '/home/cnc/linuxcnc/configs/EDM1'
Machine configuration file is 'Sherline3Axis_mm.ini'
INIFILE=/home/cnc/linuxcnc/configs/EDM1/Sherline3Axis_mm.ini
PARAMETER_FILE=stepper.var
TASK=milltask
HALUI=halui
DISPLAY=axis
Starting LinuxCNC...
Starting LinuxCNC server program: linuxcncsvr
Loading Real Time OS, RTAPI, and HAL_LIB modules
Starting LinuxCNC IO program: io
Starting HAL User Interface program: halui
Starting TASK program: milltask
Starting DISPLAY program: axis
Shutting down and cleaning up LinuxCNC...
Killing task linuxcncsvr, PID=9069
Killing task milltask, PID=9120
Removing HAL_LIB, RTAPI, and Real Time OS modules
Removing NML shared memory segments
Cleanup done

Debug file information:
Can not find -sec MOT -var MOT -num 1
Can not find -sec IO -var IO -num 1
Can not find -sec LINUXCNC -var NML_FILE -num 1
Can not find -sec EMC -var NML_FILE -num 1
rev.py:2: DeprecationWarning: the emc module is deprecated; use the linuxcnc module instead
import hal, time, emc
File "/usr/bin/axis", line 1807
s.poll()
^
IndentationError: unindent does not match any outer indentation level
9069
PID TTY STAT TIME COMMAND
9120
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components

Kernel message information:
[ 6986.863061] I-pipe: Domain RTAI registered.
[ 6986.863073] RTAI[hal]: <3.8.1> mounted over IPIPE-NOTHREADS 2.6-03.
[ 6986.863079] RTAI[hal]: compiled with gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) .
[ 6986.863145] RTAI[hal]: mounted (IPIPE-NOTHREADS, IMMEDIATE (INTERNAL IRQs DISPATCHED), ISOL_CPUS_MASK: 0).
[ 6986.863150] PIPELINE layers:
[ 6986.863155] fa3dce20 9ac15d93 RTAI 200
[ 6986.863160] c085cb20 0 Linux 100
[ 6986.896331] RTAI[malloc]: global heap size = 2097152 bytes, <BSD>.
[ 6986.896745] RTAI[sched]: IMMEDIATE, MP, USER/KERNEL SPACE: <with RTAI OWN KTASKs>, kstacks pool size = 524288 bytes.
[ 6986.896757] RTAI[sched]: hard timer type/freq = APIC/12468720(Hz); default timing: periodic; linear timed lists.
[ 6986.896764] RTAI[sched]: Linux timer freq = 250 (Hz), TimeBase freq = 2992667000 hz.
[ 6986.896769] RTAI[sched]: timer setup = 999 ns, resched latency = 2944 ns.
[ 6986.896894] RTAI[usi]: enabled.
[ 6986.986062] RTAI[math]: loaded.
[ 6987.214376] config string '0x0378'
[ 6988.729366] RTAI[math]: unloaded.
[ 6988.791508] SCHED releases registered named ALIEN RTGLBH
[ 6988.820910] RTAI[malloc]: unloaded.
[ 6988.920530] RTAI[sched]: unloaded (forced hard/soft/hard transitions: traps 0, syscalls 0).
[ 6988.924629] I-pipe: Domain RTAI unregistered.
[ 6988.924716] RTAI[hal]: unmounted.
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: MyGUI

Сообщение vmarkiv »

файл axis
Вложения
axis.zip
редуктирован
(28.31 КБ) 696 скачиваний
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: MyGUI

Сообщение vmarkiv »

С версией
nkp писал(а):то модуль rev.py такой:
и версией вставки файла из сообщ 545 ошибки такие Print file information:

Can not find -sec LINUXCNC -var NML_FILE -num 1
Can not find -sec EMC -var NML_FILE -num 1
File "rev.py", line 2
import hal, time,linuxcnc
^
IndentationError: unexpected indent
core_stepper.hal:54: python exited without becoming ready
9886
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components
Ответить

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