Страница 4 из 10
Re: Python в LinuxCnC
Добавлено: 30 май 2012, 20:29
nkp
Скрипт для трех осей:
- idle.py.tar
- (править путь к файлам)
- (10 КБ) 528 скачиваний
Вывод в виде:
Код: Выделить всё
17 X3.254869 Y0.8354206 Z0
18 X3.2852 Y0.8097 Z0
19 X3.310461 Y0.7785634 Z0
20 X3.329075 Y0.7431 Z0
21 X3.340199 Y0.7036305 Z0
22 X3.3437 Y0.6627 Z0
В хал добавлено:
Код: Выделить всё
loadrt conv_s32_float
addf conv-s32-float.0 servo-thread
net numb motion.program-line conv-s32-float.0.in
loadrt minmax
addf minmax.0 servo-thread
net numb1 conv-s32-float.0.out minmax.0.in
Загружаем ж-код,ставим на пошаговый режим,запускаем наш скрипт-получаем вывод.
Re: Python в LinuxCnC
Добавлено: 31 май 2012, 19:56
Nick
А как взять координаты именно в начале кадра???
Re: Python в LinuxCnC
Добавлено: 31 май 2012, 20:39
nkp
Nick писал(а):А как взять координаты именно в начале кадра???
Что ты имеешь в виду?
Разве точка в которую пришли в n кадре не есть начальной для n+1 кадра?
Re: Python в LinuxCnC
Добавлено: 01 июн 2012, 10:16
Nick
Но эта точка бей отступов.
Или этим скриптом мы решаем только проблему o-кодов?
Re: Python в LinuxCnC
Добавлено: 01 июн 2012, 13:21
nkp
Nick писал(а):бей отступов

