В Linux посмотреть передачу по RS232->USB

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

Это не все... или все? В конце нет ].
О а сделай еще
a = hal.component("a")
dir(a)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

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

>>> a = hal.component("a") 
>>> dir(a)
['__class__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'exit', 'getitem', 'getparam', 'getpin', 'getprefix', 'newparam', 'newpin', 'ready', 'setprefix']
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

nkp писал(а):'newparam', 'newpin'
Похоже, что есть только пины и параметры, оно и правильно, зачем компонентам userspace функции?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

Файл pult.py в папке с ini
pult.py.tar
(10 КБ) 396 скачиваний
В хал :
loadusr -Wn pult python pult.py
net pult pult.out halui.program.stop
Появился только в разделе "Сигналы" : Ни в разделе компоненты ,ни в разделе пины ничего нет :wik:
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

Файл pult.py:

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

#!/usr/bin/python

import hal, time 
h = hal.component("pult")
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("out", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
try:
    while 1:
		time.sleep(1)
		h['out'] = False	
		ser = serial.Serial('/dev/ttyS0', 115200, timeout=1)
		x = ser.read()
		if x == '2' :
			h['out'] = True
			ser.close()
except KeyboardInterrupt:
    raise SystemExit
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

Хммм. но появился же :).
попробуй в консоли выполнить halcmd show all | grep pult
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

nkp@nkp-desktop:~$ halcmd show all | grep pult
7 bit IN FALSE halui.program.stop <== pult
bit FALSE pult
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

Вот что мне не нравится, почему у тебя компонент и сигнал имеют одинаковое имя, сделай хотя бы
net pult-stop pult.out halui.program.stop

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

Мне кажется ,что все нормально со стороны емс- просто скрипт не работает
Вот так меняет halui.program.stop на true
(для просмотра содержимого нажмите на ссылку)

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

#!/usr/bin/python

import hal, time 
h = hal.component("pult")
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("out", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
h['out'] = False

try:
    while 1:

			h['out'] = True
			
except KeyboardInterrupt:
    raise SystemExit
Выделение_108.png (2323 просмотра) <a class='original' href='./download/file.php?id=5384&mode=view' target=_blank>Загрузить оригинал (22.83 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

Ну наконец то - можно идти спать- это ж надо целый день не замечать, что забыл добавить "import serial" (смайлик стучащая об стенку голова)
Теперь все работает:

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

#!/usr/bin/python

import hal, time , serial
h = hal.component("pult")
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("out", hal.HAL_BIT, hal.HAL_OUT)
h.ready()
h['out'] = False
ser = serial.Serial('/dev/ttyS0', 115200, timeout=1)
try:
    while 1:
		time.sleep(1)	
		x = ser.read()
		if x == '2' :
			h['out'] = True
			
except KeyboardInterrupt:
    raise SystemExit
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

Nick писал(а):А тебе много надо?
Просто пока в голове такая реализация работы пульта:
пишем в порт значение "a" - пин 1 тру
пишем в порт значение "b" - пин 2 тру
пишем в порт значение "c" - пин 3 тру
...................
пишем в порт значение "x" - пин n тру
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

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

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

Я вот тут про другое подумал-надо бы чтоб кнопки на пульте были двухконтактные(или програмно это реализовать)
отслеживать кнопка нажата-отпущена.Если управление через компорт-то нажата значение x? отпущена-y.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение nkp »

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

#!/usr/bin/python

import hal, time , serial
h = hal.component("pult")
h.newpin("out", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("a", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("b", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("c", hal.HAL_BIT, hal.HAL_OUT)

h.ready()
h['a'] = False
h['b'] = False
h['c'] = False
h['out'] = False


try:
    while 1:
		time.sleep(1)
		ser = serial.Serial('/dev/ttyS0', 115200, timeout=1)	
		x = ser.read()
		if x == '2' :
			h['out'] = True
		else :
			h['out'] = False
		if x == '3' :
			h['a'] = True
			h['b'] = False
		if x == '4' :
			h['b'] = True
			h['a'] = False
		if x == '5' :
			h['c'] = True
		ser.close()
			
except KeyboardInterrupt:
    raise SystemExit
Вот работа трех кнопок-стоп программа, пауза и снятие с паузы.
В hal пишем

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

loadusr  -Wn pult python  pult.py
net pult-stop pult.out halui.program.stop
net pult-pause pult.a halui.program.pause 
net pult-resume  pult.b halui.program.resume 
Если в порт передаем "2" - стоп
Если в порт передаем "3" - пауза
Если в порт передаем "4" - снят с паузы
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

ИМХО, может быть проще и понятнее, если во входном значении каждый бит будет символизировать логический пин.

Тогда будет так:

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

# Инициализация :
pin_bits = [
				[ h["out"],  0b00000001 ],
				[ h["out1"], 0b00000010 ],
				[ h["out2"], 0b00000100 ],
				[ h["out3"], 0b00001000 ],
				[ h["out4"], 0b00010000 ],
			]

# В рабочем цикле :
for pin in pin_bits  :
	pin[0] = input_byte and pin[1]
И не надо кучу условий писать, плюс в микроконтроллере будет проще все запрограммировать, точно таким же способом, только накапливание результата будет не через and, а через or.
Если пинов больше, то можно использовать не байт, а два байта, тогда сразу берем два символа, а в массиве pin_bits, все старшие биты записываем так:
0b00010000*256.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: В Linux посмотреть передачу по RS232->USB

Сообщение Nick »

Афтаев, переведем для тебя на человеческий язык. Сохраняешь верхник код отсюда В Linux посмотреть передачу по RS232->USB #78 в файл pult.py в папку с ini файлом. В hal добавляешь строчки нижнего кода. И все должно работать.

Кстати, что ты хочешь передавать в пульт и что получать из него?


И поясните мне, как ведется передача по COM? Будет создаваться пакет? Или все значения будут передаваться по отдельности?

Мое предложение передавать значения пинов битов как описал выше, а пинов float через какой-нибудь дескриптор пина + значение. Тогда декодирование передачи будет такой же простой, как в примере выше. О, можно и битовые пины таким же образом передавать. В общем, расскажите, как ведется передача информации по COM, есть ли какие-нибудь служебные команды?
Ответить

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