Страница 3 из 6
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 16:48
Nick
Надо лучше всего тогда контрольную сумму в ответ писать. Хотя надо ли это для пульта?
А как обычно устройство понимает, что это ему что-то пишут? У него порт свой или как-то иначе?
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 16:53
nkp
Nick писал(а):А как обычно устройство понимает, что это ему что-то пишут
Первый байт команды-номер принимающего.
Nick писал(а):Хотя надо ли это для пульта?
Смотря какой функционал в него хотим заложить
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 17:11
billsmith
При работе с ком портом никому ничего знать не надо.
ПК по передающей линии посылает данные, она подключена напрямую в принимающую линию контроллера. И наоборот.
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 17:24
nkp
billsmith писал(а):При работе с ком портом никому ничего знать не надо.
это если узко смотреть-один передает-один принимает
Считаю надо писать скрипт с широкими возможностями(если свой стандарт-то тем более) Moldus если не ошибаюсь-256 адресуемых устр
А рассматриваемый девайс будет частным случаем
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 17:35
billsmith
nkp писал(а):billsmith писал(а):При работе с ком портом никому ничего знать не надо.
это если узко смотреть-один передает-один принимает
Считаю надо писать скрипт с широкими возможностями(если свой стандарт-то тем более) Moldus если не ошибаюсь-256 адресуемых устр
А рассматриваемый девайс будет частным случаем
Да зачем усложнять. Просто нужен выбор порта и всё. Если у меня будет ещё одно устройство, оно уже будет по адресу
/dev/ttyUSB1, следующее /dev/ttyUSB2 и т.д.
Arduino стоит 15баксов. В нём встроенный преобразователь USB-COM. Я проверял обмен данными с компом на скоростях до 115200. Да и вообще можно поставить Arduino Mega 1280 за 22 бакса, у неё 54 цифровых входов/выходов + 16 аналоговых входов. К ней цепляй экраны флешки, кнопки, энкодеры и т.д. Так что много устройств не нужно.
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 17:43
nkp
billsmith писал(а):Да зачем усложнять
Я всего лишь ратую за то ,чтоб в "свой " стандарт включить идентификатор приемника- на будущее
Глянуть чуть-чуть дальше пульта

Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 17:53
billsmith
ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 18:56
billsmith
А вот кажется то что я собирался сделать
http://www.youtube.com/watch?v=n9YMpQjsab4.
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 21:42
Саша7892ХН
Народ помогите разобратся как подружить свою плату с сом портом
следуя примерам дошол пока до ошибки а как дальше нихрена непойму
чуствую что надо из предоставленного чтото доставить а вот как
в линуксе пока полный баран но очень нравится система
с другом сделали платку которая обслуживает линейки и привода под виндой програмка работает получает
и отдает данные все красиво а вон как с емс смутные представления
друг конечно у меня максималист говорит давай напишем свою чпу но я думаю что это будет очень долго хотя этот
может он класный доктор
Re: Передача данных EMC <--> COM
Добавлено: 05 июн 2012, 22:05
nkp
попробуй закомментировать
рабочая конфигурация (емс 2.5) :
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 10:24
billsmith
Следуя
http://ckcnc.wordpress.com/2011/01/08/s ... ino-howto/ удалось наладить стабильный обмен между ардуиной и linuxcnc. Там простые скрипты, с них просто начинать.
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 14:45
Nick
Вот что наваял из заготовки в начальных сообщениях:
Код: Выделить всё
#!/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()
Что надо добавить: инициализацию порта, в переменную ser.
Названия пинов в следующие переменные (через пробел):
bit_out = ""
float_out = ""
s32_out = ""
...
id девайса в
ser_id = 0
после этого исправить мелкие баги и должно работать.
А, еще надо сделать CRC. Как ее удобнее считать (входные данные - строка)?
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 15:31
billsmith
Попробовал запустить, получил:
Код: Выделить всё
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
Мой hal
Код: Выделить всё
#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()
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 21:06
Саша7892ХН
Пожалуйста обьясните как запускать скрипты питона в custom_postgui.hal
у ника написано
loadusr -Wn rs232 python rs232.py
net rs232-exec <= pyvcp.send => rs232.exec
net rs232-in0 <= pyvcp.my-spinbox => rs232.in0
что это означает
с консоли порт читается и пишется а выдает ошибку
inifile

file contains DOS-style line endings.
python exited without becoming ready
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 21:36
nkp
положить этот файл в папку с конфигурацией:
в ini файл в секцию [DISPLAY] :
PYVCP = pyvcp.xml
при запуске должна появиться панель:
если да - пойдем дальше

Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 21:40
Serg
billsmith писал(а):ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
Нельзя так делать. В момент опроса устройство может быть неготово или правильный ответ исказила помеха и т.п. Т.е. либо в итоге не находим устройство, либо запрос надо повторить через некоторое время некоторое количество раз. Остается это умножить на "некоторе" количество портов в системе и можно будет прикинуть время, которое понадобится для старта.
По поводу своего протокола: если хотите, чтобы это кроме вас никто не поддерживал, то изобретите свой протокол.
Какие реально претензии к modbus? Мало типов данных? Так это хорошо - меньше вероятность ошибки и проще реализация.
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 21:48
Саша7892ХН
nkp писал(а):положить этот файл в папку с конфигурацией:
pyvcp.xml
в ini файл в секцию [DISPLAY] :
PYVCP = pyvcp.xml
при запуске должна появиться панель:
если да - пойдем дальше

Это все сделано и залускается когда коментируеш в хал
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 21:55
nkp
если надо попробовать прием-передачу в ком - в #50 сообщ рабочий конфиг
пробовал?
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 22:52
billsmith
s3301 писал(а):billsmith писал(а):ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
Нельзя так делать. В момент опроса устройство может быть неготово или правильный ответ исказила помеха и т.п. Т.е. либо в итоге не находим устройство, либо запрос надо повторить через некоторое время некоторое количество раз. Остается это умножить на "некоторе" количество портов в системе и можно будет прикинуть время, которое понадобится для старта.
По поводу своего протокола: если хотите, чтобы это кроме вас никто не поддерживал, то изобретите свой протокол.
Какие реально претензии к modbus? Мало типов данных? Так это хорошо - меньше вероятность ошибки и проще реализация.
Даже при 10-ти портах и скорости 9600, в зависимости от времени ожидания, время запроса займёт ооочень мало времени.
Но это и не важно, вон Nick уже выложил заготовку, правда я не смог пока запустить

. Пару постов выше я описал проблему, может поможешь?
Я правда уже и сам смог выводить на LCD экран нужные мне данные и получать обратно. Но всё таки хочеться запустить вариант Nick`a как более универсальный. Тут подумал купить ещё пару ардуинок маленьких, да наконец сделать управление шпинделем, и может ещё чего придумаю.
Re: Передача данных EMC <--> COM
Добавлено: 06 июн 2012, 23:24
Serg
billsmith писал(а):
Даже при 10-ти портах и скорости 9600, в зависимости от времени ожидания, время запроса займёт ооочень мало времени.
А сколько времени будете ждать ответа на каждом порту?
А если помеха будет длится дольше?
billsmith писал(а):
Но всё таки хочеться запустить вариант Nick`a как более универсальный. Тут подумал купить ещё пару ардуинок маленьких, да наконец сделать управление шпинделем, и может ещё чего придумаю.
Например управление вот для такого частотника, который многие используют:
http://www.ebay.com/itm/HIGH-QUALITY-VA ... 2eb9f3e030