Просвети
Re: Python в LinuxCnC
Добавлено: 01 июн 2012, 14:59
Nick
без отступов...
Ну в смысле все g54..., g92, все относительные координаты все равно не сработают. Да фактически все, что в циклах будет бесполезно.
Да и кстати, есть какая-то гарантия, что мы не пропустим какую-нибудь строчку, если user-space компонент не обновится вовремя.
Re: Python в LinuxCnC
Добавлено: 04 июн 2012, 20:56
vmarkiv
В MACH3 есть встроенная функция реверса , она прекрасно работает на линейных перемещениях , на круговых часто сбоит , может в SDK есть исходники ...
Re: Python в LinuxCnC
Добавлено: 04 июн 2012, 21:02
nkp
А в маче есть реверс-реверс ?
Что то навроде
http://www.youtube.com/watch?v=ZPGiGrP8EC8
Re: Python в LinuxCnC
Добавлено: 04 июн 2012, 21:11
vmarkiv
В маче - реверс -- работаеш ( к примеру - режешь кислородной резкой сталь 20мм - погас огонь ) -- делаеш паузу , нажимаеш реверс - возвращаешся в точку обрыва -- включаеш пуск программы . Все . А Реверс-реверс - ИНТЕРЕСНО ...
Re: Python в LinuxCnC
Добавлено: 04 июн 2012, 21:21
psha
axis сам особо гкод не парсит, выдергивать бессмысленно
Если хочется каких-нибудь хитрых плюшек надо идти на #linuxcnc-devel и ловить mhaberler
Он это всё довольно ощутимо менял.
upd
В догонку. Аналогов setp/getp в питоне (hal) нет и не будет насколько я понимаю. Это дизайн такой. Хочется
получать значения - подключайтесь к сигналам.
Модули hal и emc будут работать только с тем питоном, с которым они собирались. То есть 2.6 (или 2.7, если самосборное
и стоит соответствующий).
Re: Python в LinuxCnC
Добавлено: 04 июн 2012, 22:12
Nick
Т.е. я так понимаю надо выработать необходимое и достаточное задание, на котором остановиться.
Т.е. скажем по боку все О коды, побоку отступы делаем просто инверс G01 и G03, кстати, можно попробовать сделать инверс только до последнего понятного кода. Как только встречаем что-то плохое, заканчиваем.
Re: Python в LinuxCnC
Добавлено: 08 июн 2012, 15:35
nkp
вот строка которая выводит через ком порт команду:
Код: Выделить всё
[code]data = "".join(map(chr, [0x01,0x06,0x00,0x00,0x00,0x00,0x89,0xCA]))
ser.write(data)[/code]
все работает
На вот тепеь надо допустим что то на подобие:
Код: Выделить всё
x1=2**0
x2=2**1
x3=2**2
b=x1+x2+x3
bb=hex(123)
И уже у нас bb строка.
А нам надо как то ее засунуть сюда:
Код: Выделить всё
data = "".join(map(chr, [0x01,0x06,0x00,0x00,bb,0x89,0xCA]))
не нахожу решение
Re: Python в LinuxCnC
Добавлено: 08 июн 2012, 21:43
Nick
чего-то не понимаю...
join - функция строки, в качестве параметров принимает массив, map применяет фунцию к каждому элементу массива, т.е.
string.join(map(chr,[x1,x2,x3])) = chr(x1)+string+chr(x2)+string+chr(x3), где + это конкатенация строк.
в твоем случае "" - пустая строка, т.е. просто символы соединяются вместе.
осталось правильно переменные в листе расставить.
Re: Python в LinuxCnC
Добавлено: 08 июн 2012, 21:52
nkp
Nick писал(а):чего-то не понимаю...
вот здесь:
Код: Выделить всё
x1=2**0
x2=2**1
x3=2**2
b=x1+x2+x3
bb=hex(123)
bb='0x7b'
то есть -строка
и с ней не работает так:
Код: Выделить всё
data = "".join(map(chr, [0x01,0x06,0x00,0x00,0x00,bb,0x89,0xCA]))
ser.write(data)
Надо как то '0x7b' преобразовать в 0x7b
то есть строку в число hex
Re: Python в LinuxCnC
Добавлено: 09 июн 2012, 11:57
Nick
bb="0x7b"
prtint int(bb,0)
int(число, основание) - т.е. вместо 0 можно написать 16. Вроде работает и так и так.
Хотя вообще не так, тебе надо число 123 преобразовать в текстовый символ 1 байта, правильно?
тогда просто bb = chr(123)
hex делает именно строку с представлением числа в шестнадцатеричной системе.
Re: Python в LinuxCnC
Добавлено: 04 сен 2012, 15:21
nkp
подскажите:
вот файл скрипта
запускаем ,открываем диалог "open file" , выбираем файл - все работает
но если вторично вызвать диалоговое окошко - вылетает с ошибкой
Код: Выделить всё
1.py:26: GtkWarning: gtk_file_chooser_add_filter: assertion `GTK_IS_FILE_CHOOSER (chooser)' failed
self.dialog.add_filter(filter)
Ошибка сегментирования
вот код скрипта:
Код: Выделить всё
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import re
import pygtk
import gtk
from gladevcp.gladebuilder import GladeBuilder
import gladevcp
class Widgets:
def __init__(self, xml):
self._xml = xml
def __getattr__(self, attr):
r = self._xml.get_object(attr)
if r is None: raise AttributeError, "No widget %r" % attr
return r
def __getitem__(self, attr):
r = self._xml.get_object(attr)
if r is None: raise IndexError, "No widget %r" % attr
class Test:
def open(self, data=None):
filter = gtk.FileFilter()
filter.set_name(".ngc")
self.dialog.set_current_folder('/home/nkp/emc2/nc_files')
filter.add_pattern("*.ngc")
self.dialog.add_filter(filter)
response = self.dialog.run()
filename = self.dialog.get_filename()
self.dialog.destroy()
self.filename =filename
self.update(self)
print self.filename , 'filename'
def update(self, data=None):
self.ent = [
self.widgets.entry1,self.widgets.entry2,
self.widgets.entry3,self.widgets.entry4,
self.widgets.entry5,self.widgets.entry6,
self.widgets.entry7,self.widgets.entry8,
self.widgets.entry9,self.widgets.entry10,
self.widgets.entry11,self.widgets.entry12,
self.widgets.entry13,self.widgets.entry14
]
self.ent1 = [
self.widgets.entry15,self.widgets.entry16,
self.widgets.entry17,self.widgets.entry18,
self.widgets.entry19,self.widgets.entry20,
self.widgets.entry21,self.widgets.entry22,
self.widgets.entry23,self.widgets.entry24,
self.widgets.entry25,self.widgets.entry26,
self.widgets.entry27,self.widgets.entry28
]
f = open(self.filename, "r")
lines = f.readlines()
x=0
q=0
while x < len(lines):
if re.search("#\d+ *[(*]", lines[x]):
vel=re.findall('[(][=][-]?.?0?\d*[.]?\d*', lines[x])
#парсим комментарии
dat=re.findall('[(].+', lines[x])
dat1=re.findall('\s+.+', dat[0])
print dat1 ,'DATA'
if len(dat1) != 0:
self.ent1[q].set_text(dat1[0])
else:
self.ent1[q].set_text('')
vel1=re.findall('[-]?\d+[.]?\d*', vel[0])
print vel1
if len(vel) != 0:
self.ent[q].set_text(vel1[0])
else:
self.ent[q].set_text('')
q+=1
x+=1
#скрываем незанятые поля
t=0
while t+q < 14 :
for r in self.ent :
w=self.ent[q+t]
w.hide()
t+=1
print q
tt=0
while tt+q < 14 :
for k in self.ent1 :
wd=self.ent1[q+tt]
wd.hide()
tt+=1
self.q=q
f.close()
def make (self,widget, data=None):
self.d = {
1:self.widgets.entry1.get_text(),2:self.widgets.entry2.get_text(),
3:self.widgets.entry3.get_text(),4:self.widgets.entry4.get_text(),
5:self.widgets.entry5.get_text(),6:self.widgets.entry6.get_text(),
7:self.widgets.entry7.get_text(),8:self.widgets.entry8.get_text(),
9:self.widgets.entry9.get_text(),10:self.widgets.entry10.get_text(),
11:self.widgets.entry11.get_text(),12:self.widgets.entry12.get_text(),
13:self.widgets.entry13.get_text(),14:self.widgets.entry14.get_text()
}
for i in self.d.keys() :
try:
v = int(self.d.get(i))
except ValueError:
print "Вводите только цифры"
def finish (self, data=None):
f = open("/home/nkp/ngcgui.ngc", "w")
fname0=re.findall('\w+\.', self.filename)
fname1=re.findall('\w+', fname0[0])
print fname1
ser=' '
n=['o','<', fname1[0], '>','call', '\n','M2']
h=1
m=5
while h <= self.q:
n.insert(m, '[')
m+=1
n.insert(m, self.d.get(h))
m+=1
n.insert(m, ']')
h+=1
m+=1
print n
j=ser.join(n)
f.write(j)
f.close()
gtk.main_quit()
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file("1.glade")
self.builder.connect_signals(self)
self.builder.get_object("window1").show()
self.widgets = Widgets(self.builder)
g=self.widgets.image2.path()
self.dialog = gtk.FileChooserDialog("Open ngcgui_file",
self.builder.get_object("window1"),
gtk.FILE_CHOOSER_ACTION_OPEN,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK))
print g ,'image2'
if __name__ == "__main__":
main = Test()
gtk.main()
в чем может быть проблема???????
Re: Python в LinuxCnC
Добавлено: 04 сен 2012, 16:29
Алексс
nkp писал(а):self.dialog.destroy()
вот это закомментируй и пройдет. ты после первого вызовы диалог освободил а потом опять его вызываешь.
либо создавай диалог перед вызовом каждый раз.
Re: Python в LinuxCnC
Добавлено: 04 сен 2012, 16:34
Алексс
я так подумал - последний вариант предпочтительней ибо избавит тебя от двойных фильтров
self.dialog.add_filter(filter)
и прочих артефактов.
Re: Python в LinuxCnC
Добавлено: 04 сен 2012, 17:31
nkp
Спасибо!!!!
Направление было верное

Re: Python в LinuxCnC
Добавлено: 16 дек 2012, 12:23
nkp
есть желание использовать функцию submit() из модуля hal_mdihistory.py
(повесить ее на хардовую кнопку для старта MDI команды)
импортирую модуль:
далее в __init__ :
Код: Выделить всё
self.subm=gladevcp.hal_mdihistory .EMC_MDIHistory()
self.widgets.button5.connect("clicked", self.mdi_start)
и сама функция mdi_start :
Код: Выделить всё
def mdi_start(self,widget):
self.subm.submit()
print 'cmd'
ни питон ,ни емс ни на что не ругается - но и submit() не отрабатывает
подскажите - что не так ???