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

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

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

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

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

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

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

Решил перед выключением станка по MDI:

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

#!/bin/sh
sudo shutdown -h now
выключать реле на плате COM.

Прошу поправить, если что не так:

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

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

Сообщение nkp »

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-порт (РЕШЕНО)

Сообщение Serg »

Ворон226 писал(а):Попробовал - не работает.
Надо чтобы к моменту запуска этого скрипта порт был гарантированно свободен (предыдущая программа должна закрыть порт).
Я б основной проге сделал-бы обработчик какого-нибудь сигнала, например SIGTERM, по приходу которого прога будет посылать 0 в порт и завершаться. Тогда в M102 останется только написать что-то вроде

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

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

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

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

UAVpilot писал(а):
Ворон226 писал(а):Попробовал - не работает.
Надо чтобы к моменту запуска этого скрипта порт был гарантированно свободен (предыдущая программа должна закрыть порт).
Я б основной проге сделал-бы обработчик какого-нибудь сигнала, например SIGTERM, по приходу которого прога будет посылать 0 в порт и завершаться. Тогда в M102 останется только написать что-то вроде

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

killall -SIGTERM proga
Да, согласен... Буду использовать компонент, который по состоянию станка пускает на выход информационные сигналы... Такой уже писал - осталось только его подкорректировать.
Но в этом случае и M102 нет нужды переписывать ;) Ведь сначала выключается станок, а потом уже выключается комп. Или я что-то путаю? И вообще как отрабатывается команда sudo shutdown -h now - что за чем выключается?
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Команда "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-порт (РЕШЕНО)

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

Спасибо! Где-то так себе и представлял...

Переписал компонент enrun, который пропускает сигналы от датчиков к LCNC по сигналу "Станок включен", под дополнительные сигналы на плату реле. Теперь только после включения станка можно управлять вакуумным столом, феном и т.п. И реле сбрасываются при выключении станка.

(нужно будет в Вики открыть раздел - Пользовательские компоненты, куда скидывать готовые решения. Пригодятся, однако)
Хочешь быть счастливым? Будь им!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

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

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

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

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

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

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

Прошло всего 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-е?
Хочешь быть счастливым? Будь им!
alex_sar
Мастер
Сообщения: 1672
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 278
Настоящее имя: Алексей
Контактная информация:

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

Сообщение alex_sar »

если не флоат, то разобрать не проблема.
откуда там float-то возникает? вроде неоткуда там. неохота лезть разбираться.

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

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

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

давай с целым разберемся)
Хочешь быть счастливым? Будь им!
alex_sar
Мастер
Сообщения: 1672
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 278
Настоящее имя: Алексей
Контактная информация:

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

Сообщение alex_sar »

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

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-порт (РЕШЕНО)

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

alex_sar писал(а): some_number=read_int_from_port
bit0 = some_number & 1
bit1 = some_number & 2
bit2 = some_number & 4
...
Я так понимаю, что нужно сначала:
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

Так?
Хочешь быть счастливым? Будь им!
alex_sar
Мастер
Сообщения: 1672
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 278
Настоящее имя: Алексей
Контактная информация:

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

Сообщение alex_sar »

все таки наверное

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

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

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

Тогда весь компонент:

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

!/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-порт (РЕШЕНО)

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

Попробовал...
1. После вылавливания "описок" типа несоответствия названий выдал, что нет такого "hal.HAL_INT". Пришлось исправить строку

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

.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
2. Следом вышла ошибка, что не могу сделать out1 = v & 1, так как v - с плавающей запятой...
Написал:

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

v = ser.read()
		w = int(v)
Ругается, что недопустимый литерал для int()
И сомнения в написании

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

h["out1"] = w & 1
или

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

out2 = w & 2
Где-то что-то с питоном у меня проблемы...
Хочешь быть счастливым? Будь им!
alex_sar
Мастер
Сообщения: 1672
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 278
Настоящее имя: Алексей
Контактная информация:

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

Сообщение alex_sar »

блин. не, перебором что-то может получиться. днк тоже не сразу сложилась, надо просто поперебирать миллион лет )

а если надо быстрее, то придётся документацию почитать.

подсказка - нельзя вот так вот поменять инт на флоат и ждать что всё будет работать.
D.L.
Мастер
Сообщения: 471
Зарегистрирован: 25 авг 2018, 10:11
Репутация: 152
Настоящее имя: Дмитрий
Откуда: Киров
Контактная информация:

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

Сообщение D.L. »

Ворон226 писал(а): Попробовал...
1. После вылавливания "описок" типа несоответствия названий выдал, что нет такого "hal.HAL_INT". Пришлось исправить строку
...
Прочитайте пункт 2. HAL Data в http://www.linuxcnc.org/docs/html/hal/basic-hal.html
Аватара пользователя
Ворон226
Мастер
Сообщения: 1922
Зарегистрирован: 01 окт 2012, 18:14
Репутация: 181
Откуда: Солнечногорск Московской обл. - Борки Конаковского р-на - Скоморохово Фировского р-на
Контактная информация:

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

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

D.L. писал(а): 18 ноя 2021, 16:19 Прочитайте пункт 2. HAL Data в http://www.linuxcnc.org/docs/html/hal/basic-hal.html
Получается, что в Питоне есть 4 типа данных: Bit, Float, S32 и U32
Наверное мне подойдёт U32.
Установил дома Питон - буду проверять самостоятельно...
Хочешь быть счастливым? Будь им!
Ответить

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