Страница 4 из 5

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

Добавлено: 17 май 2012, 22:38
Nick
Это не все... или все? В конце нет ].
О а сделай еще
a = hal.component("a")
dir(a)

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

Добавлено: 17 май 2012, 22:44
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']

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

Добавлено: 17 май 2012, 22:57
Nick
nkp писал(а):'newparam', 'newpin'
Похоже, что есть только пины и параметры, оно и правильно, зачем компонентам userspace функции?

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

Добавлено: 17 май 2012, 22:58
nkp
Файл pult.py в папке с ini
pult.py.tar
(10 КБ) 397 скачиваний
В хал :
loadusr -Wn pult python pult.py
net pult pult.out halui.program.stop
Появился только в разделе "Сигналы" :
(для просмотра содержимого нажмите на ссылку)
Выделение_107.png (2332 просмотра) <a class='original' href='./download/file.php?id=5383&mode=view' target=_blank>Загрузить оригинал (45.17 КБ)</a>
Ни в разделе компоненты ,ни в разделе пины ничего нет :wik:

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

Добавлено: 17 май 2012, 23:04
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

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

Добавлено: 17 май 2012, 23:11
Nick
Хммм. но появился же :).
попробуй в консоли выполнить halcmd show all | grep pult

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

Добавлено: 17 май 2012, 23:15
nkp
nkp@nkp-desktop:~$ halcmd show all | grep pult
7 bit IN FALSE halui.program.stop <== pult
bit FALSE pult

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

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

Странно, что LinuxCNC на это сразу не ругнулся...

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

Добавлено: 17 май 2012, 23:42
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 (2325 просмотров) <a class='original' href='./download/file.php?id=5384&mode=view' target=_blank>Загрузить оригинал (22.83 КБ)</a>

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

Добавлено: 17 май 2012, 23:59
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

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

Добавлено: 18 май 2012, 00:02
Nick
Кстати, именно поэтому полезно запускать LinuxCNC из консоли - в этом случае ты бы увидел ошибку питона ;).

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

Добавлено: 18 май 2012, 00:04
nkp
Согласен-при обкатке чего нового взять это за правило!!!

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

Добавлено: 18 май 2012, 00:07
nkp
А вот интересно-сколько пинов можно объявить?
Такое впечатление-что неограниченное количество.

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

Добавлено: 18 май 2012, 00:12
Nick
А тебе много надо? Насколько я понимаю ограничением будет обработка всех пинов и сигналов в LinuxCNС, интересно как они там хранятся?
Хотя наверняка они не занимают много места и доступ к ним очень быстрый.

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

Добавлено: 18 май 2012, 00:18
nkp
Nick писал(а):А тебе много надо?
Просто пока в голове такая реализация работы пульта:
пишем в порт значение "a" - пин 1 тру
пишем в порт значение "b" - пин 2 тру
пишем в порт значение "c" - пин 3 тру
...................
пишем в порт значение "x" - пин n тру

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

Добавлено: 18 май 2012, 00:49
Nick
Сделай простой code/decoder и расфигачивай пины. Все равно у тебя не получится пинов сильно больше чем в haliu.

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

Добавлено: 18 май 2012, 00:58
nkp
Я вот тут про другое подумал-надо бы чтоб кнопки на пульте были двухконтактные(или програмно это реализовать)
отслеживать кнопка нажата-отпущена.Если управление через компорт-то нажата значение x? отпущена-y.

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

Добавлено: 18 май 2012, 07:27
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" - снят с паузы

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

Добавлено: 18 май 2012, 11:24
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.

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

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

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


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

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