Передача данных EMC <--> COM

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Передача данных EMC <--> COM

Сообщение aftaev »

Нужно сделать обмен данными внешнее устройство и ЕМС по СОМ по RS232(485).
Начнем с простого:
1. Как сделать в ЕМС какое нибудь поле и кнопку?
2. Как нажав на кнопку отправить введенное значение в поле в заданный СОМ порт?

В качестве RS232 приемника для ПРИМЕРА будет выступать это устройство http://www.ebay.com/itm/Micro-Portable- ... 19ced5436f
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение Nick »

aftaev писал(а):1. Как сделать в ЕМС какое нибудь поле и кнопку?
Какое поле, что в нем будет?
aftaev писал(а):2. Как нажав на кнопку отправить введенное значение в поле в заданный СОМ порт?
Надо написать компонент на любом удобном языке, который сможет работать с пинами hal и отправлять значения по RS232.

А можно вообще отдельную программку написать, которая будет иметь кнопку и любое поле. И запускать ее вместе с emc. Помимо ручного использования кнопки, она будет к чему-то еще привязываться?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение aftaev »

Nick писал(а):Какое поле, что в нем будет?
Поле ввода. Вводим туды циферки например 123456 жмакаем на кнопку и ушли они в СОМ
Nick писал(а):А можно вообще отдельную программку написать, которая будет иметь кнопку и любое поле. И запускать ее вместе с emc. Помимо ручного использования кнопки, она будет к чему-то еще привязываться?
Это будет ТНС для плазмы, но пока нужно обкатать работу ЕМС-PIC/ Потому достаточно в ЕМС нарисовать поле чтоб ввели цеферки, нажали ОТПРАВИТь и PIC принял. Дальше это как то привязать в HAL чтоб постояно был обмен данными.
Таже история и для общения ЕМС-ПУЛЬТ

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

Re: Передача данных EMC <--> COM

Сообщение psha »

Взять обычный SpinButton и в компоненте повесить на изменение отправку данных.
http://psha.org.ru/cgit/psha/owenio/tre ... ent-trm151
root, доделай конвертацию! :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение Nick »

по личной просьбе раскроем тему боле подробно :)

1. создаем файл pyvcp.xml с таким содержанием:

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

<pyvcp>
	<labelframe text="Send to RS-232">
	    <font>("Helvetica",16)</font>
	    <vbox>
			<spinbox>
				<halpin>"my-spinbox"</halpin>
				<min_>-12</min_>
				<max_>33</max_>
				<initval>0</initval>
				<resolution>0.1</resolution>
				<format>"2.3f"</format>
				<font>("Arial",30)</font>
			</spinbox>
			<button>
				<halpin>"send"</halpin>
				<text>"Send"</text>
			</button>
	    </vbox>
	</labelframe>
</pyvcp>
2. в ini файле в разделе [DISPLAY] пишем PYVCP = pyvcp.xml. После этого при запуске emc2 у нас появится панелька и кнопка. Осталось привязать их пины.
3. Открываем файл custom_postgui.hal и пишем в нем следующее:

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

loadusr -Wn rs232 python rs232.py 
net rs232-exec	<= pyvcp.send 			=>	rs232.exec
net rs232-in0	<= pyvcp.my-spinbox 	=>	rs232.in0
4. Создаем скрипт, который будет общаться по RS232:
Я еще пока не до конца его переделал... Надо дописать процедуру записи и чтения порта...

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: sts=4 sw=4 et
""" Based on http://psha.org.ru/cgit/psha/owenio/tree/owen-component-trm151
	Hope this sould be licenced under GNU GPL 2 or later. 
	Never the less all changes are GNU GPL 2.
"""


import sys, serial, time
from owen import Packet, unpack_ieee32
import owen

import hal

tty = '/dev/ttyS0'
if len(sys.argv) > 1:
	tty = sys.argv[1]
timeout = 0.1

#TODO got to rewrite this 
"""
def serial_request(s, aidx=0, cmd='n.Err', fmt='', *a, **kw):
	p = owen.Packet(name=cmd, **kw)
	p.address += aidx
	p.data = owen.pack(fmt, *a)
	s.write(p.encode_ascii())
	d = s.read(128)
	if not d:
		return owen.Packet()
	return owen.Packet.decode_ascii(d)

def return_none(f):
	def _f(*a, **kw):
		try:
			return f(*a, **kw)
		except:
			return None
	return _f

@return_none
def read_val(s, idx=0):
	p = serial_request(s, 0, 'SP.LU', 'h', idx)
	return owen.unpack('dh', p.data)[0]

@return_none
def write_val(s, idx, temp):
	r = serial_request(s, 0, 'SP.LU', 'dh', temp, idx, request=False)
"""



