Страница 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 в двоичной системе счисления, или умножить на 2n
И все эти 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-е, нужно четко соблюдать синтаксис!
Это так везде :freak:

-------
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