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

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

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

Сообщение Nick »

Надо лучше всего тогда контрольную сумму в ответ писать. Хотя надо ли это для пульта?

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

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

Сообщение nkp »

Nick писал(а):А как обычно устройство понимает, что это ему что-то пишут
Первый байт команды-номер принимающего.
Nick писал(а):Хотя надо ли это для пульта?
Смотря какой функционал в него хотим заложить
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение billsmith »

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

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

Сообщение nkp »

billsmith писал(а):При работе с ком портом никому ничего знать не надо.
это если узко смотреть-один передает-один принимает
Считаю надо писать скрипт с широкими возможностями(если свой стандарт-то тем более) Moldus если не ошибаюсь-256 адресуемых устр
А рассматриваемый девайс будет частным случаем
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение billsmith »

nkp писал(а):
billsmith писал(а):При работе с ком портом никому ничего знать не надо.
это если узко смотреть-один передает-один принимает
Считаю надо писать скрипт с широкими возможностями(если свой стандарт-то тем более) Moldus если не ошибаюсь-256 адресуемых устр
А рассматриваемый девайс будет частным случаем
Да зачем усложнять. Просто нужен выбор порта и всё. Если у меня будет ещё одно устройство, оно уже будет по адресу
/dev/ttyUSB1, следующее /dev/ttyUSB2 и т.д.
Arduino стоит 15баксов. В нём встроенный преобразователь USB-COM. Я проверял обмен данными с компом на скоростях до 115200. Да и вообще можно поставить Arduino Mega 1280 за 22 бакса, у неё 54 цифровых входов/выходов + 16 аналоговых входов. К ней цепляй экраны флешки, кнопки, энкодеры и т.д. Так что много устройств не нужно.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

billsmith писал(а):Да зачем усложнять
Я всего лишь ратую за то ,чтоб в "свой " стандарт включить идентификатор приемника- на будущее
Глянуть чуть-чуть дальше пульта :)
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение billsmith »

ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение billsmith »

А вот кажется то что я собирался сделать http://www.youtube.com/watch?v=n9YMpQjsab4.
Саша7892ХН
Новичок
Сообщения: 29
Зарегистрирован: 22 мар 2012, 21:15
Репутация: 0
Контактная информация:

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

Сообщение Саша7892ХН »

Народ помогите разобратся как подружить свою плату с сом портом
следуя примерам дошол пока до ошибки а как дальше нихрена непойму
чуствую что надо из предоставленного чтото доставить а вот как
в линуксе пока полный баран но очень нравится система
с другом сделали платку которая обслуживает линейки и привода под виндой програмка работает получает
и отдает данные все красиво а вон как с емс смутные представления
друг конечно у меня максималист говорит давай напишем свою чпу но я думаю что это будет очень долго хотя этот
может он класный доктор
Вложения
вот что рисует (2335 просмотров) <a class='original' href='./download/file.php?id=5726&sid=6a950e663b35d027bdbc861c33625774&mode=view' target=_blank>Загрузить оригинал (190.03 КБ)</a>
вот что рисует
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

попробуй закомментировать

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

import hal_glib
рабочая конфигурация (емс 2.5) :
SherlineLathe.tar.gz
проверил-работает
(10.73 КБ) 1078 скачиваний
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение billsmith »

Следуя 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

Сообщение 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. Как ее удобнее считать (входные данные - строка)?
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение 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()
Саша7892ХН
Новичок
Сообщения: 29
Зарегистрирован: 22 мар 2012, 21:15
Репутация: 0
Контактная информация:

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

Сообщение Саша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:warning:file contains DOS-style line endings.
python exited without becoming ready
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

положить этот файл в папку с конфигурацией:
pyvcp.xml
(529 байт) 1073 скачивания
в ini файл в секцию [DISPLAY] :
PYVCP = pyvcp.xml
при запуске должна появиться панель: если да - пойдем дальше :)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

billsmith писал(а):ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
Нельзя так делать. В момент опроса устройство может быть неготово или правильный ответ исказила помеха и т.п. Т.е. либо в итоге не находим устройство, либо запрос надо повторить через некоторое время некоторое количество раз. Остается это умножить на "некоторе" количество портов в системе и можно будет прикинуть время, которое понадобится для старта.

По поводу своего протокола: если хотите, чтобы это кроме вас никто не поддерживал, то изобретите свой протокол.
Какие реально претензии к modbus? Мало типов данных? Так это хорошо - меньше вероятность ошибки и проще реализация.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Саша7892ХН
Новичок
Сообщения: 29
Зарегистрирован: 22 мар 2012, 21:15
Репутация: 0
Контактная информация:

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

Сообщение Саша7892ХН »

nkp писал(а):положить этот файл в папку с конфигурацией:
pyvcp.xml
в ini файл в секцию [DISPLAY] :
PYVCP = pyvcp.xml
при запуске должна появиться панель: если да - пойдем дальше :)
Это все сделано и залускается когда коментируеш в хал
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

если надо попробовать прием-передачу в ком - в #50 сообщ рабочий конфиг
пробовал?
billsmith
Опытный
Сообщения: 128
Зарегистрирован: 04 июн 2012, 23:46
Репутация: 5
Контактная информация:

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

Сообщение billsmith »

s3301 писал(а):
billsmith писал(а):ну если так хочется то можно.
Скрипт тогда при запуске просто должен опрашивать все доступные COM порты(посылать например символ "?"), и с какого получит верный номер, тот и устанавливать себе для работы.
Впринципе это наверное и правильно, при работе с несколькими устройствами не будет путаницы.
Нельзя так делать. В момент опроса устройство может быть неготово или правильный ответ исказила помеха и т.п. Т.е. либо в итоге не находим устройство, либо запрос надо повторить через некоторое время некоторое количество раз. Остается это умножить на "некоторе" количество портов в системе и можно будет прикинуть время, которое понадобится для старта.

По поводу своего протокола: если хотите, чтобы это кроме вас никто не поддерживал, то изобретите свой протокол.
Какие реально претензии к modbus? Мало типов данных? Так это хорошо - меньше вероятность ошибки и проще реализация.
Даже при 10-ти портах и скорости 9600, в зависимости от времени ожидания, время запроса займёт ооочень мало времени.
Но это и не важно, вон Nick уже выложил заготовку, правда я не смог пока запустить :thinking: . Пару постов выше я описал проблему, может поможешь?
Я правда уже и сам смог выводить на LCD экран нужные мне данные и получать обратно. Но всё таки хочеться запустить вариант Nick`a как более универсальный. Тут подумал купить ещё пару ардуинок маленьких, да наконец сделать управление шпинделем, и может ещё чего придумаю.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

billsmith писал(а): Даже при 10-ти портах и скорости 9600, в зависимости от времени ожидания, время запроса займёт ооочень мало времени.
А сколько времени будете ждать ответа на каждом порту?
А если помеха будет длится дольше?
billsmith писал(а): Но всё таки хочеться запустить вариант Nick`a как более универсальный. Тут подумал купить ещё пару ардуинок маленьких, да наконец сделать управление шпинделем, и может ещё чего придумаю.
Например управление вот для такого частотника, который многие используют:
http://www.ebay.com/itm/HIGH-QUALITY-VA ... 2eb9f3e030
:hehehe:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

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