Python в LinuxCnC

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

Re: Python в LinuxCnC

Сообщение 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 
Загружаем ж-код,ставим на пошаговый режим,запускаем наш скрипт-получаем вывод.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

А как взять координаты именно в начале кадра???
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а):А как взять координаты именно в начале кадра???
Что ты имеешь в виду?
Разве точка в которую пришли в n кадре не есть начальной для n+1 кадра?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Но эта точка бей отступов.
Или этим скриптом мы решаем только проблему o-кодов?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а):бей отступов
:wik: Просвети
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

без отступов...
Ну в смысле все g54..., g92, все относительные координаты все равно не сработают. Да фактически все, что в циклах будет бесполезно.
Да и кстати, есть какая-то гарантия, что мы не пропустим какую-нибудь строчку, если user-space компонент не обновится вовремя.
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: Python в LinuxCnC

Сообщение vmarkiv »

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

Re: Python в LinuxCnC

Сообщение nkp »

А в маче есть реверс-реверс ?
Что то навроде http://www.youtube.com/watch?v=ZPGiGrP8EC8
vmarkiv
Мастер
Сообщения: 516
Зарегистрирован: 21 янв 2012, 00:23
Репутация: 32
Откуда: Ивано-Франковск
Контактная информация:

Re: Python в LinuxCnC

Сообщение vmarkiv »

В маче - реверс -- работаеш ( к примеру - режешь кислородной резкой сталь 20мм - погас огонь ) -- делаеш паузу , нажимаеш реверс - возвращаешся в точку обрыва -- включаеш пуск программы . Все . А Реверс-реверс - ИНТЕРЕСНО ...
psha
Опытный
Сообщения: 147
Зарегистрирован: 28 фев 2011, 11:11
Репутация: 1
Контактная информация:

Re: Python в LinuxCnC

Сообщение psha »

axis сам особо гкод не парсит, выдергивать бессмысленно
Если хочется каких-нибудь хитрых плюшек надо идти на #linuxcnc-devel и ловить mhaberler
Он это всё довольно ощутимо менял.

upd
В догонку. Аналогов setp/getp в питоне (hal) нет и не будет насколько я понимаю. Это дизайн такой. Хочется
получать значения - подключайтесь к сигналам.

Модули hal и emc будут работать только с тем питоном, с которым они собирались. То есть 2.6 (или 2.7, если самосборное
и стоит соответствующий).
root, доделай конвертацию! :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Т.е. я так понимаю надо выработать необходимое и достаточное задание, на котором остановиться.
Т.е. скажем по боку все О коды, побоку отступы делаем просто инверс G01 и G03, кстати, можно попробовать сделать инверс только до последнего понятного кода. Как только встречаем что-то плохое, заканчиваем.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение 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]))
не нахожу решение
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

чего-то не понимаю...

join - функция строки, в качестве параметров принимает массив, map применяет фунцию к каждому элементу массива, т.е.
string.join(map(chr,[x1,x2,x3])) = chr(x1)+string+chr(x2)+string+chr(x3), где + это конкатенация строк.

в твоем случае "" - пустая строка, т.е. просто символы соединяются вместе.

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

Re: Python в LinuxCnC

Сообщение 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
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

bb="0x7b"
prtint int(bb,0)

int(число, основание) - т.е. вместо 0 можно написать 16. Вроде работает и так и так.

Хотя вообще не так, тебе надо число 123 преобразовать в текстовый символ 1 байта, правильно?
тогда просто bb = chr(123)

hex делает именно строку с представлением числа в шестнадцатеричной системе.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

подскажите:
вот файл скрипта
1.py.rar
(1.56 КБ) 456 скачиваний
запускаем ,открываем диалог "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()
	
в чем может быть проблема???????
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: Python в LinuxCnC

Сообщение Алексс »

nkp писал(а):self.dialog.destroy()
вот это закомментируй и пройдет. ты после первого вызовы диалог освободил а потом опять его вызываешь.
либо создавай диалог перед вызовом каждый раз.
Каждая собака, бегущая на поводке впереди хозяина, думает, что ведет его за собой.
Аватара пользователя
Алексс
Почётный участник
Почётный участник
Сообщения: 2210
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 266
Заслуга: IQ32
Настоящее имя: Алексей
Откуда: Прага
Контактная информация:

Re: Python в LinuxCnC

Сообщение Алексс »

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

Re: Python в LinuxCnC

Сообщение nkp »

Спасибо!!!!
Направление было верное :good:
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение 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 скачиваний
Ответить

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