Страница 1 из 6
Передача данных EMC <--> COM
Добавлено: 01 апр 2012, 10:51
aftaev
Нужно сделать обмен данными внешнее устройство и ЕМС по СОМ по RS232(485).
Начнем с простого:
1. Как сделать в ЕМС какое нибудь поле и кнопку?
2. Как нажав на кнопку отправить введенное значение в поле в заданный СОМ порт?
В качестве RS232 приемника
для ПРИМЕРА будет выступать это устройство
http://www.ebay.com/itm/Micro-Portable- ... 19ced5436f
Re: Передача данных EMC <--> COM
Добавлено: 01 апр 2012, 13:23
Nick
aftaev писал(а):1. Как сделать в ЕМС какое нибудь поле и кнопку?
Какое поле, что в нем будет?
aftaev писал(а):2. Как нажав на кнопку отправить введенное значение в поле в заданный СОМ порт?
Надо написать компонент на любом удобном языке, который сможет работать с пинами hal и отправлять значения по RS232.
А можно вообще отдельную программку написать, которая будет иметь кнопку и любое поле. И запускать ее вместе с emc. Помимо ручного использования кнопки, она будет к чему-то еще привязываться?
Re: Передача данных EMC <--> COM
Добавлено: 01 апр 2012, 18:12
aftaev
Nick писал(а):Какое поле, что в нем будет?
Поле ввода. Вводим туды циферки например 123456 жмакаем на кнопку и ушли они в СОМ
Nick писал(а):А можно вообще отдельную программку написать, которая будет иметь кнопку и любое поле. И запускать ее вместе с emc. Помимо ручного использования кнопки, она будет к чему-то еще привязываться?
Это будет ТНС для плазмы, но пока нужно обкатать работу ЕМС-PIC/ Потому достаточно в ЕМС нарисовать поле чтоб ввели цеферки, нажали ОТПРАВИТь и PIC принял. Дальше это как то привязать в HAL чтоб постояно был обмен данными.
Таже история и для общения ЕМС-ПУЛЬТ
Цель: научиться общаться с ЕМС по СОМ в ПРИМЕРАХ

Re: Передача данных EMC <--> COM
Добавлено: 01 апр 2012, 20:31
psha
Взять обычный SpinButton и в компоненте повесить на изменение отправку данных.
http://psha.org.ru/cgit/psha/owenio/tre ... ent-trm151
Re: Передача данных EMC <--> COM
Добавлено: 02 апр 2012, 13:20
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()
Re: Передача данных EMC <--> COM
Добавлено: 06 апр 2012, 20:26
nkp
Может кому будут полезны результаты попытки разобраться с com портом .До этого с ним не сталкивался, (наверно потому что он сзади компьютера

) .
Для того чтоб передавать в порт и его же слушать использовал "заглушку" с перемычками:
Файл "навороченного" интерфейса:
Скрипт:
Оба файла после распаковки ложим в папку с вашей конфигурацией .
В ini файл секция [DISPLAY] пишем: GLADEVCP = -u com.py com.ui
В скрипте используем pyserial.Если не стоит в системе-установить:
Должно получиться:
Вывод на лейбл еще не работает, так что смотрим где?...конечно в терминале
вводим
Код: Выделить всё
$ python
$ import serial
$ ser = serial.Serial('/dev/ttyS0', 19200, timeout=1)
это мы открыли порт и прописали настройки
Теперь читаем порт
Пусто! Вводим данные,жмем enter , потом- "Запись".
Читаем теперь:
продолжение следует...
Re: Передача данных EMC <--> COM
Добавлено: 06 апр 2012, 23:04
Nick
Ухты! Здорово!
Афтаев, срочно начинай тестировать!

Re: Передача данных EMC <--> COM
Добавлено: 07 апр 2012, 02:09
aftaev
Надо научить PIC принимать даные и отправлять а ддля этого нужно чтоб насройки СОМ портов совпадали. Пока к PIC принтер цепляю
Re: Передача данных EMC <--> COM
Добавлено: 07 апр 2012, 14:22
Nick
Ну, так настройки в одной строке указываются. Какие у твоего принтера настройки?
Re: Передача данных EMC <--> COM
Добавлено: 07 апр 2012, 15:38
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
Re: Передача данных EMC <--> COM
Добавлено: 07 апр 2012, 16:21
nkp
В этом файле проще изменять настройки порта
(в коментах может я и ошибся)
(для просмотра содержимого нажмите на ссылку)Код: Выделить всё
# -*- 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 - что за настройка порта?
Re: Передача данных EMC <--> COM
Добавлено: 08 апр 2012, 19:26
nkp
Немного доработал "кнопочку для сом порта".
Теперь в панельке можно и "получить" отосланные данные.(если пользовать заглушку)
1.в выпадающем списке выбрать скорость
2.после ввода данных в поле нажать Enter (далее это неудобство исправим)
Также прикрутится вся настройка порта через интерфейс.
Re: Передача данных EMC <--> COM
Добавлено: 09 апр 2012, 08:47
nkp
Re: Передача данных EMC <--> COM
Добавлено: 30 май 2012, 08:10
nkp
Распаковать в папку с конфигурацией.
В ini файл [DISPLAY]:
Код: Выделить всё
EMBED_TAB_NAME = com
EMBED_TAB_COMMAND = halcmd loadusr gladevcp -u com.py -H com_tab.hal -x {XID} com_tab.ui
Re: Передача данных EMC <--> COM
Добавлено: 31 май 2012, 19:24
Nick
Что и прямо работает?
Просто для меня com - это загадка

Re: Передача данных EMC <--> COM
Добавлено: 31 май 2012, 20:43
nkp
Nick писал(а):Что и прямо работает?
Да:
http://www.youtube.com/watch?v=smQsVb-7gMg
(надо доделать ввод настроек)
Re: Передача данных EMC <--> COM
Добавлено: 04 июн 2012, 23:49
billsmith
А может ещё расскажите как постоянно данные принимать и расшифровывать.
Захотелось на Arduino себе пульт собрать с энкодером и прочими удобностями. С пультом и Arduino проблем нет, а вот как быть с LinuxCNC.
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 11:06
Nick
Для ардуино есть специальный компонент на питоне, он может экспортировать аналоговые и битовые пины. А что именно хочешь сделать?
PS
Arduino Linux CNC - советы начинающим #1
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 12:11
billsmith
Сейчас посмотрю.
Сейчас правда у меня только Arduino Mega с сенсорным 3,5дюйма экраном. Думаю, это слишком. Хочется удобный пульт.
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 12:16
Nick
Слишком много или слишком мало

?
А ты в программировании Arduino разбираешься?