class RS232:
	def __init__(self):
		
		self.comp = hal.component('rs232')

		self.exec_pin = self.comp.newpin("exec", hal.HAL_BIT, hal.HAL_IN)
		self.pins = {}		
		self.pin_in['bit']   = dict([[i, self.comp.newpin(i, hal.HAL_BIT, hal.HAL_IN)] for i in "".split])
		self.pin_in['s32']   = dict([[i, self.comp.newpin(i, hal.HAL_S32, hal.HAL_IN)] for i in "".split])
		self.pin_in['u32']   = dict([[i, self.comp.newpin(i, hal.HAL_U32, hal.HAL_IN)] for i in "".split])
		self.pin_in['float'] = dict([[i, self.comp.newpin(i, hal.HAL_FLOAT, hal.HAL_IN)] for i in "".split])

		self.pin_out['bit']   = dict([[i, self.comp.newpin(i, hal.HAL_BIT, hal.HAL_OUT)] for i in "".split])
		self.pin_out['s32']   = dict([[i, self.comp.newpin(i, hal.HAL_S32, hal.HAL_OUT)] for i in "".split])
		self.pin_out['u32']   = dict([[i, self.comp.newpin(i, hal.HAL_U32, hal.HAL_OUT)] for i in "".split])
		self.pin_out['float'] = dict([[i, self.comp.newpin(i, hal.HAL_FLOAT, hal.HAL_OUT)] for i in "".split])

		self.port = serial.Serial(tty)
		self.port.setTimeout(timeout)
		
		self.comp.ready()

	def read(self) :
		for i in self.in_pin:
			for pin in i :
				pass #TODO

	def write(self) :
		for i in self.out_pin:
			for pin in i :
				pass #TODO
			

try:
	rs232 = RS232()
	last_exec = None
	while True:
		if rs232.exec_pin == 1 and last_exec == None :
			rs232.read()
			time.sleep(0.01); 
			rs232.write()
		time.sleep(0.1)
		last_exec = rs232.exec_pin
		
except Exception, e:
	import traceback
	traceback.print_exc()
	print e
	comp.exit()
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение nkp »

Может кому будут полезны результаты попытки разобраться с com портом .До этого с ним не сталкивался, (наверно потому что он сзади компьютера :hehehe:) .
Для того чтоб передавать в порт и его же слушать использовал "заглушку" с перемычками: Файл "навороченного" интерфейса:
com.ui.rar
(741 байт) 535 скачиваний
Скрипт:
com.py.rar
(241 байт) 633 скачивания
Оба файла после распаковки ложим в папку с вашей конфигурацией .
В ini файл секция [DISPLAY] пишем: GLADEVCP = -u com.py com.ui
В скрипте используем pyserial.Если не стоит в системе-установить:
pyserial-2.6.tar.gz
(113.56 КБ) 1184 скачивания
Должно получиться:
(для просмотра содержимого нажмите на ссылку)
Выделение_050.png
Выделение_050.png (10.95 КБ) 3961 просмотр
Вывод на лейбл еще не работает, так что смотрим где?...конечно в терминале :)
вводим

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

$ python
$ import serial 
$ ser = serial.Serial('/dev/ttyS0', 19200, timeout=1)
это мы открыли порт и прописали настройки
Теперь читаем порт

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

x = ser.read()       
print x 
Пусто! Вводим данные,жмем enter , потом- "Запись".
(для просмотра содержимого нажмите на ссылку)
Выделение_052.png
Выделение_052.png (7.23 КБ) 3961 просмотр
Читаем теперь: продолжение следует...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение Nick »

Ухты! Здорово!

Афтаев, срочно начинай тестировать! :)
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение aftaev »

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

Re: Передача данных EMC <--> COM

Сообщение Nick »

Ну, так настройки в одной строке указываются. Какие у твоего принтера настройки?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение aftaev »

Nick писал(а):Ну, так настройки в одной строке указываются. Какие у твоего принтера настройки?
В ЕМС мож и в одной строчке а вот с PIC куды веселее :)

