Страница 4 из 7
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 09:52
Ворон226
Добрался до проверки на "железке"...
В hal прописаны кнопочки управления внешними устройствами через COM:
Код: Выделить всё
net com1 mygui.hal_togglebutton1 comform.in1
net com1 mygui.hal_togglebutton2 comform.in2
net com1 mygui.hal_togglebutton3 comform.in3
net com1 mygui.hal_togglebutton4 comform.in4
net com1 mygui.hal_togglebutton5 comform.in5
net com1 mygui.hal_togglebutton6 comform.in6
net com1 mygui.hal_togglebutton7 comform.in7
net com1 mygui.hal_togglebutton8 comform.in8
В компоненте все, как мы тут наваяли...
Запускаю LCNC - реле на плате COM не работают.
Проверяю через халметр - и кнопки работают и пины компонента отрабатывают нажатие. Плата не реагирует.
При проверке платы ручками через терминал - все работает. Реле переключаются...
Где косяк?
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 10:08
Ворон226
Для проверки формирования слова для пересылки в COM-порт в компонент добавил пин:
Код: Выделить всё
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
...
h['out']=v
В халметре четко меняется значение байта при нажатии кнопок панели, но пересылки байта по COM, почему-то, не происходит...
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 10:17
Ворон226
Также проверил в терминале настройки компонента.
Код: Выделить всё
python
import serial
ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
ser.write(chr(170))
ser.write(chr(0))
ser.write(chr(255))
При прописывании ручками - всё переключает.
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 10:50
Nick
Скинь целиком свой компонент. Надо посмотреть...
Также можешь написать, чтобы он в консоль выдавал, что он пишет в порт, просто через print и потом linuxCNC запускаешь из консоли и смотришь, что происходит.
ЗЫ тут заметил, что вы там про hex и dec писали, в питоне число в hex пишется так : 0xFF - это 256, т.е. 0x и число в hex
в двоичном формате - 0b100101, в восmмиричном - 0o76543210
Я так понимаю 0x - hex, 0d - binary, 0o - octal
(может и еще какие-то варианты с разными системами счисления есть...)
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 14:02
Serg
А ничё, что везде одинаковый сигнал "net com1 ..."?
Nick писал(а):в восmмиричном - 0o76543210
А по стандарту без буковки "о", просто любое число больше нуля с нулём впереди - восьмиричное.
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 15:22
Nick
UAVpilot писал(а):А по стандарту без буковки "о", просто любое число больше нуля с нулём впереди - восьмиричное.
О, так тоже работает

Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 16:02
Ворон226
Вот компонент:
Код: Выделить всё
#!/usr/bin/python
import hal
import serial
ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
h=hal.component("comform")
h.newpin("in1", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in2", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in3", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in4", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in5", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in6", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in7", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in8", hal.HAL_BIT, hal.HAL_IN)
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
while 1:
if h['in1']==1:
pin1=1
else:
pin1=0
if h['in2']==1:
pin2=2
else:
pin2=0
if h['in3']==1:
pin3=4
else:
pin3=0
if h['in4']==1:
pin4=8
else:
pin4=0
if h['in5']==1:
pin5=16
else:
pin5=0
if h['in6']==1:
pin6=32
else:
pin6=0
if h['in7']==1:
pin7=64
else:
pin7=0
if h['in8']==1:
pin8=128
else:
pin8=0
v = pin1 + pin2 + pin3 + pin4 + pin5 + pin6 + pin7 + pin8
h['out']=v
ser.write(chr(v))
except KeyboardInterrupt:
raise SystemExit
А куда print писать - не понял...
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 16:53
Nick
а вот прямо перед ser.write: print v
Кстати, вычисление v можно вот так переписать:
v = h["in0"] | h["in1"]<<1 | h["in2"]<<2 | h["in3"]<<3 | h["in4"]<<4 | h["in5"]<<5 | h["in6"]<<6 | h["in7"]<<7
| - побитовое "или", (кстати, можно вместо него обычный + использовать

)
<< - битовый сдвиг на, блин, как это называется, в общем все равно, что добавить сзади числа несколько 0 в двоичной системе счисления, или умножить на 2
n
И все эти if else нe нужны.
и пины я бы обозвал от 0 до 7.
И да, проверь название сигнала, как
UAVpilot написал.
И out тебе нужен именно float? Может S32 сделать?
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 17:47
Ворон226
Вписал print v в компонент.
Вот что пишет LCNC в терминале при запуске и нажимании на кнопки:
Код: Выделить всё
LINUXCNC - 2.6.0-pre0-4457-g477a07d
Machine configuration directory is '/home/printer/linuxcnc-dev/configs/MyGUI'
Machine configuration file is 'MyGUI.ini'
Starting LinuxCNC...
io started
halcmd loadusr io started
task pid=3870
emcTaskInit: using builtin interpreter
Issuing ON
Emit interp-run
Как видно из этого - никакой реакции на нажатие...
Ещё раз проверил халметр по пинам компонента - есть изменения как на входных пинах, так и на выходном пине.
Пока нет смысла менять формулу, если не понятно: почему старый вариант не работает...
Также нет смысла изменять формат выходного пина - это не изменит ситуации.
Где же копать? Кстати, халметр показывает выходной пин в виде десятичного числа. Может это и есть причина? Какого формата число v из компонента?
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 18:06
Nick
Хммм... скинь еще раз, что у тебя получилось...
может у тебя по try вылетает... попробуй в except написать print "jopa"
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 18:25
Ворон226
Nick писал(а):попробуй в except написать print "jopa"
Конечно мне приятно, что ты принимаешь меня почти за гуру, но я тебя не понял

"в except написать" - это куда? В компонент?
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 18:34
Ворон226
Что-то подсказало мне, что, работая в Python-е, нужно четко соблюдать синтаксис!
Переписал кусочек компонента с
Код: Выделить всё
try:
while 1:
if h['in1']==1:
pin1=1
...
v = pin1 + pin2 + pin3 + pin4 + pin5 + pin6 + pin7 + pin8
h['out']=v
ser.write(chr(v))
except KeyboardInterrupt:
raise SystemExit
в
Код: Выделить всё
try:
while 1:
if h['in1']==1:
pin1=1
...
v = pin1 + pin2 + pin3 + pin4 + pin5 + pin6 + pin7 + pin8
h['out']=v
ser.write(chr(v))
except KeyboardInterrupt:
raise SystemExit
и всё заработало!
Одна беда - время отработки нажатия клавиши около 1 сек... Но это не критично.
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 18:37
Nick
Я не понял, а что поменялось???
Ворон226 писал(а):Что-то подсказало мне, что, работая в Python-е, нужно четко соблюдать синтаксис!
Это так везде
-------
upd понял, ser.write было вне цикла.
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 18:39
Ворон226
Поменялось положение "ser.write(chr(v))"
Интересно - как ускорить опрос клавиш?
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 19:02
Nick
1 раз в секунду это конечно зло...
насколько я понимаю это время реакции на нажатие кнопки в mygui? А где они у тебя задаются и покажи свой исходник.
кстати добавь задержку на цикл, чтобы он у тебя весь процессор не жрал:
сразу после ser.write
time.sleep(0.01)
и в самое начало
import time
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 19:20
Ворон226
Странное дело - прописал задержку и стало работать шустро! Практически одномоментно, т.е. с задержкой 0,01

Наверное, по умолчанию задержка присутствует

Короче, на сей момент можно ставить точку.
Большое спасибо!
(а компонент можно куда-нибудь выложить - может пригодиться)
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 19:25
nkp
Ворон226 писал(а):(а компонент можно куда-нибудь выложить - может пригодиться)
мне кажеться выжимку в первый пост - самое то!
находишь тему - и сразу компонент ,описание ,как применять и т.д.
(первый пост должен редактироваться)
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 19:45
Ворон226
Согласен. И к теме добавить (решено).
Re: Управление из LinuxCNC через COM-порт
Добавлено: 17 июл 2013, 20:06
Ворон226
Первый пост исправлен - можно проверять и критиковать

Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Добавлено: 17 июл 2013, 20:49
Nick
Задержка может появлялась из-за того, что ты очередь порта забивал слишком частыми write.....
Попробуй вот такой вариант, он по короче выглядит да и быстрее работать должен (хотя это не значительно):
Код: Выделить всё
#!/usr/bin/python
import hal
import serial
import time
ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
h=hal.component("comform")
h.newpin("in1", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in2", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in3", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in4", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in5", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in6", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in7", hal.HAL_BIT, hal.HAL_IN)
h.newpin("in8", hal.HAL_BIT, hal.HAL_IN)
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
while 1:
v = h["in1"] | h["in2"]<<1 | h["in3"]<<2 | h["in4"]<<3 | h["in5"]<<4 | h["in6"]<<5 | h["in7"]<<6 | h["in8"]<<7
h['out'] = v
ser.write(chr(v))
time.sleep(0.01)
except KeyboardInterrupt:
raise SystemExit