Передача данных EMC <--> COM
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Передача данных EMC <--> COM
Надо лучше всего тогда контрольную сумму в ответ писать. Хотя надо ли это для пульта?
А как обычно устройство понимает, что это ему что-то пишут? У него порт свой или как-то иначе?
А как обычно устройство понимает, что это ему что-то пишут? У него порт свой или как-то иначе?
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Передача данных EMC <--> COM
Первый байт команды-номер принимающего.Nick писал(а):А как обычно устройство понимает, что это ему что-то пишут
Смотря какой функционал в него хотим заложитьNick писал(а):Хотя надо ли это для пульта?
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
При работе с ком портом никому ничего знать не надо.
ПК по передающей линии посылает данные, она подключена напрямую в принимающую линию контроллера. И наоборот.
ПК по передающей линии посылает данные, она подключена напрямую в принимающую линию контроллера. И наоборот.
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Передача данных EMC <--> COM
это если узко смотреть-один передает-один принимаетbillsmith писал(а):При работе с ком портом никому ничего знать не надо.
Считаю надо писать скрипт с широкими возможностями(если свой стандарт-то тем более) Moldus если не ошибаюсь-256 адресуемых устр
А рассматриваемый девайс будет частным случаем
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
Да зачем усложнять. Просто нужен выбор порта и всё. Если у меня будет ещё одно устройство, оно уже будет по адресуnkp писал(а):это если узко смотреть-один передает-один принимаетbillsmith писал(а):При работе с ком портом никому ничего знать не надо.
Считаю надо писать скрипт с широкими возможностями(если свой стандарт-то тем более) Moldus если не ошибаюсь-256 адресуемых устр
А рассматриваемый девайс будет частным случаем
/dev/ttyUSB1, следующее /dev/ttyUSB2 и т.д.
Arduino стоит 15баксов. В нём встроенный преобразователь USB-COM. Я проверял обмен данными с компом на скоростях до 115200. Да и вообще можно поставить Arduino Mega 1280 за 22 бакса, у неё 54 цифровых входов/выходов + 16 аналоговых входов. К ней цепляй экраны флешки, кнопки, энкодеры и т.д. Так что много устройств не нужно.
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Передача данных EMC <--> COM
Я всего лишь ратую за то ,чтоб в "свой " стандарт включить идентификатор приемника- на будущееbillsmith писал(а):Да зачем усложнять
Глянуть чуть-чуть дальше пульта
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
А вот кажется то что я собирался сделать http://www.youtube.com/watch?v=n9YMpQjsab4.
-
- Новичок
- Сообщения: 29
- Зарегистрирован: 22 мар 2012, 21:15
- Репутация: 0
- Контактная информация:
Re: Передача данных EMC <--> COM
Народ помогите разобратся как подружить свою плату с сом портом
следуя примерам дошол пока до ошибки а как дальше нихрена непойму
чуствую что надо из предоставленного чтото доставить а вот как
в линуксе пока полный баран но очень нравится система
с другом сделали платку которая обслуживает линейки и привода под виндой програмка работает получает
и отдает данные все красиво а вон как с емс смутные представления
друг конечно у меня максималист говорит давай напишем свою чпу но я думаю что это будет очень долго хотя этот
может он класный доктор
следуя примерам дошол пока до ошибки а как дальше нихрена непойму
чуствую что надо из предоставленного чтото доставить а вот как
в линуксе пока полный баран но очень нравится система
с другом сделали платку которая обслуживает линейки и привода под виндой програмка работает получает
и отдает данные все красиво а вон как с емс смутные представления
друг конечно у меня максималист говорит давай напишем свою чпу но я думаю что это будет очень долго хотя этот
может он класный доктор
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Передача данных EMC <--> COM
попробуй закомментировать
рабочая конфигурация (емс 2.5) :
Код: Выделить всё
import hal_glib
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
Следуя http://ckcnc.wordpress.com/2011/01/08/s ... ino-howto/ удалось наладить стабильный обмен между ардуиной и linuxcnc. Там простые скрипты, с них просто начинать.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Передача данных EMC <--> COM
Вот что наваял из заготовки в начальных сообщениях:
Что надо добавить: инициализацию порта, в переменную ser.
Названия пинов в следующие переменные (через пробел):
bit_out = ""
float_out = ""
s32_out = ""
...
id девайса в
ser_id = 0
после этого исправить мелкие баги и должно работать.
А, еще надо сделать CRC. Как ее удобнее считать (входные данные - строка)?
Код: Выделить всё
#!/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
import hal
ser_id = 0
bit_out = ""
float_out = ""
s32_out = ""
u32_out = ""
bit_in = ""
float_in = ""
s32_in = ""
u32_in = ""
tty = '/dev/ttyS0'
if len(sys.argv) > 1:
tty = sys.argv[1]
timeout = 0.1
in_pin_types = {"bit":0, "s32":1, "u32":2, "float":3}
class RS232:
def __init__(self):
self.comp = hal.component('rs232')
self.enable = self.comp.newpin("enable", 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 bit_in.split])
self.pin_in['s32'] = dict([[i, self.comp.newpin(i, hal.HAL_S32, hal.HAL_IN)] for i in s32_in.split])
self.pin_in['u32'] = dict([[i, self.comp.newpin(i, hal.HAL_U32, hal.HAL_IN)] for i in u32_in.split])
self.pin_in['float'] = dict([[i, self.comp.newpin(i, hal.HAL_FLOAT, hal.HAL_IN)] for i in float_in.split])
self.pin_out['bit'] = dict([[i, self.comp.newpin(i, hal.HAL_BIT, hal.HAL_OUT)] for i in bit_out.split])
self.pin_out['s32'] = dict([[i, self.comp.newpin(i, hal.HAL_S32, hal.HAL_OUT)] for i in s32_out.split])
self.pin_out['u32'] = dict([[i, self.comp.newpin(i, hal.HAL_U32, hal.HAL_OUT)] for i in u32_out.split])
self.pin_out['float'] = dict([[i, self.comp.newpin(i, hal.HAL_FLOAT, hal.HAL_OUT)] for i in float_out.split])
self.port = serial.Serial(tty)
self.port.setTimeout(timeout)
self.comp.ready()
def read_pin(self, pin) :
r = re.match("(..):([0-7]):([A-z\-0-9])+:[0-9\-\.]+:(\.*)")
if r :
pin = r.groups()
pin_type = ["bit","s32","u32","float","bit","s32","u32","float"][pin[2]]
pin_name = pin[3]
value = pin[4]
self.pin_out[pin_type][pin_name] = value
#TODO CRC!!!
return True
else : return False
def run(self) :
self.last_in = dict(["bit","s32","u32","float"])
self.input = ""
while True:
if self.enable == 1 :
# Read from port
while ser.inWaiting():
self.input += ser.read()
# format id: 2 byte, ":", pintype(0..7) 1 byte,":", pin-name [A-z\-0-9] x byte,":", value [0-9\-\.] x byte,":", crc, "\n"
array = self.input.split("\n")
last_pin = False
for i in array :
last_pin = self.read_pin(i)
if not last_pin and len(array)>0 :
self.input = array[-1]
# Write pin's values to port if needed
for pin_type in self.pin_in :
for pin in self.pin_in[pin_type] :
if pin not in self.last_in[pin_type] or self.comp[pin]!=self.last_in[pin_type][pin] :
#TODO CRC!!!
ser.write( "%s:%s:%s:%s:%s\n" % (ser_id, in_pin_types[pin_type], pin, self.comp[pin], "CRC") )
self.last_in[pin_type][pin] = self.comp[pin]
time.sleep(0.01);
rs232 = RS232()
try:
rs232.run()
except Exception, e:
import traceback
traceback.print_exc()
print e
comp.exit()
Названия пинов в следующие переменные (через пробел):
bit_out = ""
float_out = ""
s32_out = ""
...
id девайса в
ser_id = 0
после этого исправить мелкие баги и должно работать.
А, еще надо сделать CRC. Как ее удобнее считать (входные данные - строка)?
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
Попробовал запустить, получил:
Мой hal
Скрипт
Код: Выделить всё
Debug file information:
Can not find -sec MOT -var MOT -num 1
Can not find -sec IO -var IO -num 1
Can not find -sec LINUXCNC -var NML_FILE -num 1
Can not find -sec EMC -var NML_FILE -num 1
Traceback (most recent call last):
File "./arduino1.py", line 95, in <module>
rs232 = RS232()
File "./arduino1.py", line 40, in __init__
self.pin_in['bit'] = dict([[i, self.comp.newpin(i, hal.HAL_BIT, hal.HAL_IN)] for i in bit_in.split])
TypeError: 'builtin_function_or_method' object is not iterable
custom_postgui.hal:2: ./arduino1.py exited without becoming ready
22844
PID TTY STAT TIME COMMAND
22895
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components
Код: Выделить всё
#First we load the Python user module named /user/bin/simple_arduino with the name 'arduino'
loadusr -Wn arduino ./arduino1.py
#Map the machine on/off state to the arduino
net machstate rs232.machine-state <= halui.machine.is-on
Код: Выделить всё
#!/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
import hal
ser_id = 0
bit_out = ""
float_out = ""
s32_out = ""
u32_out = ""
bit_in = "machine-state"
float_in = ""
s32_in = ""
u32_in = ""
tty = "/dev/ttyUSB0"
if len(sys.argv) > 1:
tty = sys.argv[1]
timeout = 0.1
in_pin_types = {"bit":0, "s32":1, "u32":2, "float":3}
class RS232:
def __init__(self):
self.comp = hal.component('rs232')
self.enable = self.comp.newpin("enable", 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 bit_in.split])
self.pin_in['s32'] = dict([[i, self.comp.newpin(i, hal.HAL_S32, hal.HAL_IN)] for i in s32_in.split])
self.pin_in['u32'] = dict([[i, self.comp.newpin(i, hal.HAL_U32, hal.HAL_IN)] for i in u32_in.split])
self.pin_in['float'] = dict([[i, self.comp.newpin(i, hal.HAL_FLOAT, hal.HAL_IN)] for i in float_in.split])
self.pin_out['bit'] = dict([[i, self.comp.newpin(i, hal.HAL_BIT, hal.HAL_OUT)] for i in bit_out.split])
self.pin_out['s32'] = dict([[i, self.comp.newpin(i, hal.HAL_S32, hal.HAL_OUT)] for i in s32_out.split])
self.pin_out['u32'] = dict([[i, self.comp.newpin(i, hal.HAL_U32, hal.HAL_OUT)] for i in u32_out.split])
self.pin_out['float'] = dict([[i, self.comp.newpin(i, hal.HAL_FLOAT, hal.HAL_OUT)] for i in float_out.split])
self.port = serial.Serial(tty)
self.port.setTimeout(timeout)
self.comp.ready()
def read_pin(self, pin) :
r = re.match("(..):([0-7]):([A-z\-0-9])+:[0-9\-\.]+:(\.*)")
if r :
pin = r.groups()
pin_type = ["bit","s32","u32","float","bit","s32","u32","float"][pin[2]]
pin_name = pin[3]
value = pin[4]
self.pin_out[pin_type][pin_name] = value
#TODO CRC!!!
return True
else : return False
def run(self) :
self.last_in = dict(["bit","s32","u32","float"])
self.input = ""
while True:
if self.enable == 1 :
# Read from port
while ser.inWaiting():
self.input += ser.read()
# format id: 2 byte, ":", pintype(0..7) 1 byte,":", pin-name [A-z\-0-9] x byte,":", value [0-9\-\.] x byte,":", crc, "\n"
array = self.input.split("\n")
last_pin = False
for i in array :
last_pin = self.read_pin(i)
if not last_pin and len(array)>0 :
self.input = array[-1]
# Write pin's values to port if needed
for pin_type in self.pin_in :
for pin in self.pin_in[pin_type] :
if pin not in self.last_in[pin_type] or self.comp[pin]!=self.last_in[pin_type][pin] :
#TODO CRC!!!
ser.write( "%s:%s:%s:%s:%s\n" % (ser_id, in_pin_types[pin_type], pin, self.comp[pin], "CRC") )
self.last_in[pin_type][pin] = self.comp[pin]
time.sleep(0.01);
rs232 = RS232()
try:
rs232.run()
except Exception, e:
import traceback
traceback.print_exc()
print e
comp.exit()
-
- Новичок
- Сообщения: 29
- Зарегистрирован: 22 мар 2012, 21:15
- Репутация: 0
- Контактная информация:
Re: Передача данных EMC <--> COM
Пожалуйста обьясните как запускать скрипты питона в custom_postgui.hal
у ника написано
loadusr -Wn rs232 python rs232.py
net rs232-exec <= pyvcp.send => rs232.exec
net rs232-in0 <= pyvcp.my-spinbox => rs232.in0
что это означает
с консоли порт читается и пишется а выдает ошибку
inifilefile contains DOS-style line endings.
python exited without becoming ready
у ника написано
loadusr -Wn rs232 python rs232.py
net rs232-exec <= pyvcp.send => rs232.exec
net rs232-in0 <= pyvcp.my-spinbox => rs232.in0
что это означает
с консоли порт читается и пишется а выдает ошибку
inifilefile contains DOS-style line endings.
python exited without becoming ready
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Передача данных EMC <--> COM
положить этот файл в папку с конфигурацией:
PYVCP = pyvcp.xml
при запуске должна появиться панель: если да - пойдем дальше
в ini файл в секцию [DISPLAY] :PYVCP = pyvcp.xml
при запуске должна появиться панель: если да - пойдем дальше
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Передача данных EMC <--> COM
Нельзя так делать. В момент опроса устройство может быть неготово или правильный ответ исказила помеха и т.п. Т.е. либо в итоге не находим устройство, либо запрос надо повторить через некоторое время некоторое количество раз. Остается это умножить на "некоторе" количество портов в системе и можно будет прикинуть время, которое понадобится для старта.billsmith писал(а):ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
По поводу своего протокола: если хотите, чтобы это кроме вас никто не поддерживал, то изобретите свой протокол.
Какие реально претензии к modbus? Мало типов данных? Так это хорошо - меньше вероятность ошибки и проще реализация.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
- Новичок
- Сообщения: 29
- Зарегистрирован: 22 мар 2012, 21:15
- Репутация: 0
- Контактная информация:
Re: Передача данных EMC <--> COM
Это все сделано и залускается когда коментируеш в халnkp писал(а):положить этот файл в папку с конфигурацией:в ini файл в секцию [DISPLAY] :
PYVCP = pyvcp.xml
при запуске должна появиться панель: если да - пойдем дальше
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Передача данных EMC <--> COM
если надо попробовать прием-передачу в ком - в #50 сообщ рабочий конфиг
пробовал?
пробовал?
-
- Опытный
- Сообщения: 128
- Зарегистрирован: 04 июн 2012, 23:46
- Репутация: 5
- Контактная информация:
Re: Передача данных EMC <--> COM
Даже при 10-ти портах и скорости 9600, в зависимости от времени ожидания, время запроса займёт ооочень мало времени.s3301 писал(а):Нельзя так делать. В момент опроса устройство может быть неготово или правильный ответ исказила помеха и т.п. Т.е. либо в итоге не находим устройство, либо запрос надо повторить через некоторое время некоторое количество раз. Остается это умножить на "некоторе" количество портов в системе и можно будет прикинуть время, которое понадобится для старта.billsmith писал(а):ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
По поводу своего протокола: если хотите, чтобы это кроме вас никто не поддерживал, то изобретите свой протокол.
Какие реально претензии к modbus? Мало типов данных? Так это хорошо - меньше вероятность ошибки и проще реализация.
Но это и не важно, вон Nick уже выложил заготовку, правда я не смог пока запустить . Пару постов выше я описал проблему, может поможешь?
Я правда уже и сам смог выводить на LCD экран нужные мне данные и получать обратно. Но всё таки хочеться запустить вариант Nick`a как более универсальный. Тут подумал купить ещё пару ардуинок маленьких, да наконец сделать управление шпинделем, и может ещё чего придумаю.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Передача данных EMC <--> COM
А сколько времени будете ждать ответа на каждом порту?billsmith писал(а): Даже при 10-ти портах и скорости 9600, в зависимости от времени ожидания, время запроса займёт ооочень мало времени.
А если помеха будет длится дольше?
Например управление вот для такого частотника, который многие используют:billsmith писал(а): Но всё таки хочеться запустить вариант Nick`a как более универсальный. Тут подумал купить ещё пару ардуинок маленьких, да наконец сделать управление шпинделем, и может ещё чего придумаю.
http://www.ebay.com/itm/HIGH-QUALITY-VA ... 2eb9f3e030
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...