Страница 1 из 9
LinuxCNC реверс Gкода
Добавлено: 06 дек 2012, 12:44
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)
а вот включая пошаговый :
мы не можем арументом указать требуемый стартовый кадр
(может выйдет и имеющимися средствами обойтись - а может и модуль linuxcnc.so нужно изменять)
какие у кого мнения по самому принципу?
Re: MyGUI
Добавлено: 06 дек 2012, 19:25
Nick
А что будет, если написать:
Код: Выделить всё
self.c.auto(linuxcnc.AUTO_STEP, self.program_start_line)
Re: MyGUI
Добавлено: 06 дек 2012, 19:44
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)
Re: MyGUI
Добавлено: 06 дек 2012, 20:20
nkp
в принципе - учитывая потребность в отходе на сравнительно небольшое расстояние при кз (в EDM)
даже такое решение может быть достаточным
https://www.youtube.com/watch?v=ZP9MvwxHZJA
естественно вместо кнопок получаем сигнал напряжения на эрозионном промежутке
и "на весь" кадр конечно не нужно отходить - только до устранения кз
Re: MyGUI
Добавлено: 06 дек 2012, 21:35
Nick
nkp писал(а):как и следовало ожидать:
TypeError: function takes exactly 1 argument (2 given)
Так функция же одна и та же?!
Можешь целиком ошибку скопировать?
nkp писал(а):в принципе - учитывая потребность в отходе на сравнительно небольшое расстояние при кз (в EDM)
даже такое решение может быть достаточным
Ахренеть!

Это медаль!
Ток я не понял, а как ты все это сделал??? По кнопке реверсируется Gкод, и автоматом загружается в MyGUI? Кстати, код целиком реверсируешь и после загрузки есть пройденный путь (который раньше был окончанием траектории)?
Re: MyGUI
Добавлено: 06 дек 2012, 22:00
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)
то таким образом можно было бы отходить хоть до начала...
найти бы для начала исходники модуля...
Re: MyGUI
Добавлено: 06 дек 2012, 23:48
nkp
вот исходники модуля linuxcnc.so
насколько я понимаю - именно в нем сосредоточена большая часть(или весь?) интерфейса емс
знатокам Си:
возможно ли изменение работы в пошаговом режиме с указанием начального кадра
(по аналогии с c.auto(linuxcnc.AUTO_RUN, self.program_start_line) - где
вторым аргументом указываем номер начального кадра(строки)
хочеться иметь команду:
Код: Выделить всё
c.auto(linuxcnc.AUTO_STEP, self.program_start_line)
наверно вот эта функция:
Код: Выделить всё
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;
}
Re: MyGUI
Добавлено: 07 дек 2012, 00:03
Serg
по
c.auto(linuxcnc.AUTO_STEP
оно должно "провалится" вот сюда
case LOCAL_AUTO_STEP: ...
Останется только проверить наличие второлго аргумента...
Не понял только что делает PyArg_ParseTuple(...), вроде достаёт соотв. аргументы, надо только почитать как.
Re: MyGUI
Добавлено: 07 дек 2012, 00:20
nkp
PyArg_ParseTuple(...) как я понял конвертирует типы данных из питоновских в сишные...
Re: MyGUI
Добавлено: 07 дек 2012, 00:26
Serg
Возможно, я просто не понял эти "i" и "ii", а уже спать охота.

Re: MyGUI
Добавлено: 07 дек 2012, 11:26
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
}
Re: MyGUI
Добавлено: 08 дек 2012, 13:40
nkp
выложу файлы где отходы можно протестировать в axis
функции повесил на кнопки zoom (на видео видно)
принцип простой : командуем начать выполнение с такого то кадра( точнее строки)
из-за этого есть ограничения по структуре программы(ж-кода)
но это решается простым парсером кода
https://www.youtube.com/watch?v=fEMpiFBwznc
для "попробовать" нужно:
1. заменить "родной" файл axis.py (который лежит /usr/bin) - это в случае с установленным в систему емс (делаем под root, не забывая сохранить оригинальный файл)
2. папку EDM1 положить в папку configs к остальным конфигурационным директориям
то же можно сделать и на установленном емс из исходников(еще проще )
этот примитивный ж-код в архиве (1_re.ngc)
----------------
маленькое отступление:
я стараюсь ставить емс в мужском роде - ведь это контроллер - он
а язык чешеться всегда сказать емс - она
--------------
Re: MyGUI
Добавлено: 08 дек 2012, 19:05
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
Re: MyGUI
Добавлено: 09 дек 2012, 00:19
nkp
Nick писал(а):Попробуй :Вместо: if(!PyArg_ParseTuple(o, "i", &fn)) return NULL;
наверно в этом модуле только исключительно интерфейс "общения " с помощью питона
а основные функции режимов (AUTO_RUN , AUTO_STEP,...) зарыты глубже...
найти бы где это????
там бы уже попытаться прицепить к step номер стартового кадра
Re: MyGUI
Добавлено: 09 дек 2012, 01:32
Nick
А что получается, если if поменять?
Re: MyGUI
Добавлено: 09 дек 2012, 12:53
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.
Re: MyGUI
Добавлено: 09 дек 2012, 13:20
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 строк кода) :проще, без привязки к хал,и работает в любой конфигурации
Re: MyGUI
Добавлено: 09 дек 2012, 13:26
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.
Re: MyGUI
Добавлено: 09 дек 2012, 13:28
vmarkiv
файл axis
Re: MyGUI
Добавлено: 09 дек 2012, 13:35
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