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

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

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

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

Есть плата управления устройствами (сильноточные реле) через COM-порт - PLA001 от Пурелоджика (http://www.purelogic.ru/files/downloads ... PLA001.pdf).
Понятно, что нужно для управления релюхами необходимо прописывать байт целиком - все 8 разрядов.
Но как это организовать в LinuxCNC?

Я бы хотел управлять не вводя сразу значение байта, например, "170", а нажимая на визуальной панели отдельные кнопочки. Например, "включить компрессор" - взяли текущее значение управляющего байта, изменили один бит и прописали по СОМ-у

Т.е. нужно:
1. Прописать СОМ-порт в CNC (адрес)
2. Сформировать байт из отдельных битов
3. Организовать передачу сформированного байта по COM.

В результате был написан компонент comform в python-е.

ОПИСАНИЕ comform.
Формирует байт из входных пинов и передаёт его по COM.
Загрузка.
Загрузка осуществляется как и любой пользовательский компонент:
loadusr -Wn comform python comform.py
Функция.
out = in1 + in2*2 + in3*4 + in4*8 + in5*16 + in6*32 + in7*64 + in8*128
Пины.
in1 (bit in)
in2 (bit in)
in3 (bit in)
in4 (bit in)
in5 (bit in)
in6 (bit in)
in7 (bit in)
in8 (bit in)
out (float out)

Полный текст компонента:

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

#!/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
Прошу пробовать, делать замечания, дополнять.
Ниже - путь к этому результату:
Последний раз редактировалось Ворон226 17 июл 2013, 22:56, всего редактировалось 4 раза.
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Тут где-то уже мелькал проект расширителя порта. Кратко: через 2-3 пина можно поиметь сколько хочешь входов и выходов. На стороне Linuxcnc простенький плагинчик, на стороне входов/выходов сдвиговые регистры.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

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

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

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

nkp писал(а):
Ворон226 писал(а):Есть плата
разбирался с ними уже...
Так там modbus...
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

похожесть сбила с толку...)))
---------------
тогда можешь за основу взять вот это
с #6 по #16
там используется модуль питона для работы с ком
где то доделывал даже с настройками в окне - теперь сам не нахожу...
ну не беда - допишем...
зы
можно это все в компонент "засунуть"...
==============
вот "готовая" конфигурация:
SherlineLatheCom.tar
(80 КБ) 486 скачиваний
запускаешь емс , вкладка сом, статус - открыть(порт),вводишь 170 (при подключенной плате),по идее - сработать
должны 2,4,6,8 реле.
проверить - как в ситеме называется компорт
ежели что - править скрипт...
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

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

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

Большое спасибо!
А не растолкуешь такую штуку:

Я бы хотел управлять не вводя сразу значение байта, например, "170", а нажимая на визуальной панели отдельные кнопочки. Например, "включить компрессор" - взяли текущее значение управляющего байта, изменили один бит и прописали по СОМу...
Или не так...
Как и с LPT-портом, в HAL-е прописываем пины байта СОМ-порта. И с определенной частотой формируется байт из отдельных пинов формата BIT, передавая его по СОМ.

Как бы такое сделать? Я просто не вполне представляю стандартного решения "вёрстки" байта из битов, но уверен, что это стандартная "операция".

Т.е. нужно:
1. Как прописать СОМ-порт в CNC
2. Как сформировать байт из отдельных битов
3. Как организовать передачу сформированного байта по COM.
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

такой вопрос:
а плата уже приобретена? просто мне кажется - такая же с modbus даже проще в реализации...
-------------
Ворон226 писал(а):1. Как прописать СОМ-порт в CNC
в LCNC наверно ??
=============
Ворон226 писал(а):Я бы хотел управлять не вводя сразу значение байта, например, "170",
значит ли эта фраза,что прямым вводом все заработало?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

Ворон226 писал(а):2. Как сформировать байт из отдельных битов
в ладдере делал так:
cl2.tar
(1.34 МБ) 487 скачиваний
это архив с самим ладдером и файл с 8-ю парами кнопок (по числу реле) - вкл и выкл
распакуй в любое место - запусти файл "classicladder": после запуска -нажать F5, F6 (открыть доп окна) должно быть так: и теперь нажимая в левом окошке кнопочки - наблюдаем за изменением переменной
ох ! немного не так...
пропишем в нижней строке переменную QW0 - это суммирующий "вес" всех кнопок:
вот так вот теперь меняя комбинации включенных-выключенных кнопок смотрим как меняется наш байт...
==========
осталось передать его в порт...
QW0 - это в хал classicladder.0.s32in-00
----------------
пишем компонент , который будет с заданным интервалом посылать в порт значение пина classicladder.0.s32in-00
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

