Управление из LinuxCNC через COM-порт (РЕШЕНО)
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Работает. Этот вариант короче и изящнее
Хочешь быть счастливым? Будь им!
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Решил перед выключением станка по MDI:
выключать реле на плате COM.
Прошу поправить, если что не так:
В команду MDI, а точнее в пользовательской команде M102, которая вызывается по MDI, вписываем управление платой COM:
или же импортировать и инициализировать порт нет нужды, так как им уже работаем?
Попробовал - не работает. Пишет:
import: unable to grab mouse `': Ресурс временно недоступен @ xwindow.c/XSelectWindow/8993.
/home/sun/linuxcnc-dev/nc_files/M102: 3: Syntax error: "(" unexpected
Понятно, что часть команды в sh, а часть в питоне... Но как это победить?
Код: Выделить всё
#!/bin/sh
sudo shutdown -h now
Прошу поправить, если что не так:
В команду MDI, а точнее в пользовательской команде M102, которая вызывается по MDI, вписываем управление платой COM:
Код: Выделить всё
#!/bin/sh
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(0))
sudo shutdown -h now
Попробовал - не работает. Пишет:
import: unable to grab mouse `': Ресурс временно недоступен @ xwindow.c/XSelectWindow/8993.
/home/sun/linuxcnc-dev/nc_files/M102: 3: Syntax error: "(" unexpected
Понятно, что часть команды в sh, а часть в питоне... Но как это победить?
Хочешь быть счастливым? Будь им!
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
M102:
Код: Выделить всё
#!/usr/bin/python
import serial , os
ser = serial.Serial(port='/dev/ttyS0', baudrate=19200, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
#print ser
ser.write(chr(0))
sd = os.popen("sudo shutdown -h now").read()
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Надо чтобы к моменту запуска этого скрипта порт был гарантированно свободен (предыдущая программа должна закрыть порт).Ворон226 писал(а):Попробовал - не работает.
Я б основной проге сделал-бы обработчик какого-нибудь сигнала, например SIGTERM, по приходу которого прога будет посылать 0 в порт и завершаться. Тогда в M102 останется только написать что-то вроде
Код: Выделить всё
killall -SIGTERM proga
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Да, согласен... Буду использовать компонент, который по состоянию станка пускает на выход информационные сигналы... Такой уже писал - осталось только его подкорректировать.UAVpilot писал(а):Надо чтобы к моменту запуска этого скрипта порт был гарантированно свободен (предыдущая программа должна закрыть порт).Ворон226 писал(а):Попробовал - не работает.
Я б основной проге сделал-бы обработчик какого-нибудь сигнала, например SIGTERM, по приходу которого прога будет посылать 0 в порт и завершаться. Тогда в M102 останется только написать что-то вродеКод: Выделить всё
killall -SIGTERM proga
Но в этом случае и M102 нет нужды переписывать Ведь сначала выключается станок, а потом уже выключается комп. Или я что-то путаю? И вообще как отрабатывается команда sudo shutdown -h now - что за чем выключается?
Хочешь быть счастливым? Будь им!
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Команда "shutdown -h" меняет у ОС runlevel с текущего на нулевой, что в свою очередь вызывает сначала выполнение всех скриптов /etc/init.d/rcN.d/K* (где N - текущий runlevel) с аргументом stop, потом всех скриптов /etc/init.d/rc0.d/S* с аргументом start. Потом всем оставшимся процессам посылается сигнал SIGKILL (который они не могут ни перехватить, ни игнорировать), после чего отмонтируются все FS, потом проц останавливается и выключается питание (если железо позволяет).
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Спасибо! Где-то так себе и представлял...
Переписал компонент enrun, который пропускает сигналы от датчиков к LCNC по сигналу "Станок включен", под дополнительные сигналы на плату реле. Теперь только после включения станка можно управлять вакуумным столом, феном и т.п. И реле сбрасываются при выключении станка.
(нужно будет в Вики открыть раздел - Пользовательские компоненты, куда скидывать готовые решения. Пригодятся, однако)
Переписал компонент enrun, который пропускает сигналы от датчиков к LCNC по сигналу "Станок включен", под дополнительные сигналы на плату реле. Теперь только после включения станка можно управлять вакуумным столом, феном и т.п. И реле сбрасываются при выключении станка.
(нужно будет в Вики открыть раздел - Пользовательские компоненты, куда скидывать готовые решения. Пригодятся, однако)
Хочешь быть счастливым? Будь им!
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
И в самом первым пункте этого раздела нужно будет выкладывать пользовательские компоненты построенные на основе штатных.Ворон226 писал(а):(нужно будет в Вики открыть раздел - Пользовательские компоненты, куда скидывать готовые решения. Пригодятся, однако)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Все в наших руках ("Алиса")
Хочешь быть счастливым? Будь им!
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Прошло всего 7 лет и захотел я написать пользовательский компонент не для передачи 8 пинов через СОМ на плату с 8-ю реле, а совсем наоборот...
Есть плата, на которую подключаем 8 датчиков и подключаем к ПК через СОМ.
Всё вроде понятно:
#!/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("out1", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out2", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out3", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out4", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out5", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out6", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out7", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out8", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
Прописываем настройки СОМ-порта, имя компонента, переменные...
h.ready()
try:
while 1:
А вот тут-то и нужно знание Python-а, чтобы разобрать входное слово формата FLOAT на биты, и присвоить эти биты переменным "out..."
ser.write(chr(v))
time.sleep(0.01)
except KeyboardInterrupt:
raise SystemExit
Народ! КТо силён в Python-е?
Есть плата, на которую подключаем 8 датчиков и подключаем к ПК через СОМ.
Всё вроде понятно:
#!/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("out1", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out2", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out3", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out4", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out5", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out6", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out7", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out8", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
Прописываем настройки СОМ-порта, имя компонента, переменные...
h.ready()
try:
while 1:
А вот тут-то и нужно знание Python-а, чтобы разобрать входное слово формата FLOAT на биты, и присвоить эти биты переменным "out..."
ser.write(chr(v))
time.sleep(0.01)
except KeyboardInterrupt:
raise SystemExit
Народ! КТо силён в Python-е?
Хочешь быть счастливым? Будь им!
-
- Мастер
- Сообщения: 1718
- Зарегистрирован: 28 авг 2018, 17:13
- Репутация: 286
- Настоящее имя: Алексей
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
если не флоат, то разобрать не проблема.
откуда там float-то возникает? вроде неоткуда там. неохота лезть разбираться.
если будет целое число - подскажу.
откуда там float-то возникает? вроде неоткуда там. неохота лезть разбираться.
если будет целое число - подскажу.
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
давай с целым разберемся)
Хочешь быть счастливым? Будь им!
-
- Мастер
- Сообщения: 1718
- Зарегистрирован: 28 авг 2018, 17:13
- Репутация: 286
- Настоящее имя: Алексей
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Код: Выделить всё
some_number=read_int_from_port
bit0 = some_number & 1
bit1 = some_number & 2
bit2 = some_number & 4
...
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Я так понимаю, что нужно сначала:
1. Исправить формать переменной in
h.newpin("in", hal.HAL_INT, hal.HAL_IN)
2. считать слово (аналогично "ser.write(chr(v))")
ser.read(chr(v))
3. разбить слово по битам:
out1 = v & 1
out2 = v & 2
out3 = v & 4
out4 = v & 8
out5 = v & 16
out6 = v & 32
out7 = v & 64
out8 = v & 128
4. завершить компонент:
time.sleep(0.01)
except KeyboardInterrupt:
raise SystemExit
Так?
Хочешь быть счастливым? Будь им!
-
- Мастер
- Сообщения: 1718
- Зарегистрирован: 28 авг 2018, 17:13
- Репутация: 286
- Настоящее имя: Алексей
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
все таки наверное
v = ser.read()
v = ser.read()
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Тогда весь компонент:
Так? (смогу проверить только завтра)
Код: Выделить всё
!/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("out1", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out2", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out3", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out4", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out5", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out6", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out7", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("out8", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("in", hal.HAL_INT, hal.HAL_IN)
h.ready()
try:
while 1:
v = ser.read()
out1 = v & 1
out2 = v & 2
out3 = v & 4
out4 = v & 8
out5 = v & 16
out6 = v & 32
out7 = v & 64
out8 = v & 128
time.sleep(0.01)
except KeyboardInterrupt:
raise SystemExit
Хочешь быть счастливым? Будь им!
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Попробовал...
1. После вылавливания "описок" типа несоответствия названий выдал, что нет такого "hal.HAL_INT". Пришлось исправить строку
2. Следом вышла ошибка, что не могу сделать out1 = v & 1, так как v - с плавающей запятой...
Написал:
Ругается, что недопустимый литерал для int()
И сомнения в написании
или
Где-то что-то с питоном у меня проблемы...
1. После вылавливания "описок" типа несоответствия названий выдал, что нет такого "hal.HAL_INT". Пришлось исправить строку
Код: Выделить всё
.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
Написал:
Код: Выделить всё
v = ser.read()
w = int(v)
И сомнения в написании
Код: Выделить всё
h["out1"] = w & 1
Код: Выделить всё
out2 = w & 2
Хочешь быть счастливым? Будь им!
-
- Мастер
- Сообщения: 1718
- Зарегистрирован: 28 авг 2018, 17:13
- Репутация: 286
- Настоящее имя: Алексей
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
блин. не, перебором что-то может получиться. днк тоже не сразу сложилась, надо просто поперебирать миллион лет )
а если надо быстрее, то придётся документацию почитать.
подсказка - нельзя вот так вот поменять инт на флоат и ждать что всё будет работать.
а если надо быстрее, то придётся документацию почитать.
подсказка - нельзя вот так вот поменять инт на флоат и ждать что всё будет работать.
-
- Мастер
- Сообщения: 473
- Зарегистрирован: 25 авг 2018, 10:11
- Репутация: 152
- Настоящее имя: Дмитрий
- Откуда: Киров
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Прочитайте пункт 2. HAL Data в http://www.linuxcnc.org/docs/html/hal/basic-hal.html
- Ворон226
- Мастер
- Сообщения: 1922
- Зарегистрирован: 01 окт 2012, 18:14
- Репутация: 181
- Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
- Контактная информация:
Re: Управление из LinuxCNC через COM-порт (РЕШЕНО)
Получается, что в Питоне есть 4 типа данных: Bit, Float, S32 и U32D.L. писал(а): ↑18 ноя 2021, 16:19 Прочитайте пункт 2. HAL Data в http://www.linuxcnc.org/docs/html/hal/basic-hal.html
Наверное мне подойдёт U32.
Установил дома Питон - буду проверять самостоятельно...
Хочешь быть счастливым? Будь им!