Xtal=12
Declare Hserial_Baud 57600 ' Sets the BAUD rate that will be used to receive a value serially
Declare Hserial_TXSTA = %00100100 ' Sets the respective PICmicro hardware register TXSTA. Transmitter enable
Declare Hserial_RCSTA = %10000000 ' Sets the respective PICmicro hardware register, RCSTA. Receiver disable
Declare Hserial_SPBRG 12 ' Sets the respective PICmicro hardware register, SPBRG
Declare Hserial_Clear = On ' Clear the overflow error flag before commencing a read
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение nkp »

В этом файле проще изменять настройки порта
com.py.rar
(654 байт) 584 скачивания
(в коментах может я и ошибся)
(для просмотра содержимого нажмите на ссылку)

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

# -*- coding: utf-8 -*-
import serial
import gtk

debug = 0

class HandlerClass: 

    def on_button1_pressed(self,widget,data=None):
				
		self.baudrate = 38400 #скорость
		self.port = '/dev/ttyS0'# порт в системе
		self.bytesize=8  # 8 бит 
		self.t=2  # таймаут
		self.parity='N' # паритет
		self.xonxoff=0  #програмное управление
		self.rtscts=0  #Установка аппаратного управления
		self.dsrdtr=0  #???
		self.ser = serial.Serial(self.port,self.baudrate,timeout=self.t) 
		
		self.ser.write(entry_text)
		print self.ser
	
    def on_entry_activate(widget,en):
		global entry_text 
		entry_text = en.get_text() 
    
    def on_button2_pressed(self,d=3):  
		self.baudrate = 38400
		self.port = '/dev/ttyS0'
		self.bytesize=8
		self.t=2
		self.parity='N'
		self.xonxoff=0
		self.rtscts=0
		self.dsrdtr=0
		self.ser = serial.Serial(self.port,self.baudrate,timeout=self.t)		
		self.x = self.ser.read(2)		       
		print self.x
		

			

    def __init__(self, halcomp,builder,useropts):
        self.halcomp = halcomp
        self.builder = builder
        

def get_handlers(halcomp,builder,useropts):

    return [HandlerClass(halcomp,builder,useropts)]
dsrdtr=0 - что за настройка порта?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение nkp »

Немного доработал "кнопочку для сом порта".
Выделение_055.png (3867 просмотров) <a class='original' href='./download/file.php?id=5018&sid=da65440d0fa695a32207df45fdab669e&mode=view' target=_blank>Загрузить оригинал (67.28 КБ)</a>
Теперь в панельке можно и "получить" отосланные данные.(если пользовать заглушку)
com.rar
(2.52 КБ) 455 скачиваний
1.в выпадающем списке выбрать скорость
2.после ввода данных в поле нажать Enter (далее это неудобство исправим)
Также прикрутится вся настройка порта через интерфейс.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение nkp »

(для просмотра содержимого нажмите на ссылку)
Выделение_059.png (3831 просмотр) <a class='original' href='./download/file.php?id=5023&sid=da65440d0fa695a32207df45fdab669e&mode=view' target=_blank>Загрузить оригинал (85.3 КБ)</a>
Исправленно-теперь после ввода данных не надо жать enter.
Добавлено- выбор "принимать по N байт.
com.rar
(2.96 КБ) 469 скачиваний
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение nkp »

com.tar
(50 КБ) 466 скачиваний
Распаковать в папку с конфигурацией.
В ini файл [DISPLAY]:

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

EMBED_TAB_NAME = com
EMBED_TAB_COMMAND = halcmd loadusr   gladevcp -u com.py -H com_tab.hal -x {XID}  com_tab.ui
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение Nick »

Что и прямо работает?
Просто для меня com - это загадка :)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение nkp »

Nick писал(а):Что и прямо работает?
Да:
http://www.youtube.com/watch?v=smQsVb-7gMg
(надо доделать ввод настроек)
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение billsmith »

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

Re: Передача данных EMC <--> COM

Сообщение Nick »

Для ардуино есть специальный компонент на питоне, он может экспортировать аналоговые и битовые пины. А что именно хочешь сделать?
PS Arduino Linux CNC - советы начинающим #1
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение billsmith »

Сейчас посмотрю.
Сейчас правда у меня только Arduino Mega с сенсорным 3,5дюйма экраном. Думаю, это слишком. Хочется удобный пульт.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Передача данных EMC <--> COM

Сообщение Nick »

Слишком много или слишком мало :)?
А ты в программировании Arduino разбираешься?
Ответить

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