работа с портом в питоне заключается:
импортировать модуль
import serial
инициализировать порт
ser = serial.Serial('/dev/ttyS0', 115200, timeout=1)
в скобках перечисляются все нужные настройки порта
используя функции read и write соответственно принимаем и отсылаем данные
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

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

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

nkp писал(а):такой вопрос:
а плата уже приобретена? просто мне кажется - такая же с modbus даже проще в реализации...
Плата передо мной. Живая.
nkp писал(а):в LCNC наверно ??
Точно.
nkp писал(а):
Ворон226 писал(а):Я бы хотел управлять не вводя сразу значение байта, например, "170",
значит ли эта фраза,что прямым вводом все заработало?
Нет - не проверял. Попробовал проверить cl2.tar - заработало, но старшие 4 разряда (младшие не переключаются). Да это и не важно... Важно, что, если бы и заработало, то КАК оно заработало для меня остаётся тайной. А это плохо. :(

А ведь не просто так разбил задачу на три части - хочу разобраться. Чтоб не через копирование и распаковку, а через понимание. Вот уже понял КАК работает COM-порт, какие у него сигналы. Понял почему его используют как порт для передачи управляющих сигналов и сигналов от источников с большим их количеством.

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

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

Сообщение nkp »

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

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

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

Т.е. через ладдер мы формируем байт через графический редактор.

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

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

Сообщение nkp »

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

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

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

Т.е. скрипт (или компонент?) на питоне должен быть построен так:

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

#!/usr/bin/python
import hal
import serial
h=hal.component("comform")
ser = serial.Serial('/dev/ttyS0', 115200, timeout=1)
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)
Далее нужно присвоить каждой переменной "вес":
"in1 - 1
in2 - 2
in3 - 4
in4 - 8
....
in8 - 128"
(но не знаю КАК это сделать в питоне). После этого переменные должны стать целочисленными (?).

Затем нужно просуммировать переменные - получим байт.

И передать полученный байт по COM. Тоже пока не выудил как...

Правильно?
Хочешь быть счастливым? Будь им!
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

как бы я построил работу:
подсоеденить плату
из питоновской консоли инициализировать порт
пробуем пощелкать релюшками
этим мы научимся настраивать порт и передавать в него байт
потом идти дальше...
=========итак:
для начала настойки порта из твоего мануала:
Выделение(004).jpg (3390 просмотров) <a class='original' href='./download/file.php?id=14732&sid=0061f03eaf5f6dba0a633cfc640cd6ef&mode=view' target=_blank>Загрузить оригинал (243.57 КБ)</a>
то есть скорость - 19200
если поставишь другую - ничего работать не будет
в консоли пишем :
python
enter
import serial
ser = serial.Serial('/dev/ttyS0', 19200, timeout=1)
если ошибок нет - будем посылать байт в порт
(кстати - имя порта проверял? /dev/ttyS0 ???)
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

Как бы я стал решать этот вопрос:
- взял бы за основу http://cnc-club.ru/forum/viewtopic.php? ... 912#p27540 - для того, чтобы разобраться, как работает линукс с последовательным портом и как формировать пины hal-компонента на Си.
- формировал байт из битов и выдавал его в порт при изменениях любого бита
Наверно все это можно и на питоне, но меня переменные, которые могут хранить значения любого типа, и не понятно, как именно, регулярно вводят в ступор :pssdoff: Особенно на стыке с конкретной аппаратурой, как здесь.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

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

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

Всё сделано:
Порт определил - ttyS0
ser = serial.Serial('/dev/ttyS0', 19200, timeout=1) - отправил...

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

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

Сообщение nkp »

Ворон226 писал(а):Как будем прописывать байт?
v=bin(170)
ser.write(v)

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

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

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

При выполнении ser.write(v) ругается:

File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/dist-packages/serial/serialposix.py", line 330, in write
raise TypeError('expected str, got %s' % type(data))
TypeError: expected str, got <type 'int'>

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

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

Сообщение nkp »

ну да - мы ж строку отправили ;)
может bin надо
v=bin(170)
чет я засомневался...)))
а может так:
ser.write(bin(170))
Ответить

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