Страница 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 писал(а):бей отступов
:wik: Просвети

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
подскажите:
вот файл скрипта
1.py.rar
(1.56 КБ) 457 скачиваний
запускаем ,открываем диалог "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
Спасибо!!!!
Направление было верное :good:

Re: Python в LinuxCnC

Добавлено: 16 дек 2012, 12:23
nkp
есть желание использовать функцию submit() из модуля hal_mdihistory.py
(повесить ее на хардовую кнопку для старта MDI команды)
импортирую модуль:

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

import gladevcp.hal_mdihistory 
далее в __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() не отрабатывает
подскажите - что не так ???
hal_mdihistory.py.rar
(1.47 КБ) 467 скачиваний