Управление из LinuxCNC через COM-порт (РЕШЕНО)

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон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 не работают.

Проверяю через халметр - и кнопки работают и пины компонента отрабатывают нажатие. Плата не реагирует.

При проверке платы ручками через терминал - все работает. Реле переключаются...

Где косяк?
Хочешь быть счастливым? Будь им!
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон226 »

Для проверки формирования слова для пересылки в COM-порт в компонент добавил пин:

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

h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)

...

h['out']=v
В халметре четко меняется значение байта при нажатии кнопок панели, но пересылки байта по COM, почему-то, не происходит...
Хочешь быть счастливым? Будь им!
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон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))
При прописывании ручками - всё переключает.
Хочешь быть счастливым? Будь им!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Nick »

Скинь целиком свой компонент. Надо посмотреть...
Также можешь написать, чтобы он в консоль выдавал, что он пишет в порт, просто через print и потом linuxCNC запускаешь из консоли и смотришь, что происходит.

ЗЫ тут заметил, что вы там про hex и dec писали, в питоне число в hex пишется так : 0xFF - это 256, т.е. 0x и число в hex
в двоичном формате - 0b100101, в восmмиричном - 0o76543210
Я так понимаю 0x - hex, 0d - binary, 0o - octal
(может и еще какие-то варианты с разными системами счисления есть...)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Serg »

А ничё, что везде одинаковый сигнал "net com1 ..."?
Nick писал(а):в восmмиричном - 0o76543210
А по стандарту без буковки "о", просто любое число больше нуля с нулём впереди - восьмиричное.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Nick »

UAVpilot писал(а):А по стандарту без буковки "о", просто любое число больше нуля с нулём впереди - восьмиричное.
О, так тоже работает :)
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон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 писать - не понял...
Хочешь быть счастливым? Будь им!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение 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 сделать?
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон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 из компонента?
Хочешь быть счастливым? Будь им!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Nick »

Хммм... скинь еще раз, что у тебя получилось...
может у тебя по try вылетает... попробуй в except написать print "jopa"
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон226 »

Nick писал(а):попробуй в except написать print "jopa"
Конечно мне приятно, что ты принимаешь меня почти за гуру, но я тебя не понял ;)
"в except написать" - это куда? В компонент?
Хочешь быть счастливым? Будь им!
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон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 сек... Но это не критично.
Хочешь быть счастливым? Будь им!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Nick »

Я не понял, а что поменялось???
Ворон226 писал(а):Что-то подсказало мне, что, работая в Python-е, нужно четко соблюдать синтаксис!
Это так везде :freak:

-------
upd понял, ser.write было вне цикла.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон226 »

Поменялось положение "ser.write(chr(v))"

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

Re: Управление из LinuxCNC через COM-порт

Сообщение Nick »

1 раз в секунду это конечно зло...
насколько я понимаю это время реакции на нажатие кнопки в mygui? А где они у тебя задаются и покажи свой исходник.


кстати добавь задержку на цикл, чтобы он у тебя весь процессор не жрал:
сразу после ser.write
time.sleep(0.01)
и в самое начало
import time
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон226 »

Странное дело - прописал задержку и стало работать шустро! Практически одномоментно, т.е. с задержкой 0,01 ;)
Наверное, по умолчанию задержка присутствует ;)
Короче, на сей момент можно ставить точку.
Большое спасибо!
(а компонент можно куда-нибудь выложить - может пригодиться)
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение nkp »

Ворон226 писал(а):(а компонент можно куда-нибудь выложить - может пригодиться)
мне кажеться выжимку в первый пост - самое то!
находишь тему - и сразу компонент ,описание ,как применять и т.д.
(первый пост должен редактироваться)
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон226 »

Согласен. И к теме добавить (решено).
Хочешь быть счастливым? Будь им!
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

Re: Управление из LinuxCNC через COM-порт

Сообщение Ворон226 »

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

Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)

Сообщение 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
Ответить

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